diff --git a/.drone.yml b/.drone.yml index ef96530..dd9cf9a 100644 --- a/.drone.yml +++ b/.drone.yml @@ -6,8 +6,7 @@ build: commands: - export BUILD_NUMBER=$DRONE_BUILD_NUMBER - npm install --quiet - - npm install --quiet -g karma-cli - - npm test + - npm run test:drone publish: coverage: diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 0000000..908c337 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,2 @@ +src/vendor +dist diff --git a/.eslintrc.js b/.eslintrc.js new file mode 100644 index 0000000..5b42527 --- /dev/null +++ b/.eslintrc.js @@ -0,0 +1,16 @@ +'use strict'; +module.exports = { + root: true, + parserOptions: { + ecmaVersion: 2018, + sourceType: 'script', + }, + extends: ['eslint:recommended'], + env: { + node: true, + }, + rules: { + strict: 'error', + 'no-unused-vars': ['error', { argsIgnorePattern: '^_' }], + }, +}; diff --git a/.gitignore b/.gitignore index bd08181..f4ae9d7 100644 --- a/.gitignore +++ b/.gitignore @@ -94,3 +94,11 @@ $RECYCLE.BIN/ # Windows shortcuts *.lnk + +## +# Editors/IDEs +## + +# VSCode + Plugins +.history +.vscode diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100755 index 0000000..0bd658f --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npx --no-install commitlint --edit "$1" diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 0000000..d37daa0 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npx --no-install lint-staged diff --git a/.lintstagedrc b/.lintstagedrc new file mode 100644 index 0000000..b0c1174 --- /dev/null +++ b/.lintstagedrc @@ -0,0 +1,3 @@ +{ + "*.js": "eslint --fix" +} diff --git a/.release-it.json b/.release-it.json new file mode 100644 index 0000000..a66124f --- /dev/null +++ b/.release-it.json @@ -0,0 +1,18 @@ +{ + "git": { + "commitMessage": "chore: release v${version}" + }, + "github": { + "release": true + }, + "plugins": { + "@release-it/keep-a-changelog": { + "filename": "CHANGELOG.md" + }, + "@release-it/bumper": { + "out": { + "file": "bower.json" + } + } + } +} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..fa988bb --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,37 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [0.2.1] - 2021-10-25 +### Changed +- Bump potentialy vulnerable `ua-parser-js` version to a safe version range. Security advisory: [GHSA-pjwm-rvh2-c87w](https://github.com/advisories/GHSA-pjwm-rvh2-c87w). + +## [0.2.0] - 2021-08-25 +### Added +- Modularize Java and Flash detection, offer bundles excluding either Java or Flash detection or both + +### Changed +- (**breaking**) Expose the client.js variant *without* Java and Flash detection for browser bundlers +- Update all production and dev dependencies +- Use `ua-parser-js` package from `npm` instead of a vendored copy +- Use `murmurhash-js` package from `npm` instead of a vendored copy of an older implementation +- Update vendored `deployJava.js` to latest version + +### Fixed +- Migrate to webpack-based build to fix broken bundle + +## [0.1.11] - 2016-01-25 + +## [0.1.10] - 2016-01-25 + +## [0.1.9] - 2016-01-16 + +## [0.1.8] - 2016-01-03 + +## [0.1.7] - 2016-01-02 + +## [0.1.6] - 2015-12-31 + +## [0.1.5] - 2015-09-13 diff --git a/README.md b/README.md index ffbc067..1def798 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,9 @@ -![Sauce Test Status](logo.jpg) +![ClientJS logo](logo.jpg) **Device information and digital fingerprinting written in _pure_ JavaScript.** -[![Sauce Test Status](https://saucelabs.com/buildstatus/clientjs)](https://saucelabs.com/u/clientjs) [![Build Status](http://beta.drone.io/api/badges/jackspirou/clientjs/status.svg)](http://beta.drone.io/jackspirou/clientjs) [![Aircover Coverage](https://aircover.co/badges/jackspirou/clientjs/coverage.svg)](https://aircover.co/jackspirou/clientjs) [![Kanban board for ClientJS issues at https://huboard.com/jackspirou/clientjs](https://img.shields.io/badge/Hu-Board-7965cc.svg)](https://huboard.com/jackspirou/clientjs) [![Join the chat at https://gitter.im/jackspirou/clientjs](https://badges.gitter.im/jackspirou/clientjs.svg)](https://gitter.im/jackspirou/clientjs?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +[![Sauce Test Status](https://saucelabs.com/buildstatus/clientjs)](https://saucelabs.com/u/clientjs) [![Build Status](http://beta.drone.io/api/badges/jackspirou/clientjs/status.svg)](http://beta.drone.io/jackspirou/clientjs) [![Aircover Coverage](https://aircover.co/badges/jackspirou/clientjs/coverage.svg)](https://aircover.co/jackspirou/clientjs) + [![Sauce Test Status](https://saucelabs.com/browser-matrix/clientjs.svg)](https://saucelabs.com/u/clientjs) @@ -12,16 +13,14 @@ If you want to fingerprint browsers, you are **_probably_** also interested in o Below are some features that make ClientJS different from other fingerprinting libraries: - It's pure native JavaScript -- It's decently lightweight at ~45 KB +- It's decently lightweight at ~55 KB (full bundle) or ~28 KB (minimal bundle) - All user data points are available by design, not just the 32bit integer fingerprint -## Documentation and Demos -You can find more documentation and demos on each method at [clientjs.org](https://clientjs.org/). + ## Installation -To use ClientJS, simply include `dist/client.min.js`. - -ClientJS is available for download via [bower](http://bower.io/search/?q=clientjs) and [npm](https://www.npmjs.com/package/clientjs). +To use ClientJS, simply include `dist/client.base.min.js` or one of the other bundles (see [bundles](#bundles) section for more details) ### npm @@ -29,12 +28,6 @@ ClientJS is available for download via [bower](http://bower.io/search/?q=clientj npm install clientjs ``` -### Bower - -```shell -bower install clientjs -``` - ## Fingerprinting Digital fingerprints are based on device/browser settings. They allow you to make an "educated guess" about the identify of a new or returning visitor. @@ -43,17 +36,28 @@ By taking multiple data points, combining them, and representing them as a numbe This is useful for identifying users or devices without cookies or sessions. It is not a full proof technique, but it has been shown to be statistically significant at accurately identifying devices. -Simply create a new ClientJS object. -Then call the `getFingerprint()` method which will return the browser/device fingerprint as a 32bit integer hash ID. +First, you'll need to import the library. You can do it in different ways, depending on your environment: -Below is an example of how to generate and display a fingerprint: +```js +// in an ES6 environment: +import { ClientJS } from 'clientjs'; -```javascript +// via CommonJS imports: +const { ClientJS } = require('clientjs'); + +// in a browser, when using a script tag: +const ClientJS = window.ClientJS; +``` + +After having imported the library, simply create a new `ClientJS` object and call the `getFingerprint()` method which will return +the browser/device fingerprint as a 32bit integer hash ID. + +```js // Create a new ClientJS object -var client = new ClientJS(); +const client = new ClientJS(); // Get the client's fingerprint id -var fingerprint = client.getFingerprint(); +const fingerprint = client.getFingerprint(); // Print the 32bit hash id to the console console.log(fingerprint); @@ -77,91 +81,99 @@ The current data-points that used to generate fingerprint 32bit integer hash ID - cookies - canvas print +## Bundles +For maximum flexibility, this library is distributed in 4 different pre-bundled variants for the browser: + +- `dist/client.min.js` - full distribution bundle, contains Flash and Java detection mechanisms +- `dist/client.flash.min.js` - contains Flash detection mechanism but misses Java detection (`getJavaVersion()` will throw an error when called) +- `dist/client.java.min.js` - contains Java detection mechanism but misses Flash detection (`getFlashVersion()` will throw an error when called) +- `dist/client.base.min.js` - misses both, Flash and Java detection mechanisms (`getFlashVersion()` and `getJavaVersion()` will throw an error when called) + ## Available Methods Below is the current list of available methods to find information on a users browser/device. You can find documentation on each method at [clientjs.org](https://clientjs.org/). -``` - var client = new ClientJS(); - - client.getBrowserData(); - client.getFingerprint(); - client.getCustomFingerprint(...); - - client.getUserAgent(); - client.getUserAgentLowerCase(); - - client.getBrowser(); - client.getBrowserVersion(); - client.getBrowserMajorVersion(); - client.isIE(); - client.isChrome(); - client.isFirefox(); - client.isSafari(); - client.isOpera(); - - client.getEngine(); - client.getEngineVersion(); - - client.getOS(); - client.getOSVersion(); - client.isWindows(); - client.isMac(); - client.isLinux(); - client.isUbuntu(); - client.isSolaris(); - - client.getDevice(); - client.getDeviceType(); - client.getDeviceVendor(); - - client.getCPU(); - - client.isMobile(); - client.isMobileMajor(); - client.isMobileAndroid(); - client.isMobileOpera(); - client.isMobileWindows(); - client.isMobileBlackBerry(); - - client.isMobileIOS(); - client.isIphone(); - client.isIpad(); - client.isIpod(); - - client.getScreenPrint(); - client.getColorDepth(); - client.getCurrentResolution(); - client.getAvailableResolution(); - client.getDeviceXDPI(); - client.getDeviceYDPI(); - - client.getPlugins(); - client.isJava(); - client.getJavaVersion(); - client.isFlash(); - client.getFlashVersion(); - client.isSilverlight(); - client.getSilverlightVersion(); - - client.getMimeTypes(); - client.isMimeTypes(); - - client.isFont(); - client.getFonts(); - - client.isLocalStorage(); - client.isSessionStorage(); - client.isCookie(); - - client.getTimeZone(); - - client.getLanguage(); - client.getSystemLanguage(); - - client.isCanvas(); - client.getCanvasPrint(); +```js +const client = new ClientJS(); + +client.getBrowserData(); +client.getFingerprint(); +client.getCustomFingerprint(...); + +client.getUserAgent(); +client.getUserAgentLowerCase(); + +client.getBrowser(); +client.getBrowserVersion(); +client.getBrowserMajorVersion(); +client.isIE(); +client.isChrome(); +client.isFirefox(); +client.isSafari(); +client.isOpera(); + +client.getEngine(); +client.getEngineVersion(); + +client.getOS(); +client.getOSVersion(); +client.isWindows(); +client.isMac(); +client.isLinux(); +client.isUbuntu(); +client.isSolaris(); + +client.getDevice(); +client.getDeviceType(); +client.getDeviceVendor(); + +client.getCPU(); + +client.isMobile(); +client.isMobileMajor(); +client.isMobileAndroid(); +client.isMobileOpera(); +client.isMobileWindows(); +client.isMobileBlackBerry(); + +client.isMobileIOS(); +client.isIphone(); +client.isIpad(); +client.isIpod(); + +client.getScreenPrint(); +client.getColorDepth(); +client.getCurrentResolution(); +client.getAvailableResolution(); +client.getDeviceXDPI(); +client.getDeviceYDPI(); + +client.getPlugins(); +client.isJava(); +client.getJavaVersion(); // functional only in java and full builds, throws an error otherwise +client.isFlash(); +client.getFlashVersion(); // functional only in flash and full builds, throws an error otherwise +client.isSilverlight(); +client.getSilverlightVersion(); + +client.getMimeTypes(); +client.isMimeTypes(); + +client.isFont(); +client.getFonts(); + +client.isLocalStorage(); +client.isSessionStorage(); +client.isCookie(); + +client.getTimeZone(); + +client.getLanguage(); +client.getSystemLanguage(); + +client.isCanvas(); +client.getCanvasPrint(); ``` ## Shoulders of Giants @@ -169,39 +181,41 @@ It is important to note this project owes much to other pieces great works. We had the advantage of observing how others had approached this problem. Built Upon: -- https:github.com/Valve/fingerprintjs -- http:darkwavetech.com/device_fingerprint.html -- detectmobilebrowsers.com - -## Vendor Code -All dependencies are included into `client.min.js` when the `build.sh` bash file minifies the project. Vendored dependencies should not be included separately. - -Dependencies Include: -- ua-parser.js -- fontdetect.js -- swfobject.js -- murmurhash3.js +- https://web.archive.org/web/20200714191004/https://github.com/Valve/fingerprintjs +- https://web.archive.org/web/20200411083356/https://www.darkwavetech.com/index.php/device-fingerprint-blog +- http://detectmobilebrowsers.com ## Contributing Collaborate by [forking](https://help.github.com/articles/fork-a-repo/) this project and sending a Pull Request this way. -Once cloned, install all dependencies. ClientJS uses [Karma](https://karma-runner.github.io/0.13/index.html) as its testing environment. +Once cloned, install all dependencies. ClientJS uses [Karma](https://karma-runner.github.io/) as its testing environment. ```shell # Install dependencies $ npm install - -# If you want tu run karma from the command line -$ npm install -g karma-cli ``` Run Karma and enjoy coding! ```shell -$ karma start +$ npm test ``` Thanks for contributing to ClientJS! Please report any bug [here](https://github.com/jackspirou/clientjs/issues). +## Releasing + +To make a new release, use the [`release-it`](https://github.com/release-it/release-it) tool, this will guide you through the release process: + +```sh +npx release-it +``` + +You can make a dry run of the release process with the following command: + +```sh +npx release-it --dry-run +``` + ## LICENSE -This project is using the Apache LICENSE Version 2.0. It is included in the project source code. +[Apache License 2.0](https://github.com/jackspirou/clientjs/blob/master/LICENSE) diff --git a/bower.json b/bower.json index dd9a283..697838b 100644 --- a/bower.json +++ b/bower.json @@ -1,14 +1,26 @@ { "name": "clientjs", - "version": "0.1.11", - "main": ["dist/client.min.js"], + "version": "0.2.1", + "main": [ + "dist/client.base.min.js" + ], "ignore": [ - ".travis.yml", + ".husky", + ".drone.sec", + ".drone.yml", + ".eslintignore", + ".eslintrc.js", ".gitignore", - "build", - "grunt.js", - "LICENSE", + ".lintstagedrc", + ".release-it.json", + "commitlint.config.js", + "karma", "node_modules", - "package.json" + "package-lock.json", + "package.json", + "sauce.json", + "scripts", + "specs", + "webpack.config.js" ] } diff --git a/commitlint.config.js b/commitlint.config.js new file mode 100644 index 0000000..d694ff5 --- /dev/null +++ b/commitlint.config.js @@ -0,0 +1,3 @@ +"use strict"; + +module.exports = { extends: ["@commitlint/config-conventional"] }; diff --git a/dist/client.base.min.js b/dist/client.base.min.js new file mode 100644 index 0000000..9a18cb7 --- /dev/null +++ b/dist/client.base.min.js @@ -0,0 +1,2 @@ +!function(e,i){if("object"==typeof exports&&"object"==typeof module)module.exports=i();else if("function"==typeof define&&define.amd)define([],i);else{var t=i();for(var n in t)("object"==typeof exports?exports:e)[n]=t[n]}}(this,(function(){return function(e){var i={};function t(n){if(i[n])return i[n].exports;var o=i[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,t),o.l=!0,o.exports}return t.m=e,t.c=i,t.d=function(e,i,n){t.o(e,i)||Object.defineProperty(e,i,{enumerable:!0,get:n})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,i){if(1&i&&(e=t(e)),8&i)return e;if(4&i&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(t.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&i&&"string"!=typeof e)for(var o in e)t.d(n,o,function(i){return e[i]}.bind(null,o));return n},t.n=function(e){var i=e&&e.__esModule?function(){return e["default"]}:function(){return e};return t.d(i,"a",i),i},t.o=function(e,i){return Object.prototype.hasOwnProperty.call(e,i)},t.p="",t(t.s=0)}([function(e,i,t){"use strict";var n,o,r=t(1)(),a=t(3),s=t(4),l=t(6),u=function(){var e=new s;return n=e.getResult(),o=new l,this};u.prototype={getSoftwareVersion:function(){return"0.1.11"},getBrowserData:function(){return n},getFingerprint:function(){var e="|",i=n.ua,t=this.getScreenPrint(),o=this.getPlugins(),r=this.getFonts(),s=this.isLocalStorage(),l=this.isSessionStorage(),u=this.getTimeZone(),c=this.getLanguage(),d=this.getSystemLanguage(),b=this.isCookie(),m=this.getCanvasPrint();return a(i+e+t+e+o+e+r+e+s+e+l+e+u+e+c+e+d+e+b+e+m,256)},getCustomFingerprint:function(){for(var e="|",i="",t=0;t>>16)*a&65535)<<16)&4294967295)<<15|l>>>17))*s+(((l>>>16)*s&65535)<<16)&4294967295)<<13|o>>>19))+((5*(o>>>16)&65535)<<16)&4294967295))+((58964+(r>>>16)&65535)<<16);switch(l=0,t){case 3:l^=(255&e.charCodeAt(u+2))<<16;case 2:l^=(255&e.charCodeAt(u+1))<<8;case 1:o^=l=(65535&(l=(l=(65535&(l^=255&e.charCodeAt(u)))*a+(((l>>>16)*a&65535)<<16)&4294967295)<<15|l>>>17))*s+(((l>>>16)*s&65535)<<16)&4294967295}return o^=e.length,o=2246822507*(65535&(o^=o>>>16))+((2246822507*(o>>>16)&65535)<<16)&4294967295,o=3266489909*(65535&(o^=o>>>13))+((3266489909*(o>>>16)&65535)<<16)&4294967295,(o^=o>>>16)>>>0}},function(e,i,t){var n;!function(o,r){"use strict";var a="function",s="undefined",l="object",u="string",c="model",d="name",b="type",m="vendor",w="version",g="architecture",p="console",f="mobile",h="tablet",v="smarttv",y="wearable",x="embedded",k="Amazon",S="Apple",C="ASUS",M="BlackBerry",P="Firefox",T="Google",B="Huawei",A="LG",L="Microsoft",U="Motorola",E="Opera",G="Samsung",N="Sony",j="Xiaomi",_="Zebra",R="Facebook",D=function(e){var i={};for(var t in e)i[e[t].toUpperCase()]=e[t];return i},I=function(e,i){return typeof e===u&&-1!==O(i).indexOf(O(e))},O=function(e){return e.toLowerCase()},z=function(e,i){if(typeof e===u)return e=e.replace(/^\s\s*/,"").replace(/\s\s*$/,""),typeof i===s?e:e.substring(0,255)},F=function(e,i){for(var t,n,o,s,u,c,d=0;d0?2==s.length?typeof s[1]==a?this[s[0]]=s[1].call(this,c):this[s[0]]=s[1]:3==s.length?typeof s[1]!==a||s[1].exec&&s[1].test?this[s[0]]=c?c.replace(s[1],s[2]):r:this[s[0]]=c?s[1].call(this,c,s[2]):r:4==s.length&&(this[s[0]]=c?s[3].call(this,c.replace(s[1],s[2])):r):this[s]=c||r;d+=2}},q=function(e,i){for(var t in i)if(typeof i[t]===l&&i[t].length>0){for(var n=0;n255?z(e,255):e,this},this.setUA(t),this};H.VERSION="0.7.30",H.BROWSER=D([d,w,"major"]),H.CPU=D([g]),H.DEVICE=D([c,m,b,p,f,v,h,y,x]),H.ENGINE=H.OS=D([d,w]),typeof i!==s?(typeof e!==s&&e.exports&&(i=e.exports=H),i.UAParser=H):t(5)?(n=function(){return H}.call(i,t,i,e))===r||(e.exports=n):typeof o!==s&&(o.UAParser=H);var K=typeof o!==s&&(o.jQuery||o.Zepto);if(K&&!K.ua){var Y=new H;K.ua=Y.getResult(),K.ua.get=function(){return Y.getUA()},K.ua.set=function(e){Y.setUA(e);var i=Y.getResult();for(var t in i)K.ua[t]=i[t]}}}("object"==typeof window?window:this)},function(e,i){(function(i){e.exports=i}).call(this,{})},function(e,i){e.exports=function(){var e=["monospace","sans-serif","serif"],i=document.getElementsByTagName("body")[0],t=document.createElement("span");t.style.fontSize="72px",t.innerHTML="mmmmmmmmmmlli";var n={},o={};for(var r in e)t.style.fontFamily=e[r],i.appendChild(t),n[e[r]]=t.offsetWidth,o[e[r]]=t.offsetHeight,i.removeChild(t);this.detect=function(r){var a=!1;for(var s in e){t.style.fontFamily=r+","+e[s],i.appendChild(t);var l=t.offsetWidth!=n[e[s]]||t.offsetHeight!=o[e[s]];i.removeChild(t),a=a||l}return a}}}])})); +//# sourceMappingURL=client.base.min.js.map \ No newline at end of file diff --git a/dist/client.base.min.js.map b/dist/client.base.min.js.map new file mode 100644 index 0000000..12e66d4 --- /dev/null +++ b/dist/client.base.min.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap","webpack:///./src/client.base.js","webpack:///./node_modules/globalthis/polyfill.js","webpack:///./node_modules/globalthis/implementation.browser.js","webpack:///./node_modules/murmurhash-js/murmurhash3_gc.js","webpack:///./node_modules/ua-parser-js/src/ua-parser.js","webpack:///(webpack)/buildin/amd-options.js","webpack:///./src/vendor/fontdetect.js"],"names":["root","factory","exports","module","define","amd","a","i","this","installedModules","__webpack_require__","moduleId","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","browserData","fontDetective","globalThis","murmurhash3_32_gc","UAParser","Detector","ClientJS","parser","getResult","getSoftwareVersion","getBrowserData","getFingerprint","bar","userAgent","ua","screenPrint","getScreenPrint","pluginList","getPlugins","fontList","getFonts","localStorage","isLocalStorage","sessionStorage","isSessionStorage","timeZone","getTimeZone","language","getLanguage","systemLanguage","getSystemLanguage","cookies","isCookie","canvasPrint","getCanvasPrint","getCustomFingerprint","arguments","length","getUserAgent","getUserAgentLowerCase","toLowerCase","getBrowser","browser","getBrowserVersion","version","getBrowserMajorVersion","major","isIE","test","isChrome","isFirefox","isSafari","isMobileSafari","isOpera","getEngine","engine","getEngineVersion","getOS","os","getOSVersion","isWindows","isMac","isLinux","isUbuntu","isSolaris","getDevice","device","model","getDeviceType","type","getDeviceVendor","vendor","getCPU","cpu","architecture","isMobile","dataString","navigator","window","opera","substr","isMobileMajor","isMobileAndroid","isMobileBlackBerry","isMobileIOS","isMobileOpera","isMobileWindows","match","isIphone","isIpad","isIpod","getCurrentResolution","getAvailableResolution","getColorDepth","getDeviceXDPI","getDeviceYDPI","screen","colorDepth","width","height","availWidth","availHeight","deviceXDPI","deviceYDPI","pluginsList","plugins","isJava","javaEnabled","getJavaVersion","Error","isFlash","getFlashVersion","isSilverlight","getSilverlightVersion","description","isMimeTypes","mimeTypes","getMimeTypes","mimeTypeList","isFont","font","detect","fontArray","fontString","e","cookieEnabled","rightNow","myNumber","Date","String","getTimezoneOffset","slice","isCanvas","elem","document","createElement","getContext","ctx","canvas","txt","textBaseline","fillStyle","fillRect","fillText","toDataURL","implementation","global","Math","Array","self","Function","seed","remainder","bytes","h1","h1b","c1","c2","k1","charCodeAt","undefined","FUNC_TYPE","UNDEF_TYPE","OBJ_TYPE","STR_TYPE","MODEL","NAME","TYPE","VENDOR","VERSION","ARCHITECTURE","CONSOLE","MOBILE","TABLET","SMARTTV","WEARABLE","EMBEDDED","AMAZON","APPLE","ASUS","BLACKBERRY","FIREFOX","GOOGLE","HUAWEI","LG","MICROSOFT","MOTOROLA","OPERA","SAMSUNG","SONY","XIAOMI","ZEBRA","FACEBOOK","enumerize","arr","enums","toUpperCase","has","str1","str2","lowerize","indexOf","str","trim","len","replace","substring","rgxMapper","arrays","j","k","q","matches","regex","props","exec","strMapper","map","windowsVersionMap","regexes","CHROME","EDGE","extensions","_ua","_rgxmap","mergedRegexes","concat","extend","_browser","split","_cpu","_device","_engine","_os","getUA","setUA","BROWSER","CPU","DEVICE","ENGINE","OS","$","jQuery","Zepto","set","result","prop","__webpack_amd_options__","baseFonts","h","getElementsByTagName","style","fontSize","innerHTML","defaultWidth","defaultHeight","index","fontFamily","appendChild","offsetWidth","offsetHeight","removeChild","detected","matched"],"mappings":"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","file":"client.base.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(this, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n","//\n// ClientJS. An easy to use, simple, and flexible client information library written in JavaScript.\n//\n// Version: 0.1.11\n//\n// Original Author: Jack Spirou\n// Original Data: 5 Nov 2013\n\n// ClientJS. Return a JavaScript object containing information collected about a client.\n// Return browser/device fingerprint as a 32 bit integer hash ID.\n\n// BUILT UPON:\n// - https://github.com/Valve/fingerprintjs\n// - http://darkwavetech.com/device_fingerprint.html\n// - detectmobilebrowsers.com JavaScript Mobile Detection Script\n\n// Dependencies Include:\n// - ua-parser.js\n// - fontdetect.js\n// - swfobject.js\n// - murmurhash3.js\n\n// BROWSER FINGERPRINT DATA POINTS\n// - userAgent\n// - screenPrint\n// - colordepth\n// - currentResolution\n// - availableResolution\n// - deviceXDPI\n// - deviceYDPI\n// - plugin list\n// - font list\n// - localStorage\n// - sessionStorage\n// - timezone\n// - language\n// - systemLanguage\n// - cookies\n// - canvasPrint\n\n// METHOD Naming CONVENTION\n// is[MethodName] = return boolean\n// get[MethodName] = return int|string|object\n\n// METHODS\n//\n// var client = new ClientJS();\n//\n// client.getSoftwareVersion();\n// client.getBrowserData();\n// client.getFingerprint();\n// client.getCustomFingerprint(...);\n//\n// client.getUserAgent();\n// client.getUserAgentLowerCase();\n//\n// client.getBrowser();\n// client.getBrowserVersion();\n// client.getBrowserMajorVersion();\n// client.isIE();\n// client.isChrome();\n// client.isFirefox();\n// client.isSafari();\n// client.isMobileSafari();\n// client.isOpera();\n//\n// client.getEngine();\n// client.getEngineVersion();\n//\n// client.getOS();\n// client.getOSVersion();\n// client.isWindows();\n// client.isMac();\n// client.isLinux();\n// client.isUbuntu();\n// client.isSolaris();\n//\n// client.getDevice();\n// client.getDeviceType();\n// client.getDeviceVendor();\n//\n// client.getCPU();\n//\n// client.isMobile();\n// client.isMobileMajor();\n// client.isMobileAndroid();\n// client.isMobileOpera();\n// client.isMobileWindows();\n// client.isMobileBlackBerry();\n//\n// client.isMobileIOS();\n// client.isIphone();\n// client.isIpad();\n// client.isIpod();\n//\n// client.getScreenPrint();\n// client.getColorDepth();\n// client.getCurrentResolution();\n// client.getAvailableResolution();\n// client.getDeviceXDPI();\n// client.getDeviceYDPI();\n//\n// client.getPlugins();\n// client.isJava();\n// client.getJavaVersion();\n// client.isFlash();\n// client.getFlashVersion();\n// client.isSilverlight();\n// client.getSilverlightVersion();\n//\n// client.getMimeTypes();\n// client.isMimeTypes();\n//\n// client.isFont();\n// client.getFonts();\n//\n// client.isLocalStorage();\n// client.isSessionStorage();\n// client.isCookie();\n//\n// client.getTimeZone();\n//\n// client.getLanguage();\n// client.getSystemLanguage();\n//\n// client.isCanvas();\n// client.getCanvasPrint();\n\n'use strict';\n\nvar globalThis = require('globalthis/polyfill')();\nvar murmurhash3_32_gc = require('murmurhash-js/murmurhash3_gc');\nvar UAParser = require('ua-parser-js');\nvar Detector = require('./vendor/fontdetect');\n\nvar browserData; // Global user agent browser object.\nvar fontDetective; // Global font detective object.\n\n// ClientJS constructor which sets the browserData object and returs the client object.\nvar ClientJS = function() {\n var parser = new UAParser;\n browserData = parser.getResult();\n fontDetective = new Detector();\n return this;\n};\n\n// ClientJS prototype which contains all methods.\nClientJS.prototype = {\n\n //\n // MAIN METHODS\n //\n\n // Get Software Version. Return a string containing this software version number.\n getSoftwareVersion: function() {\n var version = \"0.1.11\";\n return version;\n },\n\n // Get Browser Data. Return an object containing browser user agent.\n getBrowserData: function() {\n return browserData;\n },\n\n // Get Fingerprint. Return a 32-bit integer representing the browsers fingerprint.\n getFingerprint: function() {\n var bar = '|';\n\n var userAgent = browserData.ua;\n var screenPrint = this.getScreenPrint();\n var pluginList = this.getPlugins();\n var fontList = this.getFonts();\n var localStorage = this.isLocalStorage();\n var sessionStorage = this.isSessionStorage();\n var timeZone = this.getTimeZone();\n var language = this.getLanguage();\n var systemLanguage = this.getSystemLanguage();\n var cookies = this.isCookie();\n var canvasPrint = this.getCanvasPrint();\n\n var key = userAgent + bar + screenPrint + bar + pluginList + bar + fontList + bar + localStorage + bar + sessionStorage + bar + timeZone + bar + language + bar + systemLanguage + bar + cookies + bar + canvasPrint;\n var seed = 256;\n\n return murmurhash3_32_gc(key, seed);\n },\n\n // Get Custom Fingerprint. Take a string of datapoints and eturn a 32-bit integer representing the browsers fingerprint.\n getCustomFingerprint: function() {\n var bar = '|';\n var key = \"\";\n for (var i = 0; i < arguments.length; i++) {\n key += arguments[i] + bar;\n }\n return murmurhash3_32_gc(key, 256);\n },\n\n //\n // USER AGENT METHODS\n //\n\n // Get User Agent. Return a string containing unparsed user agent.\n getUserAgent: function() {\n return browserData.ua;\n },\n\n // Get User Agent Lower Case. Return a lowercase string containing the user agent.\n getUserAgentLowerCase: function() {\n return browserData.ua.toLowerCase();\n },\n\n //\n // BROWSER METHODS\n //\n\n // Get Browser. Return a string containing the browser name.\n getBrowser: function() {\n return browserData.browser.name;\n },\n\n // Get Browser Version. Return a string containing the browser version.\n getBrowserVersion: function() {\n return browserData.browser.version;\n },\n\n // Get Browser Major Version. Return a string containing the major browser version.\n getBrowserMajorVersion: function() {\n return browserData.browser.major;\n },\n\n // Is IE. Check if the browser is IE.\n isIE: function() {\n return (/IE/i.test(browserData.browser.name));\n },\n\n // Is Chrome. Check if the browser is Chrome.\n isChrome: function() {\n return (/Chrome/i.test(browserData.browser.name));\n },\n\n // Is Firefox. Check if the browser is Firefox.\n isFirefox: function() {\n return (/Firefox/i.test(browserData.browser.name));\n },\n\n // Is Safari. Check if the browser is Safari.\n isSafari: function() {\n return (/Safari/i.test(browserData.browser.name));\n },\n\n // Is Mobile Safari. Check if the browser is Safari.\n isMobileSafari: function() {\n return (/Mobile\\sSafari/i.test(browserData.browser.name));\n },\n\n // Is Opera. Check if the browser is Opera.\n isOpera: function() {\n return (/Opera/i.test(browserData.browser.name));\n },\n\n //\n // ENGINE METHODS\n //\n\n // Get Engine. Return a string containing the browser engine.\n getEngine: function() {\n return browserData.engine.name;\n },\n\n // Get Engine Version. Return a string containing the browser engine version.\n getEngineVersion: function() {\n return browserData.engine.version;\n },\n\n //\n // OS METHODS\n //\n\n // Get OS. Return a string containing the OS.\n getOS: function() {\n return browserData.os.name;\n },\n\n // Get OS Version. Return a string containing the OS Version.\n getOSVersion: function() {\n return browserData.os.version;\n },\n\n // Is Windows. Check if the OS is Windows.\n isWindows: function() {\n return (/Windows/i.test(browserData.os.name));\n },\n\n // Is Mac. Check if the OS is Mac.\n isMac: function() {\n return (/Mac/i.test(browserData.os.name));\n },\n\n // Is Linux. Check if the OS is Linux.\n isLinux: function() {\n return (/Linux/i.test(browserData.os.name));\n },\n\n // Is Ubuntu. Check if the OS is Ubuntu.\n isUbuntu: function() {\n return (/Ubuntu/i.test(browserData.os.name));\n },\n\n // Is Solaris. Check if the OS is Solaris.\n isSolaris: function() {\n return (/Solaris/i.test(browserData.os.name));\n },\n\n //\n // DEVICE METHODS\n //\n\n // Get Device. Return a string containing the device.\n getDevice: function() {\n return browserData.device.model;\n },\n\n // Get Device Type. Return a string containing the device type.\n getDeviceType: function() {\n return browserData.device.type;\n },\n\n // Get Device Vendor. Return a string containing the device vendor.\n getDeviceVendor: function() {\n return browserData.device.vendor;\n },\n\n //\n // CPU METHODS\n //\n\n // Get CPU. Return a string containing the CPU architecture.\n getCPU: function() {\n return browserData.cpu.architecture;\n },\n\n //\n // MOBILE METHODS\n //\n\n // Is Mobile. Check if the browser is on a mobile device.\n isMobile: function() {\n // detectmobilebrowsers.com JavaScript Mobile Detection Script\n var dataString = browserData.ua || navigator.vendor || window.opera;\n // eslint-disable-next-line no-useless-escape\n return (/(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(dataString) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i.test(dataString.substr(0, 4)));\n },\n\n // Is Mobile Major. Check if the browser is on a major mobile device.\n isMobileMajor: function() {\n return (this.isMobileAndroid() || this.isMobileBlackBerry() || this.isMobileIOS() || this.isMobileOpera() || this.isMobileWindows());\n },\n\n // Is Mobile. Check if the browser is on an android mobile device.\n isMobileAndroid: function() {\n if (browserData.ua.match(/Android/i)) {\n return true;\n }\n return false;\n },\n\n // Is Mobile Opera. Check if the browser is on an opera mobile device.\n isMobileOpera: function() {\n if (browserData.ua.match(/Opera Mini/i)) {\n return true;\n }\n return false;\n },\n\n // Is Mobile Windows. Check if the browser is on a windows mobile device.\n isMobileWindows: function() {\n if (browserData.ua.match(/IEMobile/i)) {\n return true;\n }\n return false;\n },\n\n // Is Mobile BlackBerry. Check if the browser is on a blackberry mobile device.\n isMobileBlackBerry: function() {\n if (browserData.ua.match(/BlackBerry/i)) {\n return true;\n }\n return false;\n },\n\n //\n // MOBILE APPLE METHODS\n //\n\n // Is Mobile iOS. Check if the browser is on an Apple iOS device.\n isMobileIOS: function() {\n if (browserData.ua.match(/iPhone|iPad|iPod/i)) {\n return true;\n }\n return false;\n },\n\n // Is Iphone. Check if the browser is on an Apple iPhone.\n isIphone: function() {\n if (browserData.ua.match(/iPhone/i)) {\n return true;\n }\n return false;\n },\n\n // Is Ipad. Check if the browser is on an Apple iPad.\n isIpad: function() {\n if (browserData.ua.match(/iPad/i)) {\n return true;\n }\n return false;\n },\n\n // Is Ipod. Check if the browser is on an Apple iPod.\n isIpod: function() {\n if (browserData.ua.match(/iPod/i)) {\n return true;\n }\n return false;\n },\n\n //\n // SCREEN METHODS\n //\n\n // Get Screen Print. Return a string containing screen information.\n getScreenPrint: function() {\n return \"Current Resolution: \" + this.getCurrentResolution() + \", Available Resolution: \" + this.getAvailableResolution() + \", Color Depth: \" + this.getColorDepth() + \", Device XDPI: \" + this.getDeviceXDPI() + \", Device YDPI: \" + this.getDeviceYDPI();\n },\n\n // Get Color Depth. Return a string containing the color depth.\n getColorDepth: function() {\n return screen.colorDepth;\n },\n\n // Get Current Resolution. Return a string containing the current resolution.\n getCurrentResolution: function() {\n return screen.width + \"x\" + screen.height;\n },\n\n // Get Available Resolution. Return a string containing the available resolution.\n getAvailableResolution: function() {\n return screen.availWidth + \"x\" + screen.availHeight;\n },\n\n // Get Device XPDI. Return a string containing the device XPDI.\n getDeviceXDPI: function() {\n return screen.deviceXDPI;\n },\n\n // Get Device YDPI. Return a string containing the device YDPI.\n getDeviceYDPI: function() {\n return screen.deviceYDPI;\n },\n\n //\n // PLUGIN METHODS\n //\n\n // Get Plugins. Return a string containing a list of installed plugins.\n getPlugins: function() {\n var pluginsList = \"\";\n\n for (var i = 0; i < navigator.plugins.length; i++) {\n if (i == navigator.plugins.length - 1) {\n pluginsList += navigator.plugins[i].name;\n } else {\n pluginsList += navigator.plugins[i].name + \", \";\n }\n }\n return pluginsList;\n },\n\n // Is Java. Check if Java is installed.\n isJava: function() {\n return navigator.javaEnabled();\n },\n\n // Get Java Version. Return a string containing the Java Version.\n getJavaVersion: function() {\n throw new Error('Please use client.java.js or client.js if you need this functionality!');\n },\n\n // Is Flash. Check if Flash is installed.\n isFlash: function() {\n var objPlugin = navigator.plugins[\"Shockwave Flash\"];\n if (objPlugin) {\n return true;\n }\n return false;\n },\n\n // Get Flash Version. Return a string containing the Flash Version.\n getFlashVersion: function() {\n throw new Error('Please use client.flash.js or client.js if you need this functionality!');\n },\n\n // Is Silverlight. Check if Silverlight is installed.\n isSilverlight: function() {\n var objPlugin = navigator.plugins[\"Silverlight Plug-In\"];\n if (objPlugin) {\n return true;\n }\n return false;\n },\n\n // Get Silverlight Version. Return a string containing the Silverlight Version.\n getSilverlightVersion: function() {\n if (this.isSilverlight()) {\n var objPlugin = navigator.plugins[\"Silverlight Plug-In\"];\n return objPlugin.description;\n }\n return \"\";\n },\n\n //\n // MIME TYPE METHODS\n //\n\n // Is Mime Types. Check if a mime type is installed.\n isMimeTypes: function() {\n if (navigator.mimeTypes && navigator.mimeTypes.length) {\n return true;\n }\n return false;\n },\n\n // Get Mime Types. Return a string containing a list of installed mime types.\n getMimeTypes: function() {\n var mimeTypeList = \"\";\n\n if(navigator.mimeTypes) {\n for (var i = 0; i < navigator.mimeTypes.length; i++) {\n if (i == navigator.mimeTypes.length - 1) {\n mimeTypeList += navigator.mimeTypes[i].description;\n } else {\n mimeTypeList += navigator.mimeTypes[i].description + \", \";\n }\n }\n }\n return mimeTypeList;\n },\n\n //\n // FONT METHODS\n //\n\n // Is Font. Check if a font is installed.\n isFont: function(font) {\n return fontDetective.detect(font);\n },\n\n // Get Fonts. Return a string containing a list of installed fonts.\n getFonts: function() {\n var fontArray = [\"Abadi MT Condensed Light\", \"Adobe Fangsong Std\", \"Adobe Hebrew\", \"Adobe Ming Std\", \"Agency FB\", \"Aharoni\", \"Andalus\", \"Angsana New\", \"AngsanaUPC\", \"Aparajita\", \"Arab\", \"Arabic Transparent\", \"Arabic Typesetting\", \"Arial Baltic\", \"Arial Black\", \"Arial CE\", \"Arial CYR\", \"Arial Greek\", \"Arial TUR\", \"Arial\", \"Batang\", \"BatangChe\", \"Bauhaus 93\", \"Bell MT\", \"Bitstream Vera Serif\", \"Bodoni MT\", \"Bookman Old Style\", \"Braggadocio\", \"Broadway\", \"Browallia New\", \"BrowalliaUPC\", \"Calibri Light\", \"Calibri\", \"Californian FB\", \"Cambria Math\", \"Cambria\", \"Candara\", \"Castellar\", \"Casual\", \"Centaur\", \"Century Gothic\", \"Chalkduster\", \"Colonna MT\", \"Comic Sans MS\", \"Consolas\", \"Constantia\", \"Copperplate Gothic Light\", \"Corbel\", \"Cordia New\", \"CordiaUPC\", \"Courier New Baltic\", \"Courier New CE\", \"Courier New CYR\", \"Courier New Greek\", \"Courier New TUR\", \"Courier New\", \"DFKai-SB\", \"DaunPenh\", \"David\", \"DejaVu LGC Sans Mono\", \"Desdemona\", \"DilleniaUPC\", \"DokChampa\", \"Dotum\", \"DotumChe\", \"Ebrima\", \"Engravers MT\", \"Eras Bold ITC\", \"Estrangelo Edessa\", \"EucrosiaUPC\", \"Euphemia\", \"Eurostile\", \"FangSong\", \"Forte\", \"FrankRuehl\", \"Franklin Gothic Heavy\", \"Franklin Gothic Medium\", \"FreesiaUPC\", \"French Script MT\", \"Gabriola\", \"Gautami\", \"Georgia\", \"Gigi\", \"Gisha\", \"Goudy Old Style\", \"Gulim\", \"GulimChe\", \"GungSeo\", \"Gungsuh\", \"GungsuhChe\", \"Haettenschweiler\", \"Harrington\", \"Hei S\", \"HeiT\", \"Heisei Kaku Gothic\", \"Hiragino Sans GB\", \"Impact\", \"Informal Roman\", \"IrisUPC\", \"Iskoola Pota\", \"JasmineUPC\", \"KacstOne\", \"KaiTi\", \"Kalinga\", \"Kartika\", \"Khmer UI\", \"Kino MT\", \"KodchiangUPC\", \"Kokila\", \"Kozuka Gothic Pr6N\", \"Lao UI\", \"Latha\", \"Leelawadee\", \"Levenim MT\", \"LilyUPC\", \"Lohit Gujarati\", \"Loma\", \"Lucida Bright\", \"Lucida Console\", \"Lucida Fax\", \"Lucida Sans Unicode\", \"MS Gothic\", \"MS Mincho\", \"MS PGothic\", \"MS PMincho\", \"MS Reference Sans Serif\", \"MS UI Gothic\", \"MV Boli\", \"Magneto\", \"Malgun Gothic\", \"Mangal\", \"Marlett\", \"Matura MT Script Capitals\", \"Meiryo UI\", \"Meiryo\", \"Menlo\", \"Microsoft Himalaya\", \"Microsoft JhengHei\", \"Microsoft New Tai Lue\", \"Microsoft PhagsPa\", \"Microsoft Sans Serif\", \"Microsoft Tai Le\", \"Microsoft Uighur\", \"Microsoft YaHei\", \"Microsoft Yi Baiti\", \"MingLiU\", \"MingLiU-ExtB\", \"MingLiU_HKSCS\", \"MingLiU_HKSCS-ExtB\", \"Miriam Fixed\", \"Miriam\", \"Mongolian Baiti\", \"MoolBoran\", \"NSimSun\", \"Narkisim\", \"News Gothic MT\", \"Niagara Solid\", \"Nyala\", \"PMingLiU\", \"PMingLiU-ExtB\", \"Palace Script MT\", \"Palatino Linotype\", \"Papyrus\", \"Perpetua\", \"Plantagenet Cherokee\", \"Playbill\", \"Prelude Bold\", \"Prelude Condensed Bold\", \"Prelude Condensed Medium\", \"Prelude Medium\", \"PreludeCompressedWGL Black\", \"PreludeCompressedWGL Bold\", \"PreludeCompressedWGL Light\", \"PreludeCompressedWGL Medium\", \"PreludeCondensedWGL Black\", \"PreludeCondensedWGL Bold\", \"PreludeCondensedWGL Light\", \"PreludeCondensedWGL Medium\", \"PreludeWGL Black\", \"PreludeWGL Bold\", \"PreludeWGL Light\", \"PreludeWGL Medium\", \"Raavi\", \"Rachana\", \"Rockwell\", \"Rod\", \"Sakkal Majalla\", \"Sawasdee\", \"Script MT Bold\", \"Segoe Print\", \"Segoe Script\", \"Segoe UI Light\", \"Segoe UI Semibold\", \"Segoe UI Symbol\", \"Segoe UI\", \"Shonar Bangla\", \"Showcard Gothic\", \"Shruti\", \"SimHei\", \"SimSun\", \"SimSun-ExtB\", \"Simplified Arabic Fixed\", \"Simplified Arabic\", \"Snap ITC\", \"Sylfaen\", \"Symbol\", \"Tahoma\", \"Times New Roman Baltic\", \"Times New Roman CE\", \"Times New Roman CYR\", \"Times New Roman Greek\", \"Times New Roman TUR\", \"Times New Roman\", \"TlwgMono\", \"Traditional Arabic\", \"Trebuchet MS\", \"Tunga\", \"Tw Cen MT Condensed Extra Bold\", \"Ubuntu\", \"Umpush\", \"Univers\", \"Utopia\", \"Utsaah\", \"Vani\", \"Verdana\", \"Vijaya\", \"Vladimir Script\", \"Vrinda\", \"Webdings\", \"Wide Latin\", \"Wingdings\"];\n var fontString = \"\";\n\n for (var i = 0; i < fontArray.length; i++) {\n if (fontDetective.detect(fontArray[i])) {\n if (i == fontArray.length - 1) {\n fontString += fontArray[i];\n } else {\n fontString += fontArray[i] + \", \";\n }\n }\n }\n\n return fontString;\n },\n\n //\n // STORAGE METHODS\n //\n\n // Is Local Storage. Check if local storage is enabled.\n isLocalStorage: function() {\n try {\n return !!globalThis.localStorage;\n } catch (e) {\n return true; // SecurityError when referencing it means it exists\n }\n },\n\n // Is Session Storage. Check if session storage is enabled.\n isSessionStorage: function() {\n try {\n return !!globalThis.sessionStorage;\n } catch (e) {\n return true; // SecurityError when referencing it means it exists\n }\n },\n\n // Is Cookie. Check if cookies are enabled.\n isCookie: function() {\n return navigator.cookieEnabled;\n },\n\n //\n // TIME METHODS\n //\n\n // Get Time Zone. Return a string containing the time zone.\n getTimeZone: function() {\n var rightNow, myNumber, formattedNumber, result;\n rightNow = new Date();\n myNumber = String(-(rightNow.getTimezoneOffset() / 60));\n if (myNumber < 0) {\n myNumber = myNumber * -1;\n formattedNumber = (\"0\" + myNumber).slice(-2);\n result = \"-\" + formattedNumber;\n } else {\n formattedNumber = (\"0\" + myNumber).slice(-2);\n result = \"+\" + formattedNumber;\n }\n return result;\n },\n\n //\n // LANGUAGE METHODS\n //\n\n // Get Language. Return a string containing the user language.\n getLanguage: function() {\n return navigator.language;\n },\n\n // Get System Language. Return a string containing the system language.\n getSystemLanguage: function() {\n return navigator.systemLanguage || window.navigator.language;\n },\n\n //\n // CANVAS METHODS\n //\n\n // Is Canvas. Check if the canvas element is enabled.\n isCanvas: function() {\n\n // create a canvas element\n var elem = document.createElement('canvas');\n\n // try/catch for older browsers that don't support the canvas element\n try {\n\n // check if context and context 2d exists\n return !!(elem.getContext && elem.getContext('2d'));\n\n } catch (e) {\n\n // catch if older browser\n return false;\n }\n },\n\n // Get Canvas Print. Return a string containing the canvas URI data.\n getCanvasPrint: function() {\n\n // create a canvas element\n var canvas = document.createElement('canvas');\n\n // define a context var that will be used for browsers with canvas support\n var ctx;\n\n // try/catch for older browsers that don't support the canvas element\n try {\n\n // attempt to give ctx a 2d canvas context value\n ctx = canvas.getContext('2d');\n\n } catch (e) {\n\n // return empty string if canvas element not supported\n return \"\";\n }\n\n // https://www.browserleaks.com/canvas#how-does-it-work\n // Text with lowercase/uppercase/punctuation symbols\n var txt = 'ClientJS,org 1.0';\n ctx.textBaseline = \"top\";\n // The most common type\n ctx.font = \"14px 'Arial'\";\n ctx.textBaseline = \"alphabetic\";\n ctx.fillStyle = \"#f60\";\n ctx.fillRect(125, 1, 62, 20);\n // Some tricks for color mixing to increase the difference in rendering\n ctx.fillStyle = \"#069\";\n ctx.fillText(txt, 2, 15);\n ctx.fillStyle = \"rgba(102, 204, 0, 0.7)\";\n ctx.fillText(txt, 4, 17);\n return canvas.toDataURL();\n }\n};\n\nexports.ClientJS = ClientJS;\n","'use strict';\n\nvar implementation = require('./implementation');\n\nmodule.exports = function getPolyfill() {\n\tif (typeof global !== 'object' || !global || global.Math !== Math || global.Array !== Array) {\n\t\treturn implementation;\n\t}\n\treturn global;\n};\n","/* eslint no-negated-condition: 0, no-new-func: 0 */\n\n'use strict';\n\nif (typeof self !== 'undefined') {\n\tmodule.exports = self;\n} else if (typeof window !== 'undefined') {\n\tmodule.exports = window;\n} else {\n\tmodule.exports = Function('return this')();\n}\n","/**\n * JS Implementation of MurmurHash3 (r136) (as of May 20, 2011)\n * \n * @author Gary Court\n * @see http://github.com/garycourt/murmurhash-js\n * @author Austin Appleby\n * @see http://sites.google.com/site/murmurhash/\n * \n * @param {string} key ASCII only\n * @param {number} seed Positive integer only\n * @return {number} 32-bit positive integer hash \n */\n\nfunction murmurhash3_32_gc(key, seed) {\n\tvar remainder, bytes, h1, h1b, c1, c1b, c2, c2b, k1, i;\n\t\n\tremainder = key.length & 3; // key.length % 4\n\tbytes = key.length - remainder;\n\th1 = seed;\n\tc1 = 0xcc9e2d51;\n\tc2 = 0x1b873593;\n\ti = 0;\n\t\n\twhile (i < bytes) {\n\t \tk1 = \n\t \t ((key.charCodeAt(i) & 0xff)) |\n\t \t ((key.charCodeAt(++i) & 0xff) << 8) |\n\t \t ((key.charCodeAt(++i) & 0xff) << 16) |\n\t \t ((key.charCodeAt(++i) & 0xff) << 24);\n\t\t++i;\n\t\t\n\t\tk1 = ((((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16))) & 0xffffffff;\n\t\tk1 = (k1 << 15) | (k1 >>> 17);\n\t\tk1 = ((((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16))) & 0xffffffff;\n\n\t\th1 ^= k1;\n h1 = (h1 << 13) | (h1 >>> 19);\n\t\th1b = ((((h1 & 0xffff) * 5) + ((((h1 >>> 16) * 5) & 0xffff) << 16))) & 0xffffffff;\n\t\th1 = (((h1b & 0xffff) + 0x6b64) + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16));\n\t}\n\t\n\tk1 = 0;\n\t\n\tswitch (remainder) {\n\t\tcase 3: k1 ^= (key.charCodeAt(i + 2) & 0xff) << 16;\n\t\tcase 2: k1 ^= (key.charCodeAt(i + 1) & 0xff) << 8;\n\t\tcase 1: k1 ^= (key.charCodeAt(i) & 0xff);\n\t\t\n\t\tk1 = (((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff;\n\t\tk1 = (k1 << 15) | (k1 >>> 17);\n\t\tk1 = (((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff;\n\t\th1 ^= k1;\n\t}\n\t\n\th1 ^= key.length;\n\n\th1 ^= h1 >>> 16;\n\th1 = (((h1 & 0xffff) * 0x85ebca6b) + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff;\n\th1 ^= h1 >>> 13;\n\th1 = ((((h1 & 0xffff) * 0xc2b2ae35) + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16))) & 0xffffffff;\n\th1 ^= h1 >>> 16;\n\n\treturn h1 >>> 0;\n}\n\nif(typeof module !== \"undefined\") {\n module.exports = murmurhash3_32_gc\n}","/////////////////////////////////////////////////////////////////////////////////\n/* UAParser.js v0.7.28\n Copyright © 2012-2021 Faisal Salman \n MIT License *//*\n Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.\n Supports browser & node.js environment. \n Demo : https://faisalman.github.io/ua-parser-js\n Source : https://github.com/faisalman/ua-parser-js */\n/////////////////////////////////////////////////////////////////////////////////\n\n(function (window, undefined) {\n\n 'use strict';\n\n //////////////\n // Constants\n /////////////\n\n\n var LIBVERSION = '0.7.30',\n EMPTY = '',\n UNKNOWN = '?',\n FUNC_TYPE = 'function',\n UNDEF_TYPE = 'undefined',\n OBJ_TYPE = 'object',\n STR_TYPE = 'string',\n MAJOR = 'major',\n MODEL = 'model',\n NAME = 'name',\n TYPE = 'type',\n VENDOR = 'vendor',\n VERSION = 'version',\n ARCHITECTURE= 'architecture',\n CONSOLE = 'console',\n MOBILE = 'mobile',\n TABLET = 'tablet',\n SMARTTV = 'smarttv',\n WEARABLE = 'wearable',\n EMBEDDED = 'embedded',\n UA_MAX_LENGTH = 255;\n\n var AMAZON = 'Amazon',\n APPLE = 'Apple',\n ASUS = 'ASUS',\n BLACKBERRY = 'BlackBerry',\n BROWSER = 'Browser',\n CHROME = 'Chrome',\n EDGE = 'Edge',\n FIREFOX = 'Firefox',\n GOOGLE = 'Google',\n HUAWEI = 'Huawei',\n LG = 'LG',\n MICROSOFT = 'Microsoft',\n MOTOROLA = 'Motorola',\n OPERA = 'Opera',\n SAMSUNG = 'Samsung',\n SONY = 'Sony',\n XIAOMI = 'Xiaomi',\n ZEBRA = 'Zebra',\n FACEBOOK = 'Facebook';\n\n ///////////\n // Helper\n //////////\n\n var extend = function (regexes, extensions) {\n var mergedRegexes = {};\n for (var i in regexes) {\n if (extensions[i] && extensions[i].length % 2 === 0) {\n mergedRegexes[i] = extensions[i].concat(regexes[i]);\n } else {\n mergedRegexes[i] = regexes[i];\n }\n }\n return mergedRegexes;\n },\n enumerize = function (arr) {\n var enums = {};\n for (var i in arr) {\n enums[arr[i].toUpperCase()] = arr[i];\n }\n return enums;\n },\n has = function (str1, str2) {\n return typeof str1 === STR_TYPE ? lowerize(str2).indexOf(lowerize(str1)) !== -1 : false;\n },\n lowerize = function (str) {\n return str.toLowerCase();\n },\n majorize = function (version) {\n return typeof(version) === STR_TYPE ? version.replace(/[^\\d\\.]/g, EMPTY).split('.')[0] : undefined;\n },\n trim = function (str, len) {\n if (typeof(str) === STR_TYPE) {\n str = str.replace(/^\\s\\s*/, EMPTY).replace(/\\s\\s*$/, EMPTY);\n return typeof(len) === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);\n }\n };\n\n ///////////////\n // Map helper\n //////////////\n\n var rgxMapper = function (ua, arrays) {\n\n var i = 0, j, k, p, q, matches, match;\n\n // loop through all regexes maps\n while (i < arrays.length && !matches) {\n\n var regex = arrays[i], // even sequence (0,2,4,..)\n props = arrays[i + 1]; // odd sequence (1,3,5,..)\n j = k = 0;\n\n // try matching uastring with regexes\n while (j < regex.length && !matches) {\n\n matches = regex[j++].exec(ua);\n\n if (!!matches) {\n for (p = 0; p < props.length; p++) {\n match = matches[++k];\n q = props[p];\n // check if given property is actually array\n if (typeof q === OBJ_TYPE && q.length > 0) {\n if (q.length == 2) {\n if (typeof q[1] == FUNC_TYPE) {\n // assign modified match\n this[q[0]] = q[1].call(this, match);\n } else {\n // assign given value, ignore regex match\n this[q[0]] = q[1];\n }\n } else if (q.length == 3) {\n // check whether function or regex\n if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {\n // call function (usually string mapper)\n this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;\n } else {\n // sanitize match using given regex\n this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;\n }\n } else if (q.length == 4) {\n this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;\n }\n } else {\n this[q] = match ? match : undefined;\n }\n }\n }\n }\n i += 2;\n }\n },\n\n strMapper = function (str, map) {\n\n for (var i in map) {\n // check if current value is array\n if (typeof map[i] === OBJ_TYPE && map[i].length > 0) {\n for (var j = 0; j < map[i].length; j++) {\n if (has(map[i][j], str)) {\n return (i === UNKNOWN) ? undefined : i;\n }\n }\n } else if (has(map[i], str)) {\n return (i === UNKNOWN) ? undefined : i;\n }\n }\n return str;\n };\n\n ///////////////\n // String map\n //////////////\n\n // Safari < 3.0\n var oldSafariMap = {\n '1.0' : '/8',\n '1.2' : '/1',\n '1.3' : '/3',\n '2.0' : '/412',\n '2.0.2' : '/416',\n '2.0.3' : '/417',\n '2.0.4' : '/419',\n '?' : '/'\n },\n windowsVersionMap = {\n 'ME' : '4.90',\n 'NT 3.11' : 'NT3.51',\n 'NT 4.0' : 'NT4.0',\n '2000' : 'NT 5.0',\n 'XP' : ['NT 5.1', 'NT 5.2'],\n 'Vista' : 'NT 6.0',\n '7' : 'NT 6.1',\n '8' : 'NT 6.2',\n '8.1' : 'NT 6.3',\n '10' : ['NT 6.4', 'NT 10.0'],\n 'RT' : 'ARM'\n };\n\n //////////////\n // Regex map\n /////////////\n\n var regexes = {\n\n browser : [[\n\n /\\b(?:crmo|crios)\\/([\\w\\.]+)/i // Chrome for Android/iOS\n ], [VERSION, [NAME, 'Chrome']], [\n /edg(?:e|ios|a)?\\/([\\w\\.]+)/i // Microsoft Edge\n ], [VERSION, [NAME, 'Edge']], [\n\n // Presto based\n /(opera mini)\\/([-\\w\\.]+)/i, // Opera Mini\n /(opera [mobiletab]{3,6})\\b.+version\\/([-\\w\\.]+)/i, // Opera Mobi/Tablet\n /(opera)(?:.+version\\/|[\\/ ]+)([\\w\\.]+)/i // Opera\n ], [NAME, VERSION], [\n /opios[\\/ ]+([\\w\\.]+)/i // Opera mini on iphone >= 8.0\n ], [VERSION, [NAME, OPERA+' Mini']], [\n /\\bopr\\/([\\w\\.]+)/i // Opera Webkit\n ], [VERSION, [NAME, OPERA]], [\n\n // Mixed\n /(kindle)\\/([\\w\\.]+)/i, // Kindle\n /(lunascape|maxthon|netfront|jasmine|blazer)[\\/ ]?([\\w\\.]*)/i, // Lunascape/Maxthon/Netfront/Jasmine/Blazer\n // Trident based\n /(avant |iemobile|slim)(?:browser)?[\\/ ]?([\\w\\.]*)/i, // Avant/IEMobile/SlimBrowser\n /(ba?idubrowser)[\\/ ]?([\\w\\.]+)/i, // Baidu Browser\n /(?:ms|\\()(ie) ([\\w\\.]+)/i, // Internet Explorer\n\n // Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon\n /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon|rekonq|puffin|brave|whale|qqbrowserlite|qq)\\/([-\\w\\.]+)/i,\n // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ, aka ShouQ\n /(weibo)__([\\d\\.]+)/i // Weibo\n ], [NAME, VERSION], [\n /(?:\\buc? ?browser|(?:juc.+)ucweb)[\\/ ]?([\\w\\.]+)/i // UCBrowser\n ], [VERSION, [NAME, 'UC'+BROWSER]], [\n /\\bqbcore\\/([\\w\\.]+)/i // WeChat Desktop for Windows Built-in Browser\n ], [VERSION, [NAME, 'WeChat(Win) Desktop']], [\n /micromessenger\\/([\\w\\.]+)/i // WeChat\n ], [VERSION, [NAME, 'WeChat']], [\n /konqueror\\/([\\w\\.]+)/i // Konqueror\n ], [VERSION, [NAME, 'Konqueror']], [\n /trident.+rv[: ]([\\w\\.]{1,9})\\b.+like gecko/i // IE11\n ], [VERSION, [NAME, 'IE']], [\n /yabrowser\\/([\\w\\.]+)/i // Yandex\n ], [VERSION, [NAME, 'Yandex']], [\n /(avast|avg)\\/([\\w\\.]+)/i // Avast/AVG Secure Browser\n ], [[NAME, /(.+)/, '$1 Secure '+BROWSER], VERSION], [\n /\\bfocus\\/([\\w\\.]+)/i // Firefox Focus\n ], [VERSION, [NAME, FIREFOX+' Focus']], [\n /\\bopt\\/([\\w\\.]+)/i // Opera Touch\n ], [VERSION, [NAME, OPERA+' Touch']], [\n /coc_coc\\w+\\/([\\w\\.]+)/i // Coc Coc Browser\n ], [VERSION, [NAME, 'Coc Coc']], [\n /dolfin\\/([\\w\\.]+)/i // Dolphin\n ], [VERSION, [NAME, 'Dolphin']], [\n /coast\\/([\\w\\.]+)/i // Opera Coast\n ], [VERSION, [NAME, OPERA+' Coast']], [\n /miuibrowser\\/([\\w\\.]+)/i // MIUI Browser\n ], [VERSION, [NAME, 'MIUI '+BROWSER]], [\n /fxios\\/([-\\w\\.]+)/i // Firefox for iOS\n ], [VERSION, [NAME, FIREFOX]], [\n /\\bqihu|(qi?ho?o?|360)browser/i // 360\n ], [[NAME, '360 '+BROWSER]], [\n /(oculus|samsung|sailfish)browser\\/([\\w\\.]+)/i\n ], [[NAME, /(.+)/, '$1 '+BROWSER], VERSION], [ // Oculus/Samsung/Sailfish Browser\n /(comodo_dragon)\\/([\\w\\.]+)/i // Comodo Dragon\n ], [[NAME, /_/g, ' '], VERSION], [\n /(electron)\\/([\\w\\.]+) safari/i, // Electron-based App\n /(tesla)(?: qtcarbrowser|\\/(20\\d\\d\\.[-\\w\\.]+))/i, // Tesla\n /m?(qqbrowser|baiduboxapp|2345Explorer)[\\/ ]?([\\w\\.]+)/i // QQBrowser/Baidu App/2345 Browser\n ], [NAME, VERSION], [\n /(metasr)[\\/ ]?([\\w\\.]+)/i, // SouGouBrowser\n /(lbbrowser)/i // LieBao Browser\n ], [NAME], [\n\n // WebView\n /((?:fban\\/fbios|fb_iab\\/fb4a)(?!.+fbav)|;fbav\\/([\\w\\.]+);)/i // Facebook App for iOS & Android\n ], [[NAME, FACEBOOK], VERSION], [\n /safari (line)\\/([\\w\\.]+)/i, // Line App for iOS\n /\\b(line)\\/([\\w\\.]+)\\/iab/i, // Line App for Android\n /(chromium|instagram)[\\/ ]([-\\w\\.]+)/i // Chromium/Instagram\n ], [NAME, VERSION], [\n /\\bgsa\\/([\\w\\.]+) .*safari\\//i // Google Search Appliance on iOS\n ], [VERSION, [NAME, 'GSA']], [\n\n /headlesschrome(?:\\/([\\w\\.]+)| )/i // Chrome Headless\n ], [VERSION, [NAME, CHROME+' Headless']], [\n\n / wv\\).+(chrome)\\/([\\w\\.]+)/i // Chrome WebView\n ], [[NAME, CHROME+' WebView'], VERSION], [\n\n /droid.+ version\\/([\\w\\.]+)\\b.+(?:mobile safari|safari)/i // Android Browser\n ], [VERSION, [NAME, 'Android '+BROWSER]], [\n\n /(chrome|omniweb|arora|[tizenoka]{5} ?browser)\\/v?([\\w\\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia\n ], [NAME, VERSION], [\n\n /version\\/([\\w\\.]+) .*mobile\\/\\w+ (safari)/i // Mobile Safari\n ], [VERSION, [NAME, 'Mobile Safari']], [\n /version\\/([\\w\\.]+) .*(mobile ?safari|safari)/i // Safari & Safari Mobile\n ], [VERSION, NAME], [\n /webkit.+?(mobile ?safari|safari)(\\/[\\w\\.]+)/i // Safari < 3.0\n ], [NAME, [VERSION, strMapper, oldSafariMap]], [\n\n /(webkit|khtml)\\/([\\w\\.]+)/i\n ], [NAME, VERSION], [\n\n // Gecko based\n /(navigator|netscape\\d?)\\/([-\\w\\.]+)/i // Netscape\n ], [[NAME, 'Netscape'], VERSION], [\n /mobile vr; rv:([\\w\\.]+)\\).+firefox/i // Firefox Reality\n ], [VERSION, [NAME, FIREFOX+' Reality']], [\n /ekiohf.+(flow)\\/([\\w\\.]+)/i, // Flow\n /(swiftfox)/i, // Swiftfox\n /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror|klar)[\\/ ]?([\\w\\.\\+]+)/i,\n // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror/Klar\n /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\\/([-\\w\\.]+)$/i,\n // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix\n /(firefox)\\/([\\w\\.]+)/i, // Other Firefox-based\n /(mozilla)\\/([\\w\\.]+) .+rv\\:.+gecko\\/\\d+/i, // Mozilla\n\n // Other\n /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir|obigo|mosaic|(?:go|ice|up)[\\. ]?browser)[-\\/ ]?v?([\\w\\.]+)/i,\n // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Sleipnir/Obigo/Mosaic/Go/ICE/UP.Browser\n /(links) \\(([\\w\\.]+)/i // Links\n ], [NAME, VERSION]\n ],\n\n cpu : [[\n\n /(?:(amd|x(?:(?:86|64)[-_])?|wow|win)64)[;\\)]/i // AMD64 (x64)\n ], [[ARCHITECTURE, 'amd64']], [\n\n /(ia32(?=;))/i // IA32 (quicktime)\n ], [[ARCHITECTURE, lowerize]], [\n\n /((?:i[346]|x)86)[;\\)]/i // IA32 (x86)\n ], [[ARCHITECTURE, 'ia32']], [\n\n /\\b(aarch64|arm(v?8e?l?|_?64))\\b/i // ARM64\n ], [[ARCHITECTURE, 'arm64']], [\n\n /\\b(arm(?:v[67])?ht?n?[fl]p?)\\b/i // ARMHF\n ], [[ARCHITECTURE, 'armhf']], [\n\n // PocketPC mistakenly identified as PowerPC\n /windows (ce|mobile); ppc;/i\n ], [[ARCHITECTURE, 'arm']], [\n\n /((?:ppc|powerpc)(?:64)?)(?: mac|;|\\))/i // PowerPC\n ], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [\n\n /(sun4\\w)[;\\)]/i // SPARC\n ], [[ARCHITECTURE, 'sparc']], [\n\n /((?:avr32|ia64(?=;))|68k(?=\\))|\\barm(?=v(?:[1-7]|[5-7]1)l?|;|eabi)|(?=atmel )avr|(?:irix|mips|sparc)(?:64)?\\b|pa-risc)/i\n // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC\n ], [[ARCHITECTURE, lowerize]]\n ],\n\n device : [[\n\n //////////////////////////\n // MOBILES & TABLETS\n // Ordered by popularity\n /////////////////////////\n\n // Samsung\n /\\b(sch-i[89]0\\d|shw-m380s|sm-[pt]\\w{2,4}|gt-[pn]\\d{2,4}|sgh-t8[56]9|nexus 10)/i\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [\n /\\b((?:s[cgp]h|gt|sm)-\\w+|galaxy nexus)/i,\n /samsung[- ]([-\\w]+)/i,\n /sec-(sgh\\w+)/i\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [\n\n // Apple\n /\\((ip(?:hone|od)[\\w ]*);/i // iPod/iPhone\n ], [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]], [\n /\\((ipad);[-\\w\\),; ]+apple/i, // iPad\n /applecoremedia\\/[\\w\\.]+ \\((ipad)/i,\n /\\b(ipad)\\d\\d?,\\d\\d?[;\\]].+ios/i\n ], [MODEL, [VENDOR, APPLE], [TYPE, TABLET]], [\n\n // Huawei\n /\\b((?:ag[rs][23]?|bah2?|sht?|btv)-a?[lw]\\d{2})\\b(?!.+d\\/s)/i\n ], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [\n /(?:huawei|honor)([-\\w ]+)[;\\)]/i,\n /\\b(nexus 6p|\\w{2,4}-[atu]?[ln][01259x][012359][an]?)\\b(?!.+d\\/s)/i\n ], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [\n\n // Xiaomi\n /\\b(poco[\\w ]+)(?: bui|\\))/i, // Xiaomi POCO\n /\\b; (\\w+) build\\/hm\\1/i, // Xiaomi Hongmi 'numeric' models\n /\\b(hm[-_ ]?note?[_ ]?(?:\\d\\w)?) bui/i, // Xiaomi Hongmi\n /\\b(redmi[\\-_ ]?(?:note|k)?[\\w_ ]+)(?: bui|\\))/i, // Xiaomi Redmi\n /\\b(mi[-_ ]?(?:a\\d|one|one[_ ]plus|note lte|max)?[_ ]?(?:\\d?\\w?)[_ ]?(?:plus|se|lite)?)(?: bui|\\))/i // Xiaomi Mi\n ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [\n /\\b(mi[-_ ]?(?:pad)(?:[\\w_ ]+))(?: bui|\\))/i // Mi Pad tablets\n ],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [\n\n // OPPO\n /; (\\w+) bui.+ oppo/i,\n /\\b(cph[12]\\d{3}|p(?:af|c[al]|d\\w|e[ar])[mt]\\d0|x9007)\\b/i\n ], [MODEL, [VENDOR, 'OPPO'], [TYPE, MOBILE]], [\n\n // Vivo\n /vivo (\\w+)(?: bui|\\))/i,\n /\\b(v[12]\\d{3}\\w?[at])(?: bui|;)/i\n ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [\n\n // Realme\n /\\b(rmx[12]\\d{3})(?: bui|;|\\))/i\n ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [\n\n // Motorola\n /\\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\\b[\\w ]+build\\//i,\n /\\bmot(?:orola)?[- ](\\w*)/i,\n /((?:moto[\\w\\(\\) ]+|xt\\d{3,4}|nexus 6)(?= bui|\\)))/i\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]], [\n /\\b(mz60\\d|xoom[2 ]{0,2}) build\\//i\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]], [\n\n // LG\n /((?=lg)?[vl]k\\-?\\d{3}) bui| 3\\.[-\\w; ]{10}lg?-([06cv9]{3,4})/i\n ], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [\n /(lm(?:-?f100[nv]?|-[\\w\\.]+)(?= bui|\\))|nexus [45])/i,\n /\\blg[-e;\\/ ]+((?!browser|netcast|android tv)\\w+)/i,\n /\\blg-?([\\d\\w]+) bui/i\n ], [MODEL, [VENDOR, LG], [TYPE, MOBILE]], [\n\n // Lenovo\n /(ideatab[-\\w ]+)/i,\n /lenovo ?(s[56]000[-\\w]+|tab(?:[\\w ]+)|yt[-\\d\\w]{6}|tb[-\\d\\w]{6})/i\n ], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [\n\n // Nokia\n /(?:maemo|nokia).*(n900|lumia \\d+)/i,\n /nokia[-_ ]?([-\\w\\.]*)/i\n ], [[MODEL, /_/g, ' '], [VENDOR, 'Nokia'], [TYPE, MOBILE]], [\n\n // Google\n /(pixel c)\\b/i // Google Pixel C\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]], [\n /droid.+; (pixel[\\daxl ]{0,6})(?: bui|\\))/i // Google Pixel\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]], [\n\n // Sony\n /droid.+ ([c-g]\\d{4}|so[-gl]\\w+|xq-a\\w[4-7][12])(?= bui|\\).+chrome\\/(?![1-6]{0,1}\\d\\.))/i\n ], [MODEL, [VENDOR, SONY], [TYPE, MOBILE]], [\n /sony tablet [ps]/i,\n /\\b(?:sony)?sgp\\w+(?: bui|\\))/i\n ], [[MODEL, 'Xperia Tablet'], [VENDOR, SONY], [TYPE, TABLET]], [\n\n // OnePlus\n / (kb2005|in20[12]5|be20[12][59])\\b/i,\n /(?:one)?(?:plus)? (a\\d0\\d\\d)(?: b|\\))/i\n ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [\n\n // Amazon\n /(alexa)webm/i,\n /(kf[a-z]{2}wi)( bui|\\))/i, // Kindle Fire without Silk\n /(kf[a-z]+)( bui|\\)).+silk\\//i // Kindle Fire HD\n ], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [\n /((?:sd|kf)[0349hijorstuw]+)( bui|\\)).+silk\\//i // Fire Phone\n ], [[MODEL, /(.+)/g, 'Fire Phone $1'], [VENDOR, AMAZON], [TYPE, MOBILE]], [\n\n // BlackBerry\n /(playbook);[-\\w\\),; ]+(rim)/i // BlackBerry PlayBook\n ], [MODEL, VENDOR, [TYPE, TABLET]], [\n /\\b((?:bb[a-f]|st[hv])100-\\d)/i,\n /\\(bb10; (\\w+)/i // BlackBerry 10\n ], [MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]], [\n\n // Asus\n /(?:\\b|asus_)(transfo[prime ]{4,10} \\w+|eeepc|slider \\w+|nexus 7|padfone|p00[cj])/i\n ], [MODEL, [VENDOR, ASUS], [TYPE, TABLET]], [\n / (z[bes]6[027][012][km][ls]|zenfone \\d\\w?)\\b/i\n ], [MODEL, [VENDOR, ASUS], [TYPE, MOBILE]], [\n\n // HTC\n /(nexus 9)/i // HTC Nexus 9\n ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [\n /(htc)[-;_ ]{1,2}([\\w ]+(?=\\)| bui)|\\w+)/i, // HTC\n\n // ZTE\n /(zte)[- ]([\\w ]+?)(?: bui|\\/|\\))/i,\n /(alcatel|geeksphone|nexian|panasonic|sony)[-_ ]?([-\\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony\n ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [\n\n // Acer\n /droid.+; ([ab][1-7]-?[0178a]\\d\\d?)/i\n ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [\n\n // Meizu\n /droid.+; (m[1-5] note) bui/i,\n /\\bmz-([-\\w]{2,})/i\n ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [\n\n // Sharp\n /\\b(sh-?[altvz]?\\d\\d[a-ekm]?)/i\n ], [MODEL, [VENDOR, 'Sharp'], [TYPE, MOBILE]], [\n\n // MIXED\n /(blackberry|benq|palm(?=\\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[-_ ]?([-\\w]*)/i,\n // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron\n /(hp) ([\\w ]+\\w)/i, // HP iPAQ\n /(asus)-?(\\w+)/i, // Asus\n /(microsoft); (lumia[\\w ]+)/i, // Microsoft Lumia\n /(lenovo)[-_ ]?([-\\w]+)/i, // Lenovo\n /(jolla)/i, // Jolla\n /(oppo) ?([\\w ]+) bui/i // OPPO\n ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n\n /(archos) (gamepad2?)/i, // Archos\n /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad\n /(kindle)\\/([\\w\\.]+)/i, // Kindle\n /(nook)[\\w ]+build\\/(\\w+)/i, // Nook\n /(dell) (strea[kpr\\d ]*[\\dko])/i, // Dell Streak\n /(le[- ]+pan)[- ]+(\\w{1,9}) bui/i, // Le Pan Tablets\n /(trinity)[- ]*(t\\d{3}) bui/i, // Trinity Tablets\n /(gigaset)[- ]+(q\\w{1,9}) bui/i, // Gigaset Tablets\n /(vodafone) ([\\w ]+)(?:\\)| bui)/i // Vodafone\n ], [VENDOR, MODEL, [TYPE, TABLET]], [\n\n /(surface duo)/i // Surface Duo\n ], [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]], [\n /droid [\\d\\.]+; (fp\\du?)(?: b|\\))/i // Fairphone\n ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [\n /(u304aa)/i // AT&T\n ], [MODEL, [VENDOR, 'AT&T'], [TYPE, MOBILE]], [\n /\\bsie-(\\w*)/i // Siemens\n ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [\n /\\b(rct\\w+) b/i // RCA Tablets\n ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [\n /\\b(venue[\\d ]{2,7}) b/i // Dell Venue Tablets\n ], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [\n /\\b(q(?:mv|ta)\\w+) b/i // Verizon Tablet\n ], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [\n /\\b(?:barnes[& ]+noble |bn[rt])([\\w\\+ ]*) b/i // Barnes & Noble Tablet\n ], [MODEL, [VENDOR, 'Barnes & Noble'], [TYPE, TABLET]], [\n /\\b(tm\\d{3}\\w+) b/i\n ], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [\n /\\b(k88) b/i // ZTE K Series Tablet\n ], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [\n /\\b(nx\\d{3}j) b/i // ZTE Nubia\n ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [\n /\\b(gen\\d{3}) b.+49h/i // Swiss GEN Mobile\n ], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [\n /\\b(zur\\d{3}) b/i // Swiss ZUR Tablet\n ], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [\n /\\b((zeki)?tb.*\\b) b/i // Zeki Tablets\n ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [\n /\\b([yr]\\d{2}) b/i,\n /\\b(dragon[- ]+touch |dt)(\\w{5}) b/i // Dragon Touch Tablet\n ], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [\n /\\b(ns-?\\w{0,9}) b/i // Insignia Tablets\n ], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [\n /\\b((nxa|next)-?\\w{0,9}) b/i // NextBook Tablets\n ], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [\n /\\b(xtreme\\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i // Voice Xtreme Phones\n ], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [\n /\\b(lvtel\\-)?(v1[12]) b/i // LvTel Phones\n ], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [\n /\\b(ph-1) /i // Essential PH-1\n ], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [\n /\\b(v(100md|700na|7011|917g).*\\b) b/i // Envizen Tablets\n ], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [\n /\\b(trio[-\\w\\. ]+) b/i // MachSpeed Tablets\n ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [\n /\\btu_(1491) b/i // Rotor Tablets\n ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [\n /(shield[\\w ]+) b/i // Nvidia Shield Tablets\n ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, TABLET]], [\n /(sprint) (\\w+)/i // Sprint Phones\n ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n /(kin\\.[onetw]{3})/i // Microsoft Kin\n ], [[MODEL, /\\./g, ' '], [VENDOR, MICROSOFT], [TYPE, MOBILE]], [\n /droid.+; (cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\\)/i // Zebra\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]], [\n /droid.+; (ec30|ps20|tc[2-8]\\d[kx])\\)/i\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]], [\n\n ///////////////////\n // CONSOLES\n ///////////////////\n\n /(ouya)/i, // Ouya\n /(nintendo) ([wids3utch]+)/i // Nintendo\n ], [VENDOR, MODEL, [TYPE, CONSOLE]], [\n /droid.+; (shield) bui/i // Nvidia\n ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [\n /(playstation [345portablevi]+)/i // Playstation\n ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [\n /\\b(xbox(?: one)?(?!; xbox))[\\); ]/i // Microsoft Xbox\n ], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [\n\n ///////////////////\n // SMARTTVS\n ///////////////////\n\n /smart-tv.+(samsung)/i // Samsung\n ], [VENDOR, [TYPE, SMARTTV]], [\n /hbbtv.+maple;(\\d+)/i\n ], [[MODEL, /^/, 'SmartTV'], [VENDOR, SAMSUNG], [TYPE, SMARTTV]], [\n /(nux; netcast.+smarttv|lg (netcast\\.tv-201\\d|android tv))/i // LG SmartTV\n ], [[VENDOR, LG], [TYPE, SMARTTV]], [\n /(apple) ?tv/i // Apple TV\n ], [VENDOR, [MODEL, APPLE+' TV'], [TYPE, SMARTTV]], [\n /crkey/i // Google Chromecast\n ], [[MODEL, CHROME+'cast'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /droid.+aft(\\w)( bui|\\))/i // Fire TV\n ], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [\n /\\(dtv[\\);].+(aquos)/i // Sharp\n ], [MODEL, [VENDOR, 'Sharp'], [TYPE, SMARTTV]], [\n /\\b(roku)[\\dx]*[\\)\\/]((?:dvp-)?[\\d\\.]*)/i, // Roku\n /hbbtv\\/\\d+\\.\\d+\\.\\d+ +\\([\\w ]*; *(\\w[^;]*);([^;]*)/i // HbbTV devices\n ], [[VENDOR, trim], [MODEL, trim], [TYPE, SMARTTV]], [\n /\\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\\b/i // SmartTV from Unidentified Vendors\n ], [[TYPE, SMARTTV]], [\n\n ///////////////////\n // WEARABLES\n ///////////////////\n\n /((pebble))app/i // Pebble\n ], [VENDOR, MODEL, [TYPE, WEARABLE]], [\n /droid.+; (glass) \\d/i // Google Glass\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, WEARABLE]], [\n /droid.+; (wt63?0{2,3})\\)/i\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]], [\n /(quest( 2)?)/i // Oculus Quest\n ], [MODEL, [VENDOR, FACEBOOK], [TYPE, WEARABLE]], [\n\n ///////////////////\n // EMBEDDED\n ///////////////////\n\n /(tesla)(?: qtcarbrowser|\\/[-\\w\\.]+)/i // Tesla\n ], [VENDOR, [TYPE, EMBEDDED]], [\n\n ////////////////////\n // MIXED (GENERIC)\n ///////////////////\n\n /droid .+?; ([^;]+?)(?: bui|\\) applew).+? mobile safari/i // Android Phones from Unidentified Vendors\n ], [MODEL, [TYPE, MOBILE]], [\n /droid .+?; ([^;]+?)(?: bui|\\) applew).+?(?! mobile) safari/i // Android Tablets from Unidentified Vendors\n ], [MODEL, [TYPE, TABLET]], [\n /\\b((tablet|tab)[;\\/]|focus\\/\\d(?!.+mobile))/i // Unidentifiable Tablet\n ], [[TYPE, TABLET]], [\n /(phone|mobile(?:[;\\/]| safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile\n ], [[TYPE, MOBILE]], [\n /(android[-\\w\\. ]{0,9});.+buil/i // Generic Android Device\n ], [MODEL, [VENDOR, 'Generic']]\n ],\n\n engine : [[\n\n /windows.+ edge\\/([\\w\\.]+)/i // EdgeHTML\n ], [VERSION, [NAME, EDGE+'HTML']], [\n\n /webkit\\/537\\.36.+chrome\\/(?!27)([\\w\\.]+)/i // Blink\n ], [VERSION, [NAME, 'Blink']], [\n\n /(presto)\\/([\\w\\.]+)/i, // Presto\n /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\\/([\\w\\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna\n /ekioh(flow)\\/([\\w\\.]+)/i, // Flow\n /(khtml|tasman|links)[\\/ ]\\(?([\\w\\.]+)/i, // KHTML/Tasman/Links\n /(icab)[\\/ ]([23]\\.[\\d\\.]+)/i // iCab\n ], [NAME, VERSION], [\n\n /rv\\:([\\w\\.]{1,9})\\b.+(gecko)/i // Gecko\n ], [VERSION, NAME]\n ],\n\n os : [[\n\n // Windows\n /microsoft (windows) (vista|xp)/i // Windows (iTunes)\n ], [NAME, VERSION], [\n /(windows) nt 6\\.2; (arm)/i, // Windows RT\n /(windows (?:phone(?: os)?|mobile))[\\/ ]?([\\d\\.\\w ]*)/i, // Windows Phone\n /(windows)[\\/ ]?([ntce\\d\\. ]+\\w)(?!.+xbox)/i\n ], [NAME, [VERSION, strMapper, windowsVersionMap]], [\n /(win(?=3|9|n)|win 9x )([nt\\d\\.]+)/i\n ], [[NAME, 'Windows'], [VERSION, strMapper, windowsVersionMap]], [\n\n // iOS/macOS\n /ip[honead]{2,4}\\b(?:.*os ([\\w]+) like mac|; opera)/i, // iOS\n /cfnetwork\\/.+darwin/i\n ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [\n /(mac os x) ?([\\w\\. ]*)/i,\n /(macintosh|mac_powerpc\\b)(?!.+haiku)/i // Mac OS\n ], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [\n\n // Mobile OSes\n /droid ([\\w\\.]+)\\b.+(android[- ]x86)/i // Android-x86\n ], [VERSION, NAME], [ // Android/WebOS/QNX/Bada/RIM/Maemo/MeeGo/Sailfish OS\n /(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish)[-\\/ ]?([\\w\\.]*)/i,\n /(blackberry)\\w*\\/([\\w\\.]*)/i, // Blackberry\n /(tizen|kaios)[\\/ ]([\\w\\.]+)/i, // Tizen/KaiOS\n /\\((series40);/i // Series 40\n ], [NAME, VERSION], [\n /\\(bb(10);/i // BlackBerry 10\n ], [VERSION, [NAME, BLACKBERRY]], [\n /(?:symbian ?os|symbos|s60(?=;)|series60)[-\\/ ]?([\\w\\.]*)/i // Symbian\n ], [VERSION, [NAME, 'Symbian']], [\n /mozilla\\/[\\d\\.]+ \\((?:mobile|tablet|tv|mobile; [\\w ]+); rv:.+ gecko\\/([\\w\\.]+)/i // Firefox OS\n ], [VERSION, [NAME, FIREFOX+' OS']], [\n /web0s;.+rt(tv)/i,\n /\\b(?:hp)?wos(?:browser)?\\/([\\w\\.]+)/i // WebOS\n ], [VERSION, [NAME, 'webOS']], [\n\n // Google Chromecast\n /crkey\\/([\\d\\.]+)/i // Google Chromecast\n ], [VERSION, [NAME, CHROME+'cast']], [\n /(cros) [\\w]+ ([\\w\\.]+\\w)/i // Chromium OS\n ], [[NAME, 'Chromium OS'], VERSION],[\n\n // Console\n /(nintendo|playstation) ([wids345portablevuch]+)/i, // Nintendo/Playstation\n /(xbox); +xbox ([^\\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)\n\n // Other\n /\\b(joli|palm)\\b ?(?:os)?\\/?([\\w\\.]*)/i, // Joli/Palm\n /(mint)[\\/\\(\\) ]?(\\w*)/i, // Mint\n /(mageia|vectorlinux)[; ]/i, // Mageia/VectorLinux\n /([kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?= linux)|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire)(?: gnu\\/linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\\/ ]?(?!chrom|package)([-\\w\\.]*)/i,\n // Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire\n /(hurd|linux) ?([\\w\\.]*)/i, // Hurd/Linux\n /(gnu) ?([\\w\\.]*)/i, // GNU\n /\\b([-frentopcghs]{0,5}bsd|dragonfly)[\\/ ]?(?!amd|[ix346]{1,2}86)([\\w\\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly\n /(haiku) (\\w+)/i // Haiku\n ], [NAME, VERSION], [\n /(sunos) ?([\\w\\.\\d]*)/i // Solaris\n ], [[NAME, 'Solaris'], VERSION], [\n /((?:open)?solaris)[-\\/ ]?([\\w\\.]*)/i, // Solaris\n /(aix) ((\\d)(?=\\.|\\)| )[\\w\\.])*/i, // AIX\n /\\b(beos|os\\/2|amigaos|morphos|openvms|fuchsia|hp-ux)/i, // BeOS/OS2/AmigaOS/MorphOS/OpenVMS/Fuchsia/HP-UX\n /(unix) ?([\\w\\.]*)/i // UNIX\n ], [NAME, VERSION]\n ]\n };\n\n /////////////////\n // Constructor\n ////////////////\n\n var UAParser = function (ua, extensions) {\n\n if (typeof ua === OBJ_TYPE) {\n extensions = ua;\n ua = undefined;\n }\n\n if (!(this instanceof UAParser)) {\n return new UAParser(ua, extensions).getResult();\n }\n\n var _ua = ua || ((typeof window !== UNDEF_TYPE && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);\n var _rgxmap = extensions ? extend(regexes, extensions) : regexes;\n\n this.getBrowser = function () {\n var _browser = {};\n _browser[NAME] = undefined;\n _browser[VERSION] = undefined;\n rgxMapper.call(_browser, _ua, _rgxmap.browser);\n _browser.major = majorize(_browser.version);\n return _browser;\n };\n this.getCPU = function () {\n var _cpu = {};\n _cpu[ARCHITECTURE] = undefined;\n rgxMapper.call(_cpu, _ua, _rgxmap.cpu);\n return _cpu;\n };\n this.getDevice = function () {\n var _device = {};\n _device[VENDOR] = undefined;\n _device[MODEL] = undefined;\n _device[TYPE] = undefined;\n rgxMapper.call(_device, _ua, _rgxmap.device);\n return _device;\n };\n this.getEngine = function () {\n var _engine = {};\n _engine[NAME] = undefined;\n _engine[VERSION] = undefined;\n rgxMapper.call(_engine, _ua, _rgxmap.engine);\n return _engine;\n };\n this.getOS = function () {\n var _os = {};\n _os[NAME] = undefined;\n _os[VERSION] = undefined;\n rgxMapper.call(_os, _ua, _rgxmap.os);\n return _os;\n };\n this.getResult = function () {\n return {\n ua : this.getUA(),\n browser : this.getBrowser(),\n engine : this.getEngine(),\n os : this.getOS(),\n device : this.getDevice(),\n cpu : this.getCPU()\n };\n };\n this.getUA = function () {\n return _ua;\n };\n this.setUA = function (ua) {\n _ua = (typeof ua === STR_TYPE && ua.length > UA_MAX_LENGTH) ? trim(ua, UA_MAX_LENGTH) : ua;\n return this;\n };\n this.setUA(_ua);\n return this;\n };\n\n UAParser.VERSION = LIBVERSION;\n UAParser.BROWSER = enumerize([NAME, VERSION, MAJOR]);\n UAParser.CPU = enumerize([ARCHITECTURE]);\n UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);\n UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]);\n\n ///////////\n // Export\n //////////\n\n // check js environment\n if (typeof(exports) !== UNDEF_TYPE) {\n // nodejs env\n if (typeof module !== UNDEF_TYPE && module.exports) {\n exports = module.exports = UAParser;\n }\n exports.UAParser = UAParser;\n } else {\n // requirejs env (optional)\n if (typeof(define) === FUNC_TYPE && define.amd) {\n define(function () {\n return UAParser;\n });\n } else if (typeof window !== UNDEF_TYPE) {\n // browser env\n window.UAParser = UAParser;\n }\n }\n\n // jQuery/Zepto specific (optional)\n // Note:\n // In AMD env the global scope should be kept clean, but jQuery is an exception.\n // jQuery always exports to global scope, unless jQuery.noConflict(true) is used,\n // and we should catch that.\n var $ = typeof window !== UNDEF_TYPE && (window.jQuery || window.Zepto);\n if ($ && !$.ua) {\n var parser = new UAParser();\n $.ua = parser.getResult();\n $.ua.get = function () {\n return parser.getUA();\n };\n $.ua.set = function (ua) {\n parser.setUA(ua);\n var result = parser.getResult();\n for (var prop in result) {\n $.ua[prop] = result[prop];\n }\n };\n }\n\n})(typeof window === 'object' ? window : this);\n","/* globals __webpack_amd_options__ */\nmodule.exports = __webpack_amd_options__;\n","/* eslint-disable strict */\n\n/**\n * JavaScript code to detect available availability of a\n * particular font in a browser using JavaScript and CSS.\n *\n * Author : Lalit Patel\n * Website: http://www.lalit.org/lab/javascript-css-font-detect/\n * License: Apache Software License 2.0\n * http://www.apache.org/licenses/LICENSE-2.0\n * Version: 0.15 (21 Sep 2009)\n * Changed comparision font to default from sans-default-default,\n * as in FF3.0 font of child element didn't fallback\n * to parent element if the font is missing.\n * Version: 0.2 (04 Mar 2012)\n * Comparing font against all the 3 generic font families ie,\n * 'monospace', 'sans-serif' and 'sans'. If it doesn't match all 3\n * then that font is 100% not available in the system\n * Version: 0.3 (24 Mar 2012)\n * Replaced sans with serif in the list of baseFonts\n */\n\n/**\n * Usage: d = new Detector();\n * d.detect('font name');\n */\nmodule.exports = function Detector() {\n // a font will be compared against all the three default fonts.\n // and if it doesn't match all 3 then that font is not available.\n var baseFonts = ['monospace', 'sans-serif', 'serif'];\n\n //we use m or w because these two characters take up the maximum width.\n // And we use a LLi so that the same matching fonts can get separated\n var testString = \"mmmmmmmmmmlli\";\n\n //we test using 72px font size, we may use any size. I guess larger the better.\n var testSize = '72px';\n\n var h = document.getElementsByTagName(\"body\")[0];\n\n // create a SPAN in the document to get the width of the text we use to test\n var s = document.createElement(\"span\");\n s.style.fontSize = testSize;\n s.innerHTML = testString;\n var defaultWidth = {};\n var defaultHeight = {};\n for (var index in baseFonts) {\n //get the default width for the three base fonts\n s.style.fontFamily = baseFonts[index];\n h.appendChild(s);\n defaultWidth[baseFonts[index]] = s.offsetWidth; //width for the default font\n defaultHeight[baseFonts[index]] = s.offsetHeight; //height for the defualt font\n h.removeChild(s);\n }\n\n function detect(font) {\n var detected = false;\n for (var index in baseFonts) {\n s.style.fontFamily = font + ',' + baseFonts[index]; // name of the font along with the base font for fallback.\n h.appendChild(s);\n var matched = (s.offsetWidth != defaultWidth[baseFonts[index]] || s.offsetHeight != defaultHeight[baseFonts[index]]);\n h.removeChild(s);\n detected = detected || matched;\n }\n return detected;\n }\n\n this.detect = detect;\n};\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/client.flash.min.js b/dist/client.flash.min.js new file mode 100644 index 0000000..16b544c --- /dev/null +++ b/dist/client.flash.min.js @@ -0,0 +1,6 @@ +!function(e,i){if("object"==typeof exports&&"object"==typeof module)module.exports=i();else if("function"==typeof define&&define.amd)define([],i);else{var t=i();for(var n in t)("object"==typeof exports?exports:e)[n]=t[n]}}(this,(function(){return function(e){var i={};function t(n){if(i[n])return i[n].exports;var r=i[n]={i:n,l:!1,exports:{}};return e[n].call(r.exports,r,r.exports,t),r.l=!0,r.exports}return t.m=e,t.c=i,t.d=function(e,i,n){t.o(e,i)||Object.defineProperty(e,i,{enumerable:!0,get:n})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,i){if(1&i&&(e=t(e)),8&i)return e;if(4&i&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(t.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&i&&"string"!=typeof e)for(var r in e)t.d(n,r,function(i){return e[i]}.bind(null,r));return n},t.n=function(e){var i=e&&e.__esModule?function(){return e["default"]}:function(){return e};return t.d(i,"a",i),i},t.o=function(e,i){return Object.prototype.hasOwnProperty.call(e,i)},t.p="",t(t.s=13)}([function(e,i,t){"use strict";var n,r,o=t(1)(),a=t(3),s=t(4),l=t(6),u=function(){var e=new s;return n=e.getResult(),r=new l,this};u.prototype={getSoftwareVersion:function(){return"0.1.11"},getBrowserData:function(){return n},getFingerprint:function(){var e="|",i=n.ua,t=this.getScreenPrint(),r=this.getPlugins(),o=this.getFonts(),s=this.isLocalStorage(),l=this.isSessionStorage(),u=this.getTimeZone(),c=this.getLanguage(),d=this.getSystemLanguage(),f=this.isCookie(),p=this.getCanvasPrint();return a(i+e+t+e+r+e+o+e+s+e+l+e+u+e+c+e+d+e+f+e+p,256)},getCustomFingerprint:function(){for(var e="|",i="",t=0;t>>16)*a&65535)<<16)&4294967295)<<15|l>>>17))*s+(((l>>>16)*s&65535)<<16)&4294967295)<<13|r>>>19))+((5*(r>>>16)&65535)<<16)&4294967295))+((58964+(o>>>16)&65535)<<16);switch(l=0,t){case 3:l^=(255&e.charCodeAt(u+2))<<16;case 2:l^=(255&e.charCodeAt(u+1))<<8;case 1:r^=l=(65535&(l=(l=(65535&(l^=255&e.charCodeAt(u)))*a+(((l>>>16)*a&65535)<<16)&4294967295)<<15|l>>>17))*s+(((l>>>16)*s&65535)<<16)&4294967295}return r^=e.length,r=2246822507*(65535&(r^=r>>>16))+((2246822507*(r>>>16)&65535)<<16)&4294967295,r=3266489909*(65535&(r^=r>>>13))+((3266489909*(r>>>16)&65535)<<16)&4294967295,(r^=r>>>16)>>>0}},function(e,i,t){var n;!function(r,o){"use strict";var a="function",s="undefined",l="object",u="string",c="model",d="name",f="type",p="vendor",b="version",m="architecture",w="console",g="mobile",h="tablet",v="smarttv",y="wearable",S="embedded",C="Amazon",x="Apple",k="ASUS",M="BlackBerry",T="Firefox",P="Google",A="Huawei",B="LG",E="Microsoft",L="Motorola",N="Opera",U="Samsung",j="Sony",O="Xiaomi",I="Zebra",F="Facebook",R=function(e){var i={};for(var t in e)i[e[t].toUpperCase()]=e[t];return i},G=function(e,i){return typeof e===u&&-1!==D(i).indexOf(D(e))},D=function(e){return e.toLowerCase()},_=function(e,i){if(typeof e===u)return e=e.replace(/^\s\s*/,"").replace(/\s\s*$/,""),typeof i===s?e:e.substring(0,255)},V=function(e,i){for(var t,n,r,s,u,c,d=0;d0?2==s.length?typeof s[1]==a?this[s[0]]=s[1].call(this,c):this[s[0]]=s[1]:3==s.length?typeof s[1]!==a||s[1].exec&&s[1].test?this[s[0]]=c?c.replace(s[1],s[2]):o:this[s[0]]=c?s[1].call(this,c,s[2]):o:4==s.length&&(this[s[0]]=c?s[3].call(this,c.replace(s[1],s[2])):o):this[s]=c||o;d+=2}},z=function(e,i){for(var t in i)if(typeof i[t]===l&&i[t].length>0){for(var n=0;n255?_(e,255):e,this},this.setUA(t),this};H.VERSION="0.7.30",H.BROWSER=R([d,b,"major"]),H.CPU=R([m]),H.DEVICE=R([c,p,f,w,g,v,h,y,S]),H.ENGINE=H.OS=R([d,b]),typeof i!==s?(typeof e!==s&&e.exports&&(i=e.exports=H),i.UAParser=H):t(5)?(n=function(){return H}.call(i,t,i,e))===o||(e.exports=n):typeof r!==s&&(r.UAParser=H);var $=typeof r!==s&&(r.jQuery||r.Zepto);if($&&!$.ua){var K=new H;$.ua=K.getResult(),$.ua.get=function(){return K.getUA()},$.ua.set=function(e){K.setUA(e);var i=K.getResult();for(var t in i)$.ua[t]=i[t]}}}("object"==typeof window?window:this)},function(e,i){(function(i){e.exports=i}).call(this,{})},function(e,i){e.exports=function(){var e=["monospace","sans-serif","serif"],i=document.getElementsByTagName("body")[0],t=document.createElement("span");t.style.fontSize="72px",t.innerHTML="mmmmmmmmmmlli";var n={},r={};for(var o in e)t.style.fontFamily=e[o],i.appendChild(t),n[e[o]]=t.offsetWidth,r[e[o]]=t.offsetHeight,i.removeChild(t);this.detect=function(o){var a=!1;for(var s in e){t.style.fontFamily=o+","+e[s],i.appendChild(t);var l=t.offsetWidth!=n[e[s]]||t.offsetHeight!=r[e[s]];i.removeChild(t),a=a||l}return a}}},function(e,i){"function"==typeof Object.create?e.exports=function(e,i){i&&(e.super_=i,e.prototype=Object.create(i.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:e.exports=function(e,i){if(i){e.super_=i;var t=function(){};t.prototype=i.prototype,e.prototype=new t,e.prototype.constructor=e}}},,,function(e,i,t){"use strict";var n=t(11);e.exports=function(){if(this.isFlash()){var e=n.getFlashPlayerVersion();return e.major+"."+e.minor+"."+e.release}return""}},function(e,i){ +/*! SWFObject v2.3.20130521 + is released under the MIT License +*/ +var t,n,r,o,a,s,l="undefined",u="object",c="Shockwave Flash",d="application/x-shockwave-flash",f="SWFObjectExprInst",p="onreadystatechange",b=window,m=document,w=navigator,g=!1,h=[],v=[],y=[],S=[],C=!1,x=!1,k=!0,M=!1,T=function(){var e=typeof m.getElementById!==l&&typeof m.getElementsByTagName!==l&&typeof m.createElement!==l,i=w.userAgent.toLowerCase(),t=w.platform.toLowerCase(),n=/win/.test(t||i),r=/mac/.test(t||i),o=!!/webkit/.test(i)&&parseFloat(i.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")),a="Microsoft Internet Explorer"===w.appName,s=[0,0,0],f=null;if(typeof w.plugins!==l&&typeof w.plugins[c]===u)(f=w.plugins[c].description)&&typeof w.mimeTypes!==l&&w.mimeTypes[d]&&w.mimeTypes[d].enabledPlugin&&(g=!0,a=!1,f=f.replace(/^.*\s+(\S+\s+\S+$)/,"$1"),s[0]=V(f.replace(/^(.*)\..*$/,"$1")),s[1]=V(f.replace(/^.*\.(.*)\s.*$/,"$1")),s[2]=/[a-zA-Z]/.test(f)?V(f.replace(/^.*[a-zA-Z]+(.*)$/,"$1")):0);else if(typeof b.ActiveXObject!==l)try{var p=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");p&&(f=p.GetVariable("$version"))&&(a=!0,s=[V((f=f.split(" ")[1].split(","))[0]),V(f[1]),V(f[2])])}catch(h){}return{w3:e,pv:s,wk:o,ie:a,win:n,mac:r}}();function P(){if(!C&&document.getElementsByTagName("body")[0]){try{var e,i=_("span");i.style.display="none",(e=m.getElementsByTagName("body")[0].appendChild(i)).parentNode.removeChild(e),e=null,i=null}catch(r){return}C=!0;for(var t=h.length,n=0;n0)for(var i=0;i0){var o=D(t);if(o)if(!z(v[i].swfVersion)||T.wk&&T.wk<312)if(v[i].expressInstall&&L()){var a={};a.data=v[i].expressInstall,a.width=o.getAttribute("width")||"0",a.height=o.getAttribute("height")||"0",o.getAttribute("class")&&(a.styleclass=o.getAttribute("class")),o.getAttribute("align")&&(a.align=o.getAttribute("align"));for(var s={},u=o.getElementsByTagName("param"),c=u.length,d=0;d"+o+"",b=a.firstChild),e)Object.prototype.hasOwnProperty.call(e,c)&&("styleclass"===(f=c.toLowerCase())?b.setAttribute("class",e[c]):"classid"!==f&&"data"!==f&&b.setAttribute(c,e[c]));T.ie?y[y.length]=e.id:(b.setAttribute("type",d),b.setAttribute("data",e.data)),s.parentNode.replaceChild(b,s),n=b}return n}function I(e,i,t){var n=_("param");n.setAttribute("name",i),n.setAttribute("value",t),e.appendChild(n)}function F(e){var i=D(e);i&&"OBJECT"===i.nodeName.toUpperCase()&&(T.ie?(i.style.display="none",function t(){if(4==i.readyState){for(var e in i)"function"==typeof i[e]&&(i[e]=null);i.parentNode.removeChild(i)}else setTimeout(t,10)}()):i.parentNode.removeChild(i))}function R(e){return e&&e.nodeType&&1===e.nodeType}function G(e){return R(e)?e.id:e}function D(e){if(R(e))return e;var i=null;try{i=m.getElementById(e)}catch(t){}return i}function _(e){return m.createElement(e)}function V(e){return parseInt(e,10)}function z(e){e+="";var i=T.pv,t=e.split(".");return t[0]=V(t[0]),t[1]=V(t[1])||0,t[2]=V(t[2])||0,i[0]>t[0]||i[0]==t[0]&&i[1]>t[1]||i[0]==t[0]&&i[1]==t[1]&&i[2]>=t[2]}function W(e,i,t,n){var r=m.getElementsByTagName("head")[0];if(r){var o="string"==typeof t?t:"screen";if(n&&(a=null,s=null),!a||s!=o){var u=_("style");u.setAttribute("type","text/css"),u.setAttribute("media",o),a=r.appendChild(u),T.ie&&typeof m.styleSheets!==l&&m.styleSheets.length>0&&(a=m.styleSheets[m.styleSheets.length-1]),s=o}a&&(typeof a.addRule!==l?a.addRule(e,i):typeof m.createTextNode!==l&&a.appendChild(m.createTextNode(e+" {"+i+"}")))}}function q(e,i){if(k){var t=i?"visible":"hidden",n=D(e);C&&n?n.style.visibility=t:"string"==typeof e&&W("#"+e,"visibility:"+t)}}function H(e){return null!==/[\\"<>.;]/.exec(e)&&typeof encodeURIComponent!==l?encodeURIComponent(e):e}T.w3&&((typeof m.readyState!==l&&("complete"===m.readyState||"interactive"===m.readyState)||typeof m.readyState===l&&(m.getElementsByTagName("body")[0]||m.body))&&P(),C||(typeof m.addEventListener!==l&&m.addEventListener("DOMContentLoaded",P,!1),T.ie&&(m.attachEvent(p,(function K(){"complete"===m.readyState&&(m.detachEvent(p,K),P())})),b==top&&function J(){if(!C){try{m.documentElement.doScroll("left")}catch(e){return void setTimeout(J,0)}P()}}()),T.wk&&function X(){C||(/loaded|complete/.test(m.readyState)?P():setTimeout(X,0))}())),h[0]=function(){g?function(){var e=m.getElementsByTagName("body")[0],i=_(u);i.setAttribute("style","visibility: hidden;"),i.setAttribute("type",d);var t=e.appendChild(i);if(t){var n=0;!function r(){if(typeof t.GetVariable!==l)try{var o=t.GetVariable("$version");o&&(o=o.split(" ")[1].split(","),T.pv=[V(o[0]),V(o[1]),V(o[2])])}catch(a){T.pv=[8,0,0]}else if(n<10)return n++,void setTimeout(r,10);e.removeChild(i),t=null,B()}()}else B()}():B()},T.ie&&window.attachEvent("onunload",(function(){for(var e=S.length,i=0;iGary Court\n * @see http://github.com/garycourt/murmurhash-js\n * @author Austin Appleby\n * @see http://sites.google.com/site/murmurhash/\n * \n * @param {string} key ASCII only\n * @param {number} seed Positive integer only\n * @return {number} 32-bit positive integer hash \n */\n\nfunction murmurhash3_32_gc(key, seed) {\n\tvar remainder, bytes, h1, h1b, c1, c1b, c2, c2b, k1, i;\n\t\n\tremainder = key.length & 3; // key.length % 4\n\tbytes = key.length - remainder;\n\th1 = seed;\n\tc1 = 0xcc9e2d51;\n\tc2 = 0x1b873593;\n\ti = 0;\n\t\n\twhile (i < bytes) {\n\t \tk1 = \n\t \t ((key.charCodeAt(i) & 0xff)) |\n\t \t ((key.charCodeAt(++i) & 0xff) << 8) |\n\t \t ((key.charCodeAt(++i) & 0xff) << 16) |\n\t \t ((key.charCodeAt(++i) & 0xff) << 24);\n\t\t++i;\n\t\t\n\t\tk1 = ((((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16))) & 0xffffffff;\n\t\tk1 = (k1 << 15) | (k1 >>> 17);\n\t\tk1 = ((((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16))) & 0xffffffff;\n\n\t\th1 ^= k1;\n h1 = (h1 << 13) | (h1 >>> 19);\n\t\th1b = ((((h1 & 0xffff) * 5) + ((((h1 >>> 16) * 5) & 0xffff) << 16))) & 0xffffffff;\n\t\th1 = (((h1b & 0xffff) + 0x6b64) + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16));\n\t}\n\t\n\tk1 = 0;\n\t\n\tswitch (remainder) {\n\t\tcase 3: k1 ^= (key.charCodeAt(i + 2) & 0xff) << 16;\n\t\tcase 2: k1 ^= (key.charCodeAt(i + 1) & 0xff) << 8;\n\t\tcase 1: k1 ^= (key.charCodeAt(i) & 0xff);\n\t\t\n\t\tk1 = (((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff;\n\t\tk1 = (k1 << 15) | (k1 >>> 17);\n\t\tk1 = (((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff;\n\t\th1 ^= k1;\n\t}\n\t\n\th1 ^= key.length;\n\n\th1 ^= h1 >>> 16;\n\th1 = (((h1 & 0xffff) * 0x85ebca6b) + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff;\n\th1 ^= h1 >>> 13;\n\th1 = ((((h1 & 0xffff) * 0xc2b2ae35) + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16))) & 0xffffffff;\n\th1 ^= h1 >>> 16;\n\n\treturn h1 >>> 0;\n}\n\nif(typeof module !== \"undefined\") {\n module.exports = murmurhash3_32_gc\n}","/////////////////////////////////////////////////////////////////////////////////\n/* UAParser.js v0.7.28\n Copyright © 2012-2021 Faisal Salman \n MIT License *//*\n Detect Browser, Engine, OS, CPU, and Device type/model from User-Agent data.\n Supports browser & node.js environment. \n Demo : https://faisalman.github.io/ua-parser-js\n Source : https://github.com/faisalman/ua-parser-js */\n/////////////////////////////////////////////////////////////////////////////////\n\n(function (window, undefined) {\n\n 'use strict';\n\n //////////////\n // Constants\n /////////////\n\n\n var LIBVERSION = '0.7.30',\n EMPTY = '',\n UNKNOWN = '?',\n FUNC_TYPE = 'function',\n UNDEF_TYPE = 'undefined',\n OBJ_TYPE = 'object',\n STR_TYPE = 'string',\n MAJOR = 'major',\n MODEL = 'model',\n NAME = 'name',\n TYPE = 'type',\n VENDOR = 'vendor',\n VERSION = 'version',\n ARCHITECTURE= 'architecture',\n CONSOLE = 'console',\n MOBILE = 'mobile',\n TABLET = 'tablet',\n SMARTTV = 'smarttv',\n WEARABLE = 'wearable',\n EMBEDDED = 'embedded',\n UA_MAX_LENGTH = 255;\n\n var AMAZON = 'Amazon',\n APPLE = 'Apple',\n ASUS = 'ASUS',\n BLACKBERRY = 'BlackBerry',\n BROWSER = 'Browser',\n CHROME = 'Chrome',\n EDGE = 'Edge',\n FIREFOX = 'Firefox',\n GOOGLE = 'Google',\n HUAWEI = 'Huawei',\n LG = 'LG',\n MICROSOFT = 'Microsoft',\n MOTOROLA = 'Motorola',\n OPERA = 'Opera',\n SAMSUNG = 'Samsung',\n SONY = 'Sony',\n XIAOMI = 'Xiaomi',\n ZEBRA = 'Zebra',\n FACEBOOK = 'Facebook';\n\n ///////////\n // Helper\n //////////\n\n var extend = function (regexes, extensions) {\n var mergedRegexes = {};\n for (var i in regexes) {\n if (extensions[i] && extensions[i].length % 2 === 0) {\n mergedRegexes[i] = extensions[i].concat(regexes[i]);\n } else {\n mergedRegexes[i] = regexes[i];\n }\n }\n return mergedRegexes;\n },\n enumerize = function (arr) {\n var enums = {};\n for (var i in arr) {\n enums[arr[i].toUpperCase()] = arr[i];\n }\n return enums;\n },\n has = function (str1, str2) {\n return typeof str1 === STR_TYPE ? lowerize(str2).indexOf(lowerize(str1)) !== -1 : false;\n },\n lowerize = function (str) {\n return str.toLowerCase();\n },\n majorize = function (version) {\n return typeof(version) === STR_TYPE ? version.replace(/[^\\d\\.]/g, EMPTY).split('.')[0] : undefined;\n },\n trim = function (str, len) {\n if (typeof(str) === STR_TYPE) {\n str = str.replace(/^\\s\\s*/, EMPTY).replace(/\\s\\s*$/, EMPTY);\n return typeof(len) === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);\n }\n };\n\n ///////////////\n // Map helper\n //////////////\n\n var rgxMapper = function (ua, arrays) {\n\n var i = 0, j, k, p, q, matches, match;\n\n // loop through all regexes maps\n while (i < arrays.length && !matches) {\n\n var regex = arrays[i], // even sequence (0,2,4,..)\n props = arrays[i + 1]; // odd sequence (1,3,5,..)\n j = k = 0;\n\n // try matching uastring with regexes\n while (j < regex.length && !matches) {\n\n matches = regex[j++].exec(ua);\n\n if (!!matches) {\n for (p = 0; p < props.length; p++) {\n match = matches[++k];\n q = props[p];\n // check if given property is actually array\n if (typeof q === OBJ_TYPE && q.length > 0) {\n if (q.length == 2) {\n if (typeof q[1] == FUNC_TYPE) {\n // assign modified match\n this[q[0]] = q[1].call(this, match);\n } else {\n // assign given value, ignore regex match\n this[q[0]] = q[1];\n }\n } else if (q.length == 3) {\n // check whether function or regex\n if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {\n // call function (usually string mapper)\n this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;\n } else {\n // sanitize match using given regex\n this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;\n }\n } else if (q.length == 4) {\n this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;\n }\n } else {\n this[q] = match ? match : undefined;\n }\n }\n }\n }\n i += 2;\n }\n },\n\n strMapper = function (str, map) {\n\n for (var i in map) {\n // check if current value is array\n if (typeof map[i] === OBJ_TYPE && map[i].length > 0) {\n for (var j = 0; j < map[i].length; j++) {\n if (has(map[i][j], str)) {\n return (i === UNKNOWN) ? undefined : i;\n }\n }\n } else if (has(map[i], str)) {\n return (i === UNKNOWN) ? undefined : i;\n }\n }\n return str;\n };\n\n ///////////////\n // String map\n //////////////\n\n // Safari < 3.0\n var oldSafariMap = {\n '1.0' : '/8',\n '1.2' : '/1',\n '1.3' : '/3',\n '2.0' : '/412',\n '2.0.2' : '/416',\n '2.0.3' : '/417',\n '2.0.4' : '/419',\n '?' : '/'\n },\n windowsVersionMap = {\n 'ME' : '4.90',\n 'NT 3.11' : 'NT3.51',\n 'NT 4.0' : 'NT4.0',\n '2000' : 'NT 5.0',\n 'XP' : ['NT 5.1', 'NT 5.2'],\n 'Vista' : 'NT 6.0',\n '7' : 'NT 6.1',\n '8' : 'NT 6.2',\n '8.1' : 'NT 6.3',\n '10' : ['NT 6.4', 'NT 10.0'],\n 'RT' : 'ARM'\n };\n\n //////////////\n // Regex map\n /////////////\n\n var regexes = {\n\n browser : [[\n\n /\\b(?:crmo|crios)\\/([\\w\\.]+)/i // Chrome for Android/iOS\n ], [VERSION, [NAME, 'Chrome']], [\n /edg(?:e|ios|a)?\\/([\\w\\.]+)/i // Microsoft Edge\n ], [VERSION, [NAME, 'Edge']], [\n\n // Presto based\n /(opera mini)\\/([-\\w\\.]+)/i, // Opera Mini\n /(opera [mobiletab]{3,6})\\b.+version\\/([-\\w\\.]+)/i, // Opera Mobi/Tablet\n /(opera)(?:.+version\\/|[\\/ ]+)([\\w\\.]+)/i // Opera\n ], [NAME, VERSION], [\n /opios[\\/ ]+([\\w\\.]+)/i // Opera mini on iphone >= 8.0\n ], [VERSION, [NAME, OPERA+' Mini']], [\n /\\bopr\\/([\\w\\.]+)/i // Opera Webkit\n ], [VERSION, [NAME, OPERA]], [\n\n // Mixed\n /(kindle)\\/([\\w\\.]+)/i, // Kindle\n /(lunascape|maxthon|netfront|jasmine|blazer)[\\/ ]?([\\w\\.]*)/i, // Lunascape/Maxthon/Netfront/Jasmine/Blazer\n // Trident based\n /(avant |iemobile|slim)(?:browser)?[\\/ ]?([\\w\\.]*)/i, // Avant/IEMobile/SlimBrowser\n /(ba?idubrowser)[\\/ ]?([\\w\\.]+)/i, // Baidu Browser\n /(?:ms|\\()(ie) ([\\w\\.]+)/i, // Internet Explorer\n\n // Webkit/KHTML based // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon\n /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon|rekonq|puffin|brave|whale|qqbrowserlite|qq)\\/([-\\w\\.]+)/i,\n // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ, aka ShouQ\n /(weibo)__([\\d\\.]+)/i // Weibo\n ], [NAME, VERSION], [\n /(?:\\buc? ?browser|(?:juc.+)ucweb)[\\/ ]?([\\w\\.]+)/i // UCBrowser\n ], [VERSION, [NAME, 'UC'+BROWSER]], [\n /\\bqbcore\\/([\\w\\.]+)/i // WeChat Desktop for Windows Built-in Browser\n ], [VERSION, [NAME, 'WeChat(Win) Desktop']], [\n /micromessenger\\/([\\w\\.]+)/i // WeChat\n ], [VERSION, [NAME, 'WeChat']], [\n /konqueror\\/([\\w\\.]+)/i // Konqueror\n ], [VERSION, [NAME, 'Konqueror']], [\n /trident.+rv[: ]([\\w\\.]{1,9})\\b.+like gecko/i // IE11\n ], [VERSION, [NAME, 'IE']], [\n /yabrowser\\/([\\w\\.]+)/i // Yandex\n ], [VERSION, [NAME, 'Yandex']], [\n /(avast|avg)\\/([\\w\\.]+)/i // Avast/AVG Secure Browser\n ], [[NAME, /(.+)/, '$1 Secure '+BROWSER], VERSION], [\n /\\bfocus\\/([\\w\\.]+)/i // Firefox Focus\n ], [VERSION, [NAME, FIREFOX+' Focus']], [\n /\\bopt\\/([\\w\\.]+)/i // Opera Touch\n ], [VERSION, [NAME, OPERA+' Touch']], [\n /coc_coc\\w+\\/([\\w\\.]+)/i // Coc Coc Browser\n ], [VERSION, [NAME, 'Coc Coc']], [\n /dolfin\\/([\\w\\.]+)/i // Dolphin\n ], [VERSION, [NAME, 'Dolphin']], [\n /coast\\/([\\w\\.]+)/i // Opera Coast\n ], [VERSION, [NAME, OPERA+' Coast']], [\n /miuibrowser\\/([\\w\\.]+)/i // MIUI Browser\n ], [VERSION, [NAME, 'MIUI '+BROWSER]], [\n /fxios\\/([-\\w\\.]+)/i // Firefox for iOS\n ], [VERSION, [NAME, FIREFOX]], [\n /\\bqihu|(qi?ho?o?|360)browser/i // 360\n ], [[NAME, '360 '+BROWSER]], [\n /(oculus|samsung|sailfish)browser\\/([\\w\\.]+)/i\n ], [[NAME, /(.+)/, '$1 '+BROWSER], VERSION], [ // Oculus/Samsung/Sailfish Browser\n /(comodo_dragon)\\/([\\w\\.]+)/i // Comodo Dragon\n ], [[NAME, /_/g, ' '], VERSION], [\n /(electron)\\/([\\w\\.]+) safari/i, // Electron-based App\n /(tesla)(?: qtcarbrowser|\\/(20\\d\\d\\.[-\\w\\.]+))/i, // Tesla\n /m?(qqbrowser|baiduboxapp|2345Explorer)[\\/ ]?([\\w\\.]+)/i // QQBrowser/Baidu App/2345 Browser\n ], [NAME, VERSION], [\n /(metasr)[\\/ ]?([\\w\\.]+)/i, // SouGouBrowser\n /(lbbrowser)/i // LieBao Browser\n ], [NAME], [\n\n // WebView\n /((?:fban\\/fbios|fb_iab\\/fb4a)(?!.+fbav)|;fbav\\/([\\w\\.]+);)/i // Facebook App for iOS & Android\n ], [[NAME, FACEBOOK], VERSION], [\n /safari (line)\\/([\\w\\.]+)/i, // Line App for iOS\n /\\b(line)\\/([\\w\\.]+)\\/iab/i, // Line App for Android\n /(chromium|instagram)[\\/ ]([-\\w\\.]+)/i // Chromium/Instagram\n ], [NAME, VERSION], [\n /\\bgsa\\/([\\w\\.]+) .*safari\\//i // Google Search Appliance on iOS\n ], [VERSION, [NAME, 'GSA']], [\n\n /headlesschrome(?:\\/([\\w\\.]+)| )/i // Chrome Headless\n ], [VERSION, [NAME, CHROME+' Headless']], [\n\n / wv\\).+(chrome)\\/([\\w\\.]+)/i // Chrome WebView\n ], [[NAME, CHROME+' WebView'], VERSION], [\n\n /droid.+ version\\/([\\w\\.]+)\\b.+(?:mobile safari|safari)/i // Android Browser\n ], [VERSION, [NAME, 'Android '+BROWSER]], [\n\n /(chrome|omniweb|arora|[tizenoka]{5} ?browser)\\/v?([\\w\\.]+)/i // Chrome/OmniWeb/Arora/Tizen/Nokia\n ], [NAME, VERSION], [\n\n /version\\/([\\w\\.]+) .*mobile\\/\\w+ (safari)/i // Mobile Safari\n ], [VERSION, [NAME, 'Mobile Safari']], [\n /version\\/([\\w\\.]+) .*(mobile ?safari|safari)/i // Safari & Safari Mobile\n ], [VERSION, NAME], [\n /webkit.+?(mobile ?safari|safari)(\\/[\\w\\.]+)/i // Safari < 3.0\n ], [NAME, [VERSION, strMapper, oldSafariMap]], [\n\n /(webkit|khtml)\\/([\\w\\.]+)/i\n ], [NAME, VERSION], [\n\n // Gecko based\n /(navigator|netscape\\d?)\\/([-\\w\\.]+)/i // Netscape\n ], [[NAME, 'Netscape'], VERSION], [\n /mobile vr; rv:([\\w\\.]+)\\).+firefox/i // Firefox Reality\n ], [VERSION, [NAME, FIREFOX+' Reality']], [\n /ekiohf.+(flow)\\/([\\w\\.]+)/i, // Flow\n /(swiftfox)/i, // Swiftfox\n /(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror|klar)[\\/ ]?([\\w\\.\\+]+)/i,\n // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror/Klar\n /(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\\/([-\\w\\.]+)$/i,\n // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix\n /(firefox)\\/([\\w\\.]+)/i, // Other Firefox-based\n /(mozilla)\\/([\\w\\.]+) .+rv\\:.+gecko\\/\\d+/i, // Mozilla\n\n // Other\n /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir|obigo|mosaic|(?:go|ice|up)[\\. ]?browser)[-\\/ ]?v?([\\w\\.]+)/i,\n // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Sleipnir/Obigo/Mosaic/Go/ICE/UP.Browser\n /(links) \\(([\\w\\.]+)/i // Links\n ], [NAME, VERSION]\n ],\n\n cpu : [[\n\n /(?:(amd|x(?:(?:86|64)[-_])?|wow|win)64)[;\\)]/i // AMD64 (x64)\n ], [[ARCHITECTURE, 'amd64']], [\n\n /(ia32(?=;))/i // IA32 (quicktime)\n ], [[ARCHITECTURE, lowerize]], [\n\n /((?:i[346]|x)86)[;\\)]/i // IA32 (x86)\n ], [[ARCHITECTURE, 'ia32']], [\n\n /\\b(aarch64|arm(v?8e?l?|_?64))\\b/i // ARM64\n ], [[ARCHITECTURE, 'arm64']], [\n\n /\\b(arm(?:v[67])?ht?n?[fl]p?)\\b/i // ARMHF\n ], [[ARCHITECTURE, 'armhf']], [\n\n // PocketPC mistakenly identified as PowerPC\n /windows (ce|mobile); ppc;/i\n ], [[ARCHITECTURE, 'arm']], [\n\n /((?:ppc|powerpc)(?:64)?)(?: mac|;|\\))/i // PowerPC\n ], [[ARCHITECTURE, /ower/, EMPTY, lowerize]], [\n\n /(sun4\\w)[;\\)]/i // SPARC\n ], [[ARCHITECTURE, 'sparc']], [\n\n /((?:avr32|ia64(?=;))|68k(?=\\))|\\barm(?=v(?:[1-7]|[5-7]1)l?|;|eabi)|(?=atmel )avr|(?:irix|mips|sparc)(?:64)?\\b|pa-risc)/i\n // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC\n ], [[ARCHITECTURE, lowerize]]\n ],\n\n device : [[\n\n //////////////////////////\n // MOBILES & TABLETS\n // Ordered by popularity\n /////////////////////////\n\n // Samsung\n /\\b(sch-i[89]0\\d|shw-m380s|sm-[pt]\\w{2,4}|gt-[pn]\\d{2,4}|sgh-t8[56]9|nexus 10)/i\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, TABLET]], [\n /\\b((?:s[cgp]h|gt|sm)-\\w+|galaxy nexus)/i,\n /samsung[- ]([-\\w]+)/i,\n /sec-(sgh\\w+)/i\n ], [MODEL, [VENDOR, SAMSUNG], [TYPE, MOBILE]], [\n\n // Apple\n /\\((ip(?:hone|od)[\\w ]*);/i // iPod/iPhone\n ], [MODEL, [VENDOR, APPLE], [TYPE, MOBILE]], [\n /\\((ipad);[-\\w\\),; ]+apple/i, // iPad\n /applecoremedia\\/[\\w\\.]+ \\((ipad)/i,\n /\\b(ipad)\\d\\d?,\\d\\d?[;\\]].+ios/i\n ], [MODEL, [VENDOR, APPLE], [TYPE, TABLET]], [\n\n // Huawei\n /\\b((?:ag[rs][23]?|bah2?|sht?|btv)-a?[lw]\\d{2})\\b(?!.+d\\/s)/i\n ], [MODEL, [VENDOR, HUAWEI], [TYPE, TABLET]], [\n /(?:huawei|honor)([-\\w ]+)[;\\)]/i,\n /\\b(nexus 6p|\\w{2,4}-[atu]?[ln][01259x][012359][an]?)\\b(?!.+d\\/s)/i\n ], [MODEL, [VENDOR, HUAWEI], [TYPE, MOBILE]], [\n\n // Xiaomi\n /\\b(poco[\\w ]+)(?: bui|\\))/i, // Xiaomi POCO\n /\\b; (\\w+) build\\/hm\\1/i, // Xiaomi Hongmi 'numeric' models\n /\\b(hm[-_ ]?note?[_ ]?(?:\\d\\w)?) bui/i, // Xiaomi Hongmi\n /\\b(redmi[\\-_ ]?(?:note|k)?[\\w_ ]+)(?: bui|\\))/i, // Xiaomi Redmi\n /\\b(mi[-_ ]?(?:a\\d|one|one[_ ]plus|note lte|max)?[_ ]?(?:\\d?\\w?)[_ ]?(?:plus|se|lite)?)(?: bui|\\))/i // Xiaomi Mi\n ], [[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, MOBILE]], [\n /\\b(mi[-_ ]?(?:pad)(?:[\\w_ ]+))(?: bui|\\))/i // Mi Pad tablets\n ],[[MODEL, /_/g, ' '], [VENDOR, XIAOMI], [TYPE, TABLET]], [\n\n // OPPO\n /; (\\w+) bui.+ oppo/i,\n /\\b(cph[12]\\d{3}|p(?:af|c[al]|d\\w|e[ar])[mt]\\d0|x9007)\\b/i\n ], [MODEL, [VENDOR, 'OPPO'], [TYPE, MOBILE]], [\n\n // Vivo\n /vivo (\\w+)(?: bui|\\))/i,\n /\\b(v[12]\\d{3}\\w?[at])(?: bui|;)/i\n ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [\n\n // Realme\n /\\b(rmx[12]\\d{3})(?: bui|;|\\))/i\n ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [\n\n // Motorola\n /\\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\\b[\\w ]+build\\//i,\n /\\bmot(?:orola)?[- ](\\w*)/i,\n /((?:moto[\\w\\(\\) ]+|xt\\d{3,4}|nexus 6)(?= bui|\\)))/i\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, MOBILE]], [\n /\\b(mz60\\d|xoom[2 ]{0,2}) build\\//i\n ], [MODEL, [VENDOR, MOTOROLA], [TYPE, TABLET]], [\n\n // LG\n /((?=lg)?[vl]k\\-?\\d{3}) bui| 3\\.[-\\w; ]{10}lg?-([06cv9]{3,4})/i\n ], [MODEL, [VENDOR, LG], [TYPE, TABLET]], [\n /(lm(?:-?f100[nv]?|-[\\w\\.]+)(?= bui|\\))|nexus [45])/i,\n /\\blg[-e;\\/ ]+((?!browser|netcast|android tv)\\w+)/i,\n /\\blg-?([\\d\\w]+) bui/i\n ], [MODEL, [VENDOR, LG], [TYPE, MOBILE]], [\n\n // Lenovo\n /(ideatab[-\\w ]+)/i,\n /lenovo ?(s[56]000[-\\w]+|tab(?:[\\w ]+)|yt[-\\d\\w]{6}|tb[-\\d\\w]{6})/i\n ], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [\n\n // Nokia\n /(?:maemo|nokia).*(n900|lumia \\d+)/i,\n /nokia[-_ ]?([-\\w\\.]*)/i\n ], [[MODEL, /_/g, ' '], [VENDOR, 'Nokia'], [TYPE, MOBILE]], [\n\n // Google\n /(pixel c)\\b/i // Google Pixel C\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, TABLET]], [\n /droid.+; (pixel[\\daxl ]{0,6})(?: bui|\\))/i // Google Pixel\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, MOBILE]], [\n\n // Sony\n /droid.+ ([c-g]\\d{4}|so[-gl]\\w+|xq-a\\w[4-7][12])(?= bui|\\).+chrome\\/(?![1-6]{0,1}\\d\\.))/i\n ], [MODEL, [VENDOR, SONY], [TYPE, MOBILE]], [\n /sony tablet [ps]/i,\n /\\b(?:sony)?sgp\\w+(?: bui|\\))/i\n ], [[MODEL, 'Xperia Tablet'], [VENDOR, SONY], [TYPE, TABLET]], [\n\n // OnePlus\n / (kb2005|in20[12]5|be20[12][59])\\b/i,\n /(?:one)?(?:plus)? (a\\d0\\d\\d)(?: b|\\))/i\n ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [\n\n // Amazon\n /(alexa)webm/i,\n /(kf[a-z]{2}wi)( bui|\\))/i, // Kindle Fire without Silk\n /(kf[a-z]+)( bui|\\)).+silk\\//i // Kindle Fire HD\n ], [MODEL, [VENDOR, AMAZON], [TYPE, TABLET]], [\n /((?:sd|kf)[0349hijorstuw]+)( bui|\\)).+silk\\//i // Fire Phone\n ], [[MODEL, /(.+)/g, 'Fire Phone $1'], [VENDOR, AMAZON], [TYPE, MOBILE]], [\n\n // BlackBerry\n /(playbook);[-\\w\\),; ]+(rim)/i // BlackBerry PlayBook\n ], [MODEL, VENDOR, [TYPE, TABLET]], [\n /\\b((?:bb[a-f]|st[hv])100-\\d)/i,\n /\\(bb10; (\\w+)/i // BlackBerry 10\n ], [MODEL, [VENDOR, BLACKBERRY], [TYPE, MOBILE]], [\n\n // Asus\n /(?:\\b|asus_)(transfo[prime ]{4,10} \\w+|eeepc|slider \\w+|nexus 7|padfone|p00[cj])/i\n ], [MODEL, [VENDOR, ASUS], [TYPE, TABLET]], [\n / (z[bes]6[027][012][km][ls]|zenfone \\d\\w?)\\b/i\n ], [MODEL, [VENDOR, ASUS], [TYPE, MOBILE]], [\n\n // HTC\n /(nexus 9)/i // HTC Nexus 9\n ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [\n /(htc)[-;_ ]{1,2}([\\w ]+(?=\\)| bui)|\\w+)/i, // HTC\n\n // ZTE\n /(zte)[- ]([\\w ]+?)(?: bui|\\/|\\))/i,\n /(alcatel|geeksphone|nexian|panasonic|sony)[-_ ]?([-\\w]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony\n ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [\n\n // Acer\n /droid.+; ([ab][1-7]-?[0178a]\\d\\d?)/i\n ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [\n\n // Meizu\n /droid.+; (m[1-5] note) bui/i,\n /\\bmz-([-\\w]{2,})/i\n ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [\n\n // Sharp\n /\\b(sh-?[altvz]?\\d\\d[a-ekm]?)/i\n ], [MODEL, [VENDOR, 'Sharp'], [TYPE, MOBILE]], [\n\n // MIXED\n /(blackberry|benq|palm(?=\\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[-_ ]?([-\\w]*)/i,\n // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron\n /(hp) ([\\w ]+\\w)/i, // HP iPAQ\n /(asus)-?(\\w+)/i, // Asus\n /(microsoft); (lumia[\\w ]+)/i, // Microsoft Lumia\n /(lenovo)[-_ ]?([-\\w]+)/i, // Lenovo\n /(jolla)/i, // Jolla\n /(oppo) ?([\\w ]+) bui/i // OPPO\n ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n\n /(archos) (gamepad2?)/i, // Archos\n /(hp).+(touchpad(?!.+tablet)|tablet)/i, // HP TouchPad\n /(kindle)\\/([\\w\\.]+)/i, // Kindle\n /(nook)[\\w ]+build\\/(\\w+)/i, // Nook\n /(dell) (strea[kpr\\d ]*[\\dko])/i, // Dell Streak\n /(le[- ]+pan)[- ]+(\\w{1,9}) bui/i, // Le Pan Tablets\n /(trinity)[- ]*(t\\d{3}) bui/i, // Trinity Tablets\n /(gigaset)[- ]+(q\\w{1,9}) bui/i, // Gigaset Tablets\n /(vodafone) ([\\w ]+)(?:\\)| bui)/i // Vodafone\n ], [VENDOR, MODEL, [TYPE, TABLET]], [\n\n /(surface duo)/i // Surface Duo\n ], [MODEL, [VENDOR, MICROSOFT], [TYPE, TABLET]], [\n /droid [\\d\\.]+; (fp\\du?)(?: b|\\))/i // Fairphone\n ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [\n /(u304aa)/i // AT&T\n ], [MODEL, [VENDOR, 'AT&T'], [TYPE, MOBILE]], [\n /\\bsie-(\\w*)/i // Siemens\n ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [\n /\\b(rct\\w+) b/i // RCA Tablets\n ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [\n /\\b(venue[\\d ]{2,7}) b/i // Dell Venue Tablets\n ], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [\n /\\b(q(?:mv|ta)\\w+) b/i // Verizon Tablet\n ], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [\n /\\b(?:barnes[& ]+noble |bn[rt])([\\w\\+ ]*) b/i // Barnes & Noble Tablet\n ], [MODEL, [VENDOR, 'Barnes & Noble'], [TYPE, TABLET]], [\n /\\b(tm\\d{3}\\w+) b/i\n ], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [\n /\\b(k88) b/i // ZTE K Series Tablet\n ], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [\n /\\b(nx\\d{3}j) b/i // ZTE Nubia\n ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [\n /\\b(gen\\d{3}) b.+49h/i // Swiss GEN Mobile\n ], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [\n /\\b(zur\\d{3}) b/i // Swiss ZUR Tablet\n ], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [\n /\\b((zeki)?tb.*\\b) b/i // Zeki Tablets\n ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [\n /\\b([yr]\\d{2}) b/i,\n /\\b(dragon[- ]+touch |dt)(\\w{5}) b/i // Dragon Touch Tablet\n ], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [\n /\\b(ns-?\\w{0,9}) b/i // Insignia Tablets\n ], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [\n /\\b((nxa|next)-?\\w{0,9}) b/i // NextBook Tablets\n ], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [\n /\\b(xtreme\\_)?(v(1[045]|2[015]|[3469]0|7[05])) b/i // Voice Xtreme Phones\n ], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [\n /\\b(lvtel\\-)?(v1[12]) b/i // LvTel Phones\n ], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [\n /\\b(ph-1) /i // Essential PH-1\n ], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [\n /\\b(v(100md|700na|7011|917g).*\\b) b/i // Envizen Tablets\n ], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [\n /\\b(trio[-\\w\\. ]+) b/i // MachSpeed Tablets\n ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [\n /\\btu_(1491) b/i // Rotor Tablets\n ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [\n /(shield[\\w ]+) b/i // Nvidia Shield Tablets\n ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, TABLET]], [\n /(sprint) (\\w+)/i // Sprint Phones\n ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n /(kin\\.[onetw]{3})/i // Microsoft Kin\n ], [[MODEL, /\\./g, ' '], [VENDOR, MICROSOFT], [TYPE, MOBILE]], [\n /droid.+; (cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\\)/i // Zebra\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, TABLET]], [\n /droid.+; (ec30|ps20|tc[2-8]\\d[kx])\\)/i\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, MOBILE]], [\n\n ///////////////////\n // CONSOLES\n ///////////////////\n\n /(ouya)/i, // Ouya\n /(nintendo) ([wids3utch]+)/i // Nintendo\n ], [VENDOR, MODEL, [TYPE, CONSOLE]], [\n /droid.+; (shield) bui/i // Nvidia\n ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [\n /(playstation [345portablevi]+)/i // Playstation\n ], [MODEL, [VENDOR, SONY], [TYPE, CONSOLE]], [\n /\\b(xbox(?: one)?(?!; xbox))[\\); ]/i // Microsoft Xbox\n ], [MODEL, [VENDOR, MICROSOFT], [TYPE, CONSOLE]], [\n\n ///////////////////\n // SMARTTVS\n ///////////////////\n\n /smart-tv.+(samsung)/i // Samsung\n ], [VENDOR, [TYPE, SMARTTV]], [\n /hbbtv.+maple;(\\d+)/i\n ], [[MODEL, /^/, 'SmartTV'], [VENDOR, SAMSUNG], [TYPE, SMARTTV]], [\n /(nux; netcast.+smarttv|lg (netcast\\.tv-201\\d|android tv))/i // LG SmartTV\n ], [[VENDOR, LG], [TYPE, SMARTTV]], [\n /(apple) ?tv/i // Apple TV\n ], [VENDOR, [MODEL, APPLE+' TV'], [TYPE, SMARTTV]], [\n /crkey/i // Google Chromecast\n ], [[MODEL, CHROME+'cast'], [VENDOR, GOOGLE], [TYPE, SMARTTV]], [\n /droid.+aft(\\w)( bui|\\))/i // Fire TV\n ], [MODEL, [VENDOR, AMAZON], [TYPE, SMARTTV]], [\n /\\(dtv[\\);].+(aquos)/i // Sharp\n ], [MODEL, [VENDOR, 'Sharp'], [TYPE, SMARTTV]], [\n /\\b(roku)[\\dx]*[\\)\\/]((?:dvp-)?[\\d\\.]*)/i, // Roku\n /hbbtv\\/\\d+\\.\\d+\\.\\d+ +\\([\\w ]*; *(\\w[^;]*);([^;]*)/i // HbbTV devices\n ], [[VENDOR, trim], [MODEL, trim], [TYPE, SMARTTV]], [\n /\\b(android tv|smart[- ]?tv|opera tv|tv; rv:)\\b/i // SmartTV from Unidentified Vendors\n ], [[TYPE, SMARTTV]], [\n\n ///////////////////\n // WEARABLES\n ///////////////////\n\n /((pebble))app/i // Pebble\n ], [VENDOR, MODEL, [TYPE, WEARABLE]], [\n /droid.+; (glass) \\d/i // Google Glass\n ], [MODEL, [VENDOR, GOOGLE], [TYPE, WEARABLE]], [\n /droid.+; (wt63?0{2,3})\\)/i\n ], [MODEL, [VENDOR, ZEBRA], [TYPE, WEARABLE]], [\n /(quest( 2)?)/i // Oculus Quest\n ], [MODEL, [VENDOR, FACEBOOK], [TYPE, WEARABLE]], [\n\n ///////////////////\n // EMBEDDED\n ///////////////////\n\n /(tesla)(?: qtcarbrowser|\\/[-\\w\\.]+)/i // Tesla\n ], [VENDOR, [TYPE, EMBEDDED]], [\n\n ////////////////////\n // MIXED (GENERIC)\n ///////////////////\n\n /droid .+?; ([^;]+?)(?: bui|\\) applew).+? mobile safari/i // Android Phones from Unidentified Vendors\n ], [MODEL, [TYPE, MOBILE]], [\n /droid .+?; ([^;]+?)(?: bui|\\) applew).+?(?! mobile) safari/i // Android Tablets from Unidentified Vendors\n ], [MODEL, [TYPE, TABLET]], [\n /\\b((tablet|tab)[;\\/]|focus\\/\\d(?!.+mobile))/i // Unidentifiable Tablet\n ], [[TYPE, TABLET]], [\n /(phone|mobile(?:[;\\/]| safari)|pda(?=.+windows ce))/i // Unidentifiable Mobile\n ], [[TYPE, MOBILE]], [\n /(android[-\\w\\. ]{0,9});.+buil/i // Generic Android Device\n ], [MODEL, [VENDOR, 'Generic']]\n ],\n\n engine : [[\n\n /windows.+ edge\\/([\\w\\.]+)/i // EdgeHTML\n ], [VERSION, [NAME, EDGE+'HTML']], [\n\n /webkit\\/537\\.36.+chrome\\/(?!27)([\\w\\.]+)/i // Blink\n ], [VERSION, [NAME, 'Blink']], [\n\n /(presto)\\/([\\w\\.]+)/i, // Presto\n /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\\/([\\w\\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna\n /ekioh(flow)\\/([\\w\\.]+)/i, // Flow\n /(khtml|tasman|links)[\\/ ]\\(?([\\w\\.]+)/i, // KHTML/Tasman/Links\n /(icab)[\\/ ]([23]\\.[\\d\\.]+)/i // iCab\n ], [NAME, VERSION], [\n\n /rv\\:([\\w\\.]{1,9})\\b.+(gecko)/i // Gecko\n ], [VERSION, NAME]\n ],\n\n os : [[\n\n // Windows\n /microsoft (windows) (vista|xp)/i // Windows (iTunes)\n ], [NAME, VERSION], [\n /(windows) nt 6\\.2; (arm)/i, // Windows RT\n /(windows (?:phone(?: os)?|mobile))[\\/ ]?([\\d\\.\\w ]*)/i, // Windows Phone\n /(windows)[\\/ ]?([ntce\\d\\. ]+\\w)(?!.+xbox)/i\n ], [NAME, [VERSION, strMapper, windowsVersionMap]], [\n /(win(?=3|9|n)|win 9x )([nt\\d\\.]+)/i\n ], [[NAME, 'Windows'], [VERSION, strMapper, windowsVersionMap]], [\n\n // iOS/macOS\n /ip[honead]{2,4}\\b(?:.*os ([\\w]+) like mac|; opera)/i, // iOS\n /cfnetwork\\/.+darwin/i\n ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [\n /(mac os x) ?([\\w\\. ]*)/i,\n /(macintosh|mac_powerpc\\b)(?!.+haiku)/i // Mac OS\n ], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [\n\n // Mobile OSes\n /droid ([\\w\\.]+)\\b.+(android[- ]x86)/i // Android-x86\n ], [VERSION, NAME], [ // Android/WebOS/QNX/Bada/RIM/Maemo/MeeGo/Sailfish OS\n /(android|webos|qnx|bada|rim tablet os|maemo|meego|sailfish)[-\\/ ]?([\\w\\.]*)/i,\n /(blackberry)\\w*\\/([\\w\\.]*)/i, // Blackberry\n /(tizen|kaios)[\\/ ]([\\w\\.]+)/i, // Tizen/KaiOS\n /\\((series40);/i // Series 40\n ], [NAME, VERSION], [\n /\\(bb(10);/i // BlackBerry 10\n ], [VERSION, [NAME, BLACKBERRY]], [\n /(?:symbian ?os|symbos|s60(?=;)|series60)[-\\/ ]?([\\w\\.]*)/i // Symbian\n ], [VERSION, [NAME, 'Symbian']], [\n /mozilla\\/[\\d\\.]+ \\((?:mobile|tablet|tv|mobile; [\\w ]+); rv:.+ gecko\\/([\\w\\.]+)/i // Firefox OS\n ], [VERSION, [NAME, FIREFOX+' OS']], [\n /web0s;.+rt(tv)/i,\n /\\b(?:hp)?wos(?:browser)?\\/([\\w\\.]+)/i // WebOS\n ], [VERSION, [NAME, 'webOS']], [\n\n // Google Chromecast\n /crkey\\/([\\d\\.]+)/i // Google Chromecast\n ], [VERSION, [NAME, CHROME+'cast']], [\n /(cros) [\\w]+ ([\\w\\.]+\\w)/i // Chromium OS\n ], [[NAME, 'Chromium OS'], VERSION],[\n\n // Console\n /(nintendo|playstation) ([wids345portablevuch]+)/i, // Nintendo/Playstation\n /(xbox); +xbox ([^\\);]+)/i, // Microsoft Xbox (360, One, X, S, Series X, Series S)\n\n // Other\n /\\b(joli|palm)\\b ?(?:os)?\\/?([\\w\\.]*)/i, // Joli/Palm\n /(mint)[\\/\\(\\) ]?(\\w*)/i, // Mint\n /(mageia|vectorlinux)[; ]/i, // Mageia/VectorLinux\n /([kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?= linux)|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire)(?: gnu\\/linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\\/ ]?(?!chrom|package)([-\\w\\.]*)/i,\n // Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware/Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus/Raspbian/Plan9/Minix/RISCOS/Contiki/Deepin/Manjaro/elementary/Sabayon/Linspire\n /(hurd|linux) ?([\\w\\.]*)/i, // Hurd/Linux\n /(gnu) ?([\\w\\.]*)/i, // GNU\n /\\b([-frentopcghs]{0,5}bsd|dragonfly)[\\/ ]?(?!amd|[ix346]{1,2}86)([\\w\\.]*)/i, // FreeBSD/NetBSD/OpenBSD/PC-BSD/GhostBSD/DragonFly\n /(haiku) (\\w+)/i // Haiku\n ], [NAME, VERSION], [\n /(sunos) ?([\\w\\.\\d]*)/i // Solaris\n ], [[NAME, 'Solaris'], VERSION], [\n /((?:open)?solaris)[-\\/ ]?([\\w\\.]*)/i, // Solaris\n /(aix) ((\\d)(?=\\.|\\)| )[\\w\\.])*/i, // AIX\n /\\b(beos|os\\/2|amigaos|morphos|openvms|fuchsia|hp-ux)/i, // BeOS/OS2/AmigaOS/MorphOS/OpenVMS/Fuchsia/HP-UX\n /(unix) ?([\\w\\.]*)/i // UNIX\n ], [NAME, VERSION]\n ]\n };\n\n /////////////////\n // Constructor\n ////////////////\n\n var UAParser = function (ua, extensions) {\n\n if (typeof ua === OBJ_TYPE) {\n extensions = ua;\n ua = undefined;\n }\n\n if (!(this instanceof UAParser)) {\n return new UAParser(ua, extensions).getResult();\n }\n\n var _ua = ua || ((typeof window !== UNDEF_TYPE && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);\n var _rgxmap = extensions ? extend(regexes, extensions) : regexes;\n\n this.getBrowser = function () {\n var _browser = {};\n _browser[NAME] = undefined;\n _browser[VERSION] = undefined;\n rgxMapper.call(_browser, _ua, _rgxmap.browser);\n _browser.major = majorize(_browser.version);\n return _browser;\n };\n this.getCPU = function () {\n var _cpu = {};\n _cpu[ARCHITECTURE] = undefined;\n rgxMapper.call(_cpu, _ua, _rgxmap.cpu);\n return _cpu;\n };\n this.getDevice = function () {\n var _device = {};\n _device[VENDOR] = undefined;\n _device[MODEL] = undefined;\n _device[TYPE] = undefined;\n rgxMapper.call(_device, _ua, _rgxmap.device);\n return _device;\n };\n this.getEngine = function () {\n var _engine = {};\n _engine[NAME] = undefined;\n _engine[VERSION] = undefined;\n rgxMapper.call(_engine, _ua, _rgxmap.engine);\n return _engine;\n };\n this.getOS = function () {\n var _os = {};\n _os[NAME] = undefined;\n _os[VERSION] = undefined;\n rgxMapper.call(_os, _ua, _rgxmap.os);\n return _os;\n };\n this.getResult = function () {\n return {\n ua : this.getUA(),\n browser : this.getBrowser(),\n engine : this.getEngine(),\n os : this.getOS(),\n device : this.getDevice(),\n cpu : this.getCPU()\n };\n };\n this.getUA = function () {\n return _ua;\n };\n this.setUA = function (ua) {\n _ua = (typeof ua === STR_TYPE && ua.length > UA_MAX_LENGTH) ? trim(ua, UA_MAX_LENGTH) : ua;\n return this;\n };\n this.setUA(_ua);\n return this;\n };\n\n UAParser.VERSION = LIBVERSION;\n UAParser.BROWSER = enumerize([NAME, VERSION, MAJOR]);\n UAParser.CPU = enumerize([ARCHITECTURE]);\n UAParser.DEVICE = enumerize([MODEL, VENDOR, TYPE, CONSOLE, MOBILE, SMARTTV, TABLET, WEARABLE, EMBEDDED]);\n UAParser.ENGINE = UAParser.OS = enumerize([NAME, VERSION]);\n\n ///////////\n // Export\n //////////\n\n // check js environment\n if (typeof(exports) !== UNDEF_TYPE) {\n // nodejs env\n if (typeof module !== UNDEF_TYPE && module.exports) {\n exports = module.exports = UAParser;\n }\n exports.UAParser = UAParser;\n } else {\n // requirejs env (optional)\n if (typeof(define) === FUNC_TYPE && define.amd) {\n define(function () {\n return UAParser;\n });\n } else if (typeof window !== UNDEF_TYPE) {\n // browser env\n window.UAParser = UAParser;\n }\n }\n\n // jQuery/Zepto specific (optional)\n // Note:\n // In AMD env the global scope should be kept clean, but jQuery is an exception.\n // jQuery always exports to global scope, unless jQuery.noConflict(true) is used,\n // and we should catch that.\n var $ = typeof window !== UNDEF_TYPE && (window.jQuery || window.Zepto);\n if ($ && !$.ua) {\n var parser = new UAParser();\n $.ua = parser.getResult();\n $.ua.get = function () {\n return parser.getUA();\n };\n $.ua.set = function (ua) {\n parser.setUA(ua);\n var result = parser.getResult();\n for (var prop in result) {\n $.ua[prop] = result[prop];\n }\n };\n }\n\n})(typeof window === 'object' ? window : this);\n","/* globals __webpack_amd_options__ */\nmodule.exports = __webpack_amd_options__;\n","/* eslint-disable strict */\n\n/**\n * JavaScript code to detect available availability of a\n * particular font in a browser using JavaScript and CSS.\n *\n * Author : Lalit Patel\n * Website: http://www.lalit.org/lab/javascript-css-font-detect/\n * License: Apache Software License 2.0\n * http://www.apache.org/licenses/LICENSE-2.0\n * Version: 0.15 (21 Sep 2009)\n * Changed comparision font to default from sans-default-default,\n * as in FF3.0 font of child element didn't fallback\n * to parent element if the font is missing.\n * Version: 0.2 (04 Mar 2012)\n * Comparing font against all the 3 generic font families ie,\n * 'monospace', 'sans-serif' and 'sans'. If it doesn't match all 3\n * then that font is 100% not available in the system\n * Version: 0.3 (24 Mar 2012)\n * Replaced sans with serif in the list of baseFonts\n */\n\n/**\n * Usage: d = new Detector();\n * d.detect('font name');\n */\nmodule.exports = function Detector() {\n // a font will be compared against all the three default fonts.\n // and if it doesn't match all 3 then that font is not available.\n var baseFonts = ['monospace', 'sans-serif', 'serif'];\n\n //we use m or w because these two characters take up the maximum width.\n // And we use a LLi so that the same matching fonts can get separated\n var testString = \"mmmmmmmmmmlli\";\n\n //we test using 72px font size, we may use any size. I guess larger the better.\n var testSize = '72px';\n\n var h = document.getElementsByTagName(\"body\")[0];\n\n // create a SPAN in the document to get the width of the text we use to test\n var s = document.createElement(\"span\");\n s.style.fontSize = testSize;\n s.innerHTML = testString;\n var defaultWidth = {};\n var defaultHeight = {};\n for (var index in baseFonts) {\n //get the default width for the three base fonts\n s.style.fontFamily = baseFonts[index];\n h.appendChild(s);\n defaultWidth[baseFonts[index]] = s.offsetWidth; //width for the default font\n defaultHeight[baseFonts[index]] = s.offsetHeight; //height for the defualt font\n h.removeChild(s);\n }\n\n function detect(font) {\n var detected = false;\n for (var index in baseFonts) {\n s.style.fontFamily = font + ',' + baseFonts[index]; // name of the font along with the base font for fallback.\n h.appendChild(s);\n var matched = (s.offsetWidth != defaultWidth[baseFonts[index]] || s.offsetHeight != defaultHeight[baseFonts[index]]);\n h.removeChild(s);\n detected = detected || matched;\n }\n return detected;\n }\n\n this.detect = detect;\n};\n","if (typeof Object.create === 'function') {\n // implementation from standard node.js 'util' module\n module.exports = function inherits(ctor, superCtor) {\n if (superCtor) {\n ctor.super_ = superCtor\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n })\n }\n };\n} else {\n // old school shim for old browsers\n module.exports = function inherits(ctor, superCtor) {\n if (superCtor) {\n ctor.super_ = superCtor\n var TempCtor = function () {}\n TempCtor.prototype = superCtor.prototype\n ctor.prototype = new TempCtor()\n ctor.prototype.constructor = ctor\n }\n }\n}\n","'use strict';\n\nvar swfobject = require('../vendor/swfobject');\n\n// Get Flash Version. Return a string containing the Flash Version.\nmodule.exports = function getFlashVersion() {\n if (this.isFlash()) {\n var objPlayerVersion = swfobject.getFlashPlayerVersion();\n return objPlayerVersion.major + '.' + objPlayerVersion.minor + '.' + objPlayerVersion.release;\n }\n return '';\n};\n","/*! SWFObject v2.3.20130521 \n is released under the MIT License \n*/\n\n/* global ActiveXObject: false */\n/* eslint-disable strict */\n\nvar UNDEF = \"undefined\",\n OBJECT = \"object\",\n SHOCKWAVE_FLASH = \"Shockwave Flash\",\n SHOCKWAVE_FLASH_AX = \"ShockwaveFlash.ShockwaveFlash\",\n FLASH_MIME_TYPE = \"application/x-shockwave-flash\",\n EXPRESS_INSTALL_ID = \"SWFObjectExprInst\",\n ON_READY_STATE_CHANGE = \"onreadystatechange\",\n\n win = window,\n doc = document,\n nav = navigator,\n\n plugin = false,\n domLoadFnArr = [],\n regObjArr = [],\n objIdArr = [],\n listenersArr = [],\n storedFbContent,\n storedFbContentId,\n storedCallbackFn,\n storedCallbackObj,\n isDomLoaded = false,\n isExpressInstallActive = false,\n dynamicStylesheet,\n dynamicStylesheetMedia,\n autoHideShow = true,\n encodeURIEnabled = false,\n\n/* Centralized function for browser feature detection\n - User agent string detection is only used when no good alternative is possible\n - Is executed directly for optimal performance\n*/\nua = function () {\n var w3cdom = typeof doc.getElementById !== UNDEF && typeof doc.getElementsByTagName !== UNDEF && typeof doc.createElement !== UNDEF,\n u = nav.userAgent.toLowerCase(),\n p = nav.platform.toLowerCase(),\n windows = p ? /win/.test(p) : /win/.test(u),\n mac = p ? /mac/.test(p) : /mac/.test(u),\n webkit = /webkit/.test(u) ? parseFloat(u.replace(/^.*webkit\\/(\\d+(\\.\\d+)?).*$/, \"$1\")) : false, // returns either the webkit version or false if not webkit\n ie = nav.appName === \"Microsoft Internet Explorer\",\n playerVersion = [0, 0, 0],\n d = null;\n if (typeof nav.plugins !== UNDEF && typeof nav.plugins[SHOCKWAVE_FLASH] === OBJECT) {\n d = nav.plugins[SHOCKWAVE_FLASH].description;\n // nav.mimeTypes[\"application/x-shockwave-flash\"].enabledPlugin indicates whether plug-ins are enabled or disabled in Safari 3+\n if (d && (typeof nav.mimeTypes !== UNDEF && nav.mimeTypes[FLASH_MIME_TYPE] && nav.mimeTypes[FLASH_MIME_TYPE].enabledPlugin)) {\n plugin = true;\n ie = false; // cascaded feature detection for Internet Explorer\n d = d.replace(/^.*\\s+(\\S+\\s+\\S+$)/, \"$1\");\n playerVersion[0] = toInt(d.replace(/^(.*)\\..*$/, \"$1\"));\n playerVersion[1] = toInt(d.replace(/^.*\\.(.*)\\s.*$/, \"$1\"));\n playerVersion[2] = /[a-zA-Z]/.test(d) ? toInt(d.replace(/^.*[a-zA-Z]+(.*)$/, \"$1\")) : 0;\n }\n }\n else if (typeof win.ActiveXObject !== UNDEF) {\n try {\n var a = new ActiveXObject(SHOCKWAVE_FLASH_AX);\n if (a) { // a will return null when ActiveX is disabled\n d = a.GetVariable(\"$version\");\n if (d) {\n ie = true; // cascaded feature detection for Internet Explorer\n d = d.split(\" \")[1].split(\",\");\n playerVersion = [toInt(d[0]), toInt(d[1]), toInt(d[2])];\n }\n }\n }\n catch (e) {\n // ignore error\n }\n }\n return {w3: w3cdom, pv: playerVersion, wk: webkit, ie: ie, win: windows, mac: mac};\n}();\n\n/* Cross-browser onDomLoad\n - Will fire an event as soon as the DOM of a web page is loaded\n - Internet Explorer workaround based on Diego Perini's solution: http://javascript.nwbox.com/IEContentLoaded/\n - Regular onload serves as fallback\n*/\n(function () {\n if (!ua.w3) { return; }\n if ((typeof doc.readyState !== UNDEF && (doc.readyState === \"complete\" || doc.readyState === \"interactive\")) || (typeof doc.readyState === UNDEF && (doc.getElementsByTagName(\"body\")[0] || doc.body))) { // function is fired after onload, e.g. when script is inserted dynamically\n callDomLoadFunctions();\n }\n if (!isDomLoaded) {\n if (typeof doc.addEventListener !== UNDEF) {\n doc.addEventListener(\"DOMContentLoaded\", callDomLoadFunctions, false);\n }\n if (ua.ie) {\n doc.attachEvent(ON_READY_STATE_CHANGE, function detach() {\n if (doc.readyState === \"complete\") {\n doc.detachEvent(ON_READY_STATE_CHANGE, detach);\n callDomLoadFunctions();\n }\n });\n if (win == top) { // if not inside an iframe\n (function checkDomLoadedIE() {\n if (isDomLoaded) { return; }\n try {\n doc.documentElement.doScroll(\"left\");\n }\n catch (e) {\n setTimeout(checkDomLoadedIE, 0);\n return;\n }\n callDomLoadFunctions();\n }());\n }\n }\n if (ua.wk) {\n (function checkDomLoadedWK() {\n if (isDomLoaded) { return; }\n if (!/loaded|complete/.test(doc.readyState)) {\n setTimeout(checkDomLoadedWK, 0);\n return;\n }\n callDomLoadFunctions();\n }());\n }\n }\n}());\n\nfunction callDomLoadFunctions() {\n if (isDomLoaded || !document.getElementsByTagName(\"body\")[0]) { return; }\n try { // test if we can really add/remove elements to/from the DOM; we don't want to fire it too early\n var t, span = createElement(\"span\");\n span.style.display = \"none\"; //hide the span in case someone has styled spans via CSS\n t = doc.getElementsByTagName(\"body\")[0].appendChild(span);\n t.parentNode.removeChild(t);\n t = null; //clear the variables\n span = null;\n }\n catch (e) { return; }\n isDomLoaded = true;\n var dl = domLoadFnArr.length;\n for (var i = 0; i < dl; i++) {\n domLoadFnArr[i]();\n }\n}\n\nfunction addDomLoadEvent(fn) {\n if (isDomLoaded) {\n fn();\n }\n else {\n domLoadFnArr[domLoadFnArr.length] = fn; // Array.push() is only available in IE5.5+\n }\n}\n\n/* Cross-browser onload\n - Based on James Edwards' solution: http://brothercake.com/site/resources/scripts/onload/\n - Will fire an event as soon as a web page including all of its assets are loaded\n */\nfunction addLoadEvent(fn) {\n if (typeof win.addEventListener !== UNDEF) {\n win.addEventListener(\"load\", fn, false);\n }\n else if (typeof doc.addEventListener !== UNDEF) {\n doc.addEventListener(\"load\", fn, false);\n }\n else if (typeof win.attachEvent !== UNDEF) {\n addListener(win, \"onload\", fn);\n }\n else if (typeof win.onload === \"function\") {\n var fnOld = win.onload;\n win.onload = function () {\n fnOld();\n fn();\n };\n }\n else {\n win.onload = fn;\n }\n}\n\n/* Detect the Flash Player version for non-Internet Explorer browsers\n - Detecting the plug-in version via the object element is more precise than using the plugins collection item's description:\n a. Both release and build numbers can be detected\n b. Avoid wrong descriptions by corrupt installers provided by Adobe\n c. Avoid wrong descriptions by multiple Flash Player entries in the plugin Array, caused by incorrect browser imports\n - Disadvantage of this method is that it depends on the availability of the DOM, while the plugins collection is immediately available\n*/\nfunction testPlayerVersion() {\n var b = doc.getElementsByTagName(\"body\")[0];\n var o = createElement(OBJECT);\n o.setAttribute(\"style\", \"visibility: hidden;\");\n o.setAttribute(\"type\", FLASH_MIME_TYPE);\n var t = b.appendChild(o);\n if (t) {\n var counter = 0;\n (function checkGetVariable() {\n if (typeof t.GetVariable !== UNDEF) {\n try {\n var d = t.GetVariable(\"$version\");\n if (d) {\n d = d.split(\" \")[1].split(\",\");\n ua.pv = [toInt(d[0]), toInt(d[1]), toInt(d[2])];\n }\n } catch (e) {\n //t.GetVariable(\"$version\") is known to fail in Flash Player 8 on Firefox\n //If this error is encountered, assume FP8 or lower. Time to upgrade.\n ua.pv = [8, 0, 0];\n }\n }\n else if (counter < 10) {\n counter++;\n setTimeout(checkGetVariable, 10);\n return;\n }\n b.removeChild(o);\n t = null;\n matchVersions();\n }());\n }\n else {\n matchVersions();\n }\n}\n\n/* Perform Flash Player and SWF version matching; static publishing only\n*/\nfunction matchVersions() {\n var rl = regObjArr.length;\n if (rl > 0) {\n for (var i = 0; i < rl; i++) { // for each registered object element\n var id = regObjArr[i].id;\n var cb = regObjArr[i].callbackFn;\n var cbObj = {success: false, id: id};\n if (ua.pv[0] > 0) {\n var obj = getElementById(id);\n if (obj) {\n if (hasPlayerVersion(regObjArr[i].swfVersion) && !(ua.wk && ua.wk < 312)) { // Flash Player version >= published SWF version: Houston, we have a match!\n setVisibility(id, true);\n if (cb) {\n cbObj.success = true;\n cbObj.ref = getObjectById(id);\n cbObj.id = id;\n cb(cbObj);\n }\n }\n else if (regObjArr[i].expressInstall && canExpressInstall()) { // show the Adobe Express Install dialog if set by the web page author and if supported\n var att = {};\n att.data = regObjArr[i].expressInstall;\n att.width = obj.getAttribute(\"width\") || \"0\";\n att.height = obj.getAttribute(\"height\") || \"0\";\n if (obj.getAttribute(\"class\")) { att.styleclass = obj.getAttribute(\"class\"); }\n if (obj.getAttribute(\"align\")) { att.align = obj.getAttribute(\"align\"); }\n // parse HTML object param element's name-value pairs\n var par = {};\n var p = obj.getElementsByTagName(\"param\");\n var pl = p.length;\n for (var j = 0; j < pl; j++) {\n if (p[j].getAttribute(\"name\").toLowerCase() !== \"movie\") {\n par[p[j].getAttribute(\"name\")] = p[j].getAttribute(\"value\");\n }\n }\n showExpressInstall(att, par, id, cb);\n }\n else { // Flash Player and SWF version mismatch or an older Webkit engine that ignores the HTML object element's nested param elements: display fallback content instead of SWF\n displayFbContent(obj);\n if (cb) { cb(cbObj); }\n }\n }\n }\n else { // if no Flash Player is installed or the fp version cannot be detected we let the HTML object element do its job (either show a SWF or fallback content)\n setVisibility(id, true);\n if (cb) {\n var o = getObjectById(id); // test whether there is an HTML object element or not\n if (o && typeof o.SetVariable !== UNDEF) {\n cbObj.success = true;\n cbObj.ref = o;\n cbObj.id = o.id;\n }\n cb(cbObj);\n }\n }\n }\n }\n}\n\n/* Main function\n - Will preferably execute onDomLoad, otherwise onload (as a fallback)\n*/\ndomLoadFnArr[0] = function () {\n if (plugin) {\n testPlayerVersion();\n }\n else {\n matchVersions();\n }\n};\n\nfunction getObjectById(objectIdStr) {\n var r = null,\n o = getElementById(objectIdStr);\n\n if (o && o.nodeName.toUpperCase() === \"OBJECT\") {\n //If targeted object is valid Flash file\n if (typeof o.SetVariable !== UNDEF) {\n r = o;\n } else {\n //If SetVariable is not working on targeted object but a nested object is\n //available, assume classic nested object markup. Return nested object.\n\n //If SetVariable is not working on targeted object and there is no nested object,\n //return the original object anyway. This is probably new simplified markup.\n\n r = o.getElementsByTagName(OBJECT)[0] || o;\n }\n }\n\n return r;\n}\n\n/* Requirements for Adobe Express Install\n - only one instance can be active at a time\n - fp 6.0.65 or higher\n - Win/Mac OS only\n - no Webkit engines older than version 312\n*/\nfunction canExpressInstall() {\n return !isExpressInstallActive && hasPlayerVersion(\"6.0.65\") && (ua.win || ua.mac) && !(ua.wk && ua.wk < 312);\n}\n\n/* Show the Adobe Express Install dialog\n - Reference: http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=6a253b75\n*/\nfunction showExpressInstall(att, par, replaceElemIdStr, callbackFn) {\n\n var obj = getElementById(replaceElemIdStr);\n\n //Ensure that replaceElemIdStr is really a string and not an element\n replaceElemIdStr = getId(replaceElemIdStr);\n\n isExpressInstallActive = true;\n storedCallbackFn = callbackFn || null;\n storedCallbackObj = {success: false, id: replaceElemIdStr};\n\n if (obj) {\n if (obj.nodeName.toUpperCase() === \"OBJECT\") { // static publishing\n storedFbContent = abstractFbContent(obj);\n storedFbContentId = null;\n }\n else { // dynamic publishing\n storedFbContent = obj;\n storedFbContentId = replaceElemIdStr;\n }\n att.id = EXPRESS_INSTALL_ID;\n if (typeof att.width === UNDEF || (!/%$/.test(att.width) && toInt(att.width) < 310)) { att.width = \"310\"; }\n if (typeof att.height === UNDEF || (!/%$/.test(att.height) && toInt(att.height) < 137)) { att.height = \"137\"; }\n var pt = ua.ie ? \"ActiveX\" : \"PlugIn\",\n fv = \"MMredirectURL=\" + encodeURIComponent(win.location.toString().replace(/&/g, \"%26\")) + \"&MMplayerType=\" + pt + \"&MMdoctitle=\" + encodeURIComponent(doc.title.slice(0, 47) + \" - Flash Player Installation\");\n if (typeof par.flashvars !== UNDEF) {\n par.flashvars += \"&\" + fv;\n }\n else {\n par.flashvars = fv;\n }\n // IE only: when a SWF is loading (AND: not available in cache) wait for the readyState of the object element to become 4 before removing it,\n // because you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work\n if (ua.ie && obj.readyState != 4) {\n var newObj = createElement(\"div\");\n replaceElemIdStr += \"SWFObjectNew\";\n newObj.setAttribute(\"id\", replaceElemIdStr);\n obj.parentNode.insertBefore(newObj, obj); // insert placeholder div that will be replaced by the object element that loads expressinstall.swf\n obj.style.display = \"none\";\n removeSWF(obj); //removeSWF accepts elements now\n }\n createSWF(att, par, replaceElemIdStr);\n }\n}\n\n/* Functions to abstract and display fallback content\n*/\nfunction displayFbContent(obj) {\n if (ua.ie && obj.readyState != 4) {\n // IE only: when a SWF is loading (AND: not available in cache) wait for the readyState of the object element to become 4 before removing it,\n // because you cannot properly cancel a loading SWF file without breaking browser load references, also obj.onreadystatechange doesn't work\n obj.style.display = \"none\";\n var el = createElement(\"div\");\n obj.parentNode.insertBefore(el, obj); // insert placeholder div that will be replaced by the fallback content\n el.parentNode.replaceChild(abstractFbContent(obj), el);\n removeSWF(obj); //removeSWF accepts elements now\n }\n else {\n obj.parentNode.replaceChild(abstractFbContent(obj), obj);\n }\n}\n\nfunction abstractFbContent(obj) {\n var ac = createElement(\"div\");\n if (ua.win && ua.ie) {\n ac.innerHTML = obj.innerHTML;\n }\n else {\n var nestedObj = obj.getElementsByTagName(OBJECT)[0];\n if (nestedObj) {\n var c = nestedObj.childNodes;\n if (c) {\n var cl = c.length;\n for (var i = 0; i < cl; i++) {\n if (!(c[i].nodeType == 1 && c[i].nodeName === \"PARAM\") && !(c[i].nodeType == 8)) {\n ac.appendChild(c[i].cloneNode(true));\n }\n }\n }\n }\n }\n return ac;\n}\n\nfunction createIeObject(url, paramStr) {\n var div = createElement(\"div\");\n div.innerHTML = \"\" + paramStr + \"\";\n return div.firstChild;\n}\n\n/* Cross-browser dynamic SWF creation\n*/\nfunction createSWF(attObj, parObj, id) {\n var r, el = getElementById(id);\n id = getId(id); // ensure id is truly an ID and not an element\n\n if (ua.wk && ua.wk < 312) { return r; }\n\n if (el) {\n var o = (ua.ie) ? createElement(\"div\") : createElement(OBJECT),\n attr,\n attrLower,\n param;\n\n if (typeof attObj.id === UNDEF) { // if no 'id' is defined for the object element, it will inherit the 'id' from the fallback content\n attObj.id = id;\n }\n\n //Add params\n for (param in parObj) {\n //filter out prototype additions from other potential libraries and IE specific param element\n if (Object.prototype.hasOwnProperty.call(parObj, param) && param.toLowerCase() !== \"movie\") {\n createObjParam(o, param, parObj[param]);\n }\n }\n\n //Create IE object, complete with param nodes\n if (ua.ie) { o = createIeObject(attObj.data, o.innerHTML); }\n\n //Add attributes to object\n for (attr in attObj) {\n if (Object.prototype.hasOwnProperty.call(attObj, attr)) { // filter out prototype additions from other potential libraries\n attrLower = attr.toLowerCase();\n\n // 'class' is an ECMA4 reserved keyword\n if (attrLower === \"styleclass\") {\n o.setAttribute(\"class\", attObj[attr]);\n } else if (attrLower !== \"classid\" && attrLower !== \"data\") {\n o.setAttribute(attr, attObj[attr]);\n }\n }\n }\n\n if (ua.ie) {\n objIdArr[objIdArr.length] = attObj.id; // stored to fix object 'leaks' on unload (dynamic publishing only)\n } else {\n o.setAttribute(\"type\", FLASH_MIME_TYPE);\n o.setAttribute(\"data\", attObj.data);\n }\n\n el.parentNode.replaceChild(o, el);\n r = o;\n }\n\n return r;\n}\n\nfunction createObjParam(el, pName, pValue) {\n var p = createElement(\"param\");\n p.setAttribute(\"name\", pName);\n p.setAttribute(\"value\", pValue);\n el.appendChild(p);\n}\n\n/* Cross-browser SWF removal\n - Especially needed to safely and completely remove a SWF in Internet Explorer\n*/\nfunction removeSWF(id) {\n var obj = getElementById(id);\n if (obj && obj.nodeName.toUpperCase() === \"OBJECT\") {\n if (ua.ie) {\n obj.style.display = \"none\";\n (function removeSWFInIE() {\n if (obj.readyState == 4) {\n //This step prevents memory leaks in Internet Explorer\n for (var i in obj) {\n if (typeof obj[i] === \"function\") {\n obj[i] = null;\n }\n }\n obj.parentNode.removeChild(obj);\n } else {\n setTimeout(removeSWFInIE, 10);\n }\n }());\n }\n else {\n obj.parentNode.removeChild(obj);\n }\n }\n}\n\nfunction isElement(id) {\n return (id && id.nodeType && id.nodeType === 1);\n}\n\nfunction getId(thing) {\n return (isElement(thing)) ? thing.id : thing;\n}\n\n/* Functions to optimize JavaScript compression\n*/\nfunction getElementById(id) {\n\n //Allow users to pass an element OR an element's ID\n if (isElement(id)) { return id; }\n\n var el = null;\n try {\n el = doc.getElementById(id);\n }\n catch (e) {\n // ignore error\n }\n return el;\n}\n\nfunction createElement(el) {\n return doc.createElement(el);\n}\n\n//To aid compression; replaces 14 instances of pareseInt with radix\nfunction toInt(str) {\n return parseInt(str, 10);\n}\n\n/* Updated attachEvent function for Internet Explorer\n - Stores attachEvent information in an Array, so on unload the detachEvent functions can be called to avoid memory leaks\n*/\nfunction addListener(target, eventType, fn) {\n target.attachEvent(eventType, fn);\n listenersArr[listenersArr.length] = [target, eventType, fn];\n}\n\n/* Flash Player and SWF content version matching\n*/\nfunction hasPlayerVersion(rv) {\n rv += \"\"; //Coerce number to string, if needed.\n var pv = ua.pv, v = rv.split(\".\");\n v[0] = toInt(v[0]);\n v[1] = toInt(v[1]) || 0; // supports short notation, e.g. \"9\" instead of \"9.0.0\"\n v[2] = toInt(v[2]) || 0;\n return (pv[0] > v[0] || (pv[0] == v[0] && pv[1] > v[1]) || (pv[0] == v[0] && pv[1] == v[1] && pv[2] >= v[2])) ? true : false;\n}\n\n/* Cross-browser dynamic CSS creation\n - Based on Bobby van der Sluis' solution: http://www.bobbyvandersluis.com/articles/dynamicCSS.php\n*/\nfunction createCSS(sel, decl, media, newStyle) {\n var h = doc.getElementsByTagName(\"head\")[0];\n if (!h) { return; } // to also support badly authored HTML pages that lack a head element\n var m = (typeof media === \"string\") ? media : \"screen\";\n if (newStyle) {\n dynamicStylesheet = null;\n dynamicStylesheetMedia = null;\n }\n if (!dynamicStylesheet || dynamicStylesheetMedia != m) {\n // create dynamic stylesheet + get a global reference to it\n var s = createElement(\"style\");\n s.setAttribute(\"type\", \"text/css\");\n s.setAttribute(\"media\", m);\n dynamicStylesheet = h.appendChild(s);\n if (ua.ie && typeof doc.styleSheets !== UNDEF && doc.styleSheets.length > 0) {\n dynamicStylesheet = doc.styleSheets[doc.styleSheets.length - 1];\n }\n dynamicStylesheetMedia = m;\n }\n // add style rule\n if (dynamicStylesheet) {\n if (typeof dynamicStylesheet.addRule !== UNDEF) {\n dynamicStylesheet.addRule(sel, decl);\n } else if (typeof doc.createTextNode !== UNDEF) {\n dynamicStylesheet.appendChild(doc.createTextNode(sel + \" {\" + decl + \"}\"));\n }\n }\n}\n\nfunction setVisibility(id, isVisible) {\n if (!autoHideShow) { return; }\n var v = isVisible ? \"visible\" : \"hidden\",\n el = getElementById(id);\n if (isDomLoaded && el) {\n el.style.visibility = v;\n } else if (typeof id === \"string\") {\n createCSS(\"#\" + id, \"visibility:\" + v);\n }\n}\n\n/* Filter to avoid XSS attacks\n*/\nfunction urlEncodeIfNecessary(s) {\n var regex = /[\\\\\"<>.;]/;\n var hasBadChars = regex.exec(s) !== null;\n return hasBadChars && typeof encodeURIComponent !== UNDEF ? encodeURIComponent(s) : s;\n}\n\n/* Release memory to avoid memory leaks caused by closures, fix hanging audio/video threads and force open sockets/NetConnections to disconnect (Internet Explorer only)\n*/\n(function () {\n if (ua.ie) {\n window.attachEvent(\"onunload\", function () {\n // remove listeners to avoid memory leaks\n var ll = listenersArr.length;\n for (var i = 0; i < ll; i++) {\n listenersArr[i][0].detachEvent(listenersArr[i][1], listenersArr[i][2]);\n }\n // cleanup dynamically embedded objects to fix audio/video threads and force open sockets and NetConnections to disconnect\n var il = objIdArr.length;\n for (var j = 0; j < il; j++) {\n removeSWF(objIdArr[j]);\n }\n // cleanup library's main closures to avoid memory leaks\n for (var k in ua) {\n ua[k] = null;\n }\n ua = null;\n for (var l in swfobject) {\n swfobject[l] = null;\n }\n swfobject = null;\n });\n }\n}());\n\nvar swfobject = {\n /* Public API\n - Reference: http://code.google.com/p/swfobject/wiki/documentation\n */\n registerObject: function (objectIdStr, swfVersionStr, xiSwfUrlStr, callbackFn) {\n if (ua.w3 && objectIdStr && swfVersionStr) {\n var regObj = {};\n regObj.id = objectIdStr;\n regObj.swfVersion = swfVersionStr;\n regObj.expressInstall = xiSwfUrlStr;\n regObj.callbackFn = callbackFn;\n regObjArr[regObjArr.length] = regObj;\n setVisibility(objectIdStr, false);\n }\n else if (callbackFn) {\n callbackFn({success: false, id: objectIdStr});\n }\n },\n\n getObjectById: function (objectIdStr) {\n if (ua.w3) {\n return getObjectById(objectIdStr);\n }\n },\n\n embedSWF: function (swfUrlStr, replaceElemIdStr, widthStr, heightStr, swfVersionStr, xiSwfUrlStr, flashvarsObj, parObj, attObj, callbackFn) {\n\n var id = getId(replaceElemIdStr),\n callbackObj = {success: false, id: id};\n\n if (ua.w3 && !(ua.wk && ua.wk < 312) && swfUrlStr && replaceElemIdStr && widthStr && heightStr && swfVersionStr) {\n setVisibility(id, false);\n addDomLoadEvent(function () {\n widthStr += \"\"; // auto-convert to string\n heightStr += \"\";\n var att = {};\n if (attObj && typeof attObj === OBJECT) {\n for (var i in attObj) { // copy object to avoid the use of references, because web authors often reuse attObj for multiple SWFs\n att[i] = attObj[i];\n }\n }\n att.data = swfUrlStr;\n att.width = widthStr;\n att.height = heightStr;\n var par = {};\n if (parObj && typeof parObj === OBJECT) {\n for (var j in parObj) { // copy object to avoid the use of references, because web authors often reuse parObj for multiple SWFs\n par[j] = parObj[j];\n }\n }\n if (flashvarsObj && typeof flashvarsObj === OBJECT) {\n for (var k in flashvarsObj) { // copy object to avoid the use of references, because web authors often reuse flashvarsObj for multiple SWFs\n if (Object.prototype.hasOwnProperty.call(flashvarsObj, k)) {\n\n var key = (encodeURIEnabled) ? encodeURIComponent(k) : k,\n value = (encodeURIEnabled) ? encodeURIComponent(flashvarsObj[k]) : flashvarsObj[k];\n\n if (typeof par.flashvars !== UNDEF) {\n par.flashvars += \"&\" + key + \"=\" + value;\n }\n else {\n par.flashvars = key + \"=\" + value;\n }\n\n }\n }\n }\n if (hasPlayerVersion(swfVersionStr)) { // create SWF\n var obj = createSWF(att, par, replaceElemIdStr);\n if (att.id == id) {\n setVisibility(id, true);\n }\n callbackObj.success = true;\n callbackObj.ref = obj;\n callbackObj.id = obj.id;\n }\n else if (xiSwfUrlStr && canExpressInstall()) { // show Adobe Express Install\n att.data = xiSwfUrlStr;\n showExpressInstall(att, par, replaceElemIdStr, callbackFn);\n return;\n }\n else { // show fallback content\n setVisibility(id, true);\n }\n if (callbackFn) { callbackFn(callbackObj); }\n });\n }\n else if (callbackFn) { callbackFn(callbackObj); }\n },\n\n switchOffAutoHideShow: function () {\n autoHideShow = false;\n },\n\n enableUriEncoding: function (bool) {\n encodeURIEnabled = (typeof bool === UNDEF) ? true : bool;\n },\n\n ua: ua,\n\n getFlashPlayerVersion: function () {\n return {major: ua.pv[0], minor: ua.pv[1], release: ua.pv[2]};\n },\n\n hasFlashPlayerVersion: hasPlayerVersion,\n\n createSWF: function (attObj, parObj, replaceElemIdStr) {\n if (ua.w3) {\n return createSWF(attObj, parObj, replaceElemIdStr);\n }\n else {\n return undefined;\n }\n },\n\n showExpressInstall: function (att, par, replaceElemIdStr, callbackFn) {\n if (ua.w3 && canExpressInstall()) {\n showExpressInstall(att, par, replaceElemIdStr, callbackFn);\n }\n },\n\n removeSWF: function (objElemIdStr) {\n if (ua.w3) {\n removeSWF(objElemIdStr);\n }\n },\n\n createCSS: function (selStr, declStr, mediaStr, newStyleBoolean) {\n if (ua.w3) {\n createCSS(selStr, declStr, mediaStr, newStyleBoolean);\n }\n },\n\n addDomLoadEvent: addDomLoadEvent,\n\n addLoadEvent: addLoadEvent,\n\n getQueryParamValue: function (param) {\n var q = doc.location.search || doc.location.hash;\n if (q) {\n if (/\\?/.test(q)) { q = q.split(\"?\")[1]; } // strip question mark\n if (!param) {\n return urlEncodeIfNecessary(q);\n }\n var pairs = q.split(\"&\");\n for (var i = 0; i < pairs.length; i++) {\n if (pairs[i].substring(0, pairs[i].indexOf(\"=\")) == param) {\n return urlEncodeIfNecessary(pairs[i].substring((pairs[i].indexOf(\"=\") + 1)));\n }\n }\n }\n return \"\";\n },\n\n // For internal usage only\n expressInstallCallback: function () {\n if (isExpressInstallActive) {\n var obj = getElementById(EXPRESS_INSTALL_ID);\n if (obj && storedFbContent) {\n obj.parentNode.replaceChild(storedFbContent, obj);\n if (storedFbContentId) {\n setVisibility(storedFbContentId, true);\n if (ua.ie) { storedFbContent.style.display = \"block\"; }\n }\n if (storedCallbackFn) { storedCallbackFn(storedCallbackObj); }\n }\n isExpressInstallActive = false;\n }\n },\n\n version: \"2.3\"\n};\n\nmodule.exports = swfobject;\n","'use strict';\n\nvar inherits = require('inherits');\nvar ClientJS = require('./client.base').ClientJS;\nvar getFlashVersion = require('./modules/flash-detection');\n\nfunction ClientJSFlash() {\n ClientJS.apply(this, arguments);\n}\ninherits(ClientJSFlash, ClientJS);\n\nClientJSFlash.prototype.getFlashVersion = getFlashVersion;\n\nexports.ClientJS = ClientJSFlash;\n"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/client.java.min.js b/dist/client.java.min.js new file mode 100644 index 0000000..aed4cf5 --- /dev/null +++ b/dist/client.java.min.js @@ -0,0 +1,2 @@ +!function(e,i){if("object"==typeof exports&&"object"==typeof module)module.exports=i();else if("function"==typeof define&&define.amd)define([],i);else{var t=i();for(var n in t)("object"==typeof exports?exports:e)[n]=t[n]}}(this,(function(){return function(e){var i={};function t(n){if(i[n])return i[n].exports;var r=i[n]={i:n,l:!1,exports:{}};return e[n].call(r.exports,r,r.exports,t),r.l=!0,r.exports}return t.m=e,t.c=i,t.d=function(e,i,n){t.o(e,i)||Object.defineProperty(e,i,{enumerable:!0,get:n})},t.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},t.t=function(e,i){if(1&i&&(e=t(e)),8&i)return e;if(4&i&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(t.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&i&&"string"!=typeof e)for(var r in e)t.d(n,r,function(i){return e[i]}.bind(null,r));return n},t.n=function(e){var i=e&&e.__esModule?function(){return e["default"]}:function(){return e};return t.d(i,"a",i),i},t.o=function(e,i){return Object.prototype.hasOwnProperty.call(e,i)},t.p="",t(t.s=14)}([function(e,i,t){"use strict";var n,r,o=t(1)(),a=t(3),s=t(4),l=t(6),u=function(){var e=new s;return n=e.getResult(),r=new l,this};u.prototype={getSoftwareVersion:function(){return"0.1.11"},getBrowserData:function(){return n},getFingerprint:function(){var e="|",i=n.ua,t=this.getScreenPrint(),r=this.getPlugins(),o=this.getFonts(),s=this.isLocalStorage(),l=this.isSessionStorage(),u=this.getTimeZone(),c=this.getLanguage(),d=this.getSystemLanguage(),m=this.isCookie(),p=this.getCanvasPrint();return a(i+e+t+e+r+e+o+e+s+e+l+e+u+e+c+e+d+e+m+e+p,256)},getCustomFingerprint:function(){for(var e="|",i="",t=0;t>>16)*a&65535)<<16)&4294967295)<<15|l>>>17))*s+(((l>>>16)*s&65535)<<16)&4294967295)<<13|r>>>19))+((5*(r>>>16)&65535)<<16)&4294967295))+((58964+(o>>>16)&65535)<<16);switch(l=0,t){case 3:l^=(255&e.charCodeAt(u+2))<<16;case 2:l^=(255&e.charCodeAt(u+1))<<8;case 1:r^=l=(65535&(l=(l=(65535&(l^=255&e.charCodeAt(u)))*a+(((l>>>16)*a&65535)<<16)&4294967295)<<15|l>>>17))*s+(((l>>>16)*s&65535)<<16)&4294967295}return r^=e.length,r=2246822507*(65535&(r^=r>>>16))+((2246822507*(r>>>16)&65535)<<16)&4294967295,r=3266489909*(65535&(r^=r>>>13))+((3266489909*(r>>>16)&65535)<<16)&4294967295,(r^=r>>>16)>>>0}},function(e,i,t){var n;!function(r,o){"use strict";var a="function",s="undefined",l="object",u="string",c="model",d="name",m="type",p="vendor",h="version",g="architecture",f="console",b="mobile",w="tablet",v="smarttv",y="wearable",x="embedded",S="Amazon",C="Apple",k="ASUS",T="BlackBerry",M="Firefox",P="Google",A="Huawei",E="LG",I="Microsoft",N="Motorola",B="Opera",U="Samsung",j="Sony",L="Xiaomi",R="Zebra",O="Facebook",J=function(e){var i={};for(var t in e)i[e[t].toUpperCase()]=e[t];return i},D=function(e,i){return typeof e===u&&-1!==F(i).indexOf(F(e))},F=function(e){return e.toLowerCase()},_=function(e,i){if(typeof e===u)return e=e.replace(/^\s\s*/,"").replace(/\s\s*$/,""),typeof i===s?e:e.substring(0,255)},V=function(e,i){for(var t,n,r,s,u,c,d=0;d0?2==s.length?typeof s[1]==a?this[s[0]]=s[1].call(this,c):this[s[0]]=s[1]:3==s.length?typeof s[1]!==a||s[1].exec&&s[1].test?this[s[0]]=c?c.replace(s[1],s[2]):o:this[s[0]]=c?s[1].call(this,c,s[2]):o:4==s.length&&(this[s[0]]=c?s[3].call(this,c.replace(s[1],s[2])):o):this[s]=c||o;d+=2}},G=function(e,i){for(var t in i)if(typeof i[t]===l&&i[t].length>0){for(var n=0;n255?_(e,255):e,this},this.setUA(t),this};q.VERSION="0.7.30",q.BROWSER=J([d,h,"major"]),q.CPU=J([g]),q.DEVICE=J([c,p,m,f,b,v,w,y,x]),q.ENGINE=q.OS=J([d,h]),typeof i!==s?(typeof e!==s&&e.exports&&(i=e.exports=q),i.UAParser=q):t(5)?(n=function(){return q}.call(i,t,i,e))===o||(e.exports=n):typeof r!==s&&(r.UAParser=q);var H=typeof r!==s&&(r.jQuery||r.Zepto);if(H&&!H.ua){var X=new q;H.ua=X.getResult(),H.ua.get=function(){return X.getUA()},H.ua.set=function(e){X.setUA(e);var i=X.getResult();for(var t in i)H.ua[t]=i[t]}}}("object"==typeof window?window:this)},function(e,i){(function(i){e.exports=i}).call(this,{})},function(e,i){e.exports=function(){var e=["monospace","sans-serif","serif"],i=document.getElementsByTagName("body")[0],t=document.createElement("span");t.style.fontSize="72px",t.innerHTML="mmmmmmmmmmlli";var n={},r={};for(var o in e)t.style.fontFamily=e[o],i.appendChild(t),n[e[o]]=t.offsetWidth,r[e[o]]=t.offsetHeight,i.removeChild(t);this.detect=function(o){var a=!1;for(var s in e){t.style.fontFamily=o+","+e[s],i.appendChild(t);var l=t.offsetWidth!=n[e[s]]||t.offsetHeight!=r[e[s]];i.removeChild(t),a=a||l}return a}}},function(e,i){"function"==typeof Object.create?e.exports=function(e,i){i&&(e.super_=i,e.prototype=Object.create(i.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:e.exports=function(e,i){if(i){e.super_=i;var t=function(){};t.prototype=i.prototype,e.prototype=new t,e.prototype.constructor=e}}},function(e,i,t){"use strict";var n=t(9);e.exports=function(){return n.getJREs().toString()}},function(e,i,t){"use strict";var n="^(\\d+)(?:\\.(\\d+)(?:\\.(\\d+)(?:[_\\.](\\d+))?)?)?",r=n+"$",o=n+"(\\*|\\+)?$",a={core:["id","class","title","style"],applet:["codebase","code","name","archive","object","width","height","alt","align","hspace","vspace"]},s=a.applet.concat(a.core);function l(e){p.debug&&(console.log?console.log(e):alert(e))}function u(e,i){var t=0,n=e.match(o);if(null!=n){if(i)return!0;for(var r=!1,a=!1,s=new Array,u=1;u-1?t.substring(0,n+1):t+"/")+e}return i}(e)}function d(){return"Edge"==p.getBrowser()||"Chrome"==p.browserName2||"FirefoxNoPlugin"==p.browserName2&&!u("1.8*",!1)||"NoActiveX"==p.browserName2}function m(e){var i="https://java.com/dt-redirect";return null==e||0==e.length?i:("&"==e.charAt(0)&&(e=e.substring(1,e.length)),i+"?"+e)}"function"!=typeof String.prototype.startsWith&&(String.prototype.startsWith=function(e,i){return i=i||0,this.indexOf(e,i)===i});var p={debug:null,version:"20120801",firefoxJavaVersion:null,useStaticMimeType:!1,myInterval:null,preInstallJREList:null,brand:null,locale:null,installType:null,EAInstallEnabled:!1,EarlyAccessURL:null,oldMimeType:"application/npruntime-scriptable-plugin;DeploymentToolkit",mimeType:"application/java-deployment-toolkit",launchButtonPNG:function(){var e="//java.com/js/webstart.png";try{return-1!=document.location.protocol.indexOf("http")?e:"https:"+e}catch(i){return"https:"+e}}(),browserName:null,browserName2:null,getJREs:function(){var e=new Array;if(this.isPluginInstalled())for(var i=this.getPlugin().jvms,t=0;t0){var n=e.charAt(e.length-1);"."!=n&&"_"!=n||(e=e.substring(0,e.length-1))}return"*"==t?0==i.indexOf(e):"+"==t&&e<=i}("1.6.0_33+",e)}(e))},isCallbackSupported:function(){return this.isPluginInstalled()&&this.compareVersionToPattern(this.getPlugin().version,["10","2","0"],!1,!0)},installLatestJRE:function(){if(l("The Deployment Toolkit installLatestJRE() method no longer installs JRE. If user's version of Java is below the security baseline it redirects user to java.com to get an updated JRE. More Information on usage of the Deployment Toolkit can be found in the Deployment Guide at ://docs.oracle.com/javase/8/docs/technotes/guides/deploy/"),!this.isPluginInstalled()||!this.getPlugin().installLatestJRE()){var e=this.getBrowser(),i=navigator.platform.toLowerCase();return"MSIE"==e?this.IEInstall():"Netscape Family"==e&&-1!=i.indexOf("win32")?this.FFInstall():(location.href=m((null!=this.locale?"&locale="+this.locale:"")+(null!=this.brand?"&brand="+this.brand:"")),!1)}return!0},runApplet:function(e,i,t){if("undefined"!=t&&null!=t||(t="1.1"),null!=t.match(r))if("?"!=this.getBrowser()){if(d()){var n=setInterval((function(){var e;"complete"==document.readyState&&(clearInterval(n),(e=document.createElement("div")).id="messagebox",e.setAttribute("style","background-color: #ffffce;text-align: left;border: solid 1px #f0c000; padding: 1.65em 1.65em .75em 0.5em; font-family: Helvetica, Arial, sans-serif; font-size: 75%; bottom:0; left:0; right:0; position:fixed; margin:auto; opacity:0.9; width:400px;"),e.innerHTML='×

Java Plug-in is not supported by this browser. More info

',document.body.appendChild(e))}),15);return void l("[runApplet()] Java Plug-in is not supported by this browser")}(this.versionCheck(t+"+")||this.installJRE(t+"+"))&&this.writeAppletTag(e,i)}else this.writeAppletTag(e,i);else l("[runApplet()] Invalid minimumVersion argument to runApplet():"+t)},writeAppletTag:function(e,i){var t="';a||(n+=''),r&&(t+=' code="dummy"'),t+=">",document.write(t+"\n"+n+"\n")},versionCheck:function(e){return u(e,d())},isWebStartInstalled:function(e){if(d())return!0;if("?"==this.getBrowser())return!0;"undefined"!=e&&null!=e||(e="1.4.2");var i=!1;return null!=e.match(r)?i=this.versionCheck(e+"+"):(l("[isWebStartInstaller()] Invalid minimumVersion argument to isWebStartInstalled(): "+e),i=this.versionCheck("1.4.2+")),i},getJPIVersionUsingMimeType:function(){var e,i;for(e=0;e':"Netscape Family"==n&&(t=''),"undefined"==document.body||null==document.body)document.write(t),document.location=i;else{var r=document.createElement("div");r.id="div1",r.style.position="relative",r.style.left="-10000px",r.style.margin="0px auto",r.className="dynamicDiv",r.innerHTML=t,document.body.appendChild(r)}},createWebStartLaunchButtonEx:function(e){var i="javascript:deployJava.launchWebStartApplication('"+e+"');";document.write('')},createWebStartLaunchButton:function(e,i){var t="javascript:if (!deployJava.isWebStartInstalled(""+i+"")) {if (deployJava.installLatestJRE()) {if (deployJava.launch(""+e+"")) {}}} else {if (deployJava.launch(""+e+"")) {}}";document.write('')},launch:function(e){return document.location=e,!0},launchEx:function(e){return c(e),!0},isPluginInstalled:function(){var e=this.getPlugin();return!(!e||!e.jvms)},isAutoUpdateEnabled:function(){return!!this.isPluginInstalled()&&this.getPlugin().isAutoUpdateEnabled()},setAutoUpdateEnabled:function(){return!!this.isPluginInstalled()&&this.getPlugin().setAutoUpdateEnabled()},setInstallerType:function(e){return l("The Deployment Toolkit no longer installs JRE. Method setInstallerType() is no-op. More Information on usage of the Deployment Toolkit can be found in the Deployment Guide at ://docs.oracle.com/javase/8/docs/technotes/guides/deploy/"),!1},setAdditionalPackages:function(e){return l("The Deployment Toolkit no longer installs JRE. Method setAdditionalPackages() is no-op. More Information on usage of the Deployment Toolkit can be found in the Deployment Guide at ://docs.oracle.com/javase/8/docs/technotes/guides/deploy/"),!1},setEarlyAccess:function(e){this.EAInstallEnabled=e},isPlugin2:function(){if(this.isPluginInstalled()&&this.versionCheck("1.6.0_10+"))try{return this.getPlugin().isPlugin2()}catch(e){}return!1},allowPlugin:function(){return this.getBrowser(),"Safari"!=this.browserName2&&"Opera"!=this.browserName2},getPlugin:function(){this.refresh();var e=null;return this.allowPlugin()&&(e=document.getElementById("deployJavaPlugin")),e},compareVersionToPattern:function(e,i,t,n){if(e==undefined||i==undefined)return!1;var o=e.match(r);if(null!=o){for(var a=0,s=new Array,l=1;lm)return!0}return!0}for(var p=0;p "+e),-1!=e.indexOf("edge"))this.browserName="Edge",this.browserName2="Edge";else if(-1!=e.indexOf("msie")&&-1==e.indexOf("opera"))this.browserName="MSIE",this.browserName2="MSIE";else if(-1!=e.indexOf("trident")||-1!=e.indexOf("Trident")){if(this.browserName="MSIE",this.browserName2="MSIE",-1!=e.indexOf("windows nt 6.3")||-1!=e.indexOf("windows nt 6.2"))try{new ActiveXObject("htmlfile")}catch(i){this.browserName2="NoActiveX"}}else-1!=e.indexOf("iphone")?(this.browserName="Netscape Family",this.browserName2="iPhone"):-1!=e.indexOf("firefox")&&-1==e.indexOf("opera")?(this.browserName="Netscape Family",this.isPluginInstalled()?this.browserName2="Firefox":this.browserName2="FirefoxNoPlugin"):-1!=e.indexOf("chrome")?(this.browserName="Netscape Family",this.browserName2="Chrome"):-1!=e.indexOf("safari")?(this.browserName="Netscape Family",this.browserName2="Safari"):-1!=e.indexOf("mozilla")&&-1==e.indexOf("opera")?(this.browserName="Netscape Family",this.browserName2="Other"):-1!=e.indexOf("opera")?(this.browserName="Netscape Family",this.browserName2="Opera"):(this.browserName="?",this.browserName2="unknown");l("[getBrowser()] Detected browser name:"+this.browserName+", "+this.browserName2)}return this.browserName},testUsingActiveX:function(e){var i="JavaWebStart.isInstalled."+e+".0";if("undefined"==typeof ActiveXObject||!ActiveXObject)return l("[testUsingActiveX()] Browser claims to be IE, but no ActiveXObject object?"),!1;try{return null!=new ActiveXObject(i)}catch(t){return!1}},testForMSVM:function(){if("undefined"!=typeof oClientCaps){var e=oClientCaps.getComponentVersion("{08B0E5C0-4FCB-11CF-AAA5-00401C608500}","ComponentID");return""!=e&&"5,0,5000,0"!=e}return!1},testUsingMimeTypes:function(e){if(!navigator.mimeTypes)return l("[testUsingMimeTypes()] Browser claims to be Netscape family, but no mimeTypes[] array?"),!1;for(var i=0;in[0]||!(t[0]n[1]||!(t[1]n[2]||!(t[2]'):"Netscape Family"==e&&this.allowPlugin()&&this.writeEmbedTag()},refresh:function(){(navigator.plugins.refresh(!1),"Netscape Family"==this.getBrowser()&&this.allowPlugin())&&(null==document.getElementById("deployJavaPlugin")&&this.writeEmbedTag())},writeEmbedTag:function(){var e=!1;if(null!=navigator.mimeTypes){for(var i=0;i