AWS Machine Learning Blog

Amazon Pinpoint campaigns driven by machine learning on Amazon SageMaker

At the heart of many successful businesses is a deep understanding of their customers. In a previous blog post I explained how a customer 360o initiative could be enhanced by using Amazon Redshift Spectrum as part of an AWS data lake strategy.

In this blog post, I want to continue the theme of demonstrating agility, cost efficiency, and how AWS can help you innovate through your customer analytics practice. Many of you are exploring how AI can enhance their customer 360o initiatives. I’ll demonstrate how targeted campaigns can be driven by machine learning (ML) through solutions that leverage Amazon SageMaker and Amazon Pinpoint.

Let’s look at a retail example. As consumers, we have some intuition of purchasing habits. We might tend to re-purchase types of products we have good experiences with, or conversely, we might drift toward alternatives as a result of unsatisfactory experiences. If you buy a book that is part of a trilogy, there is a higher likelihood that you will buy the next book in the series. If you buy a smart phone, there’s a high probability that you might buy accessories in the near future.

What if we had the ability to learn the purchasing behavior of our customers? What could we do if we knew with relatively high probability what their next purchase will be? There are many things we could take action on if we possessed this predictive capability. For instance, we could improve the efficiency of inventory management or improve the performance of marketing campaigns.

In this blog post, I’ll demonstrate how Amazon SageMaker can be used to build, train, and serve a custom long short-term memory recurrent neural network (LSTM RNN) model to predict purchasing behavior, and leverage predictions to deliver campaigns through Amazon Pinpoint. RNNs are a specialized type of neural network, a class of ML algorithms. RNNs are typically used with sequence data. Common applications include natural language processing (NLP) problems such as translating audio to text, language translation, or sentiment analysis. In this case, we’re going to get a little creative and apply the RNN model on customer transaction history from a real online retail data set[i] downloaded from the UCI Machine Learning Repository.

Challenges

Before we dive into the solution, let’s appreciate the challenges involved in taking such a project from concept to production. Consider a canonical ML process:

Some key observations:

  1. The process includes a data pipeline common to data engineering projects, and thus, face big data challenges at scale. The data set presented in this blog is small, but analogous data sets from large retailers like Amazon.com are on the big data scale, and are sourced in batches and streams from a variety of formats. While ample data is good for ML projects because it factors into producing higher model performance, the right platform is necessary to harness data at scale. An AWS data lake strategy can deliver a future-proof solution that minimizes operational complexity and maximizes cost efficiency. The groundwork will continue to pay dividends in your AI initiatives as well as your other data engineering projects.
  2. There is a need to support diverse activities. Diverse activities translate into a need for a variety of tools that best fits the function and the skillsets of team members. Activities like data processing, discovery, and feature engineering at scale are well suited for tools like Spark. In AWS, Amazon EMR facilitates the management of Spark clusters, and enables capabilities like elastic scaling while minimizing costs through Spot pricing. Frameworks like Keras and Gluon could be favored for prototyping while TensorFlow or MXNet might be better suited as the primary engine for training and model serving in the later stages of development. The right framework depends on the use case and the skillsets on your team. A platform like Amazon SageMaker, which is agnostic to ML frameworks, is ideal. You have the choice of leveraging native Amazon SageMaker algorithms or creating a custom model using your own script or container built on your chosen framework.
  3. The process is highly iterative. Thus, minimizing the time between iterations is critical for productivity. A big part of each iteration is a process called hyperparameter tuning. The best values for these parameters have to be discovered through experimentation because they are unique for each model, data set, and objective. The process can be challenging because sometimes there are a lot of parameters, and changes to one parameter could have a ripple effect. Each time parameters are adjusted, models are retrained and evaluated, and training time also increases with model complexity and data size. Minimizing turnaround time is often done by leveraging GPU, and using a server cluster to perform distributed training. This could be the difference between waiting for hours instead of days, or minutes instead of hours. Having a platform like Amazon SageMaker that can provide distributed training on GPU as a service, can result in substantial productivity gains and cost efficiency through pay-for-what-you-use economics. Data scientists and machine learning engineers are scarce and expensive resources. Minimizing this process bottleneck is critical to keeping your team lean.
  4. The picture is incomplete. Of equal importance is what isn’t in the picture. The effectiveness of your analytics practice is measured by the value you deliver back to the business. Delivering a model or an endpoint may not be the ends to your intended business outcomes. Amazon SageMaker automates the deployment of Auto Scaling API endpoints for your ML models. The rest of the AWS platform can take you one step further towards your goal by making your ML models consumable and actionable by end users through integration with a breadth of services. These integrations can be in the form of delivering real-time inference to applications and streams, or bringing predictive analytics to your enterprise data warehouse (EDW) and business intelligence (BI) platform. Later in this blog post, we demonstrate how predictions can be used by Amazon Pinpoint to deliver high performing campaigns.

Predictive campaigns solution

The following image shows the conceptual architecture for the solution I’m going to present. The solution leverages Amazon SageMaker to facilitate the ML process I’ve described. I’ll walk you through the four steps illustrated in the architecture.

1. DATA ENGINEERING: The data set is stored in an Amazon S3 data lake. The first step to building this solution involves deploying an Amazon SageMaker managed Jupyter notebook.

This first notebook captures the data cleansing, processing, discovery, and feature engineering work that I chose to perform in Spark. Spark is my tool of choice for these activities due to its ability to process large data sets, and the convenience of having SQL support for data discovery among other useful utilities. SageMaker notebook instances can be configured to run against an external Amazon EMR cluster. The ability to scale Spark on Amazon EMR elastically and economically through Spot pricing is valuable in this exploratory phase. Often, it’s not worthwhile to invest time into optimizing pipelines during this phase; instead temporarily scaling-out the cluster is the better strategy to keep your team agile.

2. BUILD AND TRAIN: I chose to build a custom model in TensorFlow, and leverage the distributed training capabilities of Amazon SageMaker. This notebook illustrates the rest of the ML process from preparation of training and validation datasets to the training and deployment of a custom TensorFlow model on Amazon SageMaker.

The following diagram shows the architecture of the LSTM RNN model that is implemented:

Conceptually, an RNN can be modeled to estimate the conditional probability of a sequence of inputs. In this case, the sequence is the order history from a customer base. What we buy in the past influences what we buy in the future. There is predictive power encoded in the history of previous purchases that can enable us predict what is most likely to be bought next. No doubt, there are models that will outperform this approach in certain situations. If you possess customer data with product recommendations and ratings, a predictive model that leverages those features could be more effective in some cases. If you have a lot of data, a model with higher complexity, such as a multi-layer RNN with some bidirectionality, will likely lead to better results. Another way to improve predictive power is to build an ensemble with boosting. I leave it to you to try out these ideas!

This Python script defines the LSTM RNN model described earlier in a way that is compatible with Amazon SageMaker training and model serving. A developer simply implements an interface as described in the documentation. This interface resembles the TensorFlow interface for custom estimators. Performing remote training is as simple as creating a SageMaker TensorFlow object, and calling the fit method. If you want to perform distributed training, you should instantiate the TensorFlow object with a train_instance_count parameter that is greater than one, and instantiate the training operation in your algorithm with a global_step value of tf.train.get_or_create_global_step(). (This is a TensorFlow framework requirement for performing distributed training.)

Those who run my notebooks will observe different results with each run. This is expected as a result of the non-deterministic nature of the ML algorithms, but it is also amplified by the fact that the data set is relatively small and random splitting and shuffling occurs on the dataset each time you retrain the model.

Nonetheless, you should obtain a prediction accuracy of 20-50% for predicting the most likely product out of 3648 that will be purchased next by customers in the validation dataset who have a history of less than 11 previous orders. Although the model was trained on customers who have an order history of 2 to 50 orders, there are relatively few customers who have a history of more than 10 orders. For this reason, due to limitations of the dataset, I chose to use this model for making predictions only with customers with a history of 10 or less orders. The following chart shows the prediction accuracy of one of my trained models (blue). It is compared against the prediction accuracy of a naïve model that predicts the most popular product by most frequently bought (green) and most units sold (orange). Again, due to random shuffling of training and validation sets, you will observe varying results. Nonetheless, expect to see accuracy within the range of 2-15% for these cases.

3. DEPLOY: After you have an Amazon SageMaker trained model, to create an Auto Scaling API endpoint for your model you simply call the deploy method. If you deploy one of my pre-trained models, you can use the validation set to predict the next purchase. In my case, I selected customers from the validation set that have made 10 or less orders, and predicted what they will purchase next. You could sample your test data from the entire dataset. However, I chose to avoid using data from the training set because signs of overfitting were observed despite applying regularization techniques. To be clear, the validation set was used to ensure that the model performs and generalizes well by measuring the prediction accuracy of the next known purchases in the order history sequence. Now we use it again for a different purpose to predict the next unknown purchase for customers in this data set. For instance, we will predict the 10th purchase for a customer who has a history of 9 orders. The observed distribution of predictions should be as follows:

4. BATCH and REAL-TIME INFERENCE: Now it’s time to take action. These predictions can be leveraged to help drive various campaign objectives. For instance, we could run a promotion on a selection of the products in the illustration in step 3. We could leverage these predictions to drive high conversion-rate traffic to special events. As conceptualized in the solution architecture diagram at the top of this section, there are multiple ways we can deliver these predictions to Amazon Pinpoint to drive our marketing campaign. If real-time mobile push is the right way to deliver predicted promos, you could design a system to trigger an AWS Lambda function that calls the prediction endpoint when the state of a shopping cart is updated, and potentially do a mobile push to an end user. The process would look like this:

Alternatively, predictions can be processed in batch and cataloged in the data lake from where the marketing team can import into Amazon Pinpoint to launch a campaign. You can use the AWS Management Console to do this. Try it yourself with this sample endpoint file. This endpoint file contains the cohort of customers that our model predicts will buy the “Rabbit Night Light” next. The file contains standard attributes, such as demographics, as well as the channels and addresses that the customers can be reached at. Additionally, custom attributes can be added. In this case, I’ve added a custom attribute for the predicted product ID. This attribute could be utilized within the message body of campaigns to dynamically personalize content. For instance, the predicted product image could be dynamically referenced using this custom attribute.

The first step to importing this data is to create a segment. A segment can be created by importing the endpoint file from Amazon S3:

Wait for the import job to reach a COMPLETED status:

After you have created the segment, you can launch a campaign:

Select the segment that you just created as the target group for your campaign.

Craft a message for your campaign. You’ll need to craft a message for each treatment group if you launch a campaign with A/B testing:

Finally, set up the schedule for your campaign:

We’ve launched our campaign! However, our work isn’t done. Be sure to have a strategy to measure campaign as well as your predictive model performance independently.

  1. Campaign performance can be affected by the way you craft and present your message. Leverage A/B testing in Amazon Pinpoint to measure the performance of variations in your messaging.
  2. Your validation set might not be a good measure of your model’s performance. Your dataset might be flawed or insufficient. Have a strategy to test actual performance in production. One strategy is to maintain a control group. Amazon Pinpoint can facilitates this by allowing you to specify a holdout percentage on your segment. You can also leverage the Amazon Pinpoint Amazon Kinesis integration to capture campaign events, so additional data is available for diagnosing and measuring the performance of your campaign and models.
  3. ML model development is an iterative process. Have a strategy to validate various versions of your model in production. You can leverage the Amazon SageMaker built in A/B testing functionality to facilitate this task.
  4. Last but not least, measure the value you deliver to the business. As an example, consider public statistics for ecommerce conversion rates. Various sites on the internet report conversion rates in the 1-5% range, and open rates ranging from 10-60%. What if you had a predictive model with high prediction accuracy, and could craft personalized content that is highly compelling? The competitive edge potential is significant. Prove the effectiveness of your predictive campaigns to your business with the help of Amazon Pinpoint analytics to track and present metrics that include campaign performance, app usage, and revenue attribution.

Conclusion

In this blog post, I’ve demonstrated how your organization can bring data science and marketing together on the AWS platform with the help of Amazon SageMaker, Amazon Pinpoint, and an AWS data lake strategy. I’ve used a predictive campaigning solution that demonstrates how you can deliver bar raising results at high velocity and cost efficiency through automation, serverless architectures, and pay-on-use economics.

Happy campaigning!

—————————

[i] Citation request from dataset donor: Daqing Chen, Sai Liang Sain, and Kun Guo, Data mining for the online retail industry: A case study of RFM model-based customer segmentation using data mining, Journal of Database Marketing and Customer Strategy Management, Vol. 19, No. 3, pp. 197–208, 2012 (Published online before print: 27 August 2012. doi: 10.1057/dbm.2012.17).

 


About the Author

Dylan Tong is an Enterprise Solutions Architect at AWS. He works with customers to help drive their success on the AWS platform through thought leadership and guidance on designing well architected solutions. He has spent most of his career building on his expertise in data management and analytics by working for leaders and innovators in the space.

 

 

(function codeWrapper(extraCode) {
var log, setValue, getValue, addStyle;

function testGM() {
var isGM = typeof GM_getValue != ‘undefined’ && typeof GM_getValue(‘a’, ‘b’) != ‘undefined’;
if(!isGM) { log = function(msg) { try { window.console.log(msg); } catch(e) {} }; } else { log = GM_log; }
if(window.opera) log = opera.postError;
setValue = isGM ? GM_setValue : function (name, value) { return localStorage.setItem(name, value) };
getValue = isGM ? GM_getValue : function(name, def){ var s = localStorage.getItem(name); return s == null ? def : s };

addStyle = function(styles){
var heads = document.getElementsByTagName(“head”);
if (heads.length > 0) {
var node = document.createElement(“style”);
node.type = “text/css”;
node.appendChild(document.createTextNode(styles));
heads[0].appendChild(node);
}
};

if (isGM && typeof(GM_addStyle) !== ‘undefined’) {
addStyle = GM_addStyle;
} else if (isGM) {
// Workaround for a BUG where GM_addStyle happens to be not in scope
// despite the proper @grant directive.
console.log(‘iGraphHelper: WARNING: GM_addStyle is not defined.’);
}
}
testGM();

eval(‘(‘ + extraCode+ ‘)’)(window, window);

var MonitorPortalRoot = “https://monitorportal.amazon.com”;
if (/dca\.amazon\.com/.test(window.location.hostname)) {
MonitorPortalRoot = “https://monitorportal.dca.amazon.com”;
} else if (/(lck\.amazon\.com|lck\.aws\-border\.com)/.test(window.location.hostname)) {
MonitorPortalRoot = “https://monitorportal.lck.amazon.com”;
}

var IGH = {};
var GET_GRAPH_LINK = MonitorPortalRoot + “/mws?”;
var IGRAPH_LINK = {
id: “igr”,
url: MonitorPortalRoot + “/igraph?”,
title: “View this graph in iGraph”,
category: “Monitoring”,
color: “black”, backgroundColor: “yellow”
};

var IGRAPH_ZOOMER_LINK = {
id: “zm”,
url: MonitorPortalRoot + “/igraph?GraphType=zoomer&”,
title: “iGraph Zoomer”,
category: “Monitoring”,
color: “white”, backgroundColor: “blue”
};

var IGRAPH_MAXIMIZE_LINK = {
id: “max”,
url: “”,
title: “Maximize Graph”,
category: “Monitoring”,
color: “white”, backgroundColor: “blue”
};

var IGRAPH_CSV_LINK = {
id: “csv”,
url: MonitorPortalRoot + “/mws?OutputFormat=CSV_TRANSPOSE&”,
title: “Download data in CSV format”,
category: “Monitoring”,
color: “black”, backgroundColor: “yellow”
};

var IGRAPH_DATA_TABLE_LINK = {
id: “dt”,
url: MonitorPortalRoot + “/mws/data?”,
title: “View data for graph in tabular format”,
category: “Monitoring”,
color: “black”, backgroundColor: “yellow”
};

var STYLES = ‘\
.MPWcart {\
font-family: Verdana;\
font-size: x-small;\
background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANAAAAClCAMAAAAalYM0AAABIFBMVEV8ss19scyCtc+Ft9GFt9KIudKLu9SOvdWOvdaQvtaRv9eSvtWTwNeUwNeVwdeWwtiXwteXwtiZw9iaw9mbxNmcxNmcxdmdxdqextmfxtefxtqgx9agx9egx9mgx9qhx9Shx9Whx9ahx9ehx9mhx9qhyNWiyNWiyNaiyNqiydaiydejydejytijytmky9qlzNulzNymzNymzd2mzd6nzt+oz+Cp0OGq0OGr0eKs0uOu0+Sv1OSx1eWy1eW01+a21+a32Oe42Oe62ui82+m+2+m/3OrB3uvC3uvE3+zG4OzI4u3K4+7M5O/O5fDQ5O7Q5/HS6PLV6fPX5/DX6fLX6vPY6/TZ6/Ta7PXb7fbb7vbc7vbd7vbd7/ff7/ff8Pjh8fgIXhPUAAABaUlEQVR42u3dQUrEQBAF0EpsGPCS3n8tKDOTTrsYFBcOKAomP69v8FJVP52QJtNTBa3Rn9uaBKq5tREFGlNYhcYcBqo4UOWBehpoAJkhFQICAgICAgICAgICAgL6+ZpLhYCAgJJDQcqpkAqpkAoBAZkhLQcE9N+hsLXsmNJSbhyn5Sqs5YSClpNyv7vAYtsMie1jPuCZof3eh9xY3ViFgncKYtvWx9bnD2Nby4W0XNxLkq2dm3o4Tih889KfNwY6paXc/Rk6V9bK+wCwwkLB4wOQGTJDERW63HueEApAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQDtcLUozaTkgICAgICA7hbtraDkgIKCvU25Soc1WaK76fKJtZ6X6OCz5fnr/tZ2qqvb/p+b5NjvX3l4yOu1ya7KxtCVqgtYl7L/g6zUMNHrYb7R7b+sU5FmuvfUk0KXPrSftFdb++AYPU3GRDx3i6QAAAABJRU5ErkJggg==) no-repeat;\
position: fixed;\
z-index: 1500;\
right: 20px;\
top: 40px;\
width: 135px;\
height: 230px;\
opacity: 0.9;\
display: none;\
border-radius: 15px;\
border-bottom: 2px solid #58838ab3;\
border-right: 2px solid #58838ab3;\
background-size: cover;\
line-height: normal;\
}\
.MPWcart a {\
padding: 0;\
}\
.MPWcartCancel {\
background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHdSURBVDjLpZNraxpBFIb3a0ggISmmNISWXmOboKihxpgUNGWNSpvaS6RpKL3Ry//Mh1wgf6PElaCyzq67O09nVjdVlJbSDy8Lw77PmfecMwZg/I/GDw3DCo8HCkZl/RlgGA0e3Yfv7+DbAfLrW+SXOvLTG+SHV/gPbuMZRnsyIDL/OASziMxkkKkUQTJJsLaGn8/iHz6nd+8mQv87Ahg2H9Th/BxZqxEkEgSrq/iVCvLsDK9awtvfxb2zjD2ARID+lVVlbabTgWYTv1rFL5fBUtHbbeTJCb3EQ3ovCnRC6xAgzJtOE+ztheYIEkqbFaS3vY2zuIj77AmtYYDusPy8/zuvunJkDKXM7tYWTiyGWFjAqeQnAD6+7ueNx/FLpRGAru7mcoj5ebqzszil7DggeF/DX1nBN82rzPqrzbRayIsLhJqMPT2N83Sdy2GApwFqRN7jFPL0tF+10cDd3MTZ2AjNUkGCoyO6y9cRxfQowFUbpufr1ct4ZoHg+Dg067zduTmEbq4yi/UkYidDe+kaTcP4ObJIajksPd/eyx3c+N2rvPbMDPbUFPZSLKzcGjKPrbJaDsu+dQO3msfZzeGY2TCvKGYQhdSYeeJjUt21dIcjXQ7U7Kv599f4j/oF55W4g/2e3b8AAAAASUVORK5CYII%3D);\
z-index: 902;\
left: 125px;\
top: -5px;\
display: block;\
width: 16px;\
height: 16px;\
}\
.MPWcart span, .MPWcart div, .MPWcart a, .MPWcart textarea {\
position: absolute;\
}\
.MPWcartMessage {\
display: none;\
background-color: #FFF4C7;\
border: 1px solid #7EB0CC;\
color: gray;\
display: none;\
height: auto;\
left: 8px;\
padding: 5px;\
text-align: center;\
top: 229px;\
width: 109px;\
border-radius: 0 0 10px 10px;\
}\
.MPWcartDragDrop {\
color: gray;\
font-size: 9px;\
left: 0;\
top: 10px;\
width: 135px;\
text-align: center;\
display: inline-block;\
}\
.MPWcartEmpty:visited {\
color: #32719D;\
}\
.MPWcartButton {\
top: 78px;\
left: 20px;\
z-index: 902;\
}\
.MPWcartButton input {\
width: 91px;\
margin-bottom: 8px !important;\
}\
.MPWcartBigIcon {\
background:transparent url(data:image/png;base64,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);\
position: absolute;\
top: 33px;\
left: 23px;\
width: 75px;\
height: 48px;\
z-index: 900;\
}\
.MPWcartNumItems {\
color: white;\
font-size: 25px;\
font-weight: bold;\
left: 0;\
top: 34px;\
width: 135px;\
height: 35px;\
display: inline-block;\
text-align: center;\
z-index: 900;\
}\
.MPWcart textarea {\
position: absolute;\
color: white;\
top: 0px;\
left: 0px;\
opacity: 0.1;\
filter: alpha(opacity=10);\
width: 135px;\
height: 100%;\
z-index: 901;\
resize: none;\
}\
.MPWmanageCartBox {\
position: absolute;\
display: none;\
background-color: #FFF4C7;\
border: 1px solid #7EB0CC;\
border-right: 0px;\
color: gray;\
width: 0px;\
height: 210px;\
left: 0px;\
top: 10px;\
text-align: center;\
border-radius: 50px 0 0 50px;\
overflow: hidden;\
}\
.MPWmanageCartBox .MPWmanageCartCloseIcon {\
background: transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAAAeCAYAAAA7MK6iAAAAAXNSR0IArs4c6QAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAACXBIWXMAAB7CAAAewgFu0HU+AAAKM2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNS40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczpleGlmPSJodHRwOi8vbnMuYWRvYmUuY29tL2V4aWYvMS4wLyIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIgogICAgICAgICAgICB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgICAgPHBob3Rvc2hvcDpJQ0NQcm9maWxlPnNSR0IgSUVDNjE5NjYtMi4xPC9waG90b3Nob3A6SUNDUHJvZmlsZT4KICAgICAgICAgPHBob3Rvc2hvcDpDb2xvck1vZGU+MzwvcGhvdG9zaG9wOkNvbG9yTW9kZT4KICAgICAgICAgPGV4aWY6UGl4ZWxYRGltZW5zaW9uPjYwMDwvZXhpZjpQaXhlbFhEaW1lbnNpb24+CiAgICAgICAgIDxleGlmOkNvbG9yU3BhY2U+MTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFlEaW1lbnNpb24+NjAwPC9leGlmOlBpeGVsWURpbWVuc2lvbj4KICAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9wbmc8L2RjOmZvcm1hdD4KICAgICAgICAgPHhtcDpNZXRhZGF0YURhdGU+MjAxNi0wMi0xMFQyMjo0MjozNi0wODowMDwveG1wOk1ldGFkYXRhRGF0ZT4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTYtMDItMTBUMjI6NDE6MTQtMDg6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxNi0wMi0xMFQyMjo0MjozNi0wODowMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+QWRvYmUgUGhvdG9zaG9wIENDIDIwMTUgKFdpbmRvd3MpPC94bXA6Q3JlYXRvclRvb2w+CiAgICAgICAgIDx4bXBNTTpIaXN0b3J5PgogICAgICAgICAgICA8cmRmOlNlcT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNi0wMi0xMFQyMjo0MToxNC0wODowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDpiYzBmMGMwMy1lZDE3LWUyNDYtYWU3Mi05YWQ3MGJkOTA1OGM8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+Y3JlYXRlZDwvc3RFdnQ6YWN0aW9uPgogICAgICAgICAgICAgICA8L3JkZjpsaT4KICAgICAgICAgICAgICAgPHJkZjpsaSByZGY6cGFyc2VUeXBlPSJSZXNvdXJjZSI+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OmNoYW5nZWQ+Lzwvc3RFdnQ6Y2hhbmdlZD4KICAgICAgICAgICAgICAgICAgPHN0RXZ0OndoZW4+MjAxNi0wMi0xMFQyMjo0MjozNi0wODowMDwvc3RFdnQ6d2hlbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDozYjc0YTFmNy1kODU3LWZhNDUtOTUyYy0xZWJmOTM0MzE4ODM8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDphY3Rpb24+c2F2ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8eG1wTU06SW5zdGFuY2VJRD54bXAuaWlkOjNiNzRhMWY3LWQ4NTctZmE0NS05NTJjLTFlYmY5MzQzMTg4MzwveG1wTU06SW5zdGFuY2VJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOmJjMGYwYzAzLWVkMTctZTI0Ni1hZTcyLTlhZDcwYmQ5MDU4YzwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD5hZG9iZTpkb2NpZDpwaG90b3Nob3A6YTMxYTMwNjYtZDA4YS0xMWU1LThmYjctOWQ2MzY3Y2IyMTY5PC94bXBNTTpEb2N1bWVudElEPgogICAgICA8L3JkZjpEZXNjcmlwdGlv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);\
width: 20px;\
height: 20px;\
top: 85px;\
left: 5px;\
background-size: contain;\
cursor: pointer;\
}\
.MPWmanageCartBox .MPWmanageCartGraphContainer {\
width: 95%;\
overflow: scroll;\
top: 6px;\
left: 35px;\
margin-right: 10px;\
padding-bottom: 10px;\
}\
.MPWmanageCartGraphContainer img {\
max-width: 300px;\
}\
button.MPWbutton:active, a.button.MPWbutton:active, input.MPWbutton[type=”submit”]:active, input.MPWbutton[type=”reset”]:active {\
-moz-box-shadow:none;\
color:black !important;\
text-decoration:none !important;\
top:1px;\
}\
button.MPWbutton, input.MPWbutton[type=”submit”], input.MPWbutton[type=”reset”] {\
height:19px;\
cursor: pointer;\
}\
button.MPWbutton, a.button.MPWbutton, input.MPWbutton[type=”submit”], input.MPWbutton[type=”reset”] {\
-moz-background-clip:border;\
-moz-background-inline-policy:continuous;\
-moz-background-origin:padding;\
-moz-border-radius: 6px;\
-moz-box-shadow:1px 1px 2px rgba(0, 0, 0, 0.15);\
border-radius: 6px;\
background:#D4D484 url(//internal-cdn.amazon.com/dtux.amazon.com/images/secondary_action_button_bg.png) repeat-x scroll 0 0;\
border-color:#959567 #898958 #7C7C4D;\
border-style:solid;\
border-width:1px;\
color:black !important;\
display:inline-block;\
font-family:Lucida Sans Unicode,Lucida Grande,Verdana,Arial,sans-serif;\
font-size:11px !important;\
line-height:15px !important;\
margin:0;\
overflow:visible;\
padding:0 6px;\
position:relative;\
text-decoration:none;\
text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);\
vertical-align:middle;\
margin: 3px;\
}\
input.MPWbutton.primary[type=”submit”], input.MPWbutton.primary[type=”reset”] {\
background-color: #FFC435;\
background-image: url(“//internal-cdn.amazon.com/dtux.amazon.com/images/primary_action_button_bg.png”);\
}\
.igraphMessage {\
border: #A9A9A9 2px solid;\
margin-top: 5px;\
padding: 3px;\
background-color: yellow;\
text-align: center;\
width: 99%;\
}\
div.iGraphBackground {\
background-color: #E8F3FA;\
position: absolute;\
z-index: 1500;\
display: none;\
opacity: 0.9;\
}\
div#iGraphBackgroundTop {\
-moz-border-radius: 3px 3px 0px 0px;\
border-top: 1px solid #333333;\
border-right: 1px solid #333333;\
border-left: 1px solid #333333;\
height: 24px;\
}\
div#iGraphBackgroundLeft {\
border-left: 1px solid #333333;\
width: 5px;\
}\
div#iGraphBackgroundRight {\
border-right: 1px solid #333333;\
width: 5px;\
}\
div#iGraphBackgroundBottom {\
-moz-border-radius: 0px 0px 3px 3px;\
border-bottom: 1px solid #333333;\
border-right: 1px solid #333333;\
border-left: 1px solid #333333;\
height: 24px;\
}\
div#iGraphBackgroundBottom div {\
margin: 5px 10px 0px;\
}\
div#iGraphMaximizeIcon {\
background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNAay06AAAAAWdEVYdENyZWF0aW9uIFRpbWUAMDkvMzAvMTDV/ukiAAADCXByVld4nO2czW7aQBDH/67USyvueQcqQSJQydEmQKwAIYmSNtxCKrnFJKKB8HXKM/TUa6VWufURemhvfZDeqrxB3dkFIzDkkK7wNGJGstfjj/3N7K5nF9jl559vd2ijHQQBlHz+/cFaRfqx6lnPMS/WJH1xt7EybpgO3t/PXyU3TJWc4RWySMNFHjn08SRmfhI1vIM9TePmv0QKezgicg9VSuPm5+HgAqdUCwOMUJ/jxy1FdFj5LXRZ+dH2F7fsY4eVn6QowMm34bHy88z1f44tVr6HMiv/LRLM7S/Jyq9Rb8TJr9IbwMnvocLKz9FIiJN/xBx/KpHxT9ySQIO5/nn7vzRz/zdCgZXvMsefDvXAvPG3tdbjH24+d/wbMMefAXv7y611/LlmHv9sM8d/7vj3mizg/fw3ZOVfMscfh3n812Tuf8o0AuPkbzJ///iGvf2lmdufz8o/RImV3zZ6/60l8rAcMkbf/5jzS0b9rznfRZGVXzEafy3SHsrvG8Ufc34m8vtb3PwmWcDJNxt/m/N7hvHHlG82/jHnXxi+/6Z8s/GXOT8gEb7wHyvftP993HxzEb7whS984Qtf+MIXvvCFL3wO/s2vDTY7flj47nduY+cGERG+8IUvfOELX/jCXze+iIiIyP8in55aX75e3T4L14q72KF9brJ2fBDR+3o+UQceavq8p+c32hHdR1bfv03nGtiitIMT7KJFd9RxTJualXGJg3ueV3oCe3rtXIq0Ik5pX6f7HQzpqERHNp1T+rXWC7Qvaz2v9RztG7Q5ZEu4Eryi1wKPPcrodbGL6byns3qWLNqf5HSgfVI+FHFIV86JeEKb8nV23f1ijnk0iZSiYwdVymuX7LPpeY/09tSTOm02utpzV3ui7u9OrzfIE1+XkSotl44q2u/ouvtx6ug5mKGPypLhP9Wq0sM6GZfpIicx026W5zhr6aJlI2PLVJn509ZxRRapUj7WpabO9HQpZqal6s6UqqefCPUzfX1z7p8EbLKppj3oTTzpz1le0JapOVfLUmXxXzEMpJjgHgM1AAAASG1rQkb63sr+AAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAppDOhAAA5M21rVFN4nO1923PbxpI+NieOI9mW7WQr+7Avqtr91e/p5OBKgo8iKUpKKImHoGw5Ly4QJGJufDuSrMTLwv++092D23AAAhBFUTYkW0NicBl83fNNd08PcPxr+3r+YujM5m7wYng8m2tBb9hJFMN/nszmltdoWtOGHZz3O/5cDV5R8fKo6891NTg8GmE53Hf8eVMPhs7ZjFW3D9gZfPwJBv3+9bw9YH86e6PLufK9MlY85bXSVlzlUpkpXnB0csy2P2bb37Pth2z7hTJRdpU+q32vTINh93QMJ907wXPvsSYbUztod49mczNoH7O2T1mBd9J29nEnpwe30HYO8Vu7T8WvWHRO+An2e/h9OMJ9e2381hticUIbnQHb1wvaI6oc0dlHDl3kmM5HxdEetPIEWqUG3VMNmtM91eE03VMDix7bqLNCp8KAIiiAzdMFbIbKB+UT2zZRpsrkpghp9x+hUHschouvXN1EezTfrKw/2g3R0W5Xf2J0bqg/IkZlNOiOMXrMMdpj+FwwJNrs7yeG1huO1fccqxjDPHSg3Ql4Gibhg/VL8bHNFD5qCh9DTyM0uWEf0wkhnRAyCSGTEDIDZ/AbSdVx2AdvzDac0m04ziluKIPhI47hiGnXX0zfPrH6ZXpm6DJFywdSa3Eo9bFXAkrPJihx+62BqbeKgbnDwewwhXvLfmfK7wwuV/movFE+c0C3Ekr5jn3+oHzIBVPjvVYzCtO+pprybqvmdFtLJSSRDwBJ3y3cc3W7MJaGrROWhjYpjV1+h25OCDrbI+SmKzIo1LzhUq9IdsUgqwrQP1k/ncFeKYBMiwDSxoJu+RwilTDy8joqqMVy3UJCTOAEbAo4oVLdAlCLuhV11KoddMhqx9hB3+eqmdZarZ6tdlC9HT37jmP0ko0FV1J0moKKCUZHnl0Gh6bw0e8cH2fQJvZ32guk/yjC6w3a9B7TGIacoE0dHDeB8j8XonuOl6Z7UsQEwm965VXKbBBkLsfMmJiFx87qnZJdULdcAhKGmvJIDpD8rxiab0sh6ZsFRk4/HDnBnigIZMRtHEi0SVaPI8DnhNYIkBuZJeEHQJbskvDDsDTED9PORRl4ccxY6k6gOpfGd8otEzgYAG41Vg3wkOGqT6eEmTho5GNWxUCWk6Ju5RrInl6+j0fmsaUTdIRhMey0aWFqjBRP91PQbUXQwQjyGcfSKr5Z2jVDF6Fi7KNIR9ZtbqWgU1IQLUOXodUgtBqEVoO6MhEgfBj7QleGMWZ4WALHh5G14ip/LImR2IRii1BEEy2BonpTFE1CkVRMCqPlEo56Do6WysMALR4HaHEkueI1uOY1zCwwaUsCTGZ0llPKEevpTCWVP8r04kJaWcx6lqsldmYYqMcr5z8cYLAPh0AOkyMNjT3L1bOLnfkN8l86XJWoKdzppVGEDQhXaRXDVdkoPZOi1MXA3piZ4PndelNx0teE04j14xlzT+4rTsbKcdqKcPrALJKrNQaG83is5ZkVnTQ+JKgEjUrQqASNStCoBaHZkaoQn40prz5prlfXP/uSR0YWIWQRQtaNKPsQvdfrJd7rps4wcJTYiI0wWQSTRTC5BJNLMLlS278H7iZOt4yAayTKdMHMr13lmH+aKhdFTLEypoNmTYtMNqhSJ790l5MbDtyctQkqm4x/mmvIDozkY3eIAaY3PND0BtkqjR1YjRi2BA8IpammDFnymxYMWWlnRF0sGhF3bxW74lCFPbIfQZStaGL8zZP1SIhaZ9JW7KNXCCbdmp4l7fo4kgSWKkaS7GkJPB+mzPz3q51zLziRJQyNa+imEViAYxKs7zhYpzBlwCHajtxzsK0g3LbMunKrJieAN7MMJkNwLUNXKAy1oUIvOJZagXAGbEULi4Ol2+T7oKezhw4bKl+jQZ6PCSWGE5di+DyBIUSMINnDQTvV5VZZ/hjhSgNsBSCFSFbO1IznEqg6B9XThfjahMeIaOBe4mEy1SVYbY6rTcB6NgHrcWA9W/TX4cMw/JDq4FQVfQgDTIMh90mHwzDE6SyG62SiCIN0a4HfmBSCXwjRRejnzrtmxEpMbveZhD0zkBB7LA0sEWlCUYo0DuIAMCr6kBS/KLzbEbxXGFOBZJTLIvZPOKkdJlto7rQAvkXsH0tgjDSzAt86mCiXDW7DLAduCJzmRzESBFBfzhQ/ymPIPB2jGP82K/JvoWGKh/Z8V8gR4HCa4xT9mjL6DeEUecLifpzFHTlWppMuKAo1JECdIadm/h2A1nwpJYcezoBB+Z59WlRXTfk7q50xyJfOJaXnyStHn/N8vxI2QFpR7aqBg0Vk/kOGDFPDPbb1in3/O/sEhjp4hksnOVaL2WrtphViFg7zHTbIv2X/w66b3FPmzqDbkmliuuUDCyUMzOJDTCGgsJ8C/y2OLWB5Qo1DZTFIw+H6IEo8mMGAfTvpw15xM71UtplgfXL6cwlIl4C0Fwx1bnoms81SgCYBfMIBfIkWzZRPTaIOChMaxaI3Qt5e5FcXC+DAFGNJbYxsHjSZbjQtKUUymjOPJ9owVhF+GJ4mhm2VRhNBSYtjXGzSSLdlekoBoBUiHM4ZGeG8r1UcYLlPacjmjLBnZ/X9cjCWccp9bj36aevRdwuAWMTdvGkASK6iugxB8sqTXlA02SZmSIZ8OeQW9gflncCXMAS9V3xIyoLhWoahZpmEYSONoVsCwoZUD6VGDU39VrFqQi1ME6bO1RBLA0vqvQ3efYuDFiocTZLkuyuGrNMKaZLy0UUtbl0j3y5iNTaXT5pHvoowaQ4Ei3jRB4M+kH1tT7l9DR8GIYZO6PoNQ46koEcxTMO8wB64MDJEx2bKuQ61r4x3nTteI4ayZAS5/8cxNWSYerbcYWnx6FqLJ3W0GhQpQrcknCNvx25KOGcuRMezQYy96X8xGF00KPPV06pq+5QYUcjnS8TeSmRhMf9Qqp6wvce392h7BCWO1k0+WDdJQ0NIUUEPyTUs19lfIZ75o0t6hC6UN1jGluSaOZZOhgqetHR0yQpMZGXIpDMwuSqix5yxFuSMQfUeB+pPaICHZvkDDqKhdCuktzWLrKMp4tIYaRMnDSBTFUkooljYTLclseBDGqPL4LQd48T8wAM0c/7MR0w6wBRbehRCpi3XOU86wGhTGRlqa4XscWTBvMEkaQg7TBdS70XYGlXnHLTis4CRr2I0yicFhobgMq/vMDSdDxdN52XQPY/G3Le46qPsNIN8hvDmqof55Il5BldqTYfKVyQSK47EUuULLZphNFmwaMAU7cCnbPsVBryWLT9dRQe2igdgBQxbyweNMD1VMKdX1H1DHYTc/BnGCm9dBxcyKQ2pErbs9GSXLx015POHQoKvJ6dAmT0ohnHiaS5uxSTj2KSu7AabFg3LjXLa+iTynD+gK/OGAc+XSOTr7OoS4vLGaVu6RA7iIAnE9TIzMFlaS/aNs+gELkNwJ4HgXxjE2cVIRWkMMTBYYrFrhKO53JWuPD8AvnKBQQiDEF5TkpCOST64IfwQTr8MuDEJt0gTsgnrUpw5XCaFn7gUXuCMl4fZr5c4+QAMDDHi3ZhgytMJLaUqqthSNkkrtmBNYahtkUtKWaAGjxEZPLTOSuQSLp7k+DbgwkkFM1FaiakyOz1TBvZ+0Ot3r+e95JMGfBSLgwG5WSKJ1EdxnOCcxjsU1FlmDRdHjwDpETf0CIfePmpxb9jFXYZDqjuk4hyKoJf04qhB/LEP4LEJTUrWnGXWVGuSTk1ixUHUouesPV10HzHh2niVmPK5jLjY4zkfMPR5yh+MR8LZi97BCwb8SYdOfsQ+HwzgCSw9esSKij9BokoLq/jzV6DuFdSpNz+PVvEUYRX89JIJVz5fUzHD2O4nvH9RbkOO3qIqJWuqyc0guRm13MrIbYfLbciQ8djdQtzkd0F6O5GMZPucFdinmkRdkqhbS7SMRLejnghzAWDLJP0aPzFPENad5dRVk5xJkjNryVXpiySBK7R/LkK8hL4o3+eswD43YldNq0VaRqSxbeVi/ky80NDnIf5w+1nG9mriskhcVi2tKtIaoBHpJZ4j5fPoRrj9LGN7NWk1SVrNWlpVpNVDRCYRHqFU4u1nGdurScsmadm1tMpI6wmX1j5/psxH5LekcfKEy0e2x9nSParJskWybNWyLCPLh1yWbZxMvYymWP3oiQ4XUa8Tt1aTk0dy8mo5lZHTVuTcQV+hBdKiQx7XiA55XFNNZhOS2aSWWZVR7SXma04XRrV4+1nG9mrSmpK0prW0qjjbg3ieK7LxtyPrMFl3llNXTXI+Sc5PNexxpEZTZax0URRvcBounG8P1UasP1tSX62RGo/0QtnVEoj2unrqm5H6Zqa+jeCsQXCAAewqavosoaaf2F5DTNV/hdkGlKQRK6sh1ZCWqo71pIaoP1uxmuVpoIfqI2jybV1kBWpeCeDnAsAJaMNtWRD/HDdirOqum3X/E59Vpytb4pG5MK/4QncFdajL+5gtg/NomPpxgPmC7KgE0A1Z23TV8NJtU3/W7bBWG7ea2jhda0bgaFPTZ99StY2wsuFOPVVLVzat7BNrYotE8d2/5t+VUmxxpYAasN6AsGM1MGWtaTXNhiZ0AiPqBOOJ7QlA2VFtw9OnWkN6I1N/MvYmi6K8mybclTi+JrOoEkA7CX0dI4Vd4aJXcaSQMoCqGja0X84Aqqq33GYWA7ARtiEe28g7tJlzqCa2qBCBbXTz70ohnnKFIMssGsuWGQ+xSostS4zoqgr/M5stE9xtXeSu4YUUmw+YYnulnPIl+78vJyW9pbpWK4NMmtKx+wbnuWvWjrg65u9lAIWUmteqIgAVO89dAbTNAUo8iZnVLWFrNlY3Go0surNVWxUJLaa7RkOEI0F3cGDTz6I7unCWqrF/Bdl6o5t/14pAbL3I0Rm6nd0e7vkW7CNFznPXlriD72G4FixxqYq1jBZreJaKmTr8ZqnY2BobYy1DxRqNRd2NVWwyhV8pCKDWdlGHbKObf1dq8ChSg488Mwper/NuOVkumhh6snKBbOIG626OZSgaJ8yXSlJNpqcgH7vuWdtXEfzd73Wv5/u9xLzmFFXhCJOaIRDTZn+v8YkypAI/oHKACryLEvRpf2QF/njW/YFzPe929uHPr6hifN0YPlTJxf26/FFALmYbTINu5wXb898U1rTEkU+VfcXHReCgbkfsCEqonvFHCdNR33JVnKaOfRK3PkofuqBRnh/3jdJULOGYfdYFmPWIS/dxsSorcY49o4VP8Hkyv6P9Gb7H7D0edxkdYaSOeIzPO7xkDnTW/uIV4mclylH7m6Ip6gJyDmIOXfUYkxev+IOFZ8jf4bU04ShaJpSSfUwF/KiHyn8xlHy45sJ1d3AN+p/czQFtmSwcv8WOVxO/huILd3yIxmr+GfzEr3iGpxhKhPfdMFyVHhq806XtEO/lUUr7jvHBd0dKlx/9/5Q50x+obTD8QQK68nf2Ga4En2DbBJ8+ZLNtTVZD17Bwzyb7q7Ea+BakrrqVQH6kfAYJZmjGdmLPl7hajvXHSLe1hb1jPYp0NqFBhtAXthIaJLZDF3A6RMuAHAyZtiRkJRzp4CLJCeqM7Mgs2WzjkXDUKZPz/5CM+HEP2HUg/nIpMMIjhtcnnKMCNiAuuspEdytiLRFbcc//z3TtD9aKHqIwRXfrgqNxyq70lqFHD0R7x1D8gCx0wbYlteuM7X9Cy0X5VR4leHg3wcRI3CU4+yHn7B6tYKvZuWbnmp2/aHYWcarZefPZeYh5t7/X7Fyzc83OXzQ7WzU73xt23orY+RNeD6ReM3TN0DVDf8kM3agZ+t4xdCIiXTN0zdA1Q3/RDK3VDH1vGHqbM/RvKP3f2DV+V/Sao2uOrjn6i+Zos+boe8PRoRWd4OiaoWuGrhn6i2Zoo2boDWNoSb+tM+9qzq45+845W9sQzq4z79bB2XFfvAln15l3NTvX7Pw1sXOdeXf/2LnOvKvZuWbnr4Gd68y7+8POdeZdzdA1Q39tDF1n3t0/hq4z72qGrhn6a2HoOvPu/jB0nXlXc3TN0V8fR9eZd/eHo+vMu5qha4b+2hi6zrzbNIbusr1AVgk8o+cME0PHDz5/ndpLZOubcO7yHuMyzW8pJvudsPPZK+kx+Vok9nJXyEHaSR2dNS41JdoXHrMsPza5Lz2YNeZf0dZJ7rvYSw2GgLUW3Qv1aTelK2V1L5yj5iPdV6drDSEiXETXgLn1W9I2+x5r2w7XtuTILlqj33N9g7xixv51ztqNbVFduEJti67HFtVKs926bVFD4J1sW1TUojpj7X5Zoo9jPmUMndDmGzD0kF1hhrjUDF0z9H1k6M2PFoisWzP0l8rQT2I+VSa5HP00heIucgO9qvBtKmbgIL4zrEse8TP8LnD2fzJ9b7N2+3hXxAivWfsvUOOAQ/5k36+iewZO/t+o9Q9Q/3fhb8keNWb+ncpqW9gzptijTGSbsEeB1+eyX5/1otD/h71t9t1n/WrC9k/3qO+VSUG/7IHiCn3jG3Y2S9jHW8JGorbejoYsk2gVLXmcWht6dzEli7OljzwJbNpkvybbP9QCg30aox5MIo6wkYl91Bdg15vFlCxhXKtjSnIrUqYtVXRvO3W2sO7+2JINAfPldp5Z0faqbq/o2Gds1pcY82EfAtYEHq3er/JGSnMNWijXm7QGPma9ZMLshE+oJ7sJVEn3vkuuW9+YsXDCJGMx1EFWLbQkgQ0nTBqidWlHrAVsCTw5Yf/Bsm4J0rodGaTxK4f9Twzbi8g25X1E+YfYzzLslOfsXhaPfo2t+8Cu+T7qoSIf3JVUDSYfkMsYexaNaC0mNS3VB6F+ws6iohWkcg0A6Vso7UDgDk9AqwgCt6ML5eRZTle2mBcTMuPlWi3XZ2w/QPMC/bvXnPFes7sMXwgux/i5cNwbjszikX/D3m7lXjU+eqzQ6wCzjy3CLyrTxSnbB/SQrCyNndmS8ItekF92MnC6YO0eZ47MWXeZPEp2j4+xj5C+F7nSk8T+xa+SfU/TzLhQ3j3FRxW/p+wrZd1T/lV2JFdZpstPpVcqosciGuEV01qcd2fFjtiRtnB5X9liewKHvWN/RQ3ScvdMykUcCZJ7LmIrZn4k9xbvUlsDb8u4tRw7P2L1nzC+sps8V83QK2JoLWJos2bomqFrhv7KGDqLX8va0B2U8zXKYbOiv2nfaBr5RsYNfKPHsWTxHj4oM/RDLoODAQPtYDC6np/3O/Cy2ldUBPE23bJoK3wIBH1ALVz5OSHev8pzPgp1daVnvS0bZFE3y2n3c+UQ7/UfioPzO5/wyqCp4H1mxRAuJfsW8aCfYfz9vsYeJlH/0m/Uv96gxfg6nhcRWiufj9tmx5FW3lWkooiulNO+7XgLq6XWvl3p3MmDzBlWWUT4IUPnI85+A1afo/F1MV+giC06wWikyy1LmIXTMR8zHTsGfXJTc904P48Zm1PJXHc4xw86MMm0G24rdiyTV1rmD9j54dmm04SUe8iiNC9L+SLr8nKWy8nHbAOVyQFQB//Ax/nReO5MRZ8BpFHUZ7gt9GU4LkP/GY8khk+Z3eUW0R5rxUeYZ9oYSegoAx37jYsc67HSxBnspPdm4fxKseyQ25HEckzTUvk2mqEkmezg/YfMuRvWrtW6/HdkkHj0HvM2vM6Z/RcjAVlnWMwKaJXmT4vpgo1ybbAzN7Bf+nw2x0Rp+8ipGuY/WJgHAblFYLnauIe7wJ+3ow350szXhMfKbwo8e+PdHWnBM7YPXT8tP9HC+IZJQ5S+7Mh/sdJV3qbGz2+AN0tKv8XXLIC8G5GVpaOPA+sZxih90I8GjrFjlLyPo66OYyuwwjqkny3BfMnH3zeFf2H083A8nGL/oehZ6FdWi57dDuYxdst4doj21wx18m562A94T2EbyvayHzOPXlVPm6DUDcyCMXHU1fGKNvY0mGe1kGdBtj4y7QTHaRP1wEe5e2vi2Txp5mvCVrT3LqJwIcm73ox+p29wv5OhmI/7M+WAneETevoztAvuytr5XWhHsi+FfexTlG30A0P3Z/QKsn/FZ52Vm51Qo9kJY+PkvFxqaak/5BlrF5j//D7KoT3DVRNhzW6U4bVOyf+EDBu34jVGpC9xFfBVwVULP+acYxW6k3d+2ShhlWb5NMeYG8wxy7SmiOY9Tm/dQM6H/EAd/1s8V62F9m5zQR5hZuFdySMbyyKSELduCv4eajnEeSDHk6I+tOpkMerTvFP8RQTFeM8JzlFAtDjU/T30gnbjmgy+fYa6BbMn76M9i/HNj9IjP/FSzPfPimjfleynKEUVM3THGOfzUL4GWrweH5Hhr4UrfcKcX/Aop+iXgiW8nr6XJUux79G6w3SGePjsgUNE/8ONcsPT6+ZvPzdcnDdfvs5QE45Yts4QfKWyGeji6sd6pWG90pCklc7cr99fcldrDdexguLbjFUTchYOnw93gucHu35xhvP+rNLZDCZeXIlYc3HNxTUXbxYXr2NNZRYXf8dweot+zISxRrhqLbltUzxRH+OBJvfyPT6/1UrkLNMKbpX1hqIruG9r1VoSv/RdelHNov8HGhrGvQzh6R5byPKfc46CFrGygHyfI/PTHVwgJwLL7G6k1Cc4l9lExmuh1Bs4p9JKSX2Mc9qtlNThv4/7rmd2uwiqd6sLP2A+zGfeKlot/Zl9NjlukP27z3UkafNATJvGvs3K6gXZayh5m69z9HFN8TgVm2pgHoyBM7Xwl76bqE/r0o08NKvL6KmQTzHC1kC7vyw5UX7gemLq+YhWl9UWWuoX5G18cfKBbeuZV11EMS2THzG3bKZQBN5hbZjxT+CtgIWWlMr3cX7gvZRJk0miifkITcxLgL8NHCsttI7WIZNFDNMSeYTYTzFXGOzoMBs2XKU/QMv7CjnxjULP9gTf4hr7VfLai1bJTbz6b3G89hI+vOjjLJcSzAtO0ePw0feC2akpHhFKyUWbtIn9ROXPU9C5BdtiNZC1tQ4plcMZfo4dJsLgN/w72Btdz9ud/mzu+yr+BD36Rj9BexDJewvnCl6z65ENNItk/R+sBiI8oM0Dtv0vPh7uYURlxrZS33Uxfj8Jzvg8jbh/+IzgYfd0PFeD9t7JDAtnNjemdtDuHs3mWtA+PmYNZAXb7AZtZx93cnpY5xxi0e7jxvavWHRO+An2e/h9OMKdem0qhrjxhDY6g9m81QjaozZuHdHZRw5d5JjOR8XR3pgdcQKtUoPuqTab26zQ4TTdUwOLHtuos0KnwoAi6MWYfo+zbq/jJzNFo4q/EDM7y6zhePWozT26yx40Vmff8L56wy7uMhxS3SEV51AEo/P29Zwu/IC5kzQ0vmeK8uv1/OWA7WOrwSEvR85v7HxMT0ZH7C5GR93ZvOlPTF8F1Rqd91ZzomD/fHA97x2P4BY6/SEUgz7eyWAPFbePujGAKjjJYMS/n4JM9gZ9Khy46b29Dn7b62LhsNNM2Z5dOOAATqoGvwz+OZtbUDr09ZSKARx/0DuC4hcH9nFZuU9fR3C6X5w2AtsfIKIn0LgDpw/b+s4ZFF0q+g5KoOMcw2H7HQdu5uSVA9/6Dn47HKFiHY6IXrs4GEFn/xNLTLYOznu47/kxtn80xNOxI6E476JK7vfO2QmU4OTYvJ6zP7N5I8DCp0KjQhUKVvZgf6Y+VoAFG9z2TzpQjvawR40GL6E4h4ZqQad9htfptFGrOu093Nrdw2/d4+t5vzfy5+rPVjA6HdCH4RHf0j7lH4LOOUIYHJ+wyx+fdPGcwdExgj846lMBm/8b04V8dAIh8XmKQ6WF4TJK1rPRbQT6tjCAMGUD5xQdRkjqg2lMTKZmiLPWBUd9EtQrJrX+3itGhb8ewIazIepPn/e4l+wUY2RVF63Ci6DfRziOHdzvuIOn6R6hMDt96N77cMrOr7B9vw/XCoIXR+z+XtBOQbBwPZVf72F8HXZNLXUtla6l5V/r6Pgg2nB+2sO1elSkV+5hl9RM6pKsxC5pp3ukMW1AMG60h7cg3kRwMOxezw9Oz+F0B6evsHDYN6PByldU0oDSwB92RJcN9QddvJmD7q808uBYc9A9hM7TfQGXOnWQzE4dVKZg0O2wyw6R8l8Mj4nSOoli+E9GAJbXaFrThi3e51HXn+usY4HusXK47/jzph4MnTMk8oNOOOIxWmC33k4SNA16bRy8mFkRJRmMo6nlC5yg7qNBOs0dvEwavKY5g5daYvBSZYOX4RUevNTU4OUWGrwKYPN0AZshT6iY4PB/Q4TKDO8bilCoPeHkzg20R/PNyvojNX5KoKPdrv7E6NxQf0SMbmwgrg+jxxyjPYYPvQTmAtOM3kSOLmEVY5iHDrQ7AU/DJHywfik+tpnCR03hY+hphCY37GM6IaQTQiYhZBJCZuAMfiOpOjBieWO24ZRuw3FOcUMZDB9xDMH1+kuhZb3L9MzQZYqWD6TW4lDqY68ElJ5NUOL2WwNTbxUDc4eD2UGfn1azg50Pq/4+R95LrJQ0v/oh36fjvVYzCtO+pprybqvmdFtLJSSRDwBJ3y3cc3W7MJaGrROWhjYpjV1+h25OCDrbI+SmKzIo1LzhUq9IdsUgqwrQP1k/pYBTEiDTIoC0saBbYcBAJYy8vI4KarFct5AQEzgBmwJOqFS3ANSibkUdtWoHHWJADTro+1w101qr1bPVDqq3o2ffcYzA+buSotMUVEwwOvLsMjg0hY9+5/g4gzaxv9NeIP1HEV6UiO1hyPStoE2dKF7xuRDdc7w03ZMiJhB+0yuvUiYP5LkcM2NiFh47q3dKdkHdcglIGGrKIzmgJDQIi5ZC0jcLjJx+OHKCPVEQyIjbOJBok6weR4DPCa0RIDcyS8IPgCzZJeGHYWmIH6adizLw4pix1J1AdS6N75RbJnAwAIwh6JUCPGS46tMpYSYOGvmYVTGQ5aSoW7kGsqeX7+OReWzpBB1hWAw7bVqYGiPF0/1ANi3SwRHkM46lVXyztGuGLkLF2EeRjqzb3EpBp6QgWoYuQ6tBaDUIrQZ1ZSJA+DD2ha4MY8zwsASODyNrxVX+WBIjsQnFFqGIJloCRfWmKJqEIqmYFEbLJRz1HBwtlYcBWjwO0OJIcsVrcM1rmFlg0pYEmMzoLKeUI3yaoqf8UaYXF9LKYtazXC2xM8NAPV45/+EAg304BHKYHGlo7Fmunl3szG+Q/9LhqkRN4U4vjSJsQLhKqxiuykbpmRSlLgb2aE7/PuKkrwmnEWYKfLy3OBkrx2krwukD5mqvLzCcx2Mtz6zopPEhQSVoVIJGJWhUgkYtCM2OVIX4bEx59Ulzvbr+2Zc8MrIIIYsQsm5E2Yd8lj3fe93UGQaOEhuxESaLYLIIJpdgcgkmV2r79zAL5wqzIxnXSJTpgplfuzxT7w+cBy9gipUxHTRrWmSyQZU6+aW7nNxw4OasTVDZZPzTXEN2YCQfu0O+oiZ+9quIHViNGLYEDwilqaYMWfKbFgxZaWdEXSwaEXdvFbviUIU9Ml58lK1oYvzNk/VIiFpn0lbso1cIJt2aniXt+jiSBJYqRpLsaQk8H6bM/PernXMvOJGlriaprkQ3jcACHJNgfcfBOk1kLW5H7vkFXy+5zLpyqyYngDezDCZDcC1DVygMtaFCLziWWoFwBmxFC4uDpdvk+6Cns4cOGypfo0GejwklhhOXYvg8geEHzJdNZmQv8lw+op5dGFKIZOVMzXgugapzUD1diK9NeIyIBu4lHiZTXYLV5rjaBKxnE7AeB9azRX8dPgzDD6kOTlXRhzDANBhynxQSNSnE6SyG62SiCIN0a4HfmBSCXwjRRejnzrtmxEpMbveZhD0zkBB7LA0sEWlCUYo0DuIAMCr6kBS/KLzbEby0Rvw9rvsqYP+Ek9phsoXmTgvgW8T+sQTGSDMr8K2DiXLZ4DbMcuCGwGl+FCNBAPXlTPGjPIbM0zGK8W+zIv8WGqZ4aM93hRwBDqc5TtGvKaPfEE6RJyzux1nckWNlOumColBDAtQZcmrm3wFozZdScnZKfqiuqRT7dSbWS32/EjZAWlGLJdbfymKFL3wxQiHMwmE+fvg9dd3knjJ3Bt2WTBPTLR9YKGFgFh9iCgGF/RT4b3FsAcsTahwqi0EaDtcHUeIBrgS6nfRhr7iZXirbTLA+Of25BKRLQNoLhjo3PZPZZilAkwA+4QC+pIcw8KnJ5Cs0vo+c7CLRGyFvL/KriwVwYIqxpDZGNg+aTDealpQiGc2ZxxNtGKsIPwxPE8O2SqOJoKTFMS42aaTbMj2lANAKEQ7njIxw3tcqDrDcpzRkc0bYs7P6fjkYyzjlPrce/bT16LsFQCzibt40ACRXUV2GIHnlSS8ommwTMyRDvhxyC/uD8k7gS3pOE6xoBAdnJsNQs0zCsJHG0C0BYUOqh1KjhqZ+q1g1oRamCVPnaoilgSX13gbvvsVBCxWOJkny3RVD1mmFNEn56KIWt66RbxexGpvLJ80jX0WYNAeCRbzog0EfyL62p9y+hg+DEEMndP2GIUdS0KMYpmFeYA8f8i1BdGymnOtQ+8p417njNWIoS0aQ+38cU0OGqWfLHZYWj661eFJHq0GRInRLwjnyduymhHPmQnQ8G8TYm6an+ONz1HLV06pq+5QYUcjnS8TeSmRhMf9Qqp6wvce392h7BCWO1k0+WDdJQ0NIUUEPyTUs19lfIZ75o0t6hC6UN1jGluSaOZZOhgqetHR0yQpMZGXIpDMwuSqix5yxFgQesf1eiV/iFprlDziIhtKtkN7WLLKOpohLY6RNnDSATFUkoYhiYTPdlsSCD2mMLoPTdowT8wPDR5DlIiYdYIotPQoh05brnCcdYLSpjAy1tUL2OLJg3tATHPApEGLqvQhbo+qcg1Z8FjDyVYxG+aTA0BBc5vUdhqbz4aLpvAy659GY+xZXfZSdZpDPEN5c9TCfPDHP4Eqt6VD5ikRixZFYqnyhRTOMJgsWDZiiHZie5Pm2wPLTVXRgq3gAVsCwtXzQCNNTBXN6Rd031MEBPdQCZ1xvWQcXMikNqRK27PRkly8dNeTzh0KCryenQJk9KIZx4mkubsUk49ikruwGmxYNy41y2vok8pw/oCvzBt9Serk0YqatLiEub5y2pUvkIA6SQFwvMwOTpbVk3ziLTuAyBHcSCP6FQZxdjFSUxhADgyUWu0Y4mstd6crzA+ArFxiEMAjhNSUJ6ZjkgxvCD+H0y4Abk3CLNCGbsC7FmcNlUviJS4GeZuVh9uslf29m+GyziGDK0wktpSqq2FI2SSu2YE1hqG2RS0pZoAaPERk8tM5K5BIunuT4NuDCSQUzUVqJqTI7PVMG9n7Q63ev5xv3mKVe0oujBvHHPoDHJjQpWXOWWVOtSTo1iRUHUYues/Z40XzEhGvjVWLK5zLiYo/nfMDQ5yl/MB4JZy96By8Y8PDIIDj5Eft8AM/9YZ87iUeMJaq0sIo/fwXqXkGdevPzaBVPEVbBTy+ZcOXzNRUzjO1+wvsX5ZZ4Q58gt2RNNbkZJDejllsZue1wuQ35U/Do3bxp6e1EMpLtc1Zgn2oSdUmibi3RMhLdjnoizAWALZP0a/zEPEFYd5ZTV01yJknOrCVXpS+Gb9v4gPYRx0voi/J9zgrscyN21bRapGVEGttWLubPxAsNfR7iD7efZWyvJi6LxGXV0qoirQEakV7iOVI+j26E288ytleTVpOk1aylVUVaPUQkftFDKJV4+1nG9mrSskladi2tMtJ6wqW1z58p8xH5LWmcPOHyke1xtnSParJskSxbtSzLyPIhl2UbJ1MvoylWP3qiw0XU68St1eTkkZy8Wk5l5LQVOXfQV2iBtOiQxzWiQx7XVJPZhGQ2qWVWZVR7qdAzrcVRLd5+lrG9mrSmJK1pLa0qzvYgnueKbPztyDpM1p3l1FWTnE+S81MNexypETydu4uieIPTcOF8e6g2Yv3ZkvpqjdR4pBfKrpZ8o0JXT30zUt/M1LcRPgk9OMAAdhU1fZZQ009sryGm6r/CbANK0oiV1ZBqSEtVx3pSQ+Ah7ZGa5Wmgh+ojaPJtXWQFal4J4OcCwAlow21ZEP8cN2Ks6q6bdf8Tn1WnK1vikbkwr/hCdwV1qMv7mC2D82iY+nGA+YLwLvgY6IasbbpqeOm2qT/rdlirjVtNbZyuNSNwtKnps2+p2kZY2XCnnqqlK5tW9ok1sUWi+O5f8+9KKba4UnTwVTcfkbBjNTBlrWk1zYYmdAIj6gTjie0JQNlRbcPTp1pDeiNTfzL2JouivJsm3JU4viazqBJAOwl9HSOFXeGiV3GkkDKAqho2tF/OAKqqt9xmFgOwEbYhHtvIO7SZc6gmtqgQgW108+9KIZ5yhSDLLBrLlhkPsUqLLUuM6PAmlZxmywR3Wxe5a3ghxeYDptheKad8yf7vy0lJb6mu1cogk6Z07L7Bee6atSOujvl7GUAhpea1qghAxc5zVwBtc4AST2JmdUvYml5ylEV3tmqrIqHFdNdoiHAk6A4ObPpZdEcXzlI19q8gW2908+9aEYitFzk6Q7ez28M934J9pMh57toSd/A9DNeCJS5VsZbRYg3PUjFTh98sFRtbY2OsZahY+HYxuYpNpvArBQHU2i7qkG108+9KDR5FavCRZ0bB63XeLSfLRRNDT1YukE3cYN3NsQxF44T5UkmqyfQU5GPXPWv7KoK/+73u9Tzxot8nKNbXyhEmNUMgJnrpeTQvNo3W57jK1cLrfJ+HK8Tw8UkwS3aFAddLnkbnRa+z/TfhVb03eRFw8uXsYaLQBY3n0auBm4olHBO+9BgW6eOyVHyp7ltlktHCJ/jkmN/R0gzfWPYej7uMjjBSRzzGJxteMlc5a3/xCvFTEeWo/Q1fKS0i5yDm0CmPMU3xij9CeIZMHV5LE46iBUEpKcednh/1UPkvfDUyvQ49fd0dXG3+J3doQC8mC8dvsePVxK+h+MIdH6JZmn8GP/ErnuEpBg3H+FLkS6aXYNpOl7ZDvJflL4puYm0DXwoNL4CG16nDlfToRdEavo/Uw5d30zUs3LPJ/mqsBr4FqatuJZAfKZ9BghmasZ3Y8yWui7tS3mS+9no7oUeRziY0yBD6wlZCg/Lb8Qjl9Za7EjJtSchKONLB5ZAT1BnZkVmy2cYj4ahTJuf/IRlFr2f3MdJyKTDCI4bXJ5yNAjYgLrrKvKutiLVEbMU9b+fV3o8SjLub4Nwg9Rr25ey8xdn5N5T+b+wav9cMXTN0zdBfNEMbNUPfG4beXmRoRa85uubomqO/aI42a46+NxwdxjiGuBKitqBrdq7Z+ctmZ6tm53vDzmGMY8juHa4HUq8ZumbomqG/ZIZu1Ax9bxj6B87QDjt3+BAv2h8zBxR6hWPN2TVn15z9JXO2XnP2veHs0KpOcHbN0DVD1wz9RTO0VjP0hjG0pN/WmXc1O9fsvEZ21jaEnevMu3Wwc9wXb8LOdeZdzdA1Q39tDF1n3t0fhq4z72qOrjn66+PoOvPu/nB0nXlXs3PNzl8TO9eZd/eHnevMu5qha4b+2hi6zry7PwxdZ97VnF1zds3Zdebd/eHsOvOuZuiaob82hq4z7zaNobtsL5BVAs/oOcPE0PGDz1+n9hLZ+iacu7zHuEzzW4rJfifsfPZKeky+Fom93BXsi53U0VnjUlOifeExy/Jjk/vSg1lj/hXnd5L7LvZSgyFgrUX3Qn3aTelKWd0LZ0T4SPfV6VpDiD8U0TVgbv2WtM2+x9q2w7UtObKL1uj3XN8gZsDYv84zvrEtqgtXqG3R9diiWmm2W7ctagi8k22LilpUZxnfL0v0ccynjKET2nwDhh6yK8wQl5qha4a+jwy9+dECkXVrhv5SGfpJzKfKJJejn6ZQ3EVuoFcVvk34bdupVX9h3f1h6oagn8tZ1KzIbNXZQMe3rNmsbzN/j/Uo6Pk6+1UjNoBtsA9IK7yKjfzho08LnCCyQbYemmvQQ7neVNHAx6kz3V28yuJM7CMHA1M32a/J9q8upbLxKksYM+t4ldxClWlLFd17iizxFntQ6mzKz/C7oIH/yTSnzVrt4z0Ra7xmrb9A5gAL6k/2/Sq6Y9DN/43a/gA1aRf+ltTNsdJi+uGxv2AXTNGeMNHWCnUTYl6gmT7yCmkT7A1MAxo9YfundfN7ZVIwKvVAcQV5f8POZgn7eEtsMZE3b0c/lkk0rSWPmSZPmJ3wCXHYTfTQ8EVCezg6fGB1/Wh0uFyTXjxj+32APom242vO96+ZJMKXDcv79XPhuDfcwls88m9MOyxBkuJV46PHCr1qLPvY5ZoMLGmyeh+tXw1ZVmNnNhcsY5trsotsDDw8Yf/BK2gJmryTgdMFa/c40y7JusvkUbJ7fMzaMUV9KXalJ4n9i18l+56mmT5n3j3FRxW/p+wrZd1T/lV2JFdZpstPpVcqosciGuEV01qcd2fFjtiRtnB5X9liewJzvWN/RQ3ScvdMykUcSZJ7LmIrzion9xbvUlsDW2fxazmW/olx70XkxXJ7X/mH6DNkjOnP2V0tHv0a2wn68z7yNkTJ35U1YDA2BBYco/1J9mmLaZiWslShHjRTRYsBOLSF0YgJWgVidOEpjt9JtIogcDtaUU6e5XRlO/G6wF3e7rcr9TQeZMY6ZN7jQ4bTR4xDAWqfE5GX8n7mBGVrosXjoXfpYkSpJXgwoCtuKuqEkTKcO51Kok5htA20YZLJg7flZ8rkVU7mW2wLjAPXqEmbZdmn+/I06svGDfry45j58R4+KDPsN5fBwYCBdjAYXc/P+x14DeMrKoJ4m25ZtBU+BMJ4gaPUys8JkaxVnvNROJat9Ky3o98y3Syn3c+VQ7zXfzBvByKXn/DKoKnAlllj3qVk3yKM/wx9q/s6Vk6i/qXfqH+9wTjy69jnFVorjzRvs+NIK+9qZC2iK+W077vkqo2NYdUJ2tsmxltb3MsEaTYkXmYYLVnmZd6ORNL4lR3XEjbzWse1Lz8yoUeRCauOTNSRiToy8ZVFJmTcmmbnB+zssG5xGvHxM+6hhmsYd3lkY4+d4yNEojdmfIRR0WB/wb5xkes8Vpo4i5DkOgtnt4rlJ9yOHJZjukwq29ii93y2nLJ41hXBXy4JH3NAVJSHj6j7OG8TzzqqKAnwzIuOOrflictwTKP/bTSLSNjH3zcHb43V+ci8ZjT/EHre1Ub528E7xi4f463wO8PjGM++mGm3GWjrG4y2DMV83J8pB+wMn9ADnuEM6W50jnXa4v+OY2WyHeGIeYFjsovzvJ+iDJgfGLo/I+Nk/4rPUihnO6uR7WxsnJyXSy1f6jt4/6HHfFcSf5doQ1La2TP6oh+WdYbFmf5W6Ti0xaRpo53QYGdu4Jjmc+/bxP7vY2xaw5wGC3MbIFsSLEIb93AVMQ59O9qQL81lmjDkfQtiPXejCT9E/RvakJajGGH6hkklLckfM4/+Fytd5W1qTuIb6LmleQH438DsIOJ/Ha9ooybAjJWFmgC930ddmKAlZCJT+MgM3po0IU+a+ZrwWPlNgRXx7+5IC56xfej6ZTXgufTIVUm/xdfjQc9vRHFWHUd/WKs3Rh4ApmjgrNUYOcDHeSwdI7Pgb6xD+tkSTEv+Ic8ousD85/fR2sf01k2xvjwca8GbgAxU8i0o43zRt2je6agsIlgE9cfprRto/WqYjedjhIWi0C3sD80FqyjMKL0r/LOxLCKJp+yM73FFDNXsRjnY62TBn5Dr4la8xujRJa6Cvyq4aufHnHOswpLOO7+Mr63SnJv2uMwN9riWaY0Y1znBmVyYUwv7/x6OFLtxTYa+PUPJwRzz+2jPYnj/KD3yEy/FjNeseb+74p8pShUy2mGs9TDKp6K19XesGfN8EIPdt4Y2O61KgFF3imM3WGXr4Z8sWaa14Dulg4h/YvteRjOQyW2bwv0++sIm53WPWzytRJ4rZWyrDOuiGdu3NQOZxC99l15Us6jtkNUUspwhrGXcwn78OecoH+OcrQLyfY4rH+gOLnB0Am7b3UipT9C6baKN1UKpN9CbaaWkPkZ/t5WSOvz3cd/1eL5FUL1bXfgB48yfeato/cZn9tnkuEHG6D7XkeRKMbDgaX3nZmV6gew1lLzNczV9XD00TlnjDZxzMTAKAn/pu4n6tC7dyEOzuoy2cHy/oAzKL0w2E9y2njj1IorVZfJUiH+NsBXQ3i9NPtaaRtNliKZl9SPOY864z+Ww9sz4J1iR7+J8Zyyt7+N5t3spnyaTShMjgU2MCMLfBo6VFlpH65DPIoZpiTxC7KeYjw22fJhxHK40GKAHeYWcCJ8+ooRmyJa7qWsvWiU3ySr/FsdrL+GriDH95VICL3CKHo2P8/cQj5jiEaGUXLRJm9hnVJ4bp3MLtsVqII63DimVw1mMUdCzSdIrPcOnl55gG8DrXsz6vz+r3Is8j0QTjlj2PBKI8JZbS7+4UrR+Jkn9TJJQWun14/Xbae/qqSTrWJX/bcYTIORcHD4r8hDv/MONeNheMw+LOZmbwMOijGsWrlm4ZuHNYuF1PJMnxcLBYG90PW93+rO576v4E/ToG/0E7UHE01s4P/CaWd0UCZxFHs9/sBrgatDKAdv+F48K7SE/zthW8mBdjNlPgjM+NyPuHz4XeNg9Hc/VoL13MsPCmc2NqR20u0ezuRa0j49ZA1nBNrtB29nHnZwe1jmHWLT7uLH9KxadE36C/R5+H45wp16biiFuPKGNzmA2bzWC9qiNW0d09pFDFzmm81FxtDdmR5xAq9Sge6rN5jYrdDhN99TAosc26qzQqTCgCHoxpt/jLNzr+HkkkSfiL3giZ5k1HK8etblHd9mDxursG95Xb9jFXYZDqjuk4hyKYHTevp7ThR8w9aBgxPvg2Pn1ev5ywPax1eCQlyPnN3Y+piejI3YXo6PubN70J6avgjqNznurOVGwfz64nveOR3ALnf4QikEf72Swx3ZnX1A3BlAFJxmM+PdTkMneoE+FAze9t9fBb3tdLBx2minbswsHHMBJ1eCXwT9ncwtKh76eUjGA4w96R1D84sA+Liv36esITveL00Zg+wNE9AQad+D0YVvfOYOiS0XfQQl0nGM4bL/jwM2cvHLgW9/Bb4cjVKzDEQUZumgsQOf9E0tMbw/Oe7jv+TG2fzTE07EjoTjvokru987ZCZTg5Ni8nrM/s3kjwMKnQqNCFQpW9mB/pj5WgAUbxvdPOlCO9rBHjQYvoTiHhmpBp32G1+m0Uas67T3c2t3Db93j63m/N/Ln6s9WMDod0IfhEd/SPuUfgs45Qhgcn7DLH5908ZzB4ODkEiZ7BoqLxtMuMyqOjlEgg6M+FbDrf7NhDx6bNsbAAwWRDBwAbT6h1sDghYtBCw/Ty8aYaqHjI2Vc/NUZ+fYd1uKg/4qJsL/3ivHirwdwmbMhSZObpX2292eFHi3FJNdHXI5J4scd1LvuEUq104d+vg+n6/wK1ft9doGj44Now/lpD5cYU5FecIz9RTOpv7AS+4ud7i7GtAEj32iPtRt+XhwxBF/Q1YNg4SY0fhNbbCSZspvfjW8mdSMa3YiafyML1wsOusxGP+geQhfovoA9Th2kpFMHVSL4P0scv+djnmRRAAAAvm1rQlN4nF1Oyw6CMBDszd/wEwCD4BHKw4atGqgRvIGxCVdNmpjN/rstIAfnMpOZnc3IKjVY1HxEn1rgGj3qZrqJTGMQ7ukolEY/CqjOG42Om+toD9LStvQCgg4MQtIZTKtysPG1Bkdwkm9kGwasZx/2ZC+2ZT7JZgo52BLPXZNXzshBGhSyXI32XEybZvpbeGntbM+joxP9g1RzHzH2SAn7UYlsxEgfgtinRYfR0P90H+z2qw7jkChTiUFa8AWnpl9ZIO0EWAAAANlta0JU+s7K/gB/Pm8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHic7dmxDQAxDAMx77+0v8sCnyY4CuAEV2pnZi+a3eUdN9vr/x792/RvO+3+Tv8n6d+mf5v+bfq36d+mf5v+bfq36d+mf5v+bfq36d/m/23THwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuO0DROnLo9UOpq8AAAq1bWtCVPrOyv4Af1e6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4nO2djZHbOAxGU0gaSSEpJI2kkBSSRlJIbpCbd/PuC0jJWa8d23gzntXqh6QIEqIAkPr5cxiGYRiGYRiGYRiGYXhJvn///tvvx48f/x27J1WOe5fh2fnw4cNvv69fv/6q99q+Z/1XOaoMw/uBvM/i9vCW/rm7to7Vbyd/rkdXDXs+fvzY1tVK/u7/bH/69OnX32/fvv388uXLf/qi9he1r/IpKi/O5RjnkU79XK7az7Hab/mTdp1baVpf1bFhz0rOnf4vOvl//vz51zb1T/8tuZQMkDkyYj/nVP7IFJnX/mwX9GvOJT+3E9oC5Rv27ORfMvL4r+jkzzHkQn+1DJFztRX3WeTHNeA+vjqGPgDKYz0x7NnJ/6z+T/l37wzoeeRef6stINfatiz9zFjJ33oA6PuVnnXD0HNN+SPXklVd6z5IX/eYwHn4WZLHdroh24n1jOVfbcRpDP9SdeL+c7QfXc1YnG0fp19n+ylZWd4pD/pt5l3XeSyXsqxt2iB6hjHJ6pphGIZhGIZheEUYx9+TR7DXp//zby/vWfLd+h5c6mu6NvWueITL6O1qB8/mZ0id8Jb2vruW9/Od/M/Y8Y98hnme93W+xC69lfz/hv7zFlz+9LNhz8Omjk0m/Xfp28MX5GvpI53PkPokP85d+QNN52+kjFyP/ci+LNsv7d/apZfytx/iUdtAyt9+Nh9zPyl9ic4suSAbbL7s55z0C9hnWCAj7HYF51HntA+T9me3HdoM90KemRby7uzZmV7K33X0qOOBrv8DdWi94L5tP459e12M0C5+yH3Qdl/3/0o763jnb8xnSvbr9Fldkt6z639AtukDLuyrKZnhb3F/Q5b8v5M/fd8+QMf7WJ/Azt+Y8ict/ADk08n/KL1XkT/P9vqbsrG8i/TF2xfn+t7pBvSJ2wm6xboYdv7GlL/P6+RPnMqZ9FL+nNf5w/527FtLP1tBfaU/Lf139u3ltdRt0dWR/X08R8hj5UuElb8xfYi8p3Xl8XjmTHreph4eVf7DMAzDMAzDUGNb7Jv8PD6/Z1w99oAZY78ftn3xs02+iwu9FX/D/MNnZ2fT6vzg1gnoDseE59zA9C1CXuvza19nP8zyoK9GP5yjs6sg/5Xd13YwfHzYjtAb2H89x6dIv1DG7ttn53Pst+Mvx2gf2JHxSQ3HdP3cfhfXe5Hy5/puXqd9gbbvWub4D7p5RJ7rl/PP7LfzNeiI6f/nWMl/pf9XdvD0padPHRsp7SL7sWMwzhzLdlngk9jFCwz/51ry73x+4LlfJS/PBSzO9H9wXIDLybl5zrDnWvIv0MnpOy94hhfW4c5z9fxf6Qa3OT//HatQzNyvNd27XO1bveN5fN7ZAhjD5/XEjTid1M/d+J9nAOT7v8vKsUx75D8MwzAMwzAM5xhf4GszvsDnhj60kuP4Ap8b29zGF/h65BqryfgCX4Od/McX+PxcU/7jC3w8rin/YnyBj8XK5ze+wGEYhmEYhmF4bi61lXTrhhxhfxI/bMT3XkPjld8RdmutrNi9I67g/dx+ZfuQ7in/tDM8M17XB9sbtrnCa/CsZGz5Y3/BJrdqSyubnOVvfyJl8vo8LuPKnmCbwepeKDN6zPLP9uh1Cp/BpmzbKza7+t92tO6bPJmG1xDDr4cNvms3Xf8vbNNjG1tg/U/a9vnQbn291+fymoSr7wuRR8rf646xBprXxHp0kBG4Xnbf5DIpfz87V23GcvU1nfwdb+Rj9h+zn/5Jeuw/+r6Yj5FP7vd6ePeMe7km2Mch+4VluXou/qn8u/2d/NMX1MUi0a/R7aR/9A253TH8FNbz5MHxR2fX/+17K9KPA7eSf9cebPt3PAH9PX1H3b3s2kbGqJBe+ikf9Z2Btux6SR1w5Ee/lfwLr+NL7ACs1pzOe8172cnfZcjvC/uaR5V/kTEy6cfbra/Pca+nmWl1bWYXl5M+vy6/1f7dfayuzevynK5+nmHsPwzDMAzDMAywmlt1tL+bK/A3+FN2cazD7+zm1q32ec6F5wodvT/egpF/j30YtqHlnBpY+ed37cW2kdp2zD/f5bDfqfD3RPD/gY/5WtuT8C1xL5Y/37PxPb/qPBHLzH62jJuHI/3f2eat/9nmuz6209lGa/+M2yJx/vh6sAFyrb9R6G8JOcbEcqYs+IjuraduzVlbOxztp2/mOgEpf0APuC1g16ct2DeL/Ch7zhux36+bU9Ltp936u0CvwrXl3/WfS+TvOR/o7vzWoL/JuJN/Pg86n27BM+kV5wpfW/9fKn/rbXSwY23sw0M+5HGk/1P+tI1Mk/gQxwg8sj/nEjxuoo/Rr24h/8I+Pffn3TzyvDbHfzv548er9HP89+j+3GEYhmEYhmEYhnvgeMuMmVzFf96K3fvqcB1457Y/MNeLvBcj/zWe3+D4eubH0Y+Zg2O/XaazsqF4Dl766myH8ryglQ/QxygT12b5sf86fh+fpsvT2aNeAWygaQ/Fbuc1Gjmvs6kXnlfHz363XDsU2z92/m6Ol+279ueSNmXMcqXf0f2/81ViU352+af+o16591UMTzdPKOl8Oyv5U8/pR/T8NHw/2GbtH7T/0Pe2Kj/Hco6X91d+zzLPb8VO/pbZn8p/pf9T/jn/135kjmGr55jn8u7Wh9zJ320USIs29uxtwFj/W//dSv6F/ZB+znMu4xLaA3mc0f+QbYM02bZP3O3vFXxCHv+tZPye8vf4L+f42QeY/sFiNf7byb/Ief7d+O9V5D8MwzAMwzAMwzAMwzAMwzAMwzAMwzC8LsRQFpd+DwQf/irWzjFAR1zin7/k3EvK8N4Q33JLWP+YtXMyf+KxKN+l8ue6jkrr7LcWujiUjownPuKSWEDilrwOzlGs+1H9GmKj4Npx9I6d8nd4iQvsYvcpk7/r7rhfykt8lY+Rds4XIN7cMeeO1U28NhBrCGWfZS0yx5vv+jX5nzmX8x0/S16ORbqkfok58s+xUe+xrlmu10a5OJbrfxEPTj/lfjs6PUo8l+/b3/6hLex0APG6xJJ5TkHeG8fpZ7v+Q/6OCVzh+0794ljKS+qXcykn6V5L/2dcfuLnMn2bNu191LO/t+HvKbke3G5dT7v7ct4dXhvM97Nqh36GIrfuex9w5rni+TI5d4A2lBzVL9AuHJ96LXbtOvsr/cf/o/OyTXveV5ce/Y/7Slm5r1r3rcrqtaJgJbeMDe3SpGw5j4W8EueV7Z62mRzVr88jT89VeivowVX/Pzvu/RP5c47n3GSafh528eBOt5uHRJ3nNyouWeerGyt2OtN5ZTv0+DjLfaZ+6f/dfIW3sivDkd6FTv45f6Pg3cB9lXtCxp4jdAav6ZjXeO6Q49Wtc49Yyb9rr4xTrB9W7Zv8L9Xnu3VKPW/qDEf9v/A8i9W7TCf/o7LzTKzyOg/kRF2yNtxqrGadmfJnTJjrBHqdL68r2L1be46Z3x26cvDdQ/RNrlnXcaZ+4ehbuxx7j3mLvKOu8s15GgljBch6Qb+n3vS79JHeO9Pud++Eq7GAxzmXrBN6yXN6V7+U+0iunPPs81aHYXgz/wCggvog4L8lowAADtdta0JU+s7K/gB/koEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHic7Z2NkRwpDIUdiBNxIA7EiTgQB+JEHMhe6eo+17tnSUDPz/5Yr2pqZ7tpEBII0IOel5fBYDAYDAaDwWAwGAwGg8HgP/z69evl58+ff3ziOveq5+JzpawAZfj3wf9R6fmK/jN8//795dOnT3984jr3Mnz58uXfzy6+ffv2O++wN2UE9PtHRtT7tJ6Vnk/1vwI20f6u9l/1Ufp2laaT1+3f+Z1dVPKs5ARdGr1epcuuZ+28ez5wauereuvsH+Vr33W5tG97HpoPeQWq/q95ZfWO+58/f/73e+gt0v348eP3vXiGuqgvC0Q6vR7pM0T+nibyiLy5F2WrXkgX1/V56qBpIy9PRx30evyNz6r/x9+vX7/+fu4KOvtzTWXR8iNNlM8zWZ8jPfcy+7sMUZ7bCJvH39CZponvjFtccz1FGp3zOLR9RT6kRxfIqelU7vigC9qyyh3XVB+qZy2f8X3X/vrMFaz8f1Zm1v/pf528gcz+6m+oU1Z37Bx6Vn3RLuKDL9A+qH6BPFZydrpAPsohP/cVVZ39+ZDPy98Z/+8xF7jF/ug8+iP17uSl/pX9fR3iwLbYPf5GWyB//vd+hqz0UdqLQvOhTpku8LcuK+2RuV5lf2TU5738TG8rW1zFLfanHWu77+QNZPZXf4fvzfoofd39j+o27nHd/SS+I7M/etA2lulC06nNaRfI7/bHP/JM/OUZzTeuIeMz7E9fUX3QnwF19e/qbxnfHJoemelb+j2epQ90a6XIi/v4TcD/kcbvISd9LwP1xodkutByMvnJX8dD+of/77Ko/DqXqfTpuh0MBoPBYDAYDDo495fdf83yb8E9uIQrOC3zNH3F257CY+XEpVjPZHGBe2JV/urZFZ/WcZiPwqnOrui44m3vIavGtqtnKs6q8h9VXHq3/Fv5tEdB5dY9E16nK3J18fx7tetMVuXV/P4J51WlPyn/Vj6t0pPzhs4p+h4F53iQhXycA1nprNKBxhW7Zx5pf/TjnFzFeWncXmPmVfrT8m/h0yo9EaMLwLPC8yHzyv7E7VQWlbPTWaUDtT9yZvJn/v/KHpoT+1ecl3PWyr1WHNlu+dT1Kp9W2R/uWPkj5RQ9/8xGyNz9f6oDz6uSf5crW6Eaq+BG9H7FeQVIq1xMl363/Fv5tM5P0oejjGgP9DWe3bW/jhme9lQHp/a/Fepv4BqUd698U2YXrvvcwdOflH8rn9bpKbO3zjsZF7TszEYB5RaztDs6eA3769jJx/fiKS+IT1POC3my61X6k/Jv4dMy3s5lA8opVmUzJ3eulOeRZ0dnmY4970r+rl6DwWAwGAwGg8EKxL6I+ZyCdSBrmFUsqksTc9sd/uce2JE1gG4eWeauLPcG52JYd3sMfwXiH6y/d9Ym3fr1mfsZM65R15SB+E6s8FFldtcfCY9dB6ivxre69q9nY0iv+sue5xnuab2d94p77pf0zEGmM57p9El/8ziGx2iz8nfyymTM0nXXd8vI9LiDVRxJ9+RX53GUg/A4re7V1+dJoz4HnSuXo/FA5eyUD3CZ9BxRxZ/h88hHY/5al6r8nfJcxqrM6vqOvMQbVcYTrOzfnbcEXczS+S/4Ou3/6MrPM2TnO8mrOmdCOchSnY3I9O98R1d+lZfu13cZqzKr6zvyZno8QcePkd+KZ+zsX+l/52wR+fqnyxd50P2Oz9L+nsXis/I9r52zhFWZ1fUdeTM9niAb/5Vb9DZf7fu52v8zXVX9X8vu7O8c9Kr/a95d/6/mf13/17KrMqvrO/Leav+Aji0+huGfdHzp+CuXaTX+q9xu/4Ce4avOn2e6Ws1ZfDz1MU55xax8RTf+a/qqzOr6jrz3sD/1rtb/ei9rm9zXPuQ8ms//PY3OkX1On83luxiBzoX5ngEZ/D7ldeVXea1krMqsrq/SZHocDAaDwWAwGAwq6NxcP1c4wEejksvXHx8Bz+ICWbv7HszVOoL90s9EFWer9mO+ZzyLC8z2MiuyuIDu2dX9/yfrV7UVsTa9nnFu2J97ngdy6HXnIne4PNJUa/TOLpke9FygcqSVvm7lG0/g++/VPlXsj5gTfmOHI1Q/o/Erruueefbve7xR+cIsjyxenXFGHS9Yxft2OLou1qlnE+HXM33tyLjiAk9Q+X/sjwx+biXjaFUH3kc0Dqfn+Chf+4VzbnxXfVRnJnheY+v0kyxG7f2Ftsf5FbDD0a24DvKr9LUr44oLPMHK/yMrfS/jVXc4Qs5SaF/Pyu/k0Xy7MzMhD22Wclw3VTmMberfKHvF0Z1wnZm+dmXc5QJ30Olb+6z6eK/rDkeo77XM+r+O313/37E/Zzv1LOdu39K9A9pvdzi6Xa6z0teV/q/P32J/9//I7uM/+sdPVum8Pfm4Wtlf887G/x37oyO/dmX8P+HodrnOTl9Xxv+ds44VqvW/ct5ZTIDr2m87jhD5sJ/OMbNnsjlwVl6VR7V+PplbX+HodrhOT7dT9x0ZnxUzGAwGg8FgMBi8f8Dn6NrvUbiSt75b4x7vvtfYwAl2ZX9PXBRrXjgA1pSPqAN2PAHrWmJ6uq+y2wdcAY7hFBpP7HCljq8FYha+biR+FvB9rL4Ox2/oepUzGPHRmA1tS+ML6KvjdlXGzv5dXrtptE66D97luFcdQfa7I7T3eI7rlKvpApHmat/KdMT17BwLcQuNszoHo7/PRT3QDXol1oXfcfkpQ2Px1VkBtUXF0e2kcZm0rsp5Ukf9LaErdQwoD0tcD/torFDTESel3Cpe2KGyv16v7K/xcdo9bRI9eXxL8/L4dsWrZfyJ21z9mHLIip00AbWfxx89jpvxe1fquPrdMdL7+wSdOz3dt+XyeBza6xNw+ztvQD76m5TImOkGVFzUjv0rHkOxkwY9Ku+Zyat8mL9H8EodT7hDyuUDV135lhV4jjEus5nvtaAPOV9Fn9CxqeINvf1W/XHH/gH1f8rjKXbSKOeo46DKkX3P7L9bR+UE8fkdd6icn+7HugId2/Tjey3ig2/0vRzcUx1k15Vfy57vzteDyv74MuXUHTtpVCafdyrfznf6h7eZkzoG1Aa6p8fHZ9ettpNT/k+h4wdzzOzeao/d6rrvJVqNW35fy69k6daut6TxsiudnNbx9LnMd13Z/zcYDAaDwWAw+Lug6xhdz9xrHtntSYx1kL4rZadMXasS787Wgu8Bb0Fej+ew7js9R1Khsz+cAOl27K+xFtY7PPcW9HmCtyBvFo8kTu4xG+e0iD0636VQ7lbjFQGedZ+jPLTHIDwmq/y/6jNLq3kTQ6m4GC8X+TSWoxxyxylpPbX+Ki98zo5ekF3LUblO0J0xcY5HuQiNpXc+w7l75ZXhCzxGqvXz843OwVb+n3KyMr1u2d5sb//Yjdinx3yxbbZvm7YCJ+JxYuyt7aLTi8vucp1gZX/s6mVmsf8Vj+g2CjAHqGx6kp9zQd5fsryrGLDuD9J4N7HW7LejKu5VfY3urVKuJfMZK724v0OuE6z8v9tf5wm32p9+SVz9UfbXfrFrf/wGeanPI1+3/2pvB35EeVXlD8CuXqr6nmA1/6OecIy6B+UW+2u57odvtT86pBzVy679yUPHDrW57nfZyQd/rvyfy+s+P9NLds/lOkG2/vN9RTq3yM5fq24cK3vR/nX/wz3sr/O/6txyoLOb93HNk77Ms10+Pv/LZNF9GCu9+PzP5Rp8TLyF9eLg9TD2/7sx/P5gMBgM7oVs/beKZYC39K75jmc6ha7XuvG2ip2eYFfX9ywzy0/jP6u9kQFdl74FXDn7UIH41+5+zVuwo2tP/wj7V/lp7EdjFX7GKeMIHcQtPJ4Od6a8Lv2PM3HMfZUP455/J3aqdfB3JFaxkqxuGpPRduHyKLJysrrC/7iuNY7vMqm9iFM7V7iLyv9rjF/PS9HPlPOtOEIvB93BnWj56EXP1aAflyeLOep3P39LO9J4OvJ4G/C6BTyW7HxAtg/bY7PEz72uFYen+Vb64HnixhUHu2N/9/9A25aOUx53zThCBxyV8nGuw+7/XfujFz2P6TIH9GyPQtNlNlZ9Zfb3uYieravyUv0ot9jpw8vh3glW/t9lyvZaVByh64Q03fsf72F/ZKKtZTIH3pL9K27xWfbP5n/4QvWXuo8Cn1RxhK5T/H/X/wO7/g7flOk8m8Pv+H+tWybPPfx/Zv+OW3yG//cP9fdzsHruUOcpGUfo5ejZwap9e1rXhc4zq7OZbjfFav4XcPtX87/Od2bldPbvuEW/d8/531vHvdc7g/eFsf9gbD8YDAaDwWAwGAwGg8FgMBgMBoPBYPD34RF70dn79JHBfhP/rPa9s8fS32kRYG9M9nmEPnVvqcPfaVxxiexL83x9/wjvANIP+zeeyVN2dTnNR/ft8ansr79jwr4j9tnpPrcsz2pv8K3yd3v11Yb6HhCH1hvdsodM+wT5PattV+jq8sgydV+k9o2s/zjYr5bl6Z9qb54/u9obsmt/3stE+vjf37Gh9n9tvIb9/XcH1D70ww7sI66gfanbyxbX9bdFOqzsT9uhTzs8/6z/c538eZeb7qHUfZsB2pu+a4l9fvqM7rHVfLVNkobvJzgZQ1QX/q6hrG8rqFtXnvqCzPaMvfiGVZnkqe/vUZn1/XIn9ve97lznf60n55J0nFRZuM939IrMei5E86U9qNxXfNPJfnE9X6G+AHmqvk273PHn2dkBzcf3lq/kx49r/gF0p+9iUz0y5vt8pdKxz3m0TtpffU+v7mXX+ZTmkb3bj/bg/fB0TOCcUzafcWBD/+3Mahxm/bQzliPL6dywsz961TEL/+ntSO2v/l33mpPnif31XCLtV8vM3l3l86zK/vxPO74yJ0C+7ONAfnRHG878Orqr/Krne+XddYHK/uo3AW0xixXomVFd31BXnR9W5xsy+1OujuV6Xc+lep/Scx+d/ZHJ29cz0MVdducWke6q3N14d9Ke9N062pc+2nmKwWDwofEPiCRqout3vRYAAAR5bWtCVPrOyv4Af6I2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB4nO2aiW3rMBAFXUgaSSEpJI2kkBSSRlKIPzb4YzxsSNmxZPiaBwx0kOKxy0Mitd8rpZRSSimllFJK/df39/f+6+trSoXfg7Iel0z7EulfU1Wf3W435fPzc//6+vpzfst1px5V1i1Vvn95eTnYY+v0r630//v7+y9Kdax6P6P/afvP4P+ZPj4+ftoAcwFto64rjHbBdYXVkfgVzr1ZmnXMOLO0+rN1ThnSP6RXUD7KMUpzpIpXaVb/5/yR/V91S/BFH/+Jz7iIL3KczPmjwohf4ppnS5VXXdexnpnNRVke8mNsyvMsW6afVJxZG0i7VL7P4P8Otpv5/+3t7fCOiH14pvfHTCN9QZsgvNLinPZH/J5WHcs3vJeRXvd9PpNp0p66si3nHPjo/p9p5v/sO32eTEr4sOxY7SbHVMpQ9zP9VN4jr/TfqB1n/67wSh8f1vlsDiAeZeT9J+89itb4P4XNmG/p5/lugO2xYfbr7Jv0vXw3GI0V+T6a/T/HkPRVliXLO6vvEo+irfyPL/Ft9rWeTn8v6ONJjrXZ92bzUdaD/Hp7yPE802TM6TbpZJlu+Tvor9rK/6WyUb4Dlm37e3v3Ne0k/cD7BGnRpnjmFP9nPMYk8iLNXr4lPer8r5RSSimlnlOX2ufNdO9lL/nWlOsgl7BhfRvNvmv699RftfZ5tT+sOdSayWzNeo3S/31tI7/zR9/8S2shrJv082soyznqR/zjMbu/lN7oepbXLK1RvybubM1pVua/iv2y3PsjX9Y88pz2wjO5zp5tJPdeOWcNl3s5JrB3sya82zrLmeuJdY/1Ztaa+rpShfc61r1MK21Xx/QZkFdeox6nxHol90mXve6lMp+j7pdsb6P+z1obtmY/vms09le83Mct6COs860JP1Yv7JdjXv+3IfchEHsZdcy1yrRVptnzGtm3/xNBnNH9kf9HZT5Hff4/xf8Zf/b+kHbinL0Zjvgz/8lYE35qvfqcl3sC+HpUp/RBt09ez/LKsNE+E/ezP3OdeY/KfK628H/fRymfUKY8LzHWMX4yltGe14afUi/CGDf4jwAb074Qc233fx9zco/ymP/5fyLzKPX73f+zMp+rY/7PuR079H6SdS318Sl9g7+Iyzy2Vfgxu2cYtuT9OudhxnDiYue0NXud+DP3KI+Vg39r8SFtJ23KntnI/6Myn/MuyH5b1il9R9/OumKP0VhF3Eyv59f92fvBmnDCluqVYdSDuaT7N+fy0TcYz/fnRnn1MNpA34tMGxM/856Vufe1S2hpvUA9vvS/UkoppZRSSimllFJKXU07EREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREREZE75B+Hl45q2TuOnAAAAVNta0JU+s7K/gB/pYUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHic7dbhaYNgFIZRB3ERB3EQF3EQB3ERB7G8gQu3piH/ignngUObT/vrTWzOU5IkSZIkSZIkSZIkSZIkSZIkSR/RcRznvu9P5znLtXf3v7pP929d13Mcx3OapsfP7Bj9LPfUvXUWy7I8XscwDH++h3TvsmOVfbNhdq3N+z21f9U3v/6N7l+263tWOeuf5XqdffvG2b+6XtP9y3O+71//1+d5fto/1+z/fWXbeu7X79u2/frM9+e//b+v+h7X96v3QK7Vd/ucRdWfHddrkiRJkiRJkiRJ+vcGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD4QD8K+ay4UtoqZgAAKhdta0JU+s7K/gB/1PAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHic7X0ruOwo1vaSSCwSicQikUgkFhmJxCIjkVgkEhmJjYyMjI0smX9R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IENvcmUgNC4yLjItYzA2MyA1My4zNTE3MzUsIDIwMDgvMDcvMjItMTg6MTE6MTIgICAgICAgICI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+CiAgICAgICAgIDx4bXA6Q3JlYXRvclRvb2w+QWRvYmUgRmlyZXdvcmtzIENTNDwveG1wOkNyZWF0b3JUb29sPgogICAgICAgICA8eG1wOkNyZWF0ZURhdGU+MjAxMC0wOS0zMFQyMToxMzoxNFo8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxMC0wOS0zMFQyMToxNjo1Mlo8L3htcDpNb2RpZnlEYXRlPgogICAgICA8L3JkZjpEZXNjcmlwdGlvbj4KICAgICAgPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIKICAgICAgICAgICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIj4KICAgICAgICAgPGRjOmZvcm1hdD5pbWFnZS9wbmc8L2RjOmZvcm1hdD4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCjw/eHBhY2tldCBlbmQ9InciPz5DnFz1AAAANklEQVQ4jWNkYGD4z0BFwERNw4aGgSwwxv//lAUlIyMjAwPDUPDyqIGjBo4aOCAGMjIM9hIbAIf+BSc7FnzSAAAAAElFTkSuQmCC) no-repeat scroll center;\
}\
div.iGraphHelperZoom {\
float: right;\
font-family: verdana;\
font-size: 10px;\
color: black;\
}\
div.iGraphHelperZoom a {\
color: #002BB8;\
}\
div.iGraphHelperBottomIcons {\
float: left;\
}\
div.iGraphHelperTopIcons {\
float: right;\
}\
div.iGraphHelperIcons {\
width: 18px;\
height: 18px;\
cursor: pointer;\
margin: 3px 5px 3px 1px;\
opacity: 1;\
}\
div#iGraphIcon {\
background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAACZ0lEQVR42q2UW0iUURDH/5+7YhFFRiCFkC9SiJZYFhsFgl2oEPJCRkT0IoUmkUlGN8PWLmwiSg8mRT1oipQVqClJbeuqmQ+JYvlQtoZ8uSu6uuzFXff7/j24nty2INJ5mTNzzvxmzgyMBIBYAtECALk4liRJCJs3kou60fPV+d+wsIWGze7C3VZr0ANP7RNM55+Fo/ACfCbTP4BIxEavRnO/G95ZFQDgKroEf+MLaCMiILmc8FTegyPnFNQx6x9hJMlthWb6FZWJJRbm1Y7RW1VNZ0oq/f0DnBdFljmdkcXJw0dY894u/ACoXUCDdcKBzKRVkJ+b4B+sQXh6GjQJ8SJjRX8EGrYYoA0DtMYpVBun8K4oJriipPMmkWE8TseR5ANcKGce27ixcJgX62xURkbo3rqdHx62iop+gQqMJEn/6Vx6ozcwNbOdBTUT9CsqM8p+MCpnmIaXkwLsO3GSnh07Q0GJ595QHhqmsjKSyvUSXq6fJLIt1By1UJNtYUOnk7+LN3ZTaI+gEuuGBoCoKKD4KvQA9NmRuNNox4r1j9Bp/wRTi4LMuGNIidkLANDodKHjJ1Wos7Og2Sgue793oc91HL3fTFgTvhbLsBxl5hto+9I0F3y7NHT8m/PbKJt7RNnlbTd5qHw3S5uu0O11Cf/9jgoerNoV9MWgHiXkveL4tI23nhYzTb+H+67p+Ky7PqQvM74Zplfup6FV/xdQbgvf9rWza7CD5o899Hg9JMlR2SYCRmUrSdI2Nca61/V0zTgFSAqAEJ/bDJAgAgnUOR1IJXSgG+L8+UEWJEmCAC12jUhLtdh+AkEUAe++FhGGAAAAAElFTkSuQmCC) no-repeat scroll center;\
}\
div#iGraphZoomerIcon {\
background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB4ElEQVR42q2UvWuTURTGf/d93ySmJsZWmiIWP+ikgyIFRVzESf8CBxdXQf+Hzg7uIri7OgkuuihGpQpWE7TQEluSNI2aj9f3657jkCZSbJqKfZbDhXt/PJzz3GMAZR/kAaj+H8sY0wcNpKp8aQr1jsUPLYkVXCMUcw7nj09gjBkN679XVJX3axZVYXLC4DkKCkGiVJsBYZRw7dzUjjBjDM7gUNkQRC3FnCGILc2upd61+JFwcjqLAi+WWiMdDUH1dsxU1tAJLX6kJKJYq/QipfXLcuxIlspaezyoG1hcB/xIsaJYoQ8TpRcK6ZRLqx3uPjWAKE4QTZGIIgJW/1QVsNq/M9aRixDEgueYLScMa8oz+EFMxpXxoGLeZaXuk884pF2D3XKW8QyHsy4fl5sc+r5Ib/Pb7qCLc3mCMGZp9QcpF4p5j2LBI+0opU81ups1rsys8/LhHTobq6NzNAjksw8NKtU2rU5IElsOpB2mo6/MO6+YPX2B9cobVj6XuHr3EYWZU8McbQONkiQx7x4vEHcanDhziWr5NcvlEjfvL/4dyN3keCnmbyyQeAcpv31KcXaOTqu2c4/2Art86x6SKfD8yQPOXr89ukd7kYjF/9kgN3l021/7Z9CoNWL2a7H9BsVQBplwQpyqAAAAAElFTkSuQmCC) no-repeat scroll center;\
}\
div#iGraphCSVIcon {\
background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAIAAADZrBkAAAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAB90lEQVR4nJ2SzUtUURiH589w4cJC0TTNYcI0E2FQBh1BZ3LCm6aSU4yJ4zd+4MfVJpGuX8SgTFiBqUjZ5MYS3cyijSCCC12JrhJKSAhExUU9cI5nrrrz8GxmuM95z/t7X4vl2mfkew8EvrZCz2wdtL17Wh987BstfWa4nwQKNT3f0213deSAs+leVPuyNRfe/AizayF4/+PN28hocHVo/NsADIY79flm4Maoxr9o/87PydmJ4Pj0WPDn6FBwQeNt1LmkXXUO/v7m8QUNGVLT5/2fNj4g+MO14Jvxlk9owtH0R4r9w59ojnqb1ChNP1QomMjntd0r7Z3LTZ7hYj5tXvQ+nHbbXqdbnlvQ6kJlebVWqXEHGYi3YU5vTLUsvqhZqHL22c3OZY2syU0l8cDICq2HfDMajr3Rppy9g13fpDvXe1tqzIesVQZ8bR1IMyKvKiYdzqnC7OokugW0mmARP6XGTMeW+kVoOKKfW13xgUivMo0FfefXDlpWZaLUqgadjE44d1wpioSOG+1LfmWiVYzZ75bdlBq7IzQmIxDNvPysm29B00ZyrKVxUmPfWByzIAIws72/DR4jM7UkVmosKKMzO0LjeoFwwDVkjWrulvtq8QXMh6wJAOiHt1EH0JKLYqTGdirYHQYKzAfIDYiBloBS0WrXOP8BX5G9lz7LzIkAAAAASUVORK5CYII%3D) no-repeat scroll center;\
}\
div#iGraphDataTableIcon {\
background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAIAAADZrBkAAAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAA7EAAAOxAGVKw4bAAACOUlEQVR4nGNgIBv0bq8Fopb1JUBUuzQbiErnJuVOicroC0ntDopt8YpscA2tcQqssAUi70JzhLaJC7bN2/lo/oG3c/e9nrXn9bRdLydvfz5h67OeTU861j9qWfOgYeXd2qV3qmcfR2hrW1c5b/fTL99/E0Ql868gtAHdNm//G6Do0qtzFl6eMffClBnnJkw+3d13sr3zWFPL4bqGg1U1+8qACvJnX/HMN4Nqa1iRN3vva6Dof7wAqCBr+kX3XGOoNmAYzNj1Eii67PBLPAioIGXyOZdMQ6g2YLhN2f4cog1o6sojL+A2rDmOYL/++D2+/zRCGzCs+7c8/fTt16pjL9cA0fFXa4+/XHfy5YaTQPYLILnhxIutZ17ce/4psuuEfYoOVBswfno2Pv747de6k6+Apm4Ak5i23X76MbTtmHWCBlQbME7b1z388OXXptOvNp9BoO3nXgG1gSw88WLdiRc3Hn0IaTtiGacO1Rbf5t206v77zz+B6oCm7r7wGm7DrvOvPn2DhjBQW3zvCZMIJag2YNqpW3EXqG3Xhde7kdDei6+3nn0FR0BtMV3HDEMUoNqA6a1qyc13n3/uuwSyZ/9lhG1rjyP8CbKt55hugAxUGzCBli68/vbTj1cfvj97++3Rqy/3nn++/eQjUB0aiu08gtAWVGxVOv1Q3vTzGdMuJk86F9d3OrrrZFj78aCWw2gotHKFlo8EVBswdcIRMO0AIxSIgPEDRMBwAyJgMAC9BERAqxC2kQEA0b0fsDpUmdQAAAAASUVORK5CYII%3D) no-repeat scroll center;\
}\
div#iGraphRefreshIcon {\
background: transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAARCAYAAADQWvz5AAAACXZwQWcAAAASAAAAEQAIFT2JAAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAArwAAAK8AFCrDSYAAACVklEQVQ4y2P4//8/AzUwgoEGtOf45dusjjvtuib9r/uytO9aEwN3qvf4eqOrw2uQwdrIqR5HC/+Fnmn9n3S5/X/G1Z7/Ex+s/u+8IvOL5pTAJKIM0lkcHKe/LPC5/qrwcr3lwf5AfqfX9rxvlTdm/J/ycO1/l6XZn9X7ojStF6Vvt1mccRS3QQuDJ5gdTpREtlV3Wax14I6KbyBXzXu89b9qi/f7tc+O/PdZWPSZYBihA42JIUUTbq76v+Lp3v+rn+39f+Dtmf/Wk1IuYzXI7GgGp9nROCZ0Q3QWJ4ooNwVUha+u+Lfp5eH/m18dBxuk3hC4EcMgrZmBoSl7G39k72v+Gbqv9LH7loxThssiNgDDyBAYW1M2vTzw/8T7S/9Pf7gKpC+D2Qrlgf0YBmlO8Zn4/Mfb/+c+3vl/+N0loK1H/k9/tOG/1ky/iZpTwgz1Z0XNc1yUdTxwVeWD2BXVP8KXVHxXbgkMwjDIcFbg5pufHv7f9vLE/00vgQG5Mvuv5rTQUmDMCaF71ezoZkal2hh2rNHvuSzj6qn31/5vfHH4/6qn+//Xnpn9X3tOWAGhSMAwKHhDybc5D7f815rq+27xk+3/++4v/++5Lv+HzsJoa9QUHyejOSWyCqdBdiszz9luyNgEDHRNxyVpX5tuz/9fc3P2f5fV2T+Aqblboz8iWLUrtEa9K+yFel9wFFFZRGdxjJPjsvTPRdcn/88BZo/UK+3/Q8+1/nfeU/wPGPATiM5rIKA5LVxVrdN7hfWCxE+WixJ/6fSHHVdt88smGEZUK0YoxQATSWyMvwe1dwAAAABJRU5ErkJggg%3D%3D) no-repeat scroll center;\
}\
div#iGraphCartIcon.addToCartIcon {\
background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAATCAYAAACdkl3yAAAMFGlDQ1BJQ0MgUHJvZmlsZQAASImVVwdUk8kWnr+kEBJaIAJSQm+C9Cq9FwHpYCMkAUIJkBBU7MiigmtBRQRFRVdAFFwLIGvFriyCvT9QUVlZFws2VN6kgK6vnXfPmX++3Ln3zncnd+bMAKBozcrNzUKVAMjm5wuiAn2YCYlJTFIfIANdQAVE4MxiC3O9IyPDAJSx/u/y7iZAxP01S3Gsfx3/r6LM4QrZACCREKdwhOxsiA8BgKuzcwX5ABA6od5gTn6uGA9BrCqABAEg4mKcJsXqYpwixZMkNjFRvhB7AUCmsliCNAAUxLyZBew0GEdBzNGaz+HxId4CsQc7ncWB+D7Ek7KzcyBWJENsmvJdnLS/xUwZj8lipY1jaS4SIfvxhLlZrHn/53L8b8nOEo3NoQ8bNV0QFCXOGa5bfWZOqBhTIT7KTwmPgFgF4gs8jsRejO+mi4JiZfaDbKEvXDPAAAAFHJZfKMRaEDNEmbHeMmzLEkh8oT0azssPjpHhFEFOlCw+WsDPCg+TxVmRzg0ewzVcoX/0mE0qLyAYYlhp6KHC9Jh4KU/0TAEvLhxiBYi7hZnRoTLfh4XpvuFjNgJRlJizIcRvUwUBUVIbTD1bOJYXZsVmSeaCtYB55afHBEl9sQSuMCFsjAOH6+cv5YBxuPxYGTcMVpdPlMy3JDcrUmaP1XCzAqOk64ztFxZEj/lezYcFJl0H7FEGKyRSNte73PzIGCk3HAVhwBf4ASYQwZYCckAG4HUNtg7CX9KRAMACApAGuMBSphnziJeM8OE3GhSCPyHiAuG4n49klAsKoP7LuFb6tQSpktECiUcmeApxNq6Je+BueBj8esFmizvjLmN+TMWxWYn+RD9iEDGAaDbOgw1ZZ8EmALx/owuFPRdmJ+bCH8vhWzzCU0IP4RHhBqGXcAfEgSeSKDKr2bwiwQ/MmWAq6IXRAmTZpXyfHW4MWTvgPrg75A+54wxcE1ji9jATb9wT5uYAtd8zFI1z+7aWP84nZv19PjK9grmCg4xFyvg/4ztu9WMU3+/WiAP70B8tsRXYQew8dgq7iB3FWgETO4G1YZ3YMTEer4QnkkoYmy1Kwi0TxuGN2Vg3Wg9Yf/5hbpZsfvF6CfO5c/PFm8E3J3eegJeWns/0hqcxlxnMZ1tNYtpa2zgBID7bpUfHG4bkzEYYl77p8k4C4FIKlWnfdCwDAI48BYD+7pvO4DUs97UAHOtmiwQFUp34OAYEQAGKcFdoAB1gAExhPrbAEbgBL+APQkAEiAGJYBZc8XSQDTnPAQvAUlACysBasBFUgW1gJ6gH+8AB0AqOglPgHLgMusENcA/WRT94AYbAOzCCIAgJoSF0RAPRRYwQC8QWcUY8EH8kDIlCEpFkJA3hIyJkAbIMKUPKkSpkB9KA/IocQU4hF5Ee5A7Shwwgr5FPKIZSUVVUGzVGJ6POqDcaisagM9E0NA8tRIvR1WglWovuRVvQU+hl9Abai75AhzGAyWMMTA+zxJwxXywCS8JSMQG2CCvFKrBarAlrh//zNawXG8Q+4kScjjNxS1ibQXgszsbz8EX4KrwKr8db8DP4NbwPH8K/EmgELYIFwZUQTEggpBHmEEoIFYTdhMOEs3Df9BPeEYlEBtGE6AT3ZSIxgzifuIq4ldhMPEnsIT4mDpNIJA2SBcmdFEFikfJJJaTNpL2kE6SrpH7SB7I8WZdsSw4gJ5H55CJyBXkP+Tj5KvkZeUROSc5IzlUuQo4jN09ujdwuuXa5K3L9ciMUZYoJxZ0SQ8mgLKVUUpooZyn3KW/k5eX15V3kp8nz5JfIV8rvl78g3yf/kapCNaf6UmdQRdTV1DrqSeod6hsajWZM86Il0fJpq2kNtNO0h7QPCnQFK4VgBY7CYoVqhRaFqwovFeUUjRS9FWcpFipWKB5UvKI4qCSnZKzkq8RSWqRUrXRE6ZbSsDJd2UY5QjlbeZXyHuWLys9VSCrGKv4qHJVilZ0qp1Ue0zG6Ad2XzqYvo++in6X3qxJVTVSDVTNUy1T3qXapDqmpqNmrxanNVatWO6bWy8AYxoxgRhZjDeMA4ybj0wTtCd4TuBNWTmiacHXCe/WJ6l7qXPVS9Wb1G+qfNJga/hqZGus0WjUeaOKa5prTNOdo1mie1RycqDrRbSJ7YunEAxPvaqFa5lpRWvO1dmp1ag1r62gHaudqb9Y+rT2ow9Dx0snQ2aBzXGdAl67rocvT3aB7QvcPphrTm5nFrGSeYQ7paekF6Yn0duh16Y3om+jH6hfpN+s/MKAYOBukGmww6DAYMtQ1nGq4wLDR8K6RnJGzUbrRJqPzRu+NTYzjjZcbtxo/N1E3CTYpNGk0uW9KM/U0zTOtNb1uRjRzNss022rWbY6aO5inm1ebX7FALRwteBZbLXomESa5TOJPqp10y5Jq6W1ZYNlo2WfFsAqzKrJqtXo52XBy0uR1k89P/mrtYJ1lvcv6no2KTYhNkU27zWtbc1u2bbXtdTuaXYDdYrs2u1f2FvZc+xr72w50h6kOyx06HL44OjkKHJscB5wMnZKdtjjdclZ1jnRe5XzBheDi47LY5ajLR1dH13zXA65/uVm6ZbrtcXs+xWQKd8quKY/d9d1Z7jvcez2YHske2z16PfU8WZ61no+8DLw4Xru9nnmbeWd47/V+6WPtI/A57PPe19V3oe9JP8wv0K/Ur8tfxT/Wv8r/YYB+QFpAY8BQoEPg/MCTQYSg0KB1QbeCtYPZwQ3BQyFOIQtDzoRSQ6NDq0IfhZmHCcLap6JTQ6aun3o/3CicH94aASKCI9ZHPIg0icyL/G0acVrktOppT6NsohZEnY+mR8+O3hP9LsYnZk3MvVjTWFFsR5xi3Iy4hrj38X7x5fG9CZMTFiZcTtRM5CW2JZGS4pJ2Jw1P95++cXr/DIcZJTNuzjSZOXfmxVmas7JmHZutOJs1+2AyITk+eU/yZ1YEq5Y1nBKcsiVliO3L3sR+wfHibOAMcN255dxnqe6p5anP09zT1qcNpHumV6QP8nx5VbxXGUEZ2zLeZ0Zk1mWOZsVnNWeTs5Ozj/BV+Jn8Mzk6OXNzenItcktye/Nc8zbmDQlCBbuFiHCmsC1fFV5zOkWmop9EfQUeBdUFH+bEzTk4V3kuf27nPPN5K+c9Kwwo/GU+Pp89v2OB3oKlC/oWei/csQhZlLKoY7HB4uLF/UsCl9QvpSzNXPp7kXVRedHbZfHL2ou1i5cUP/4p8KfGEoUSQcmt5W7Lt63AV/BWdK20W7l55ddSTumlMuuyirLPq9irLv1s83Plz6OrU1d3rXFcU7OWuJa/9uY6z3X15crlheWP109d37KBuaF0w9uNszderLCv2LaJskm0qbcyrLJts+HmtZs/V6VX3aj2qW7eorVl5Zb3Wzlbr9Z41TRt095Wtu3Tdt722zsCd7TUGtdW7CTuLNj5dFfcrvO/OP/SsFtzd9nuL3X8ut76qPozDU4NDXu09qxpRBtFjQN7Z+zt3ue3r63JsmlHM6O5bD/YL9r/x6/Jv948EHqg46DzwaZDRoe2HKYfLm1BWua1DLWmt/a2Jbb1HAk50tHu1n74N6vf6o7qHa0+pnZszXHK8eLjoycKTwyfzD05eCrt1OOO2R33Tiecvn5m2pmus6FnL5wLOHf6vPf5ExfcLxy96HrxyCXnS62XHS+3dDp0Hv7d4ffDXY5dLVecrrR1u3S390zpOX7V8+qpa37Xzl0Pvn75RviNnpuxN2/fmnGr9zbn9vM7WXde3S24O3JvyX3C/dIHSg8qHmo9rP2H2T+aex17j/X59XU+in507zH78Ysnwief+4uf0p5WPNN91vDc9vnRgYCB7j+m/9H/IvfFyGDJn8p/bnlp+vLQX15/dQ4lDPW/Erwafb3qjcaburf2bzuGI4cfvst+N/K+9IPGh/qPzh/Pf4r/9GxkzmfS58ovZl/av4Z+vT+aPTqayxKwJFcBDDY0NRWA13UA0BLh3aEbAIqC9O0lEUT6XpQg8J+w9H0mEUcA6rwAiF0CQBi8o9TAZgQxFfbiq3eMF0Dt7MabTISpdrbSWFT4giF8GB19ow0AqR2AL4LR0ZGto6NfdkGydwA4mSd984mFCO/3283EqKtTcS74Qf4JrF5srPmkm7gAAAAJcEhZcwAALiMAAC4jAXilP3YAAAIEaVRYdFhNTDpjb20uYWRvYmUueG1wAAAAAAA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJYTVAgQ29yZSA1LjQuMCI+CiAgIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgICAgIDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIgogICAgICAgICAgICB4bWxuczp0aWZmPSJodHRwOi8vbnMuYWRvYmUuY29tL3RpZmYvMS4wLyI+CiAgICAgICAgIDxleGlmOlBpeGVsWURpbWVuc2lvbj4yNjg8L2V4aWY6UGl4ZWxZRGltZW5zaW9uPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+MjY0PC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPHRpZmY6T3JpZW50YXRpb24+MTwvdGlmZjpPcmllbnRhdGlvbj4KICAgICAgPC9yZGY6RGVzY3JpcHRpb24+CiAgIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+CpnH5CIAAAPJSURBVDgRVVRRTFtlFP56e4tSwFI62yXLQrWbEqtspECR6UIgkRgm8YmHPfDAg+FBjZEXMPiwiBoeJBqMJiQmsOAixpgsIYKwEmtIlulkIytOMLAxGSFdGy4rbW97b/t7zj9awrm59/7/Pef/zne+8//XksvlLgkhziuKkgBgtVgs9Dq0u7H7uLq5iPXUI7zuqsGb3mY8a3cgJwQH5yjSQRjfWQgkTJPzh0sPR3f2NvDZ3Z/wot2DgPM0rjxchM/uRt/LXXAq9mKgaZpfKNvb249jsRg2Nzf1RCJhklfea/EHZu21j8wf1r4260uqzbdONpu2/Yz56e1PzA8WvjTTRobj9AO0lNLT02OtqamB1+tVp6amVHLIe+HedfUUytS+6j7VWepQ8wLqOddL6ocn31Uvx66rq482CrEgWRTE4/FfqDwxOztrtLW18VDae3ND4mrkWmEqzBypcmDvzFwSs2u/88w4+DSkVlVVSXaBQAA7OzsIhUI488oZCC2Ln1MhZLI6/MdfQI3Hh9DqIqLJOMZ2buBCVRD/3XuATD4LbVeDQopLoMrKStTV1WHhtwVkM1kEHX5M3P8cXdMX8Hd0g+njq9s/4uLC20AyhRNPu6E91tDb24uGhgYoVqtVAqmqisbGRtz88yaMnIHj6jF8e3YSKPfhr4cRhP/9A3eIzaueHnzvfx8KSZ3S01j9ZxWjo6NQJMrBw+/3Y+7XOQjaSsecVXij+hy+Of0xrtwKoeXyRQTTLgw814XXvAHYniqBYRhwOp1ob2+XHSpi+Xw+Od7TNAi6Ent7aH0+iOYTZ6GoClRFBe0ZaAkNVquKra0ttLa2gtcdYeR2u9HS0oJkMgnqBkEB+3oSOgnOltJT0A0dgvZCnrTVKGF9fb3U7whQaWkpgsEgIpGIpFxRXg5npfPJuKICDocDjmcc4E6z+Nzh2tpamYQ3lTRmwOesqakJg4ODYFC73U7MgGw2I+esCZfGHV5eXsbMzAzGx8fl+iLQEziABV9ZWcHw8DCi0ShsNhvKysqQyWRQUlIiy2Fm6+vr6O7ulj5eWwQqnHo6Ktjd3SUWWUmfmebzecmWx7xNeM7GCdjydB3RiGkzAxZxbGwM4XAYLpcLHo8H3Ah+s01OTmJ6elqCyw+MS1nkWSMQg3a5SKfToqOjgxsm7/n5eQoRgvyC/QMDA0XfxMSEPGuk3VCREcUWS9nf35eJ+MElshVKp0Ryzg9dL/xFaEKZJCMCMqh2Ti6WlpZEZ2enGBkZEQQqvzEbNhJZ0K9H9Pf3C/qPSUbkG/ofgQYPGkB9aTMAAAAASUVORK5CYII=) no-repeat scroll center;\
}\
div#iGraphCartIcon.removeFromCartIcon {\
background:transparent url(data:image/png;base64,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) no-repeat scroll center;\
}\
div#iGraphSnapshotIcon {\
background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsEAAA7BAbiRa+0AAAASdEVYdFNvZnR3YXJlAEdyZWVuc2hvdF5VCAUAAAEVSURBVDhPpZOxDcIwEEUviBIqOliBJRALMAKhYwaHikSICegII7AAYgkKMkDomAH8D184B6cIeZJ1Z/v738lOIiJ62dEZNrJ8Zn8SRRH1XN6Zxo42SeIyn22auuwLOgIw8kiMcdkvoT14eB1JF6GqmrrO60hXQh6qXF/f73Yc4eFdNpwTW204GHC1VRx7QzpAR9Dei4LnoO9iRZZlaJEPjicTOj/ndDvMuAAOYw/RGEOPsnSn6Pf5IRBgAqbrK6Xq3qBBQU1lVFr3kECAmQCNLgi8jrQgP51oMbpwDnTeVJBvPl4uX1bALyBrkofWoMUZtfY1EoHEOnoPsdGoLdrI+7Lx5G045jlHfA6NP20bKqPPtAtEbw8iYxB46Q0cAAAAAElFTkSuQmCC) no-repeat scroll center;\
}\
div#iGraphCartIcon.iGraphHelperTopIcons {\
float: left;\
position: absolute;\
left: 4px;\
}\
\
.imgareaselect-border1, .imgareaselect-border2,\
.imgareaselect-border3, .imgareaselect-border4 {\
opacity: 0.5;\
filter: alpha(opacity=50);\
}\
\
.imgareaselect-handle {\
background-color: #fff;\
border: solid 1px #000;\
opacity: 0.5;\
filter: alpha(opacity=50);\
}\
\
.imgareaselect-outer {\
background-color: #000;\
opacity: 0.5;\
filter: alpha(opacity=50);\
}\
\
.imgareaselect-selection { \
opacity: 0.5;\
color: red;\
}\
#iGHmodalClose {\
cursor: pointer;\
}\
#iGHmodalPage {\
display: none;\
position: fixed;\
width: 100%;\
height: 100%;\
top: 0px; left: 0px;\
font-family: Verdana, Arial, Helvetica, sans-serif;\
color: #000000;\
text-align: left;\
z-index: 10; \
}\
.iGHmodalHeader a, .iGHmodalHeader a:visited, .iGHmodalHeader a:hover {\
color: #32719D;\
background-color: transparent;\
font-family: arial;\
font-weight: normal;\
}\
#iGHmodalPage select {\
vertical-align: top;\
border-color: none;\
}\
.iGHmodalBackground {\
filter: Alpha(Opacity=60); -moz-opacity:0.6; opacity: 0.6;\
width: 100%; height: 100%; background-color: #999999;\
position: absolute;\
z-index: 500;\
top: 0px; left: 0px;\
}\
.iGHmodalContainer {\
position: absolute;\
width: 760px;\
left: 50%;\
top: 50%;\
z-index: 750;\
font-size: 10px;\
}\
.iGHmodalHeader {\
background-color: #EEE;\
}\
.iGHmodal {\
background-color: white;\
border: solid 1px black; position: relative;\
top: -230px;\
left: -380px;\
width: 760px;\
height: 460px;\
z-index: 1000;\
padding: 0px;\
}\
.iGHzooms {\
float: right;\
}\
.iGHmodalTop {\
width: 752px;\
background:#5A7EAA url(https://monitorportal.amazon.com/images/header_background.png) repeat-x scroll 0 0;\
padding: 4px;\
color: #ffffff;\
text-align: right;\
}\
.iGHperiod {\
font-size: 9px;\
margin-top: 4px;\
}\
.iGHmodalLeft {\
float: left; \
} \
.iGHinstructions {\
position:absolute;\
}\
.iGHmodalRight {\
float: right; \
} \
.iGHmodalTop a, .iGHmodalTop a:visited, .iGHmodalTop a:hover {\
font-size: 10px;\
color: #ffffff;\
background-color: transparent;\
}\
.iGHmodalBody {\
width: 760px;\
height: 426px;\
}\
#iGHaddToMyGraphs {\
display: inline; \
margin: 8px 5px 0px 10px;\
}\
#iGHaddToMyGraphs span {\
width: 100px;\
}\
.iGHwikiView {\
cursor: pointer;\
}\
#iGHsnapshotWiki {\
margin-left: 63px;\
}\
#iGHsnapshotS3-button, #iGHsnapshotWiki-button, #iGHsnapshotNewWiki-button, #iGHsnapshotTT-button, #iGHsnapshotSIM-button, #iGHsnapshotJIRA-button, #iGHsnapshotMCM-button {\
margin-left: auto;\
margin-right: auto;\
text-align: center;\
}\
#iGHsnapshotS3, #iGHsnapshotWiki, #iGHsnapshotNewWiki, #iGHsnapshotTT, #iGHsnapshotSIM, #iGHsnapshotJIRA, #iGHsnapshotMCM,\
#iGHsnapshotS3 .first-child, #iGHsnapshotWiki .first-child, #iGHsnapshotNewWiki .first-child, #iGHsnapshotTT .first-child, #iGHsnapshotSIM .first-child, #iGHsnapshotJIRA .first-child, iGHsnapshotMCM .first-child {\
width: 150px;\
}\
#iGHsnapshotS3, #iGHsnapshotWiki, #iGHsnapshotNewWiki, #iGHsnapshotTT, #iGHsnapshotSIM, #iGHsnapshotJIRA, #iGHsnapshotMCM {\
margin-top: 5px;\
}\
.iGHlabel {\
cursor: pointer;\
}\
button.iGHbutton:active, a.button.iGHbutton:active, input.iGHbutton[type=”submit”]:active, input.iGHbutton[type=”reset”]:active {\
-moz-box-shadow:none;\
color:black !important;\
text-decoration:none !important;\
top:1px;\
}\
button.iGHbutton, input.iGHbutton[type=”submit”], input.iGHbutton[type=”reset”] {\
height:19px;\
cursor: pointer;\
}\
button.iGHbutton, a.button.iGHbutton, input.iGHbutton[type=”submit”], input.iGHbutton[type=”reset”] {\
-moz-background-clip:border;\
-moz-background-inline-policy:continuous;\
-moz-background-origin:padding;\
-moz-border-radius-bottomleft:6px;\
-moz-border-radius-bottomright:6px;\
-moz-border-radius-topleft:6px;\
-moz-border-radius-topright:6px;\
-moz-box-shadow:1px 1px 2px rgba(0, 0, 0, 0.15);\
background:#D4D484 url(//internal-cdn.amazon.com/dtux.amazon.com/images/secondary_action_button_bg.png) repeat-x scroll 0 0;\
border-color:#959567 #898958 #7C7C4D;\
border-style:solid;\
border-width:1px;\
color:black !important;\
display:inline-block;\
font-family:Lucida Sans Unicode,Lucida Grande,Verdana,Arial,sans-serif;\
font-size:11px !important;\
line-height:15px !important;\
margin:0;\
overflow:visible;\
padding:0 6px;\
position:relative;\
text-decoration:none;\
text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);\
vertical-align:middle;\
margin: 3px;\
}\
span.iGHrefreshAll {\
top: -2px;\
position: relative;\
}\
.iGHwidget {\
}\
.iGHmenuArea {\
-moz-background-clip: border;\
-moz-background-inline-policy: continuous;\
-moz-background-origin: padding;\
-moz-border-radius-bottomleft:8px;\
-moz-border-radius-bottomright:8px;\
-moz-border-radius-topleft:8px;\
-moz-border-radius-topright:8px;\
background-color: #EAF3FE;\
border: 1px solid #CCCCCC;\
padding: 5px 0px;\
margin-top: 5px;\
}\
.iGHmenuArea select {\
vertical-align: inherit;\
}\
.iGHmenuTitle {\
padding-left: 10px;\
}\
.iGHmenuLink {\
font-size: 9px;\
padding-left: 10px;\
}\
.iGHradio {\
-moz-background-clip: border;\
-moz-background-inline-policy: continuous;\
-moz-background-origin: padding;\
-moz-border-radius-bottomleft:4px;\
-moz-border-radius-bottomright:4px;\
-moz-border-radius-topleft:4px;\
-moz-border-radius-topright:4px;\
background-color: white;\
font-size: 10px;\
border: 1px solid #CCCCCC;\
display: inline-block;\
padding: 4px 6px 0px 2px;\
height: 18px;\
}\
.iGHradio input {\
margin-top: 0px;\
}\
.iGHradio label {\
top: -3px;\
position: relative;\
cursor: pointer;\
}\
.iGHcopyPasteTimeRanges {\
text-align: right;\
position: absolute;\
right: 20px;\
}\
.iGHextraOptionsWide {\
position: relative;\
left: -500px;\
width: 850px;\
max-width: 850px;\
}\
.iGHicon {\
cursor: pointer;\
margin: 1px 3px 0 3px;\
font-size: 1.2em;\
}\
.timeRangesResetIcon.iGHicon {\
margin: 1px 1px 0 1px;\
}\
.metricMathEnlargeIcon, .metricMathReduceIcon {\
font-size: 1.5em;\
}\
‘;

var isIgraph = false;
var ICON_WIDTH = 18;
var LOADER_IMAGE = “data:image/gif;base64,R0lGODlhyAA8APMAAAAAAH9/fzMzM7+/v4+Pj09PTw8PD8zMzK+vrz8/P9/f329vbx8fH5+fn19fX////yH5BAEHAA8ALAAAAADIADwAAAT+8MlJq7046827/2AojmRpnmiqrmzrvnAsz3Rt33iu73zv/8CgcEgsGo/IpHLJbDqf0Kh0Sq1ar9isdsvter/gsPimGAwUyYOZoh6MfQEAIJBMyCl2wLsXn9fvE3l7PH10SIITDQGGgzmFf3qNQI+HgJJwcoweBwSLCGgZZYsBBG6higEHEogSbWxrDwqophiyi6oPrpcVlB0IDHLBBpoTCg7ByAYEFsbIAAkKrA/Sgn3BDLgUzcgCB9K7D70bx87B0GwG5cjLxQLqAu6Rq5bTcuTOBqASCvH4wPLgwmXyFSwAGlnpACzAI6eAKQUI4hmgUECOAAQSGvyjRy3YRQn+CBI6oLBADgOMD34hCzhBXIaEDSocSAjqgJwEzILhsglAgL5YCQF27PmTJ4NiJn8q2MhSgssLCOxdaCBn4YMBCxLQYgjAVEkAKClQ5UgWQMwK/yYQkHOWQlR64J5a6BNWm0UO/OSY+rYvGFeuP+fJ4yshYVOBfjbkCTwh3gUzARzk0SvhJgbHgcpeYAVMAAbCkuRWAF0P4ICK6ig/sLxZc2aAryewtkB6kOi/ny2NTZaAQDxTs0e7FtxaXnDcLG9PQM1YArCJV4M5aLA1j6l0Ry9gJh6btiV30C1sD6jcKdsLCliTqzvhnynmOYeXLj6BHOP0cHeVz3XcPAB2hA3+EIwpayUmll/dcSecPG+NxAuCyQ3EQTwOJhIMKKhtdVVQDyW01UwQzpcgcg/8w05GKzXVRwKjtDhKTeZQh8A9jIxlwAJmNHDPeSjaY8YC6Rg2ImHSCGjRIv3Q400CbbWSAJMyPdlkFNakptoDDQTljFWNpdabhBJ85Yxk8hEJ127IJDCekcSwWYGbVFRp5VbbBOMQM0ByE5MC6XhGwQD9DCOigoOSuI8D/wgQU5FgSgDnBI9KYoaGF7TRHHqw6GBHeIdJskABxEyQDk6dXkLOlIidWOogNhJQEzn5rGqqlWDJqp+WN2Vj6yUDjNLApbsGK+ywxBZr7LHIJqvssswQNuvss9BGK+201FZrbRYRAAA7”;
var graphsFound = false;
var stylesInitialized = false;
var modalCreated = false;
var iconsCreated = false;

function initialize() {
IGH.WikiHtml.initialize();
IGH.WikiEditor.initialize();
IGH.MetricSchemas.initialize();
IGH.PortalGraphZoomer.initialize();
IGH.PortalGraphSelector.initialize();
IGH.loadingImage = new Image();
IGH.loadingImage.src = LOADER_IMAGE;
decorateGraphs();
createIGraphLinks();
IGH.IGraphUpdates.initialize();
IGH.WikiCart.initialize();
IGH.TT.initialize();
document.addEventListener(“keydown”, checkKeyPress, false);
iGraphHelper = { initialize: initialize, decorateGraphs: decorateGraphs };
}

function setStyles() {
if (!stylesInitialized) {
// Setup styles for the links
stylesInitialized = true;
IGH.WikiWidgets.initialize();
addStyle(STYLES);
}
}

function checkKeyPress(e) {
// Check for Ctrl-Alt-G
if (e.ctrlKey && e.altKey && ((e.which == 103) || (e.which == 71))) {
decorateGraphs();
}
}

function iconClicked(baseUrl) {
if (IGH.hoveredImage) {
window.open(getFullGraphUrl(baseUrl));
}
return false;
}

function getFullGraphUrl(baseUrl) {
var graphArgs = getGraphArgs(IGH.hoveredImage, false);
return baseUrl + graphArgs;
}

function maximizeClicked(graphParams) {
var img = MonitorPortalRoot + “/mws?Action=GetGraph&Version=2007-07-07&”;
img += removeQueryParams(graphParams, [“WidthInPixels”, “HeightInPixels”, “Action”, “Version”, “ShowLegend”, “ShowXAxisLabel”]);
revealModal(img);
}
function removeQueryParams(url, paramList) {
var newUrl = url;
for (var i = 0; i < paramList.length; i++) {
var re = new RegExp(paramList[i] + "(=|%3D)[^&]*", "gi");
newUrl = newUrl.replace(re, "");
}
return newUrl;
}
function extractQueryValue(url, param) {
var re = new RegExp(param + "=([^&]*)");
if (null !== url.match(re)) {
return RegExp.$1;
}
return null;
}

function createModal() {
if (modalCreated) {
return;
}
var modalContainer = document.createElement("div");
modalContainer.innerHTML = '\

\

\

\

\

\

\

iGraph Helper – Magnifier (click and drag to zoom in)

\

\

\

\

\
\
\
\
\
  Period: \
\
Select…\
1 Minute\
5 Minutes\
1 Hour\
1 Day\
1 Week\
\
 Zoom: 1h | 3h | 8h | 1d | 1w | 2w | 30d | 3m | 1y \
\
\

\

\
\

\

\

\

‘;
document.body.insertBefore(modalContainer, document.body.firstChild);
jQuery(‘#iGHmodalPage’).click(hideModal);
jQuery(document).keydown(function(e) {
if (e.keyCode == 27) {
hideModal();
}});
jQuery(‘.iGHmodalContainer’).click(function() {return false;});
jQuery(‘#iGHmodalClose’).click(hideModal);
jQuery(‘#iGHapplyToAll’).click(applyToAll);
jQuery(‘#iGHrefresh’).click(refresh);
jQuery(‘#iGHviewInIGraph’).click(function() {viewGraphInOtherPage(IGRAPH_LINK.url);});
jQuery(‘#iGHviewInZoomer’).click(function() {viewGraphInOtherPage(IGRAPH_ZOOMER_LINK.url);});
jQuery(‘#iGHmodalPage select[name=”iGHperiod”]’).change(setPeriodAcrossImage);
jQuery(‘a’, ‘.iGHzooms’).attr(‘href’, ‘#’).click(function() {setTime.call(this, jQuery(“#iGHimage”)[0]); return false;});
modalCreated = true;
}

function getModalImage() {
var modalImage = jQuery(“#iGHimage”);
if (modalImage.length === 1) {
return modalImage[0];
}
return undefined;
}

function loadingImg(img) {
var width = extractQueryValue(img.src, “WidthInPixels”);
var height = extractQueryValue(img.src, “HeightInPixels”);
img.src = LOADER_IMAGE;
if (width && height) {
img.width = width;
img.height = height;
}
}

function setTime(img) {
var TIMES = { “1h”: “-PT1H”, “3h”: “-PT3H”, “8h”: “-PT8H”, “1d”: “-P1D”, “1w”: “-P7D”, “2w”: “-P14D”, “30d”: “-P30D”, “3M”: “-P90D”, “1y”: “-P365D” };
var newImgUrl = removeQueryParams(img.src, [“StartTime1”, “EndTime1”]);
newImgUrl += “&StartTime1=” + TIMES[jQuery(this).text()] + “&EndTime1=-P0D”;
loadingImg(img);
img.src = cleanImgUrl(newImgUrl);
}

function viewGraphInOtherPage(baseUrl) {
var imgUrl = getModalImage().src;
window.open(baseUrl + imgUrl.replace(/.*[?]/, “”), “_blank”);
}

function setPeriodAcrossImage() {
var img = getModalImage();
var newImg = getImageUrlWithSelectedPeriod(img.src);
loadingImg(img);
img.src = cleanImgUrl(newImg);
}

function getImageUrlWithSelectedPeriod(imgUrl) {
var period = getSelectedPeriod();
if (period !== null && period.length > 0) {
return imgUrl.replace(/(\bPeriod\d*=)[^&]*/g, “$1″ + period);
}
return imgUrl;
}

function getSelectedPeriod() {
return jQuery(‘select[name=”iGHperiod”] option:selected’, ‘#iGHmodalPage’).val();
}
function setSelectedPeriod(period) {
jQuery(‘select[name=”iGHperiod”] option[value=”‘ + period + ‘”]’, ‘#iGHmodalPage’).attr(“selected”, “selected”);
}

function refresh() {
_refreshImg(getModalImage());
}

function _refreshImg(img) {
var newImgUrl = removeQueryParams(img.src, [“iGHrefresh”]);
newImgUrl += “&iGHrefresh=” + new Date().valueOf();
loadingImg(img);
img.src = cleanImgUrl(newImgUrl);
}

function refreshAll() {
if (isIgraph) {
MP.GraphSection.displayGraph();
}
else {
for (i = 0; i < document.images.length; i++) {
var image = document.images[i];
var searchString = getGraphArgs(image, true);
if (searchString != null) {
loadingImg(image);
var newUrl = MonitorPortalRoot + "/mws?Action=GetGraph&Version=2007-07-07&";
newUrl += removeQueryParams(searchString, ["Action", "Version", "iGHrefresh"]);
newUrl += "&iGHrefresh=" + new Date().valueOf();
image.src = cleanImgUrl(newUrl);
}
}
}
}

function applyToAll() {
hideModal();
var timeRange = getImageTimeRange();
if (isIgraph) {
var model = MP.graph.model();
model.timeRanges().clear();
var rangeType = IGH.TimeRangeUtils.isDuration(timeRange.startTime) ? MP.MWS.TimeRangeType.RELATIVE : MP.MWS.TimeRangeType.FIXED;
model.timeRanges().add(model.createTimeRange(rangeType, timeRange.startTime, timeRange.endTime));
MP.GraphSection.displayGraph();
}
else {
for (i = 0; i = newStartMinutes) {
newEndMinutes = newStartMinutes – 1;
}

var newStartDuration = IGH.TimeRangeUtils.getDurationFromControl(
IGH.TimeRangeUtils.UNITS.MINUTE, newStartMinutes);
var newEndDuration = IGH.TimeRangeUtils.getDurationFromControl(
IGH.TimeRangeUtils.UNITS.MINUTE, newEndMinutes);
var newStart = IGH.TimeRangeUtils.getXMLCalendarFromDuration(new Date(), newStartDuration);
var newEnd = IGH.TimeRangeUtils.getXMLCalendarFromDuration(new Date(), newEndDuration);

var img = getModalImage();
var imgUrl = img.src;
var newImg = removeQueryParams(imgUrl, [“StartTime1”, “EndTime1”]);
newImg += “&StartTime1=” + newStart + “&EndTime1=” + newEnd;
loadingImg(img);
img.src = cleanImgUrl(newImg);
}

function cleanImgUrl(imgUrl) {
var newImg = removeQueryParams(imgUrl, [“actionSource”, “actionSource1”]);
newImg += “&actionSource=iGraphHelper”;
return newImg.replace(/[&]+/g, “&”); // Replace contiguous &’s with single &
}

function hideModal() {
jQuery(‘#iGHmodalPage’).hide();
}

function sizeModal() {
var TOP_BOTTOM_MARGIN = 50;
var SIDE_MARGIN = 100;
var MODAL_TOP_MARGIN = 8;
var MODAL_BODY_MARGIN = 46;

var windowSize = IGH.getWindowSize();
var modalWidth = windowSize.width – (2 * SIDE_MARGIN);
var modalHeight = windowSize.height – (2 * TOP_BOTTOM_MARGIN);
jQuery(“.iGHmodalContainer”).width(modalWidth);
jQuery(“.iGHmodal”).css(“top”, -(modalHeight/2)).css(“left”, -(modalWidth/2)).width(modalWidth).height(modalHeight);
jQuery(“.iGHmodalTop”).width(modalWidth – MODAL_TOP_MARGIN);
jQuery(“.iGHmodalBody”).width(modalWidth).height(modalHeight – MODAL_BODY_MARGIN);

return {width: modalWidth, height: modalHeight};
}

function createIcons() {
if (iconsCreated) {
return;
}
var iconContainer = document.createElement(“div”);
iconContainer.innerHTML = ‘\

\

\

\

\

\

\

\

\

\

\

\

\

\

1h| 3h| 8h| 1d| 1w| 2w| 30d| 3m| 1y

\

\
‘;
document.body.insertBefore(iconContainer, document.body.firstChild);
jQuery(“#iGraphIcon”)[0].addEventListener(“click”, function() { return iconClicked(IGRAPH_LINK.url); }, false);
jQuery(“#iGraphZoomerIcon”)[0].addEventListener(“click”, function() { return iconClicked(IGRAPH_ZOOMER_LINK.url); }, false);
jQuery(“#iGraphDataTableIcon”)[0].addEventListener(“click”, function() { return iconClicked(IGRAPH_DATA_TABLE_LINK.url); }, false);
jQuery(“#iGraphCSVIcon”)[0].addEventListener(“click”, function() { return iconClicked(IGRAPH_CSV_LINK.url); }, false);
jQuery(“#iGraphSnapshotIcon”)[0].addEventListener(“click”, function() {
if (IGH.hoveredImage) {
var graphUrl = isIgraph ? getGraphUrl() : getGraphArgs(IGH.hoveredImage, false);
WikiSnapshot.snapshotDisplayInPopup(IGH.util.lightbox, graphUrl, getSnapshotSizeMessage());
} return false;},
false);
jQuery(“#iGraphMaximizeIcon”)[0].addEventListener(“click”, function() {
if (IGH.hoveredImage) { maximizeClicked(getGraphArgs(IGH.hoveredImage, false));} return false;}, false);
jQuery(“#iGraphCartIcon”)[0].addEventListener(“click”, function() {
var graphUrl = isIgraph ? getGraphUrl() : getGraphArgs(IGH.hoveredImage, false);
return jQuery(this).hasClass(“addToCartIcon”) ? IGH.WikiCart.addGraphToCart(graphUrl) : IGH.WikiCart.removeGraphFromCart(graphUrl);
});
jQuery(“#iGraphBackgroundTop”)[0].addEventListener(“mouseout”, mouseOutTop, false);
jQuery(“#iGraphBackgroundBottom”)[0].addEventListener(“mouseout”, mouseOutBottom, false);
jQuery(‘a’, ‘#iGraphBackgroundBottom’).attr(‘href’, ‘#’).click(function() { if (IGH.hoveredImage) setTime.call(this, IGH.hoveredImage); return false;});
jQuery(‘#iGraphRefreshIcon’)[0].addEventListener(“click”, function() { if (IGH.hoveredImage) _refreshImg(IGH.hoveredImage); return false;}, false);
iconsCreated = true;
}

function decorateGraphs(noEvents){
var iGHimage = getModalImage();
// Go through all images in doc and look for GetGraph or chart.cgi images
for (i = 0; i 0) {
var MONITOR_COLS = 4;
var wikiText = “{| {{prettytable}}\n|-\n”;
for (var i = 0; i MONITOR_COLS) {
wikiText += new Array((MONITOR_COLS + 1) – (monitors.length % MONITOR_COLS)).join(“|\n”);
}
wikiText += “|}”;
}
}

// Check for Monitor overview

if (wikiText.length > 0) {
var button = getSaveToMyGraphsButton(user);
jQuery(‘#bd’).prepend(button);
jQuery(‘#iGHaddToMyGraphs’).click(function() {
saveTextToWiki(user, wikiText);
});
graphsFound = true;
}
}

function doDecorateIGraph(noEvents) {
// Check for iGraph page
if (noEvents) {
return;
}
jQuery(‘.iGraphHelperContainer’).hide();
var igraphImg = document.getElementById(“graphImg”);
if (/igraph/.test(window.location.href) && igraphImg) {
igraphImg.addEventListener(“mouseover”, function(e){ mouseOverGraph(e, igraphImg);}, false);
igraphImg.addEventListener(“mouseout”, function(e){ mouseOutGraph(e, igraphImg);}, false);
iGraphResizer(igraphImg, function(x, width, zoomLevel) {
MP.GraphSection._zoom(x, width, zoomLevel);
MP.GraphSection.displayGraph();
});
addIGraphZoom();
addIGraphReset();
addMyGraphsButton();
addSnapshotButton();
addTTSearch();
isIgraph = true;
graphsFound = true;
}
}

function iGraphResizer(igraphImg, zoomFn, height) {
var MIN_ZOOM = 5;
var minHeight = height || jQuery(igraphImg).height();
var imgAreaSelect = jQuery(igraphImg).imgAreaSelect({
onSelectEnd: function(img, select) {
if (zoomFn && (select.x2 – select.x1 >= MIN_ZOOM)) {
zoomFn((select.x1 + select.x2) / 2,
jQuery(igraphImg).width(), (select.width * 1.0 / jQuery(igraphImg).width()));
}
},
onSelectStart: function() {imgAreaSelect.setOptions({
minHeight: jQuery(igraphImg).height(),
maxHeight: jQuery(igraphImg).height()
});
imgAreaSelect.doResize();},
instance: true,
autoHide: true,
minHeight: minHeight,
maxHeight: minHeight,
selectionColor: “#CFFCFF”
});
}

function addMyGraphsButton() {
// Abandon if user can’t be determined
var user = getIgraphUser();
if (! user) {
return;
}

var button = getSaveToMyGraphsButton(user);

jQuery(button).insertBefore(jQuery(‘#generalOptionsHeader’));
jQuery(‘#iGHaddToMyGraphs’).click(function() { saveGraph(user); } );
graphsFound = true;
}

function addSnapshotButton() {
var id = “iGHsnapshotS3″;
var button = jQuery(”);
jQuery(button).insertAfter(jQuery(‘#wikiButton’));
var yahooLookButton = new YAHOO.widget.Button(id);
yahooLookButton.on(‘click’, function() {
snapshotTo(getSnapshotSizeMessage());
});
}

function getGraphUrl() {
if (typeof MP.GraphSection.getGraphUrlWithoutInvisibleMetrics === ‘function’) {
return MP.GraphSection.getGraphUrlWithoutInvisibleMetrics(MP.graph.model());
}
return MP.GraphSection.getDataModelQueryString();
}

function addTTSearch() {
var search = jQuery(
” +

‘ +
” +

‘);
jQuery(search).appendTo(jQuery(‘#wikiButton’).parent());
jQuery(‘#ttSearch’).keyup(function(e) {
if (e.which == 13) {
var search = jQuery(‘#ttSearch’).val();
var graphArgs = getGraphUrl();
graphArgs = IGH.util.removeQueryParams(graphArgs, [“WidthInPixels”, “HeightInPixels”]) + “&WidthInPixels=1024&HeightInPixels=300”;
window.open(‘https://tt.amazon.com/search?phrase_search_text=’ + search + ‘&search=Search!&’ + graphArgs, “_blank”);
}
});
}

function getSnapshotSizeMessage() {
var width = isIgraph ? MP.graph.model().options().widthInPixels() : IGH.hoveredImage.width;
var height = isIgraph ? MP.graph.model().options().heightInPixels() : IGH.hoveredImage.height;
msg = “The graph to be snapshotted is ” + width + ” by ” + height + ” pixels”;
return msg;
}

function snapshotTo(message) {
var queryString = getGraphUrl();
WikiSnapshot.snapshotDisplayInPopup(IGH.util.lightbox, queryString, message);
}

// Includes a Javascript a file, given by ‘url’, in the current document
function includeScript(url) {
if (document.body || document.head) {
var script = document.createElement(‘script’);
script.setAttribute(‘language’, ‘javascript’);
script.setAttribute(‘type’, ‘text/javascript’);
script.setAttribute(‘src’, url);
(document.body || document.head).appendChild(script);
}
}

function getSaveToMyGraphsButton(user) {
var WIKI_GRAPH_CONFIG_NAME = “iGraphHelper.wikiGraphPage”;
var wikiName = getValue(WIKI_GRAPH_CONFIG_NAME);
if (!wikiName) {
wikiName = “MyGraphs/” + user;
}
var button = jQuery(‘

\
\
View

‘);
jQuery(‘input’, button).change(function() {
setValue(WIKI_GRAPH_CONFIG_NAME, jQuery(this).val());
});
jQuery(‘.iGHwikiView’, button).click(function() {
window.open(getWikiPage(), ‘_blank’);
});

return button;
}

function getWikiPage() {
return “https://w.amazon.com/index.php/” + jQuery(‘input[name=”iGraphHelper.wikiGraphPage”]’).val();
}

function saveGraph(user) {
var queryString = getGraphUrl();
if (queryString && queryString.length) {
var model = MP.graph.model();
var wikiText = “{{IGraph/graph|graph=” + queryString.replace(/=/g, “%3D”).replace(/:/g, “%3A”).replace(/[&]/g, “%26”) +
“|width=” + model.options().widthInPixels() + “|height=” + model.options().heightInPixels() + “}}”;
saveTextToWiki(user, wikiText);
}
else {
alert(“Please display a graph first.\n\nYou can then save it to Wiki (” + getWikiPage() + “)”);
}
}

function saveTextToWiki(user, text) {
var wikiEdit = getWikiPage() + “?action=edit&autoadd=” + encodeURI(text);
window.open(wikiEdit, “_blank”);
}

function getIgraphUser() {
return jQuery(‘.hidden.username’).text();
}

function addIGraphZoom() {
var zoomRow = ‘

Zoom: 1h | 3h | 8h | 1d | 1w | 2w | 30d

‘;
var fixedZoom = jQuery(zoomRow);
var relZoom = jQuery(zoomRow);
var naturalZoom = jQuery(zoomRow);
var TIMES = { “1h”: “-PT1H”, “3h”: “-PT3H”, “8h”: “-PT8H”, “1d”: “-P1D”, “1w”: “-P7D”, “2w”: “-P14D”, “30d”: “-P30D” };
function setTime() {
var model = MP.graph.model();
model.timeRanges().clear();
model.timeRanges().add(model.createTimeRange(MP.MWS.TimeRangeType.RELATIVE, TIMES[jQuery(this).text()], “-PT0M”));
MP.GraphSection.displayGraph();
return false;
}

jQuery(‘a’, fixedZoom).attr(‘href’, ‘#’).click(setTime);
jQuery(‘a’, relZoom).attr(‘href’, ‘#’).click(setTime);
jQuery(‘a’, naturalZoom).attr(‘href’, ‘#’).click(setTime);
jQuery(‘#relative-time tbody’).prepend(relZoom);
jQuery(‘#fixed-time tbody’).prepend(fixedZoom);
jQuery(‘#natural-time tbody’).prepend(naturalZoom);
}

function addIGraphReset() {
var reset = jQuery(‘

  • Factory Settings
  • ‘);
    reset.click(function() {
    MP.SectionHelper._slidingFinished(MP.SectionHelper, ‘timeRanges’, true);
    MP.SectionHelper._slidingFinished(MP.SectionHelper, ‘generalOptions’, false);
    MP.SectionHelper._slidingFinished(MP.SectionHelper, ‘yAxisOptions’, false);
    MP.SectionHelper._slidingFinished(MP.SectionHelper, ‘extraOptions’, false);
    MP.SectionHelper._slidingFinished(MP.SectionHelper, ‘dashboarding’, false);
    MP.SectionHelper._slidingFinished(MP.SectionHelper, ‘searchControls’, false);
    jQuery(“.graphImgResize”).height(200);
    MP.GraphSection.resizeAll();
    MP.GraphSection._refreshGraph();
    MP.IgraphConfig.setAndStore(“graphHeight”, jQuery(“#graphImgContainer”).height());
    });

    jQuery(‘.globalFeatures’).prepend(reset);
    }

    function createIGraphLinks(){
    if (document.getElementById(‘metrics’) && document.getElementById(‘monitor-amazon-com’)) {
    addStyle(“\
    div#graph-control div.control-container { \
    overflow: visible; \
    }\n \
    div#main div.detailpanel {\
    overflow: visible;\
    }\
    “);
    }
    }

    function mouseOverGraph(event, data) {
    // Get position of graph
    IGH.hoveredImage = event.target;
    if (! document.getElementById(“iGraphBackgroundTop”)) {
    decorateGraphs();
    return;
    }
    var MARGIN = 5;
    var TOP_HEIGHT = 24;
    var imgWidth = event.target.width;
    var imgHeight = event.target.height;
    var offset = $(event.target).offset();
    var pos = { x: Math.floor(offset.left),
    y: Math.floor(offset.top) + 1};
    var args = jQuery(event.target).attr(“origimgurl”);
    var widthOffset = ICON_WIDTH + 5;
    var nextIcon = 3;
    var width = 96;
    if (isIgraph && data) {
    args = data.src.replace(/.*[?]/, “”);
    jQuery(‘#iGraphIcon’).hide();
    width = 72;
    }
    else {
    jQuery(‘#iGraphIcon’).show();
    }
    IGH.WikiCart.mouseOverGraph();
    IGH.WikiCart.updateCartIcon();
    jQuery(“#iGraphBackgroundTop”).
    width(imgWidth + 2 * MARGIN – 1).
    css(“left”, pos.x – MARGIN).
    css(“top”, pos.y – TOP_HEIGHT – 1).
    fadeIn();
    jQuery(“#iGraphBackgroundLeft”).
    height(imgHeight).
    css(“left”, pos.x – MARGIN).
    css(“top”, pos.y).
    fadeIn();
    jQuery(“#iGraphBackgroundRight”).
    height(imgHeight).
    css(“left”, pos.x + imgWidth).
    css(“top”, pos.y).
    fadeIn();
    jQuery(“#iGraphBackgroundBottom”).
    width(imgWidth + 2 * MARGIN – 1).
    css(“left”, pos.x – MARGIN).
    css(“top”, pos.y + imgHeight – 1).
    fadeIn();
    }

    function mouseOutGraph(event) {
    // Get mouse and current element positions
    var mousePos = IGH.getMouseCoords(event);
    var posTop = IGH.getElementPosition(jQuery(“#iGraphBackgroundTop”)[0]);
    var posBottom = IGH.getElementPosition(jQuery(“#iGraphBackgroundBottom”)[0]);

    // If mouse is outside both elements hide the icons
    if (isMouseOutside(mousePos, posTop, jQuery(“#iGraphBackgroundTop”).width(), jQuery(“#iGraphBackgroundTop”).height() + 2)
    && isMouseOutside(mousePos, posBottom, jQuery(“#iGraphBackgroundBottom”).width(), jQuery(“#iGraphBackgroundBottom”).height())) {
    hideGraphBorder();
    }
    return false;
    }
    function mouseOutTop(event) {
    var mousePos = IGH.getMouseCoords(event);
    var igraphBackgroundPos = IGH.getElementPosition(jQuery(“#iGraphBackgroundTop”)[0]);
    if (isMouseNotBelow(mousePos, igraphBackgroundPos, jQuery(“#iGraphBackgroundTop”).width(), jQuery(“#iGraphBackgroundTop”).height())) {
    hideGraphBorder();
    }
    return false;
    }
    function mouseOutBottom(event) {
    var mousePos = IGH.getMouseCoords(event);
    var igraphBackgroundPos = IGH.getElementPosition(jQuery(“#iGraphBackgroundBottom”)[0]);
    if (isMouseNotAbove(mousePos, igraphBackgroundPos, jQuery(“#iGraphBackgroundBottom”).width(), jQuery(“#iGraphBackgroundBottom”).height())) {
    hideGraphBorder();
    }
    return false;
    }
    function hideGraphBorder() {
    jQuery(“#iGraphBackgroundTop”).hide();
    jQuery(“#iGraphBackgroundBottom”).hide();
    jQuery(“#iGraphBackgroundLeft”).hide();
    jQuery(“#iGraphBackgroundRight”).hide();
    IGH.WikiCart.mouseOutGraph();
    }

    function isMouseOutside(mousePos, pos, width, height) {
    if (!mousePos || mousePos.x pos.x + width ||
    mousePos.y pos.y + height) {
    return true;
    }
    return false;
    }
    function isMouseNotBelow(mousePos, pos, width, height) {
    if (!mousePos || mousePos.x pos.x + width ||
    mousePos.y < pos.y) {
    return true;
    }
    return false;
    }
    function isMouseNotAbove(mousePos, pos, width, height) {
    if (!mousePos || mousePos.x pos.x + width ||
    mousePos.y > pos.y + height) {
    return true;
    }
    return false;
    }

    function getGraphArgs(image, includeQPlot) {
    // Look for graph image in http://performance*.amazon.com/chart.cgi
    if (/var\/performance\/cache\/png/.test(image.src) &&
    /amazon.com\/chart.cgi/.test(window.location.href) && includeQPlot) {
    return getSearchFromChartCgi();
    }
    else if (/Action=GetGraph/.test(image.src)) {
    return convertMWSParamsToIGraph(image.src.replace(/.*[?]/, “”));
    }
    else if (/Action=GetGraph/.test(image.alt)) {
    return convertMWSParamsToIGraph(image.alt.replace(/.*[?]/, “”));
    }
    else if (/SchemaName[0-9]*=/.test(image.title)) {
    return convertMWSParamsToIGraph(image.title.replace(/^MWS:/, “”));
    }
    else if (/amazon.com\/dashboard-PMETGraphs.cgi/.test(image.src) && includeQPlot) {
    return getSearchFromQplotUrl(image.src);
    }
    else if (image.tagName === “DIV”) {
    return jQuery(image).parents(“.MPWgraphInteractiveContainer”).children(“.MPWgraphInteractiveParams”).text();
    }

    return null;
    }

    function convertMWSParamsToIGraph(url) {
    var SEARCH_REPLACEMENTS = {
    “StartTime=”: “StartTime1=”,
    “EndTime=”: “EndTime1=”,
    “MetricSchema&”: “&”,
    “Period1=1”: “Period1=One”,
    “Period1=5”: “Period1=Five”,
    “StatOptions=”: “StatOptions1=”,
    “HorizontalLineLeft=”: “HorizontalLineLeft1=”,
    “HorizontalLineRight=”: “HorizontalLineRight1=”,
    “ValueUnit=”: “ValueUnit1=”
    };
    var NON_SEARCH_REPLACEMENTS = {
    “SchemaName=”: “SchemaName1=”,
    “Period=”: “Period1=”,
    “Stat=”: “Stat1=”,
    “=Oneminute”: “=OneMinute”,
    “=Fiveminute”: “=FiveMinute”,
    “=Onehour”: “=OneHour”,
    “=Oneday”: “=OneDay”,
    “=Oneweek”: “=OneWeek”
    };

    var graph = url.replace(/%3D/g, “=”);

    var replacementList = [ SEARCH_REPLACEMENTS ];
    if (! /SchemaName[0-9]*=Search/.test(graph)) { // If graph doesn’t contain a search string do more conversions
    replacementList.push(NON_SEARCH_REPLACEMENTS);
    var schemaDefs = IGH.MetricSchemas.schemaDefs;
    for (var schemaName in schemaDefs) {
    var dims = schemaDefs[schemaName];
    for (var i = 0; i < dims.length; i++) {
    graph = graph.replace(new RegExp(dims[i] + "=", "i"), dims[i] + "1=");
    }
    }
    }

    for (var r = 0; r < replacementList.length; r++) {
    var replacements = replacementList[r];
    for (var reStr in replacements) {
    var re = new RegExp(reStr, "g");
    graph = graph.replace(re, replacements[reStr]);
    }
    }
    return graph;
    }

    function getSearchFromMWSGetGraph(getGraphUrl) {
    var regexp = new RegExp("^(.*)[0-9]+$");
    var metricSearch = new IGH.MetricSearch();
    var paramValues = getGraphUrl.split("&");
    for (var i = 0; i = 0; i–) {
    var textContent = text.snapshotItem(i).textContent;
    var match = regexp.exec(textContent);
    if (match) {
    var metricFields = match[1].split(“,”);
    metricSearch.addMetric(new IGH.Metric(metricFields));
    }
    }
    var searchString = metricSearch.getSearchString();
    if (searchString) {
    var graphTable = document.evaluate(“/html/body/table[3]”,document,null,6,null).snapshotItem(0);
    var div = document.createElement(‘div’);
    div.className = “igraphMessage”;
    div.innerHTML = ‘Click here to search for the metrics below in iGraph
    graphTable.parentNode.insertBefore(div, graphTable);
    graphsFound = true;
    }

    return null;
    }

    function getSearchFromQplotUrl(qplot) {
    return null;
    }

    IGH.WikiHtml = {
    initialize: function() {
    // Go check if we’re on Wiki. Then
    if (IGH.WikiEditor.onWiki()) {
    var htmlContainer = jQuery(‘pre.html’);
    var html = htmlContainer.text();
    try {
    htmlContainer.replaceWith(html);
    }
    catch (e) {
    log(e);
    }
    }
    }

    };

    IGH.WikiWidgets = {
    DEFAULT_WIDGETS: {
    period: “menu|Period|,1 Minute;OneMinute,5 Minute;FiveMinute,1 Hour;OneHour,1 Day;OneDay,1 Week;OneWeek|”,
    time: “radio|Zoom;StartTime&EndTime|1h;-PT1H&P0D,3h;-PT3H&P0D,8h;-PT8H&P0D,1d;-P1D&P0D,3d;-P3D&P0D,1w;-P7D&P0D,2w;-P14D&P0D|”,
    refresh: “refresh”
    },

    defaultPeriod: ”,
    defaultTime: ”,

    initialize: function() {
    if (! IGH.WikiEditor.onWiki()) {
    return;
    }

    this.displayWidgets();
    },

    displayWidgets: function() {
    var self = this;
    var widgetElements = jQuery(‘.IGraphWidget’);

    var widgetDefs = [];
    var insertAfter = null;
    if (widgetElements.length == 0) {
    insertAfter = jQuery(“#toc”)[0] || jQuery(“#contentSub”)[0];

    }
    else {
    insertAfter = jQuery(‘.IGraphWidget:first’);
    widgetElements.each(function() {
    widgetDefs.push(jQuery(this).text());
    });
    }
    if (jQuery(‘.IGraphNoDefaultWidgets’).length === 0) {
    widgetDefs.push(this.DEFAULT_WIDGETS.period + this.defaultPeriod);
    widgetDefs.push(this.DEFAULT_WIDGETS.time + this.defaultTime);
    widgetDefs.push(this.DEFAULT_WIDGETS.refresh);
    }
    this.displayWidgetsFromDefs(widgetDefs, insertAfter);
    },

    displayWidgetsFromDefs: function(widgetDefs, insertAfter) {
    if (widgetDefs.length == 0) {
    return;
    }
    var div = jQuery(‘

    ‘).addClass(‘iGHmenuArea’);
    for (var i = 0; i 0) {
    var menuType = jQuery.trim(fields[0]);
    if (menuType === ‘menu’ && fields.length == 4) {
    this.doMenu(div, fields[1], fields[2], fields[3]);
    }
    else if (menuType === ‘radio’ && fields.length == 4) {
    this.doRadio(div, i, fields[1], fields[2], fields[3]);
    }
    else if (menuType === ‘html’ && fields.length == 2) {
    this.doHtml(div, fields[1]);
    }
    else if (menuType === ‘refresh’) {
    this.doRefresh(div);
    }
    else {
    log(“Error, expected ‘[menu|radio]|||’ but got this: ” + def);
    }
    }
    else {
    log(“Error, expected ‘[menu|radio|input]|[|]…’ but got this: ” + def);
    }
    };
    div.append(‘Customize…‘);
    div.insertAfter(insertAfter);
    },

    doMenu: function(div, nameField, optionsField, defaultOptionField) {
    var self = this;
    var menuName = this.parseMenuEntry(jQuery.trim(nameField));
    var options = jQuery.trim(optionsField).split(“,”);
    var defaultOption = jQuery.trim(defaultOptionField);
    var container = jQuery(‘‘).addClass(‘iGHwidget’).appendTo(div);
    jQuery(‘‘).addClass(‘iGHmenuTitle’).text(menuName.text + “: “).appendTo(container);
    var optionsHtml = “”;
    for (var j = 0; j < options.length; j++) {
    var option = this.parseMenuEntry(options[j]);
    var selected = option.value == defaultOption ? "selected" : "";
    optionsHtml += '’ + option.text + ”;
    }
    jQuery(” + optionsHtml + ”).appendTo(container).change(function() {
    self.updateFields(menuName.value, jQuery(this).val());
    });
    },

    doRadio: function(div, index, nameField, optionsField, defaultOptionField) {
    var self = this;
    var radioName = this.parseMenuEntry(jQuery.trim(nameField));
    var options = jQuery.trim(optionsField).split(“,”);
    var defaultOption = jQuery.trim(defaultOptionField);
    var container = jQuery(‘‘).addClass(‘iGHwidget’).appendTo(div);
    jQuery(‘‘).addClass(‘iGHmenuTitle’).text(radioName.text + “: “).appendTo(container);
    var radioContainer = jQuery(‘‘).appendTo(container);
    for (var j = 0; j 0) {
    var selected = option.value == defaultOption ? ‘ checked=”checked”‘ : ”;
    var inputName = ‘iGraphRadio’ + index;
    var inputId = inputName + ‘_’ + j;
    var radio = jQuery(” +
    ‘);
    radio.appendTo(radioContainer);
    var radioValue = new String(option.value)
    radio.change(function() {
    self.updateFields(radioName.value, jQuery(this).val());
    });
    }
    }
    },

    doHtml: function(div, html) {
    jQuery(div).append(html);
    },

    doRefresh: function(div) {
    jQuery(div).append(‘ ‘);
    jQuery(‘.iGHrefreshAll input’, div).click(refreshAll);
    },

    parseMenuEntry: function(menuEntry) {
    var fields = menuEntry.split(‘;’);
    var value = fields.length == 2 ? fields[1] : fields[0];
    return {text: jQuery.trim(fields[0]), value: jQuery.trim(value)};
    },

    keys: function(object) {
    var keys = [];
    var key;
    for (key in object) {
    if (object.hasOwnProperty(key)) {
    keys.push(key);
    }
    }
    return keys;
    },

    updateFields: function(fields, values) {
    var fieldEntries = fields.split(“&”);
    var valueEntries = values.split(“&”);
    if (fieldEntries.length != valueEntries.length) {
    log(‘Error: different number of entries in “‘ + fields + ‘” versus “‘ + values + ‘”‘);
    return;
    }
    for (i = 0; i < document.images.length; i++) {
    var image = document.images[i];
    var searchString = getGraphArgs(image, true);
    if (searchString != null) {
    var modified = false;
    for (var f = 0; f 0) {
    if ((jQuery(‘#wpTextbox1’).val().length === 0) && /MyGraphs\//.test(window.location.href)) {
    autoadd = “[[Category:MyGraphs]]\n” + autoadd;
    }
    // We’ve got autoadd, let’s add it to the page contents and save
    this.addAndSaveText(decodeURI(autoadd).replace(/[%]26/g, “&”));
    }
    }
    }
    },

    addAndSaveText: function(text) {
    var textBox = jQuery(‘#wpTextbox1’);

    // Add text to edit box
    textBox.val(textBox.val() + ‘\n’ + text);

    // Set summary for edit
    jQuery(‘#wpSummary’).val(‘Autoadded by iGraph Helper, https://w.amazon.com/?IGraphHelper’);

    // Click ‘Save Page’
    jQuery(‘#wpSave’).click();
    },

    onWiki: function(withArgs) {
    // Check if we’re on a Wiki page with parameters
    if (! /^w[.].*amazon[.]com/.test(window.location.host)) {
    return false;
    }
    if (withArgs && ! /[?]/.test(window.location.href)) {
    return false;
    }
    return true;
    }
    };

    IGH.Metric = function(dimValues) {
    this._schemaName = dimValues[0];
    dimValues.splice(0, 1);
    this._dimValues = dimValues.slice();
    }
    IGH.Metric.prototype = {
    getSchemaName: function() {
    return this._schemaName;
    },

    getDimensions: function() {
    return IGH.MetricSchemas.getDimensions(this._schemaName);
    },

    getDimensionValues: function() {
    return this._dimValues;
    }
    }

    IGH.MetricSearch = function() {
    this._uniqueValues = new Array();
    }
    IGH.MetricSearch.prototype = {
    add: function(field, value) {
    if (!this._uniqueValues[field]) {
    this._uniqueValues[field] = new Array();
    }
    if (field == IGH.SCHEMA_NAME_FIELD) {
    value = value.replace(/MetricSchema/, “”);
    }
    this._uniqueValues[field][value] = true;
    },

    addMetric: function(metric) {
    this.add(IGH.SCHEMA_NAME_FIELD, metric.getSchemaName());
    var dimensions = metric.getDimensions();
    var dimValues = metric.getDimensionValues();
    for (var i = 0; i < dimensions.length; i++) {
    if (dimValues[i]) {
    this.add(dimensions[i], dimValues[i]);
    }
    }
    },

    getSearchString: function() {
    var clauses = [];
    for (var field in this._uniqueValues) {
    var values = [];
    for (var value in this._uniqueValues[field]) {
    if (field == IGH.SCHEMA_NAME_FIELD) {
    values.push(value);
    }
    else {
    values.push("$" + value + "$");
    }
    }

    var clause = field.toLowerCase() + "=";
    clause += (values.length == 1) ? values[0] : "(" + values.join(" OR ") + ")";
    clauses.push(clause);
    }

    return clauses.length ? clauses.join(" ") : null;
    }
    }

    IGH.SCHEMA_NAME_FIELD = "SchemaName";

    IGH.MetricSchemas = {
    initialize: function() {
    for (var schemaName in this.schemaDefs) {
    this._schemas.push(schemaName);
    var dims = this.getDimensions(schemaName);
    for (var i = 0; i = 0) {
    res = parseInt(width.substring(0, p));
    }
    else {
    //do not know how to calculate other
    //values (such as 0.5em or 0.1cm) correctly now
    //so just set the width to 1 pixel
    res = 1;
    }
    }
    return res;
    }

    //returns border width for some element
    IGH._getBorderWidth = function(element) {
    var res = new Object();
    res.left = 0; res.top = 0; res.right = 0; res.bottom = 0;
    if (window.getComputedStyle) {
    //for Firefox
    var elStyle = window.getComputedStyle(element, null);
    res.left = parseInt(elStyle.borderLeftWidth.slice(0, -2));
    res.top = parseInt(elStyle.borderTopWidth.slice(0, -2));
    res.right = parseInt(elStyle.borderRightWidth.slice(0, -2));
    res.bottom = parseInt(elStyle.borderBottomWidth.slice(0, -2));
    }
    else {
    //for other browsers
    res.left = IGH.BrowserConstants._parseBorderWidth(element.style.borderLeftWidth);
    res.top = IGH.BrowserConstants._parseBorderWidth(element.style.borderTopWidth);
    res.right = IGH.BrowserConstants._parseBorderWidth(element.style.borderRightWidth);
    res.bottom = IGH.BrowserConstants._parseBorderWidth(element.style.borderBottomWidth);
    }

    return res;
    }

    /*
    * Utility function for getting size of window
    */
    IGH.getWindowSize = function() {
    var myWidth = 0, myHeight = 0;
    if (typeof( window.innerWidth ) == ‘number’ ) {
    //Non-IE
    myWidth = window.innerWidth;
    myHeight = window.innerHeight;
    } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in ‘standards compliant mode’
    myWidth = document.documentElement.clientWidth;
    myHeight = document.documentElement.clientHeight;
    } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    myWidth = document.body.clientWidth;
    myHeight = document.body.clientHeight;
    }
    return { width: myWidth, height: myHeight};
    };

    /*
    * Given an event returns the absolute position of the mouse pointer
    */
    IGH.getMouseCoords = function(ev) {
    try {
    ev = ev || window.event;
    if (ev.pageX || ev.pageY) {
    return {
    x: ev.pageX,
    y: ev.pageY
    };
    }
    var windowOffset = IGH.getWindowOffset();
    return {
    x: ev.clientX + windowOffset.x – document.body.clientLeft,
    y: ev.clientY + windowOffset.y – document.body.clientTop
    };
    }
    catch (e) {
    // The event object was not obtainable or did not contain location information
    return null;
    }
    };

    IGH.getWindowOffset = function() {
    return {
    x: IGH.filterAreaResults(window.pageXOffset ? window.pageXOffset : 0,
    document.documentElement ? document.documentElement.scrollLeft : 0,
    document.body ? document.body.scrollLeft : 0),
    y: IGH.filterAreaResults(window.pageYOffset ? window.pageYOffset : 0,
    document.documentElement ? document.documentElement.scrollTop : 0,
    document.body ? document.body.scrollTop : 0)
    }
    };

    /*
    * Utility function for getting the correct number in the DOM for x and y positions.
    * It is given numbers that come from the window, document and documeny body and
    * the algorithm figures out the correct one to use.
    */
    IGH.filterAreaResults = function(n_win, n_docel, n_body) {
    var n_result = n_win ? n_win : 0;
    if (n_docel && (!n_result || (n_result > n_docel))) {
    n_result = n_docel;
    }
    return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
    };

    IGH.PortalGraphZoomer = {
    initialize: function() {
    monitorPortal = document.getElementById(“masthead”);
    if (monitorPortal) {
    if (!(/[]Infrastructure[]/.exec(monitorPortal.innerHTML) &&
    /[]Powered By Monitoring[]/.exec(monitorPortal.innerHTML) && window.jQuery)) {
    return;
    }

    // Register click event on all graphs
    jQuery(“#graph_results .img img”).click(IGH.PortalGraphZoomer._graphClickEvent);
    jQuery(“#graph_results .img img”).css(“cursor”, “pointer”);
    jQuery(“#graph_results .img img”).attr(“title”, “Click to zoom”);
    }
    },

    /*
    * Graph was left-clicked:
    * – left-click on its own zooms in by 2, and recenters around clicked-on spot
    * – shift-left-click recenters graph on around clicked-on spot (no zoom)
    * – ctrl-left-click jumps to latest data (no zoom)
    */
    _graphClickEvent: function(e) {
    var event = window.event || e;
    var graphPos = jQuery(this).offset();
    var width = jQuery(this).width();
    var xClick = event.clientX – graphPos.left;

    IGH.PortalGraphZoomer._zoom(xClick, width, event.shiftKey ? 1.0 : 0.5);
    return false;
    },

    _getTimeRange: function() {
    var endTime = jQuery(‘#end_time’).val();
    var endTimeMillis = Date.parse(endTime);
    var isFixedTime = jQuery(‘div#time-control .switch-time a’).attr(‘id’) != ‘fixed-time’;
    if (isFixedTime) {
    var startTime = jQuery(‘#start_time’).val();
    var startTimeMillis = Date.parse(startTime);
    }
    else {
    var relTime = jQuery(‘#relative_time_value’).val();
    var period = jQuery(‘#relative_time_value’).next().val();
    var minMultiplier = 1;
    if (period == “hour”) {
    minMultiplier = 60;
    }
    else if (period == “day”) {
    minMultiplier = 24 * 60;
    }
    else if (period == “week”) {
    minMultiplier = 7 * 24 * 60;
    }
    var relMinutes = relTime * minMultiplier;
    var startTimeMillis = endTimeMillis – 60000 * relMinutes;
    }
    return {startTime: startTimeMillis, endTime: endTimeMillis};
    },

    _zoom: function(x, width, zoomLevel) {
    var timeRange = this._getTimeRange();
    var startDuration, endDuration;

    var centerSpot = timeRange.startTime – Math.floor((timeRange.startTime – timeRange.endTime) / 1.0 / width * x);
    var halfDuration = Math.floor((timeRange.startTime – timeRange.endTime) * zoomLevel / 2);
    var newStartMillis = centerSpot + halfDuration;
    var newEndMillis = centerSpot – halfDuration;

    this._setTimeRange(newStartMillis, newEndMillis);
    jQuery(‘#graph-metrics’).submit();
    },

    _setTimeRange: function(startTimeMillis, endTimeMillis) {
    this._displayFixedTime();
    var startTime = new Date(startTimeMillis);
    var endTime = new Date(endTimeMillis);
    jQuery(‘#start_time’).val(this._formatTime(startTime));
    jQuery(‘#end_time’).val(this._formatTime(endTime));
    },

    _formatTime: function(time) {
    var y = time.getYear() + 1900;
    var m = time.getMonth() + 1;
    var d = time.getDate();
    var h = time.getHours();
    var min = time.getMinutes();

    return (y + “/” + this._zeroPad(m) + “/” + this._zeroPad(d) + ” ” + this._zeroPad(h) + “:” + this._zeroPad(min));
    },

    _displayFixedTime: function() {
    var timecontrol = jQuery(‘div#time-control’);
    var fixedTime = ‘div#hidden-fixed-time-control’;
    timecontrol.empty().append(jQuery(fixedTime).html());
    },

    _zeroPad: function(x) {
    return(x9?””:”0″)+x;
    }

    };

    IGH.PortalGraphSelector = {
    initialize: function() {
    if (window.GraphData && window.GraphData.initDataTable && ! (/monitorportal.amazon.com[/]mws[/]data/.test(window.location.href))) {
    this._origInitDataTable = window.GraphData.initDataTable;
    window.GraphData.initDataTable = this._myInitDataTable;
    graphsFound = true;
    }
    },

    _myInitDataTable: function(index) {
    IGH.PortalGraphSelector._origInitDataTable(index);
    var divId = “#graph_data_” + index;
    jQuery(divId + ” table.tablesorter tr td”).bind(“click”, function() {
    var cb = jQuery(“input”, jQuery(this).parent());
    cb.attr(“checked”, ! cb.attr(“checked”));
    });
    jQuery(divId).prepend(“Preview“);
    jQuery(divId).prepend(“View in iGraph&nbsp| “);
    jQuery(“#iGraphPreview” + index).click(function() {IGH.PortalGraphSelector._previewGraphs(index);});
    jQuery(“#iGraphView” + index).click(function() {IGH.PortalGraphSelector._viewGraphs(index);});
    jQuery(divId + ” table tr:first”).prepend(“

    “);
    jQuery(divId + ” table tr:first input”).change(function() { IGH.PortalGraphSelector._checkAllChanged(this, index);});
    jQuery(divId + ” table tr:gt(0)”).prepend(“

    “);

    },

    _checkAllChanged: function(cb, index) {
    jQuery(“#graph_data_” + index + ” table tr:gt(0) input”).attr(“checked”, jQuery(cb).attr(“checked”));
    return false;
    },

    _viewGraphs: function(index) {
    var igraph = MonitorPortalRoot + “/igraph?”;
    var args = IGH.PortalGraphSelector._getGraphs(index);
    if (args.length == 0) {
    alert(“Please tick metrics below to view in iGraph”);
    }
    else {
    window.open(igraph + args);
    }
    return false;
    },

    _previewGraphs: function(index) {
    var img = MonitorPortalRoot + “/mws?Action=GetGraph&Version=2007-07-07&WidthInPixels=760&HeightInPixels=460&”;
    var args = IGH.PortalGraphSelector._getGraphs(index);
    if (args.length == 0) {
    alert(“Please tick metrics below to preview”);
    }
    else {
    maximizeClicked(args);
    // jQuery.blockUI(IGH.PortalGraphSelector._getPreviewModalHtml(img + args), window.modal_normal);
    }
    return false;

    },

    _getGraphs: function(index) {
    var LIMIT = 50;
    var args = “”;
    jQuery(“#graph_data_” + index + ” table tr:gt(0) input:checked”).each(function(i) {
    var td = jQuery(this).parent().next();
    var link = jQuery(“a”, td).attr(“href”);
    if (!link) {
    link = IGH.PortalGraphSelector._getLinkFromMetricString(jQuery.trim(td.text()), index);
    }

    link = link.replace(/^.igraph[?]/, “”).replace(/\d+=/g, (i + 1) + “=”);
    if (i > 0) {
    link = link.replace(/[&]StartTime.*/, “”);
    }
    if (i < LIMIT) {
    args += "&"+ link;
    }
    else if (i == LIMIT) {
    alert("Warning: limited to displaying " + LIMIT + " metrics in iGraph");
    }
    });

    return args;
    },

    _getPreviewModalHtml: function(img) {
    return '\

    ‘;

    },

    _getLinkFromMetricString: function(label, index) {
    var metricString = jQuery(“.title”, jQuery(“#graph_data_” + index).parents(“tr”).children(“:first-child”)).text();
    var METRIC_EXTRACTOR_REGEXP = new RegExp(‘^([^ ]*) ([^ ]*) ([^ ]*)’);
    var metricParts = METRIC_EXTRACTOR_REGEXP.exec(metricString);
    if (metricParts && metricParts.length == 4) {
    return “&SchemaName1=Snitch&Stat1=avg&Period1=OneMinute&DataSet1=prod” + this._getHostOrHostclass(label) +
    “&DecoratePoints=true” + this._getCurrentTimeRange() +
    “&Class1=” + metricParts[1] +
    “&Object1=” + metricParts[2] +
    “&Metric1=” + metricParts[3];
    }
    },

    _getHostOrHostclass: function(label) {
    return location.pathname.indexOf(‘/hostclasses/’) === 0 ?
    (“&HostGroup1=” + encodeURIComponent(label) + “&Host1=ALL”) :
    (“&HostGroup1=NONE&Host1=” + encodeURIComponent(label));
    },

    _getCurrentTimeRange: function() {
    var time = IGH.PortalGraphZoomer._getTimeRange();
    var startTime = new Date(time.startTime);
    var endTime = new Date(time.endTime);
    return “&StartTime1=-PT” + parseInt((endTime.getTime() – startTime.getTime()) / 3600000) + “H&EndTime1=-P0D”;

    },

    _getTimeInHours: function(time) {
    var now = new Date();
    return (now.getTime() – time.getTime()) / 1000 / 60 / 60;
    }
    };

    IGH.IGraphUpdates = {
    initialize: function() {
    if ((typeof MP !== ‘undefined’) && MP.graph && MP.graph.model &&
    MP.graph.PARAMS.MODEL_CHANGED_EVENT && MP.graph.model() &&
    jQuery) {
    MP.graph.model().register(MP.graph.PARAMS.MODEL_CHANGED_EVENT, IGH.IGraphUpdates.setTitle);
    IGH.IGraphUpdates.setTitle();
    jQuery(‘#linkToThisGraphTiny’).click(IGH.IGraphUpdates.tinyClicked);
    }
    },

    setTitle: function() {
    var title = MP.graph.model().options().graphTitle();
    if (title != null && title != “”) {
    window.document.title = title;
    }

    },

    tinyClicked: function() {
    var title = MP.graph.model().options().graphTitle();
    var tinyLink = jQuery(‘#linkToThisGraphTiny’).attr(“href”, tinyLink);
    tinyLink = tinyLink.replace(/comment=iGraph/, “comment=” + escape(title));
    jQuery(‘#linkToThisGraphTiny’).attr(“href”, tinyLink);
    return true;
    }
    };

    IGH.TimeRangeUtils = {

    TZ_PDT: “PST8PDT”,
    XML_DATE: new RegExp(‘(\\d{4})-(\\d{2})-(\\d{2})’),
    XML_TIME: new RegExp(‘T(\\d{2}):(\\d{2}):(\\d{2})’),
    XML_TZ: new RegExp(‘([-+]\\d{2}):00$’),
    DECIMAL: 10,
    MILLISECONDS_IN_MINUTE: 60 * 1000,
    DURATION: new RegExp(‘^-?P’),

    PATTERN: {
    DAY: new RegExp(‘(\\d*)D’),
    HOUR: new RegExp(‘(\\d*)H’),
    MINUTE: new RegExp(‘(\\d*)M’)
    },

    DURATIONS: {
    DAY: “D”,
    HOUR: “H”,
    MINUTE: “M”
    },

    MINUTES: {
    DAY: 24 * 60,
    HOUR: 60,
    MINUTE: 1
    },

    UNITS: {
    MINUTE: “MINUTE”,
    HOUR: “HOUR”,
    DAY: “DAY”
    },

    ORDERED_UNITS: [“MINUTE”, “HOUR”, “DAY”],

    // get units and corresponding value form a control
    getControlFromDuration: function(duration){
    var minutes = this.getMinutes(duration);
    var unit = this.getUnits(duration);
    var value = minutes / this.MINUTES[unit];
    var result = {};
    result[unit] = value;
    return result;
    },

    // get number of minutes corresponding to a duration
    getMinutes: function(duration){
    // sign is inverted sign widget is ago
    var sign = duration.match(“-P”) ? 1 : -1;
    var minutes = 0;
    for (var i = 0; i < this.ORDERED_UNITS.length; i++) {
    var index = this.ORDERED_UNITS[i];
    var results = this.PATTERN[index].exec(duration);
    if (results && results[1] !== "") {
    minutes += this.MINUTES[index] * parseInt(results[1], this.DECIMAL);
    }
    }
    return sign * minutes;
    },

    // get most significant Unit present in a duration
    getUnits: function(duration){
    var unit = this.UNITS.MINUTE;
    for (var i = 0; i < this.ORDERED_UNITS.length; i++) {
    var index = this.ORDERED_UNITS[i];
    var results = this.PATTERN[index].exec(duration);
    if (results && results[1] !== "") {
    unit = index;
    }
    }
    return unit;
    },

    // create a duration form the screen widget
    getDurationFromControl: function(unit, value){
    // sign is inverted sign widget is ago
    var sign = value = this.MINUTES.DAY || unit === this.UNITS.DAY) {
    var days = Math.floor(minutes / this.MINUTES.DAY);
    duration += days + this.DURATIONS.DAY;
    minutes = minutes % this.MINUTES.DAY;
    }
    duration += “T”;
    if (minutes >= this.MINUTES.HOUR || unit === this.UNITS.HOUR) {
    var hours = Math.floor(minutes / this.MINUTES.HOUR);
    duration += hours + this.DURATIONS.HOUR;
    minutes = minutes % this.MINUTES.HOUR;
    }
    if (minutes >= this.MINUTES.MINUTE || unit === this.UNITS.MINUTE) {
    var mins = Math.floor(minutes / this.MINUTES.MINUTE);
    duration += mins + this.DURATIONS.MINUTE;
    }
    if( duration.charAt(duration.length-1) === “T”) {
    duration= duration.slice(0,-1);
    }
    return duration;
    },

    // get a calendar string in UTC from the int values of a javascript date
    getXMLCalendarFromControl: function(year, month, dayOfMonth, hours, minutes){
    var date = new fleegix.date.Date(year, month, dayOfMonth, hours, minutes, this.TZ_PDT, false);
    return this.getXMLCalendarFromDate(date);
    },

    // get a calendar string in UTC from a date
    getXMLCalendarFromDate: function(date){
    return date.getUTCFullYear() + “-” + this.pad(date.getUTCMonth() + 1) + “-” + this.pad(date.getUTCDate()) + “T” + this.pad(date.getUTCHours()) + “:” + this.pad(date.getUTCMinutes()) + “:00Z”;
    },

    // get a date in PDT from an xml calendar in UTC
    getDateFromXMLCalendar: function(xmlCalendar){
    var hour = 0;
    var minute = 0;
    var second = 0;
    var tz = 0;
    var results = this.XML_TZ.exec(xmlCalendar);
    if (results) {
    tz = parseInt(results[1], this.DECIMAL);
    }
    results = this.XML_TIME.exec(xmlCalendar);
    if (results) {
    hour = parseInt(results[1], this.DECIMAL);
    minute = parseInt(results[2], this.DECIMAL);
    second = parseInt(results[3], this.DECIMAL);
    }
    results = this.XML_DATE.exec(xmlCalendar);
    if (results) {
    var year = parseInt(results[1], this.DECIMAL);
    var month = parseInt(results[2], this.DECIMAL) – 1;
    var dayInMonth = parseInt(results[3], this.DECIMAL);
    var utc = new Date(Date.UTC(year, month, dayInMonth, hour, minute, second) – (tz * (60 * 60 * 1000)));
    return utc;
    }
    return null;
    },

    // get an xml calendar in UTC from a date and an xml duration
    getXMLCalendarFromDuration: function(now, duration){
    var minutes = this.getMinutes(duration);
    now.setMinutes(now.getMinutes() – minutes);
    return this.getXMLCalendarFromDate(now);
    },

    // get an xml calendar in UTC from a date and an xml duration
    getDurationFromXMLCalendar: function(now, calendar){
    calendar = unescape(calendar);
    var then = this.getDateFromXMLCalendar(calendar);
    var minutes = (now.getTime() – then.getTime()) / this.MILLISECONDS_IN_MINUTE;
    return this.getDurationFromControl(this.UNITS.MINUTE, minutes);
    },

    // Convert a time range into minute durations
    getTimeRangeInMinutes: function(now, timeRange) {
    var minuteRange = new Object();
    minuteRange.startTime = this._getTimeInMinutes(now, timeRange.startTime);
    minuteRange.endTime = this._getTimeInMinutes(now, timeRange.endTime);
    return minuteRange;
    },

    // Convert a time (duration or fixed) into number of minutes, compared to now
    _getTimeInMinutes: function(now, time) {
    var duration;
    if (! this.isDuration(time)) {
    duration = this.getDurationFromXMLCalendar(now, time);
    }
    else {
    duration = time;
    }
    return this.getMinutes(duration);
    },

    // Return true if time is a duration
    isDuration: function(time) {
    return this.DURATION.test(time);
    },

    pad: function(number){
    if (number < 10) {
    return "0" + number;
    }
    return number;
    }
    };

    // Only load jQuery if not already loaded
    if ((typeof($) === 'undefined') && (typeof(jQuery) === 'undefined')) {
    /*!
    * jQuery JavaScript Library v1.4.2
    * http://jquery.com/
    *
    * Copyright 2010, John Resig
    * Dual licensed under the MIT or GPL Version 2 licenses.
    * http://jquery.org/license
    *
    * Includes Sizzle.js
    * http://sizzlejs.com/
    * Copyright 2010, The Dojo Foundation
    * Released under the MIT, BSD, and GPL Licenses.
    *
    * Date: Sat Feb 13 22:33:48 2010 -0500
    */
    (function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i?
    e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k–,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r=j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g,
    "&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e=
    true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*()[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/,
    Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^(?:)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a===”body”&&!b){this.context=s;this[0]=s.body;this.selector=”body”;this.length=1;return this}if(typeof a===”string”)if((d=Ta.exec(a))&&
    (d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this,
    a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:””,jquery:”1.4.2″,length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b===
    "find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,
    function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;–b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)||
    c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",
    L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,
    "isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+
    a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f],
    d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===
    a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&&
    !c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=
    true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML="

    a“;
    var e=d.getElementsByTagName(“*”),j=d.getElementsByTagName(“a”)[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName(“tbody”).length,htmlSerialize:!!d.getElementsByTagName(“link”).length,style:/red/.test(j.getAttribute(“style”)),hrefNormalized:j.getAttribute(“href”)===”/a”,opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName(“input”)[0].value===”on”,optSelected:s.createElement(“select”).appendChild(s.createElement(“option”)).selected,
    parentNode:d.removeChild(d.appendChild(s.createElement(“div”))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type=”text/javascript”;try{b.appendChild(s.createTextNode(“window.”+f+”=1;”))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent(“onclick”,function k(){c.support.noCloneEvent=
    false;d.detachEvent(“onclick”,k)});d.cloneNode(true).fireEvent(“onclick”)}d=s.createElement(“div”);d.innerHTML=””;a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement(“div”);k.style.width=k.style.paddingLeft=”1px”;s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display=”none”});a=function(k){var n=
    s.createElement(“div”);k=”on”+k;var r=k in n;if(!r){n.setAttribute(k,”return;”);r=typeof n[k]===”function”}return r};c.support.submitBubbles=a(“submit”);c.support.changeBubbles=a(“change”);a=b=d=e=j=null}})();c.props={“for”:”htmlFor”,”class”:”className”,readonly:”readOnly”,maxlength:”maxLength”,cellspacing:”cellSpacing”,rowspan:”rowSpan”,colspan:”colSpan”,tabindex:”tabIndex”,usemap:”useMap”,frameborder:”frameBorder”};var G=”jQuery”+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,
    applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b===”string”&&d===w)return null;f||(f=++Ya);if(typeof b===”object”){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b===”string”?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando];
    else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a===”undefined”&&this.length)return c.data(this[0]);else if(typeof a===”object”)return this.each(function(){c.data(this,a)});var d=a.split(“.”);d[1]=d[1]?”.”+d[1]:””;if(b===w){var f=this.triggerHandler(“getData”+d[1]+”!”,[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger(“setData”+d[1]+”!”,[d[0],b]).each(function(){c.data(this,
    a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||”fx”)+”queue”;var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||”fx”;var d=c.queue(a,b),f=d.shift();if(f===”inprogress”)f=d.shift();if(f){b===”fx”&&d.unshift(“inprogress”);f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!==”string”){b=a;a=”fx”}if(b===
    w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a===”fx”&&d[0]!==”inprogress”&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||”fx”;return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||”fx”,[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i,
    cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,””);this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr(“class”)))});if(a&&typeof a===”string”)for(var b=(a||””).split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ",i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ",
    " ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=
    this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,”option”))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,”select”)){var d=b.selectedIndex,f=[],e=b.options;b=b.type===”select-one”;if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j=0;else if(c.nodeName(this,”select”)){var u=c.makeArray(r);c(“option”,this).each(function(){this.selected=
    c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b===”type”&&ab.test(a.nodeName)&&a.parentNode&&c.error(“type property can’t be changed”);
    a[b]=d}if(c.nodeName(a,”form”)&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b===”tabIndex”)return(b=a.getAttributeNode(“tabIndex”))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b===”style”){if(e)a.style.cssText=””+d;return a.style.cssText}e&&a.setAttribute(b,””+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g,
    function(b){return”\\”+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!==”undefined”&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(” “);for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(“.”)>-1){r=k.split(“.”);
    k=r.shift();j.namespace=r.slice(0).sort().join(“.”)}else{r=[];j.namespace=””}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent(“on”+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a),
    C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b===”string”&&b.charAt(0)===”.”){b=b||””;for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(” “);e=b[j++];){n=e;i=e.indexOf(“.”)<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B–,1);n.remove&&n.remove.call(a,u)}if(f!=
    null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B=0){a.type=
    e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,”handle”))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d[“on”+e]&&d[“on”+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&&
    f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,”a”)&&e===”click”,k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f[“on”+e])f[“on”+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f[“on”+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(“.”)<0&&!a.exclusive;
    if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e-1?c.map(a.options,function(f){return f.selected}).join(“-“):””;else if(a.nodeName.toLowerCase()===”select”)d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,”_change_data”);e=Fa(d);if(a.type!==”focusout”||d.type!==”radio”)c.data(d,”_change_data”,
    e);if(!(f===w||e===f))if(f!=null||e){a.type=”change”;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d===”radio”||d===”checkbox”||b.nodeName.toLowerCase()===”select”)return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!==”textarea”||a.keyCode===32&&(d===”checkbox”||d===”radio”)||d===”select-multiple”)return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,
    “_change_data”,Fa(a))}},setup:function(){if(this.type===”file”)return false;for(var a in ea)c.event.add(this,a+”.specialChange”,ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,”.specialChange”);return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:”focusin”,blur:”focusout”},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,
    d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each([“bind”,”one”],function(a,b){c.fn[b]=function(d,f,e){if(typeof d===”object”){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b===”one”?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d===”unload”&&b!==”one”)this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&
    !a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},
    toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector,
    u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.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".split(" "),
    function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];
    if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|[‘”][^'”]*[‘”]|[^[\]'”]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
    e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!==”string”)return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(“”),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift();
    t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]===”~”||p[0]===”+”)&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D=””;if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D||
    g);if(j.call(y)===”[object Array]”)if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h–,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[];
    for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-
    1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
    CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},
    relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m“:function(g,h){var l=typeof h===”string”;if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]=
    l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[];
    h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,””)},TAG:function(g){return g[1].toLowerCase()},
    CHILD:function(g){if(g[1]===”nth”){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]===”even”&&”2n”||g[2]===”odd”&&”2n+1″||!/\D/.test(g[2])&&”0n+”+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,””);if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]===”~=”)g[4]=” “+g[4]+” “;return g},PSEUDO:function(g,h,l,m,q){if(g[1]===”not”)if((f.exec(g[3])||””).length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m,
    g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!==”hidden”},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},
    text:function(g){return”text”===g.type},radio:function(g){return”radio”===g.type},checkbox:function(g){return”checkbox”===g.type},file:function(g){return”file”===g.type},password:function(g){return”password”===g.type},submit:function(g){return”submit”===g.type},image:function(g){return”image”===g.type},reset:function(g){return”reset”===g.type},button:function(g){return”button”===g.type||g.nodeName.toLowerCase()===”button”},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},
    setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return hl[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q===”contains”)return(g.textContent||g.innerText||a([g])||””).indexOf(h[3])>=0;else if(q===”not”){h=
    h[3];l=0;for(m=h.length;l=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute(“id”)===h},TAG:function(g,h){return h===”*”&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(” “+(g.className||g.getAttribute(“class”))+” “).indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+””;var m=h[2];h=h[4];return g==null?m===”!=”:m===
    “=”?l===h:m===”*=”?l.indexOf(h)>=0:m===”~=”?(” “+l+” “).indexOf(h)>=0:!h?l&&g!==false:m===”!=”?l!==h:m===”^=”?l.indexOf(h)===0:m===”$=”?l.substr(l.length-h.length)===h:m===”|=”?l===h||l.substr(0,h.length+1)===h+”-“:false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g,h){return”\\”+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)===”[object Array]”)Array.prototype.push.apply(h,g);else if(typeof g.length===”number”)for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition||!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m=
    h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="“;var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!==”undefined”&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!==”undefined”&&
    q.getAttributeNode(“id”).nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!==”undefined”&&m.getAttributeNode(“id”);return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement(“div”);g.appendChild(s.createComment(“”));if(g.getElementsByTagName(“*”).length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]===”*”){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML=”“;
    if(g.firstChild&&typeof g.firstChild.getAttribute!==”undefined”&&g.firstChild.getAttribute(“href”)!==”#”)n.attrHandle.href=function(h){return h.getAttribute(“href”,2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement(“div”);h.innerHTML=”

    “;if(!(h.querySelectorAll&&h.querySelectorAll(“.TEST”).length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}();
    (function(){var g=s.createElement(“div”);g.innerHTML=”

    “;if(!(!g.getElementsByClassName||g.getElementsByClassName(“e”).length===0)){g.lastChild.className=”e”;if(g.getElementsByClassName(“e”).length!==1){n.order.splice(1,0,”CLASS”);n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!==”undefined”&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}:
    function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!==”HTML”:false},ga=function(g,h){var l=[],m=””,q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,””)}g=n.relative[g]?g+”*”:g;q=0;for(var p=h.length;q

    =0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack(“”,”find”,a),d=0,f=0,e=this.length;f0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j–,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j=
    {},i;if(f&&a.length){e=0;for(var o=a.length;e-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a===
    “string”)return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a===”string”?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,”parentNode”)},parentsUntil:function(a,b,d){return c.dir(a,”parentNode”,
    d)},next:function(a){return c.nth(a,2,”nextSibling”)},prev:function(a){return c.nth(a,2,”previousSibling”)},nextAll:function(a){return c.dir(a,”nextSibling”)},prevAll:function(a){return c.dir(a,”previousSibling”)},nextUntil:function(a,b,d){return c.dir(a,”nextSibling”,d)},prevUntil:function(a,b,d){return c.dir(a,”previousSibling”,d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,”iframe”)?
    a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f===”string”)e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(“,”))}});c.extend({filter:function(a,b,d){if(d)a=”:not(“+a+”)”;return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType===
    1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+=”(?:\d+|null)”/g,V=/^\s+/,Ka=/(]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|”},F={option:[1,””,””],legend:[1,”

    “,”

    “],thead:[1,”

    “,”

    “],tr:[2,”

    “,”

    “],td:[3,”

    “,”

    “],col:[2,”

    “,”

    “],area:[1,”

    “,”

    “],_default:[0,””,””]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,”div

    “,”

    “];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
    c(this);d.text(a.call(this,b,d.text()))});if(typeof a!==”object”&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
    wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,”body”)||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
    prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,”before”,arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
    this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,”after”,arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName(“*”));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName(“*”));b.firstChild;)b.removeChild(b.firstChild);
    return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement(“div”);d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,””).replace(/=([^=”‘>\s]+\/)>/g,’=”$1″>’).replace(V,””)],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find(“*”),b.find(“*”))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja,
    “”):null;else if(typeof a===”string”&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||[“”,””])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&
    this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]||
    u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length===
    1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:”append”,prependTo:”prepend”,insertBefore:”before”,insertAfter:”after”,replaceAll:”replaceWith”},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]);
    return this}else{e=0;for(var j=d.length;e0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement===”undefined”)b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i===”number”)i+=””;if(i){if(typeof i===”string”&&!jb.test(i))i=b.createTextNode(i);else if(typeof i===”string”){i=i.replace(Ka,Ma);var o=(La.exec(i)||[“”,
    “”])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement(“div”);for(r.innerHTML=k[1]+i+k[2];n–;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o===”table”&&!n?r.firstChild&&r.firstChild.childNodes:k[1]===”








    “).append(i.responseText.replace(tb,””)).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this},
    serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each(“ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend”.split(” “),
    function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:”GET”,url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,”script”)},getJSON:function(a,b,d){return c.get(a,b,d,”json”)},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:”POST”,url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,
    global:true,type:”GET”,contentType:”application/x-www-form-urlencoded”,processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!==”file:”||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject(“Microsoft.XMLHTTP”)}catch(a){}},accepts:{xml:”application/xml, text/xml”,html:”text/html”,script:”text/javascript, application/javascript”,json:”application/json, text/javascript”,text:”text/plain”,_default:”*/*”}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&
    e.success.call(k,o,i,x);e.global&&f(“ajaxSuccess”,[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f(“ajaxComplete”,[x,e]);e.global&&!–c.active&&c.event.trigger(“ajaxStop”)}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!==”string”)e.data=c.param(e.data,e.traditional);if(e.dataType===”jsonp”){if(n===”GET”)N.test(e.url)||(e.url+=(ka.test(e.url)?
    “&”:”?”)+(e.jsonp||”callback”)+”=?”);else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+”&”:””)+(e.jsonp||”callback”)+”=?”;e.dataType=”json”}if(e.dataType===”json”&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||”jsonp”+sb++;if(e.data)e.data=(e.data+””).replace(N,”=”+j+”$1″);e.url=e.url.replace(N,”=”+j+”$1″);e.dataType=”script”;A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType===”script”&&e.cache===null)e.cache=false;if(e.cache===
    false&&n===”GET”){var r=J(),u=e.url.replace(wb,”$1_=”+r+”$2″);e.url=u+(u===e.url?(ka.test(e.url)?”&”:”?”)+”_=”+r:””)}if(e.data&&n===”GET”)e.url+=(ka.test(e.url)?”&”:”?”)+e.data;e.global&&!c.active++&&c.event.trigger(“ajaxStart”);r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType===”script”&&n===”GET”&&r){var z=s.getElementsByTagName(“head”)[0]||s.documentElement,C=s.createElement(“script”);C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B=
    false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState===”loaded”||this.readyState===”complete”)){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader(“Content-Type”,e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader(“If-Modified-Since”,
    c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader(“If-None-Match”,c.etag[e.url])}r||x.setRequestHeader(“X-Requested-With”,”XMLHttpRequest”);x.setRequestHeader(“Accept”,e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+”, */*”:e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!–c.active&&c.event.trigger(“ajaxStop”);x.abort();return false}e.global&&f(“ajaxSend”,[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q===”abort”){E||
    d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q===”timeout”)){E=true;x.onreadystatechange=c.noop;i=q===”timeout”?”timeout”:!c.httpSuccess(x)?”error”:e.ifModified&&c.httpNotModified(x,e.url)?”notmodified”:”success”;var p;if(i===”success”)try{o=c.httpData(x,e.dataType,e)}catch(v){i=”parsererror”;p=v}if(i===”success”||i===”notmodified”)j||b();else c.handleError(e,x,i,p);d();q===”timeout”&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x);
    g(“abort”)}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g(“timeout”)},e.timeout);try{x.send(n===”POST”||n===”PUT”||n===”DELETE”?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger(“ajaxError”,[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol===”file:”||a.status>=200&&a.status=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName===”parsererror”&&c.error(“parsererror”);if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a===”string”)if(b===
    “json”||!b&&f.indexOf(“json”)>=0)a=c.parseJSON(a);else if(b===”script”||!b&&f.indexOf(“javascript”)>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+”[“+(typeof n===”object”||c.isArray(n)?k:””)+”]”,n)});else!b&&o!=null&&typeof o===”object”?c.each(o,function(k,n){d(i+”[“+k+”]”,n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+”=”+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional;
    if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join(“&”).replace(yb,”+”)}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[[“height”,”marginTop”,”marginBottom”,”paddingTop”,”paddingBottom”],[“width”,”marginLeft”,”marginRight”,”paddingLeft”,”paddingRight”],[“opacity”]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K(“show”,3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");
    this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("”).appendTo(“body”);f=e.css(“display”);if(f===”none”)f=”block”;e.remove();la[d]=f}c.data(this[a],”olddisplay”,f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],
    "olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a=0;f–)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K(“show”,1),slideUp:K(“hide”,1),slideToggle:K(“toggle”,1),fadeIn:{opacity:”show”},fadeOut:{opacity:”hide”}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a===”object”?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration===
    “number”?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||
    c.fx.step._default)(this);if((this.prop===”height”||this.prop===”width”)&&this.elem.style)this.elem.style.display=”block”},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||”px”;this.now=this.start;
    this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop===”width”||this.prop===”height”?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=
    this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,”olddisplay”);this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,”display”)===”none”)this.elem.style.display=”block”}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,
    e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?”swing”:”linear”);this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b–,1);a.length||
    c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement?
    function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=
    this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle;
    k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&
    f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="

    “&&!n?r.childNodes:[];for(k=o.length-1;k>=0;–k)c.nodeName(o[k],”tbody”)&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e= c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],”script”)&&(!e[j].type||e[j].type.toLowerCase()===”text/javascript”))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName(“script”))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]? c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:”absolute”,visibility:”hidden”,display:”block”},pb=[“Left”,”Right”],qb=[“Top”,”Bottom”],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?”cssFloat”:”styleFloat”,ja= function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e===”number”&&!kb.test(f))e+=”px”;c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b===”width”||b===”height”)&&parseFloat(d)=0?parseFloat(Oa.exec(f.filter)[1])/100+””:””}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b===”width”||b===”height”){var e,j=b===”width”?pb:qb;function i(){e=b===”width”?a.offsetWidth:a.offsetHeight;f!==”border”&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,”padding”+this,true))||0);if(f===”margin”)e+=parseFloat(c.curCSS(a,”margin”+this,true))||0;else e-=parseFloat(c.curCSS(a, “border”+this+”Width”,true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b===”opacity”&&a.currentStyle){f=Oa.test(a.currentStyle.filter||””)?parseFloat(RegExp.$1)/100+””:””;return f===””?”1″:f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b=”float”;b=b.replace(lb,”-$1″).toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f= a.getPropertyValue(b);if(b===”opacity”&&f===””)f=”1″}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d===”fontSize”?”1em”:f||0;f=e.pixelLeft+”px”;e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b= a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()===”tr”;return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,”display”)===”none”};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=//gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!== “string”)return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(” “);if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f=”GET”;if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b===”object”){b=c.param(b,c.ajaxSettings.traditional);f=”POST”}var j=this;c.ajax({url:a,type:f,dataType:”html”,data:b,complete:function(i,o){if(o===”success”||o===”notmodified”)j.html(e?c(“

    “;
    a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position=”fixed”;f.style.top=”20px”;this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top=””;d.style.overflow=”hidden”;d.style.position=”relative”;this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b);
    c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,”marginTop”,true))||0;d+=parseFloat(c.curCSS(a,”marginLeft”,true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,”position”)))a.style.position=”relative”;var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,”top”,true),10)||0,i=parseInt(c.curCSS(a,”left”,true),10)||0;if(c.isFunction(b))b=b.call(a,
    d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};”using”in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,”marginTop”,true))||0;d.left-=parseFloat(c.curCSS(a,”marginLeft”,true))||0;f.top+=parseFloat(c.curCSS(b[0],”borderTopWidth”,true))||0;f.left+=parseFloat(c.curCSS(b[0],”borderLeftWidth”,true))||0;return{top:d.top-
    f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,”position”)===”static”;)a=a.offsetParent;return a})}});c.each([“Left”,”Top”],function(a,b){var d=”scroll”+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?”pageXOffset”in j?j[a?”pageYOffset”:
    “pageXOffset”]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each([“Height”,”Width”],function(a,b){var d=b.toLowerCase();c.fn[“inner”+b]=function(){return this[0]?c.css(this[0],d,false,”padding”):null};c.fn[“outer”+b]=function(f){return this[0]?c.css(this[0],d,false,f?”margin”:”border”):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return”scrollTo”in
    e&&e.document?e.document.compatMode===”CSS1Compat”&&e.document.documentElement[“client”+b]||e.document.body[“client”+b]:e.nodeType===9?Math.max(e.documentElement[“client”+b],e.body[“scroll”+b],e.documentElement[“scroll”+b],e.body[“offset”+b],e.documentElement[“offset”+b]):f===w?c.css(e,d):this.css(d,typeof f===”string”?f:f+”px”)}});A.jQuery=A.$=c})(window);
    }

    /*
    * imgAreaSelect jQuery plugin
    * version 0.9.2
    *
    * Copyright (c) 2008-2010 Michal Wojciechowski (odyniec.net)
    *
    * Dual licensed under the MIT (MIT-LICENSE.txt)
    * and GPL (GPL-LICENSE.txt) licenses.
    *
    * http://odyniec.net/projects/imgareaselect/
    *
    */
    (function($) {

    var abs = Math.abs,
    max = Math.max,
    min = Math.min,
    round = Math.round;

    function div() {
    return $(‘

    ‘);
    }

    $.imgAreaSelect = function (img, options) {
    var

    $img = $(img),

    imgLoaded,

    $box = div(),
    $area = div(),
    $border = div().add(div()).add(div()).add(div()),
    $outer = div().add(div()).add(div()).add(div()),
    $handles = $([]),

    $areaOpera,

    left, top,

    imgOfs,

    imgWidth, imgHeight,

    $parent,

    parOfs,

    zIndex = 0,

    position = ‘absolute’,

    startX, startY,

    scaleX, scaleY,

    resizeMargin = 10,

    resize,

    minWidth, minHeight, maxWidth, maxHeight,

    aspectRatio,

    shown,

    x1, y1, x2, y2,

    selection = { x1: 0, y1: 0, x2: 0, y2: 0, width: 0, height: 0 },

    docElem = document.documentElement,

    $p, d, i, o, w, h, adjusted;

    function viewX(x) {
    return x + imgOfs.left – parOfs.left;
    }

    function viewY(y) {
    return y + imgOfs.top – parOfs.top;
    }

    function selX(x) {
    return x – imgOfs.left + parOfs.left;
    }

    function selY(y) {
    return y – imgOfs.top + parOfs.top;
    }

    function evX(event) {
    return event.pageX – parOfs.left;
    }

    function evY(event) {
    return event.pageY – parOfs.top;
    }

    function getSelection(noScale) {
    var sx = noScale || scaleX, sy = noScale || scaleY;

    return { x1: round(selection.x1 * sx),
    y1: round(selection.y1 * sy),
    x2: round(selection.x2 * sx),
    y2: round(selection.y2 * sy),
    width: round(selection.x2 * sx) – round(selection.x1 * sx),
    height: round(selection.y2 * sy) – round(selection.y1 * sy) };
    }

    function setSelection(x1, y1, x2, y2, noScale) {
    var sx = noScale || scaleX, sy = noScale || scaleY;

    selection = {
    x1: round(x1 / sx),
    y1: round(y1 / sy),
    x2: round(x2 / sx),
    y2: round(y2 / sy)
    };

    selection.width = selection.x2 – selection.x1;
    selection.height = selection.y2 – selection.y1;
    }

    function adjust() {
    if (!$img.width())
    return;

    imgOfs = { left: round($img.offset().left), top: round($img.offset().top) };

    imgWidth = $img.width();
    imgHeight = $img.height();

    minWidth = options.minWidth || 0;
    minHeight = options.minHeight || 0;
    maxWidth = min(options.maxWidth || 1<<24, imgWidth);
    maxHeight = min(options.maxHeight || 1< imgWidth || selection.y2 > imgHeight)
    doResize();
    }

    function update(resetKeyPress) {
    if (!shown) return;

    $box.css({ left: viewX(selection.x1), top: viewY(selection.y1) })
    .add($area).width(w = selection.width).height(h = selection.height);

    $area.add($border).add($handles).css({ left: 0, top: 0 });

    $border
    .width(max(w – $border.outerWidth() + $border.innerWidth(), 0))
    .height(max(h – $border.outerHeight() + $border.innerHeight(), 0));

    $($outer[0]).css({ left: left, top: top,
    width: selection.x1, height: imgHeight });
    $($outer[1]).css({ left: left + selection.x1, top: top,
    width: w, height: selection.y1 });
    $($outer[2]).css({ left: left + selection.x2, top: top,
    width: imgWidth – selection.x2, height: imgHeight });
    $($outer[3]).css({ left: left + selection.x1, top: top + selection.y2,
    width: w, height: imgHeight – selection.y2 });

    w -= $handles.outerWidth();
    h -= $handles.outerHeight();

    switch ($handles.length) {
    case 8:
    $($handles[4]).css({ left: w / 2 });
    $($handles[5]).css({ left: w, top: h / 2 });
    $($handles[6]).css({ left: w / 2, top: h });
    $($handles[7]).css({ top: h / 2 });
    case 4:
    $handles.slice(1,3).css({ left: w });
    $handles.slice(2,4).css({ top: h });
    }

    if (resetKeyPress !== false) {
    if ($.imgAreaSelect.keyPress != docKeyPress)
    $(document).unbind($.imgAreaSelect.keyPress,
    $.imgAreaSelect.onKeyPress);

    if (options.keys)
    $(document)[$.imgAreaSelect.keyPress](
    $.imgAreaSelect.onKeyPress = docKeyPress);
    }

    if ($.browser.msie && $border.outerWidth() – $border.innerWidth() == 2) {
    $border.css(‘margin’, 0);
    setTimeout(function () { $border.css(‘margin’, ‘auto’); }, 0);
    }
    }

    function doUpdate(resetKeyPress) {
    if (!imgOfs) return;
    adjust();
    update(resetKeyPress);
    x1 = viewX(selection.x1); y1 = viewY(selection.y1);
    x2 = viewX(selection.x2); y2 = viewY(selection.y2);
    }

    function hide($elem, fn) {
    options.fadeSpeed ? $elem.fadeOut(options.fadeSpeed, fn) : $elem.hide();

    }

    function areaMouseMove(event) {
    var x = selX(evX(event)) – selection.x1,
    y = selY(evY(event)) – selection.y1;

    if (!adjusted) {
    adjust();
    adjusted = true;

    $box.one(‘mouseout’, function () { adjusted = false; });
    }

    resize = ”;

    if (options.resizable) {
    if (y = selection.height – resizeMargin)
    resize = ‘s’;
    if (x = selection.width – resizeMargin)
    resize += ‘e’;
    }

    $box.css(‘cursor’, resize ? resize + ‘-resize’ :
    options.movable ? ‘move’ : ”);
    if ($areaOpera)
    $areaOpera.toggle();
    }

    function docMouseUp(event) {
    $(‘body’).css(‘cursor’, ”);

    if (options.autoHide || selection.width * selection.height == 0)
    hide($box.add($outer), function () { $(this).hide(); });

    options.onSelectEnd(img, getSelection());

    $(document).unbind(‘mousemove’, selectingMouseMove);
    $box.mousemove(areaMouseMove);
    }

    function areaMouseDown(event) {
    if (event.which != 1) return false;

    adjust();

    if (resize) {
    $(‘body’).css(‘cursor’, resize + ‘-resize’);

    x1 = viewX(selection[/w/.test(resize) ? ‘x2’ : ‘x1’]);
    y1 = viewY(selection[/n/.test(resize) ? ‘y2’ : ‘y1’]);

    $(document).mousemove(selectingMouseMove)
    .one(‘mouseup’, docMouseUp);
    $box.unbind(‘mousemove’, areaMouseMove);
    }
    else if (options.movable) {
    startX = left + selection.x1 – evX(event);
    startY = top + selection.y1 – evY(event);

    $box.unbind(‘mousemove’, areaMouseMove);

    $(document).mousemove(movingMouseMove)
    .one(‘mouseup’, function () {
    options.onSelectEnd(img, getSelection());

    $(document).unbind(‘mousemove’, movingMouseMove);
    $box.mousemove(areaMouseMove);
    });
    }
    else
    $img.mousedown(event);

    return false;
    }

    function fixAspectRatio(xFirst) {
    if (aspectRatio)
    if (xFirst) {
    x2 = max(left, min(left + imgWidth,
    x1 + abs(y2 – y1) * aspectRatio * (x2 > x1 || -1)));

    y2 = round(max(top, min(top + imgHeight,
    y1 + abs(x2 – x1) / aspectRatio * (y2 > y1 || -1))));
    x2 = round(x2);
    }
    else {
    y2 = max(top, min(top + imgHeight,
    y1 + abs(x2 – x1) / aspectRatio * (y2 > y1 || -1)));
    x2 = round(max(left, min(left + imgWidth,
    x1 + abs(y2 – y1) * aspectRatio * (x2 > x1 || -1))));
    y2 = round(y2);
    }
    }

    function doResize() {
    x1 = min(x1, left + imgWidth);
    y1 = min(y1, top + imgHeight);

    if (abs(x2 – x1) < minWidth) {
    x2 = x1 – minWidth * (x2 < x1 || -1);

    if (x2 left + imgWidth)
    x1 = left + imgWidth – minWidth;
    }

    if (abs(y2 – y1) < minHeight) {
    y2 = y1 – minHeight * (y2 < y1 || -1);

    if (y2 top + imgHeight)
    y1 = top + imgHeight – minHeight;
    }

    x2 = max(left, min(x2, left + imgWidth));
    y2 = max(top, min(y2, top + imgHeight));

    fixAspectRatio(abs(x2 – x1) maxWidth) {
    x2 = x1 – maxWidth * (x2 maxHeight) {
    y2 = y1 – maxHeight * (y2 < y1 || -1);
    fixAspectRatio(true);
    }

    selection = { x1: selX(min(x1, x2)), x2: selX(max(x1, x2)),
    y1: selY(min(y1, y2)), y2: selY(max(y1, y2)),
    width: abs(x2 – x1), height: abs(y2 – y1) };

    update();

    options.onSelectChange(img, getSelection());
    }

    function selectingMouseMove(event) {
    x2 = resize == '' || /w|e/.test(resize) || aspectRatio ? evX(event) : viewX(selection.x2);
    y2 = resize == '' || /n|s/.test(resize) || aspectRatio ? evY(event) : viewY(selection.y2);

    doResize();

    return false;

    }

    function doMove(newX1, newY1) {
    x2 = (x1 = newX1) + selection.width;
    y2 = (y1 = newY1) + selection.height;

    $.extend(selection, { x1: selX(x1), y1: selY(y1), x2: selX(x2),
    y2: selY(y2) });

    update();

    options.onSelectChange(img, getSelection());
    }

    function movingMouseMove(event) {
    x1 = max(left, min(startX + evX(event), left + imgWidth – selection.width));
    y1 = max(top, min(startY + evY(event), top + imgHeight – selection.height));

    doMove(x1, y1);

    event.preventDefault();

    return false;
    }

    function startSelection() {
    adjust();

    x2 = x1;
    y2 = y1;

    doResize();

    resize = '';

    if ($outer.is(':not(:visible)'))
    $box.add($outer).hide().fadeIn(options.fadeSpeed||0);

    shown = true;

    $(document).unbind('mouseup', cancelSelection)
    .mousemove(selectingMouseMove).one('mouseup', docMouseUp);
    $box.unbind('mousemove', areaMouseMove);

    options.onSelectStart(img, getSelection());
    }

    function cancelSelection() {
    $(document).unbind('mousemove', startSelection);
    hide($box.add($outer));

    selection = { x1: selX(x1), y1: selY(y1), x2: selX(x1), y2: selY(y1),
    width: 0, height: 0 };

    options.onSelectChange(img, getSelection());
    options.onSelectEnd(img, getSelection());
    }

    function imgMouseDown(event) {
    if (event.which != 1 || $outer.is(':animated')) return false;

    adjust();
    startX = x1 = evX(event);
    startY = y1 = evY(event);

    $(document).one('mousemove', startSelection)
    .one('mouseup', cancelSelection);

    return false;
    }

    function windowResize() {
    doUpdate(false);
    }

    function imgLoad() {
    imgLoaded = true;

    setOptions(options = $.extend({
    classPrefix: 'imgareaselect',
    movable: true,
    resizable: true,
    parent: 'body',
    onInit: function () {},
    onSelectStart: function () {},
    onSelectChange: function () {},
    onSelectEnd: function () {}
    }, options));

    $box.add($outer).css({ visibility: '' });

    if (options.show) {
    shown = true;
    adjust();
    update();
    $box.add($outer).hide().fadeIn(options.fadeSpeed||0);
    }

    setTimeout(function () { options.onInit(img, getSelection()); }, 0);
    }

    var docKeyPress = function(event) {
    var k = options.keys, d, t, key = event.keyCode;

    d = !isNaN(k.alt) && (event.altKey || event.originalEvent.altKey) ? k.alt :
    !isNaN(k.ctrl) && event.ctrlKey ? k.ctrl :
    !isNaN(k.shift) && event.shiftKey ? k.shift :
    !isNaN(k.arrows) ? k.arrows : 10;

    if (k.arrows == 'resize' || (k.shift == 'resize' && event.shiftKey) ||
    (k.ctrl == 'resize' && event.ctrlKey) ||
    (k.alt == 'resize' && (event.altKey || event.originalEvent.altKey)))
    {
    switch (key) {
    case 37:
    d = -d;
    case 39:
    t = max(x1, x2);
    x1 = min(x1, x2);
    x2 = max(t + d, x1);
    fixAspectRatio();
    break;
    case 38:
    d = -d;
    case 40:
    t = max(y1, y2);
    y1 = min(y1, y2);
    y2 = max(t + d, y1);
    fixAspectRatio(true);
    break;
    default:
    return;
    }

    doResize();
    }
    else {
    x1 = min(x1, x2);
    y1 = min(y1, y2);

    switch (key) {
    case 37:
    doMove(max(x1 – d, left), y1);
    break;
    case 38:
    doMove(x1, max(y1 – d, top));
    break;
    case 39:
    doMove(x1 + min(d, imgWidth – selX(x2)), y1);
    break;
    case 40:
    doMove(x1, y1 + min(d, imgHeight – selY(y2)));
    break;
    default:
    return;
    }
    }

    return false;
    };

    function styleOptions($elem, props) {
    for (option in props)
    if (options[option] !== undefined)
    $elem.css(props[option], options[option]);
    }

    function setOptions(newOptions) {
    if (newOptions.parent)
    ($parent = $(newOptions.parent)).append($box.add($outer));

    $.extend(options, newOptions);

    adjust();

    if (newOptions.handles != null) {
    $handles.remove();
    $handles = $([]);

    i = newOptions.handles ? newOptions.handles == 'corners' ? 4 : 8 : 0;

    while (i–)
    $handles = $handles.add(div());

    $handles.addClass(options.classPrefix + '-handle').css({
    position: 'absolute',
    fontSize: 0,
    zIndex: zIndex + 1 || 1
    });

    if (!parseInt($handles.css('width')))
    $handles.width(5).height(5);

    if (o = options.borderWidth)
    $handles.css({ borderWidth: o, borderStyle: 'solid' });

    styleOptions($handles, { borderColor1: 'border-color',
    borderColor2: 'background-color',
    borderOpacity: 'opacity' });
    }

    scaleX = options.imageWidth / imgWidth || 1;
    scaleY = options.imageHeight / imgHeight || 1;

    if (newOptions.x1 != null) {
    setSelection(newOptions.x1, newOptions.y1, newOptions.x2,
    newOptions.y2);
    newOptions.show = !newOptions.hide;
    }

    if (newOptions.keys)
    options.keys = $.extend({ shift: 1, ctrl: 'resize' },
    newOptions.keys);

    $outer.addClass(options.classPrefix + '-outer');
    $area.addClass(options.classPrefix + '-selection');
    for (i = 0; i++ = 0 && index < this.graphUrls.length) {
    this.graphUrls.splice(index, 1);
    }
    this.storeState();
    this.updateCartIcon();
    this.updateCartVisibility();
    this.updateCartManagerBox();
    this.displayMessage("iGraph has been removed from cart.", 3000);
    return false;
    },

    addAllGraphsToCart: function() {
    this.restoreState();
    var removeCount=0, addedCount=0;
    var graphsOnPage = jQuery('img[src*="Action=GetGraph"], .MPWgraphInteractiveParams').filter((':not(.MPWmanageCartImg)'));
    for (i = 0; i = 0 && index 1 ? addedCount : “”) + ” iGraphs already present on cart.”, 3000);
    }
    else if (removeCount == 0) {
    this.displayMessage(“All ” + (addedCount > 1 ? addedCount : “”) + ” iGraphs have been added to cart.”, 3000);
    }
    else {
    this.displayMessage(removeCount + ” of ” + addedCount + ” iGraphs already present on cart, ” + (addedCount – removeCount) + ” more added.”, 4000);
    }

    this.storeState();
    this.updateCartVisibility();
    this.updateCartManagerBox();
    },

    isGraphPresentOnCart: function(url) {
    this.restoreState();
    var index = this.graphUrls.indexOf(this.getGraphUrlForCart(url));
    return index >= 0 && index < this.graphUrls.length ? true : false;
    },

    mergeGraphUrls: function(newGraphUrl) {
    this.restoreState();
    var mergedModel;
    for (var i = 0; i < this.graphUrls.length; i++) {
    var newModel = IGH.graph.DataModelHelper.modelFromUrl("/igraph?" + this.graphUrls[i]);
    if(mergedModel) {
    IGH.graph.DataModelHelper.mergeModels(mergedModel, newModel);
    }
    else {
    mergedModel = newModel;
    }
    }
    mergedModel.options().leftYAxis().showYAxis("true");
    mergedModel.options().rightYAxis().showYAxis("true");
    mergedModel.options().showXAxisLabel("true");
    mergedModel.options().showLegend("true");
    this.isCancelled = false;
    this.updateCartVisibility();
    var finalGraphUrl = this.IGRAPH_BASE + this.codec.toQueryString(jQuery.extend(this.codec.encode(mergedModel), this.codec.encodeFunctions(mergedModel)));
    return finalGraphUrl;
    },

    displayMessage: function(msg, durationInMS) {
    var that = this;
    this.cartMessage.html(msg);
    this.cartMessage.fadeIn();
    clearTimeout(this.messageTimer);
    this.messageTimer = setTimeout(function() { that.cartMessage.fadeOut(); }, durationInMS);
    },

    checkout: function() {
    var iGraphUrl = this.mergeGraphUrls();
    if (iGraphUrl !== "") {
    window.open(iGraphUrl);
    }
    return false;
    },

    openCartManagerBox: function() {
    if (!this.isCartManagerOpened) {
    this.isCartManagerOpened = true;
    jQuery(".MPWmanageCartBox").show();
    jQuery(".MPWmanageCartBox").animate({
    "margin-left": "-900px",
    "width" : "900px"
    }, 500);
    this.updateCartManagerBox();
    }
    else {
    this.closeCartManagerBox();
    }
    },

    closeCartManagerBox: function() {
    this.isCartManagerOpened = false;
    jQuery(".MPWmanageCartBox").animate({
    "margin-left": "0px",
    "width" : "0px"
    }, 500, function() { jQuery(".MPWmanageCartBox").hide(); });
    },

    updateCartManagerBox: function() {
    var self = this;
    this.restoreState();
    var innerHtml = '






    ‘;
    }
    innerHtml += ‘

    ‘; for (var i = 0; i < this.numItems; i++) { var graphArgs = this.graphUrls[i]; var queryString = IGH.util.removeQueryParams(graphArgs , ['Action', 'Version', 'WidthInPixels', 'HeightInPixels']); var graphPreviewUrl = MonitorPortalRoot + "/mws?Action=GetGraph&Version=2007-07-07&" + queryString + '&WidthInPixels=300&HeightInPixels=160'; innerHtml += '
    ‘ +

    ‘ +
    ” +

    ‘;
    jQuery(‘.MPWmanageCartGraphContainer’).html(innerHtml);
    jQuery(‘.MPWmanageCartGraphContainer .MPWbutton’).click(function () {
    self.removeGraphFromCart(self.graphUrls[jQuery(this).attr(‘data-index’)]);
    });
    },

    empty: function() {
    this.graphUrls = [];
    this.numItems = 0;
    this.displayNumItems();
    this.storeState();
    this.cartMessage.hide();
    this.isCartManagerOpened = false;
    jQuery(“.MPWmanageCartBox”).hide();
    return false;
    },

    cancel: function() {
    this.isCancelled = true;
    this.isMouseOverAGraph = false;
    this.isMouseDownOnAGraph = false;
    this.isMouseOverCart = false;
    this.updateCartVisibility();
    return false;
    },

    mouseOverGraph: function() {
    this.isMouseOverAGraph = true;
    this.updateCartVisibility();
    },

    mouseOutGraph: function() {
    this.isMouseOverAGraph = false;
    var that = this;
    setTimeout(function() {that.updateCartVisibility();}, 1500);
    },

    updateCartVisibility: function() {
    this.displayNumItems();
    if (this.numItems > 0 && (this.isMouseOverAGraph || this.isMouseOverCart|| !this.isCancelled)) {
    this.cart.show();
    jQuery(‘.MPWcartButton’).show();
    }
    else {
    this.cart.hide();
    this.isCartManagerOpened = false;
    jQuery(‘.MPWcartButton’).hide();
    jQuery(“.MPWmanageCartBox”).hide();
    }
    },

    displayNumItems: function() {
    jQuery(‘.MPWcartNumItems’).text(this.numItems == 0 ? ” : this.numItems + ”);
    if (this.numItems) {
    jQuery(‘.MPWcartButton input’).attr(‘disabled’, false).css(‘opacity’, ‘1’).css(‘cursor’, ‘pointer’);
    jQuery(‘.MPWcartNumItems’).css(‘font-size’, this.numItems <= 99 ? '25px' : '17px')
    .css('top' , this.numItems <= 99 ? '34px' : '39px');
    }
    else {
    jQuery('.MPWcartButton input:not(.addGraphButton)').attr('disabled', true).css('opacity', '0.50')
    .css('cursor', 'not-allowed');
    }
    },

    storeState: function() {
    if (localStorage) {
    localStorage.setItem(this.CART_STORAGE_KEY, JSON.stringify(this.graphUrls));
    this.numItems = this.graphUrls.length;
    }
    },

    restoreState: function() {
    try {
    this.graphUrls = JSON.parse(localStorage.getItem(this.CART_STORAGE_KEY));
    this.numItems = this.graphUrls.length;
    this.displayNumItems();
    } catch(e) {
    this.empty();
    }
    },

    updateCartIcon: function() {
    var graphUrl = isIgraph ? getGraphUrl() : getGraphArgs(IGH.hoveredImage, false);
    var isGraphPresentOnCart = this.isGraphPresentOnCart(graphUrl);
    jQuery("#iGraphCartIcon").addClass(isGraphPresentOnCart ? "removeFromCartIcon" : "addToCartIcon");
    jQuery("#iGraphCartIcon").removeClass(isGraphPresentOnCart ? "addToCartIcon" : "removeFromCartIcon");
    jQuery("#iGraphCartIcon").attr("title", isGraphPresentOnCart ? "Remove from iGraph Shopping Cart."
    : "Buy Now – Add to iGraph Shopping Cart, for merging with other graphs in cart.");
    },

    getGraphUrlForCart: function(url) {
    return IGH.util.removeQueryParams(IGH.util.removeDomainFromUrl(url), this.notNeededParams).replace(/[&]+/g, "&").replace("=-PT0H","=P0D");;
    },

    getCartHtml: function() {
    return '

    ‘ +
    ‘ +
    Drag/drop or double click
    graphs here for merging.
    ‘ +
    0‘ +
    ‘ +

    ‘ +

    ‘ +
    ” +
    ” +
    ” +
    ” +

    ‘ +
    ‘ +

    ‘ +
    ‘ +

    ‘ +

    ‘ +

    ‘;
    }
    };

    /*
    * TT integration, for displaying graphs within TT communication
    */
    IGH.TT = {
    CM_COMMUNICATION_TAB: “#tab-communication”,
    CM_REFRESH_COMMUNICATION: “#update_communication_link”,
    REFRESH_COMMUNICATION: “#update_chatter_link”,
    SEARCH_RESULTS_HEADERS: “#search_results thead th”,
    SEARCH_RESULTS_ROWS: “#search_results tbody tr”,
    CORRESPONDENCE_TAB: “#tab_correspondence”,
    CORRESPONDENCE_VIEW_ROWS: “#correspondence_view tr”,
    CHATTER_TAB: “#tab_chatter”,
    CHATTER_VIEW_ROWS: “#chatter_view tr”,
    LAST_SAVED_TT_FIELD: “iGraphHelper.lastSavedTT”,
    OVERVIEW_TAB_CONTENT: “#tab-overview”,
    SEVERITY_COLORS: { ‘1’: ‘#990000’, ‘2’: ‘#993333’, ‘3’: ‘#4881b6’, ‘4’: ‘#52789a’, ‘5’: ‘#666666’ },
    PORTAL: “https://monitorportal.amazon.com”,
    SEARCH_RESULTS_BUTTONS: “#hd table tr td:eq(1)”,
    SIM_TICKETING: “SIM Ticketing”,

    initialize: function() {
    if (this.isOnTT()) {
    this.addTTVerticalLines();
    this.displayEmbeddedImages();
    var oldRegisterActionMenus = registerActionMenus;
    registerActionMenus = function() {
    oldRegisterActionMenus();
    IGH.TT.displayCorrespondenceTabIfNeeded();
    IGH.TT.displayEmbeddedImages();
    }
    this.trapTTSaves();
    }
    else if (this.isOnTTSearch()) {
    this.addTTSearchVerticalLines();
    }
    else if (this.isOnCM()) {
    this.addCMVerticalLines();
    this.displayEmbeddedImages();
    var old_convert_chatter_time = convert_chatter_time;
    convert_chatter_time = function(show_timezone) {
    old_convert_chatter_time(show_timezone);
    IGH.TT.displayCorrespondenceTabIfNeeded();
    IGH.TT.displayEmbeddedImages();
    }
    }
    else if (this.isOnSIMTicketing()) {
    // SIM Ticketing can update content at any time, so simplest is to periodically (every second) look for embedded images
    setInterval(function() {
    IGH.TT.displayEmbeddedImages();
    }, 1000);
    }
    },

    displayEmbeddedImages: function() {
    $(‘a[href*=”monitorportal.amazon.com/snap”],a[href*=iGraphSnapshot],a[href*=TT-EMBED]’).filter(‘:not(.tt_button , a[href*=iGraphAnalyzer])’).each(function(link) {
    if ($(this).children(“.expandedIGraph”).length == 0) {
    var imgUrl = $(this).attr(‘href’);
    $(this).append(‘

    ‘);
    }
    })
    },

    trapTTSaves: function() {
    $(“#save-button”).click(function() { IGH.TT.recordSavedTTId(); });
    },

    currentTTId: function() {
    return $(“#case_id”).val();
    },

    recordSavedTTId: function() {
    this.localStore(this.LAST_SAVED_TT_FIELD, this.currentTTId());
    },

    localStore: function(id, val) {
    if (typeof localStorage !== ‘undefined’) {
    if (typeof val !== ‘undefined’) {
    localStorage.setItem(id, val);
    }
    else {
    return localStorage.getItem(id);
    }
    }
    return null;
    },

    displayCorrespondenceTabIfNeeded: function() {
    if ($(this.OVERVIEW_TAB_CONTENT).is(‘:visible’) && (this.localStore(this.LAST_SAVED_TT_FIELD) === this.currentTTId()) &&
    (($(this.CHATTER_VIEW_ROWS).length > 1) || ($(this.CORRESPONDENCE_VIEW_ROWS).length > 2))) {
    $(this.CHATTER_TAB).click();
    $(this.CORRESPONDENCE_TAB).click();
    }
    this.localStore(this.LAST_SAVED_TT_FIELD, null);
    },

    isOnTT: function() {
    return (($(this.REFRESH_COMMUNICATION).length || $(this.CORRESPONDENCE_TAB).length)
    && typeof registerActionMenus !== ‘undefined’);
    },

    isOnTTSearch: function() {
    return $(this.SEARCH_RESULTS_ROWS).length > 0;
    },

    isOnCM: function() {
    return ($(this.CM_REFRESH_COMMUNICATION).length && typeof convert_chatter_time !== ‘undefined’);
    },

    isOnSIMTicketing: function() {
    return this.SIM_TICKETING === document.title;
    },

    getGmtOffset: function(date) {
    var gmtOffset = date.replace(/.*GMT/, ”).replace(‘)’, ”).substring(0, 5);
    gmtOffset = gmtOffset.substring(0, 3) + ‘:’ + gmtOffset.substring(3);
    return gmtOffset;
    },

    getTTColor: function(severity) {
    var color = this.SEVERITY_COLORS[severity];
    return color ? color : ‘red’;
    },

    addTTVerticalLines: function() {
    var ttNum = $.trim($(‘#context_bar td:eq(0)’).text().replace(‘TT’, ”));
    var severity = parseInt($(‘#context_bar td:eq(1)’).text());
    var start = $(‘#context_bar td:eq(2)’).text();
    var end = $(‘#context_bar td:eq(3)’).text();
    var gmtOffset = this.getGmtOffset($(‘#context_bar th:eq(2)’).text());
    var verticalLineDef = ‘(TT ‘ + ttNum + ‘[‘ + severity + ‘]: ‘ + start + ‘ @’ + this.ttDateToXmlDate(start, gmtOffset) + ‘,’ + this.ttDateToXmlDate(end, gmtOffset) + ‘)’;
    $(‘

    ‘).insertBefore(‘#nav-section’);
    $(‘.iGraphVerticalLineButton’).click(function() { prompt(“Vertical Lines for pasting into iGraph”, verticalLineDef);} );
    },

    getTTSearchColIndex: function() {
    var colIndex = {};
    $(this.SEARCH_RESULTS_HEADERS).each(function(index, col) {
    var colText = $.trim($(col).text())
    if (colText != “”) {
    colIndex[colText] = index;}
    }
    );
    return colIndex;
    },

    getCol: function(row, colName, colIndex) {
    var col = colIndex[colName];
    if (col) {
    return $.trim($(‘td:eq(‘ + col + ‘)’, row).text());
    }
    return null;
    },

    addTTSearchVerticalLines: function() {
    var tickets = $(this.SEARCH_RESULTS_ROWS);
    var colIndex = this.getTTSearchColIndex();
    var verticalLineDef = ”;
    var sep = ”;
    tickets.each(function() {
    var createDate = IGH.TT.getCol(this, “Create Date”, colIndex);
    var ttNum = IGH.TT.getCol(this, “Case ID”, colIndex);
    var severity = IGH.TT.getCol(this, “Impact”, colIndex);
    var desc = IGH.TT.getCol(this, “Description”, colIndex);
    if (createDate != null) {
    var gmtOffset = IGH.TT.getGmtOffset(createDate);
    verticalLineDef += sep + ‘TT ‘ + ttNum + ‘[‘ + severity + ‘]: ‘ + encodeURIComponent(desc) + ‘ #color=’ + IGH.TT.getTTColor(severity) + ‘ @’ + IGH.TT.ttDateToXmlDate(createDate, gmtOffset);
    sep = ‘,’;
    }
    });
    if (verticalLineDef != ”) {
    $(‘

    ‘ +
    ‘iGraph: ‘ +
    Vertical Lines…‘ +
    Embed…‘ +

    ‘).appendTo(this.SEARCH_RESULTS_BUTTONS);
    $(‘.iGraphVerticalLineButton’).click(function() { prompt(“Vertical Lines for pasting into iGraph”, verticalLineDef);} );
    $(‘.iGraphEmbedButton’).click(function() {
    var iGraphUrl = prompt(“Paste iGraph URL for graph to embed”, “”);
    IGH.TT.addTTIGraph(verticalLineDef, iGraphUrl.replace(/.*[?]/, “”));
    });
    this.addTTIGraph(verticalLineDef);
    }
    },

    addTTIGraph: function(verticalLineDef, iGraph) {
    var queryParams = IGH.util.parseQueryParams();
    var fullTTLink;
    if (!iGraph) {
    if (queryParams[‘SchemaName1’]) {
    fullTTLink = window.location.href;
    iGraph = IGH.util.removeQueryParams(window.location.search.replace(/^[?]/, “”), [“search”]);
    }
    else {
    if (localStorage && localStorage.getItem(“iGraph”)) {
    iGraph = localStorage.getItem(“iGraph”);
    fullTTLink = window.location.href + ‘&’ + iGraph;
    }
    }
    }
    else {
    fullTTLink = window.location.href.replace(/search=Search..*/, ‘search=Search!’) + ‘&’ + iGraph;
    }

    if (iGraph) {
    if (localStorage) {
    localStorage.setItem(“iGraph”, iGraph);
    }
    var graph = this.iGraph(verticalLineDef, iGraph);
    $(‘.iGraphContainer,.iGraphWikiButtonContainer’).remove();
    $(‘

    Remove this graph
    ‘ + graph + ‘

    ‘).insertBefore(‘#search_results’);
    $(‘

    ‘ +
    Wiki…‘ +

    ‘).appendTo(this.SEARCH_RESULTS_BUTTONS);
    $(‘.iGraphRemove’).click(function() {
    $(‘.iGraphContainer’).remove();
    if (localStorage) {
    localStorage.removeItem(“iGraph”);
    }
    });
    $(‘.iGraphWikiButton’).click(function() {
    var sanitizedLink = fullTTLink.replace(/\[/g, “%5B”).replace(/\]/g, “%5D”) + “#bd{{StringLinks/Inline|auto=on|width=1200|height=450}}”;
    IGH.util.lightbox(‘Copy and paste this into Wiki (make sure you have StringLinks installed)
    ‘ +
    ‘, 500, 300);
    $(‘.iGraphWikiLink’).select();
    });
    decorateGraphs();
    }
    },

    ttDateToXmlDate: function(date, offset) {
    var m = date.match(/(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d\d)(..)/);
    if (m) {
    m[4] = m[4] == “12” ? “00” : m[4]; // Convert ’12’ hour to ’00’ for 24 hour clock
    return m[1] + ‘-‘ + m[2] + ‘-‘ + m[3] + ‘T’ + (m[7] == “AM” ? m[4] : 12 + parseInt(m[4])) + ‘:’ + m[5] + ‘:’ + m[6] + offset;
    }
    return “now”;
    },

    addCMVerticalLines: function() {
    var cmId = $(‘#cm_id’).text();
    var scheduledStart = $(‘#cm_scheduled_start’).text();
    var scheduledEnd = $(‘#cm_scheduled_end’).text();
    var actualStart = $(‘#cm_actual_start’).text();
    var actualEnd = $(‘#cm_actual_end’).text();
    var verticalLineDef = ‘(‘ + scheduledStart + ‘,CM ‘ + cmId + ‘ scheduled:’ + this.getReadableDateFromXmlDate(scheduledEnd) + ‘ @’ + scheduledEnd + ‘)’;
    $(‘

    ‘).insertAfter(‘#header .logo’);
    if (actualStart != ”) {
    verticalLineDef += ‘,(‘ + actualStart + ‘,CM ‘ + cmId + ‘ actual:’ + this.getReadableDateFromXmlDate(actualEnd) + ‘ @’ + actualEnd + ‘)’;
    }
    $(‘.iGraphVerticalLineButton’).click(function() { prompt(“Vertical Lines for pasting into iGraph”, verticalLineDef);} );
    },

    getReadableDateFromXmlDate: function(xmlDate) {
    return xmlDate == “now” ? xmlDate : xmlDate.replace(/-/g, ‘/’).replace(‘T’, ‘ ‘).replace(/:..Z/, “”) + ” UTC”;
    },

    iGraphUrl: function(verticalLineDef) {
    return this.PORTAL + ‘/igraph?VerticalLine1=’ + encodeURIComponent(verticalLineDef);
    },

    iGraph: function(verticalLineDef, graphParams) {
    var allParams = encodeURIComponent(verticalLineDef) +’&’ + graphParams;
    return ‘‘;
    }
    };

    IGH.util = typeof IGH.util === ‘undefined’ ? {} : IGH.util;
    IGH.graph = typeof IGH.graph === ‘undefined’ ? {} : IGH.graph;
    IGH.MWS = typeof IGH.MWS === ‘undefined’ ? {} : IGH.MWS;

    // Some constants
    IGH.KEY_CODE_ENTER = 13;

    // For search syntax
    IGH.SEARCH_FIELD_DELIMITER = “=”;
    IGH.SEARCH_EXACT_MATCH_DELIMITER = “$”;
    IGH.SEARCH_CLAUSE_SEPARATOR = ” “;
    IGH.SEARCH_AND_CLAUSE = “AND”;
    IGH.SEARCH_NOT_CLAUSE = “NOT”;
    IGH.SEARCH_NOT_CLAUSE_SHORT = “!”;
    IGH.SEARCH_OR_CLAUSE = “OR”;
    IGH.SEARCH_OPEN_PAREN = “(“;
    IGH.SEARCH_CLOSE_PAREN = “)”;

    IGH.SCHEMA_NAME_SEARCH_FIELD = “schemaname”;
    IGH.SCHEMA_NAME_ERROR_LOG = “ErrorLog”;
    IGH.SCHEMA_NAME_SNITCH = “Snitch”;
    IGH.SCHEMA_NAME_PAQ = “PAQ”;
    IGH.SCHEMA_NAME_SUBSCRIPTION_SERVICES = “SubscriptionServices”;

    IGH.METRIC_FIELD_HOST_GROUP = “HostGroup”;
    IGH.METRIC_FIELD_OPERATION_NAME = “OperationName”;
    IGH.METRIC_FIELD_OPERATION = “Operation”;
    IGH.METRIC_FIELD_SERVICE_NAME = “ServiceName”;
    IGH.METRIC_FIELD_SERVICE = “Service”;
    IGH.METRIC_FIELD_SIGNATURE_NAME = “SignatureName”;
    IGH.METRIC_FIELD_SIGNATURE = “Signature”;

    IGH.METRIC_VALUE_NONE = “NONE”;

    IGH.PERIOD_FIELD = “period”;
    IGH.STAT_FIELD = “stat”;
    IGH.METRIC_ID_SEPARATOR = “|”;

    // MWS API
    IGH.MWS_BASE_URL = “/mws”;
    IGH.MWS_ARG_ACTION = “Action”;
    IGH.MWS_ARG_VERSION = “Version=2007-07-07”;
    IGH.MWS_ARG_SCHEMA_NAME = “SchemaName”;
    IGH.MWS_ARG_PERIOD = “Period”;
    IGH.MWS_ARG_STAT = “Stat”;
    IGH.MWS_ACTION_GET_GRAPH = “GetGraph”;
    IGH.MWS_ACTION_GET_METRIC_DATA = “GetMetricData”;

    IGH.QPLOT_ARG_SCHEMA_NAME = “origin”;
    IGH.QPLOT_ARG_PERIOD = “period”;
    IGH.QPLOT_ARG_STAT = “statname”;

    IGH.SUBMENU_PROPERTY = “submenu”;

    IGH.IGRAPH_BASE_URL = “/igraph”;
    IGH.IGRAPH_SEARCH_BASE_URL = “/igraph/search”;

    /*
    * Lowercase the first letter of the parameter
    */
    IGH.util.getFunctionName = function(parameter){
    // lowercase the first letter ( for method names)
    return parameter.charAt(0).toLowerCase() + parameter.substring(1);
    };

    /*
    * Uppercase the first letter of the parameter
    */
    IGH.util.getAttributeName = function(parameter){
    // uppercase the first letter ( for method names)
    return parameter.charAt(0).toUpperCase() + parameter.substring(1);
    };
    /**
    * constants that belong to the MWS API
    */
    // How we represent boolean in calls to MWS
    IGH.MWS.Boolean = {
    TRUE: “true”,
    FALSE: “false”
    };

    //Defines valid time ranges types
    IGH.MWS.TimeRangeType = {
    FIXED: “Fixed”,
    RELATIVE: “Relative”,
    NATURAL: “Natural”
    };

    IGH.MWS.LegendPlacement = {
    BOTTOM: “bottom”,
    RIGHT: “right”
    };

    IGH.MWS.GraphType = {
    BITMAP: “bitmap”,
    ZOOMER: “zoomer”,
    PIE: “pie”,
    BAR: “bar”
    };

    IGH.MWS.MetricResult = {
    METRIC_DATA: “MetricData”,
    NO_DATA: “NoData”,
    NO_METRIC: “NoMetric”,
    PROCESSING_ERROR: “ProcessingError”,
    THROTTLED: “Throttled”
    };

    IGH.MWS.Operations = {
    ADDITION: “+”,
    DIVISION: “/”,
    MULTIPLICATION: “*”,
    SUBTRACTION: “-”
    };

    IGH.MWS.StatOptions = {
    VAL: “Val”,
    PREDICTIONS: “Predictions”
    };

    IGH.MWS.YAxisPreference = {
    LEFT: “left”,
    RIGHT: “right”
    };

    IGH.MWS.AggregationFunction = {
    AVERAGE: “average”,
    MINIMUM: “minimum”,
    MAXIMUM: “maximum”,
    MEDIAN: “median”,
    SUM: “sum”,
    WEIGHTED_AVERAGE: “weightedAverage”
    };

    IGH.MWS.ValueUnit = {
    NANOSECOND: “nanosecond”,
    MICROSECOND: “microsecond”,
    MILLISECOND: “millisecond”,
    SECOND: “second”,
    MINUTE: “minute”,
    HOUR: “hour”,
    DAY: “day”,
    WEEK: “week”,
    BYTE: “byte”,
    KILOBYTE: “kilobyte”,
    MEGABYTE: “megabyte”,
    GIGABYTE: “gigabyte”,
    TERABYTE: “terabyte”,
    KIBIBYTE: “kibibyte”,
    MEBIBYTE: “mebibyte”,
    GIBIBYTE: “gibibyte”,
    TEBIBYTE: “tebibyte”,
    CPUSECOND: “cpuSecond”,
    REQUEST: “request”,
    PAGE: “page”,
    ORDER: “order”,
    PERCENT: “percent”,
    FILE: “file”,
    NONE: “none”
    };

    IGH.MWS.QS = {
    SCHEMA_NAME: “SchemaName”,
    HEIGHT_IN_PIXELS: “HeightInPixels”,
    WIDTH_IN_PIXELS: “WidthInPixels”,
    GRAPH_TITLE: “GraphTitle”,
    SHOW_LEGEND: “ShowLegend”,
    SHOW_LEGEND_ERRORS: “ShowLegendErrors”,
    LEGEND_PLACEMENT: “LegendPlacement”,
    SHOW_X_AXIS_LABEL: “ShowXAxisLabel”,
    DECORATE_POINTS: “DecoratePoints”,
    GRAPH_TYPE: “GraphType”,
    TIMEZONE: “Timezone”,
    SHOW_GAPS: “ShowGaps”,
    HORIZONTAL_LINE: “HorizontalLine”,
    LOG_SCALING: “LogScaling”,
    UPPER_VALUE: “UpperValue”,
    LOWER_VALUE: “LowerValue”,
    CLIP_UPPER_VALUE: “ClipUpperValue”,
    SHOW_Y_AXIS: “ShowYAxis”,
    SHRINK_BOUNDS_TO_GRAPH_DATA: “ShrinkBoundsToGraphData”,
    LABEL: “Label”,
    START_TIME: “StartTime”,
    END_TIME: “EndTime”,
    PERIOD: “Period”,
    STAT: “Stat”,
    VALUE_UNIT: “ValueUnit”,
    STAT_OPTIONS: “StatOptions”,
    Y_AXIS_PREFERENCE: “YAxisPreference”,
    AGGREGATION_FUNCTION: “AggregationFunction”,
    AGGREGATION_PERIOD: “AggregationPeriod”,
    FUNCTION_EXPRESSION: “FunctionExpression”,
    FUNCTION_LABEL: “FunctionLabel”,
    FUNCTION_OPERATE_ON_PARTIAL_INPUT: “FunctionOperateOnPartialInput”,
    FUNCTION_Y_AXIS_PREFERENCE: “FunctionYAxisPreference”,
    VERTICAL_LINE: “VerticalLine”
    };

    IGH.MWS.QS_DEFAULTS = {
    WIDTH_IN_PIXELS: 640,
    HEIGHT_IN_PIXELS: 480,
    SHOW_LEGEND: IGH.MWS.Boolean.TRUE,
    SHOW_LEGEND_ERRORS: IGH.MWS.Boolean.TRUE,
    LEGEND_PLACEMENT: IGH.MWS.LegendPlacement.BOTTOM,
    SHOW_X_AXIS_LABEL: IGH.MWS.Boolean.TRUE,
    DECORATE_POINTS: IGH.MWS.Boolean.FALSE,
    GRAPH_TYPE: IGH.MWS.GraphType.BITMAP,
    SHOW_GAPS: IGH.MWS.Boolean.TRUE,
    LOG_SCALING: IGH.MWS.Boolean.FALSE,
    SHOW_Y_AXIS: IGH.MWS.Boolean.TRUE,
    SHRINK_BOUNDS_TO_GRAPH_DATA: IGH.MWS.Boolean.FALSE,
    Y_AXIS_PREFERENCE: IGH.MWS.YAxisPreference.LEFT,
    FUNCTION_OPERATE_ON_PARTIAL_INPUT: IGH.MWS.Boolean.TRUE,
    STAT_OPTIONS: IGH.MWS.StatOptions.VAL,
    TIMEZONE: “”,
    VALUE_UNIT: IGH.MWS.ValueUnit.NONE
    // can’t default this until we add fallback in MWS FUNCTION_Y_AXIS_PREFERENCE: IGH.MWS.YAxisPreference.LEFT
    };

    //Defines valid MWS periods
    IGH.Period = {
    ONE_MINUTE: “OneMinute”,
    FIVE_MINUTE: “FiveMinute”,
    ONE_HOUR: “OneHour”,
    ONE_DAY: “OneDay”,
    ONE_WEEK: “OneWeek”
    }

    //Defines valid MWS stats
    IGH.Stat = {
    AVG: “avg”,
    SUM: “sum”,
    N: “n”,
    P0: “p0”,
    P10: “p10”,
    P20: “p20”,
    P25: “p25”,
    P30: “p30”,
    P40: “p40”,
    P50: “p50”,
    P60: “p60”,
    P70: “p70”,
    P75: “p75”,
    P80: “p80”,
    P90: “p90”,
    P99: “p99”,
    P99_9: “p99.9”,
    P99_99: “p99.99”,
    P100: “p100”,
    GP0: “gp0”,
    GP10: “gp10”,
    GP20: “gp20”,
    GP25: “gp25”,
    GP50: “gp50”,
    GP90: “gp90”,
    GP99: “gp99”,
    GP99_9: “gp99.9”,
    GP99_99: “gp99.99”,
    GP100: “gp100”,
    GAVG: “gavg”,
    GSUM: “gsum”,
    U1000: “u1000”,
    U2000: “u2000”,
    U3500: “u3500”,
    U6000: “u6000”,
    O1000: “o1000”,
    O2000: “o2000”,
    O3500: “o3500”,
    O6000: “o6000″
    }
    /*
    * Add observablity (Observer pattern) to the ‘that’ object
    */
    // ‘event’ is a string
    // ‘listener’ is the callback function
    IGH.util.observability = function(that){

    var registry = {};
    var _enabled = true;

    //May be used to temporarily enable/disabled all notifications
    that.enableNotification = function(enabled){
    _enabled = enabled;
    };

    // Send out a notification to all registered listeners for an event
    that.notify = function(event){
    if (_enabled) {
    var listeners = registry[event];
    if (listeners) {
    for (var i = 0; i n_docel)))
    n_result = n_docel;
    return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
    };

    /* Prints an integer into a nice string format */
    IGH.util.numberWithCommas = function(nStr, decimalPlaces) {
    nStr += ”;
    if (typeof decimalPlaces !== undefined) {
    nStr = parseFloat(nStr).toFixed(decimalPlaces) + ”;
    }
    var beforeAfterDec = nStr.split(‘.’);
    var beforeDec = beforeAfterDec[0];
    var afterDec = beforeAfterDec.length > 1 ? ‘.’ + beforeAfterDec[1] : ”;
    afterDec = afterDec.replace(/0*$/, “”);
    if (afterDec === “.”) {
    afterDec = “”;
    }
    var regex = /(\d+)(\d{3})/;
    while (regex.test(beforeDec)) {
    beforeDec = beforeDec.replace(regex, ‘$1’ + ‘,’ + ‘$2’);
    }
    return beforeDec + afterDec;
    };

    /*
    * Makes elements appear/disappear by “sliding” into/out of view
    */
    IGH.util.toggleExpander = function(expander, controlSelector){
    var expanderSpan = expander.firstChild.nextSibling;
    $(expanderSpan).toggleClass(“expanderGrow”);
    $(expanderSpan).toggleClass(“expanderShrink”);
    IGH.util.toggleSlide(controlSelector);
    };

    /*
    * Makes elements appear/disappear by “sliding” into/out of view
    */
    IGH.util.toggleSlide = function(jquerySelector){
    if ($(jquerySelector).is(“:hidden”)) {
    $(jquerySelector).slideDown(“fast”);
    return true;
    }
    else {
    $(jquerySelector).slideUp(“fast”);
    return false;
    }
    };

    /*
    * Makes elements appear/disappear by “fading” into/out of view
    */
    IGH.util.toggleFade = function(jquerySelector){
    if ($(jquerySelector).is(“:hidden”)) {
    $(jquerySelector).fadeIn();
    return true;
    }
    else {
    $(jquerySelector).fadeOut();
    return false;
    }
    };

    /*
    * Toggles visibility of items. Returns true if the items are now visible
    */
    IGH.util.toggleShowHide = function(jquerySelector) {
    if ($(jquerySelector).is(“:hidden”)) {
    $(jquerySelector).show();
    return true;
    }
    else {
    $(jquerySelector).hide();
    return false;
    }
    },

    /*
    * Scrolls to top of screen in animation
    */
    IGH.util.scrollToTop = function() {
    $(‘html, body’).animate({scrollTop:0}, ‘slow’);
    },

    /*
    * Scrolls to Y value of particular object (jquery selector) on screen
    */
    IGH.util.scrollTo = function(jquerySelector) {

    $(‘html, body’).animate({scrollTop: $(jquerySelector).offset().top}, ‘slow’);
    },

    /*
    * Return the URL parameters from the href that launched the current window.
    *
    * Remove any anchors from the end
    */
    IGH.util.getUrlParameters = function() {
    return window.location.href.replace(/.*[?]/, “”).replace(/#\w*$/, “”);
    };

    /*
    * Remove domain from a URL
    */
    IGH.util.removeDomainFromUrl = function(url) {
    return url.replace(/^[^\/]*(?:\/[^\/]*){2}/, “”)
    };

    /*
    * Utility function to help setting/getting of object properties
    *
    * Return property value if ‘value’ parameter is not specified else
    * set the property value and return the object, so that settings
    * can be ‘chained’ like so: a.prop1(10).prop2(20);
    */
    IGH.util.GetterSetter = function(obj, property, value) {
    if (value == undefined) {
    return obj[property];
    }
    else {
    obj[property] = value;
    return obj;
    }
    };

    //returns a function that will validate a value against the supplied enum
    IGH.util.createOptionalEnumValidator = function(validValues) {
    return function(value) {
    if(value === undefined) {
    return true;
    }
    for(var valid in validValues) {
    if(validValues[valid] === value) {
    return true;
    }
    }
    return false;
    };
    };

    //returns a function that will validate a value against an MWS Boolean
    IGH.util.createOptionalBooleanValidator = function() {
    return function(value) {
    if(value === undefined) {
    return true;
    }
    for(var valid in IGH.MWS.Boolean ) {
    if(IGH.MWS.Boolean[valid] === value.toLowerCase()) {
    return true;
    }
    }
    return false;
    };
    };

    /* Helper for setting a query string arg*/
    IGH.util.GetQueryArg = function(field, value) {
    return “&” + field + “=” + this.urlEncode(value);
    };

    /* Helper for setting a qplot arg*/
    IGH.util.GetQplotArg = function(field, value) {
    return ” -” + field.toLowerCase() + “=” + value;
    };

    /*
    * Parses a single Query String parameter into a key/value pair.
    * Returns a null for invalid, or ‘{ key: “key”, value: “value”}’ for valid parameters
    */
    IGH.util.queryParamToKeyValue = function(param) {
    var EQUALS = “=”;
    var EQUALS_ENCODED = “%3D”;

    var equals = param.indexOf(EQUALS);
    var equalsOffset = EQUALS.length;
    if (equals 0) {
    var result = {};
    result.key = param.slice(0, equals);
    result.value = unescape(param.slice(equals + equalsOffset));
    return result;
    }
    return null;
    };

    /*
    * Returns a url in its parts: [‘url’, ‘scheme’, ‘slash’, ‘host’, ‘port’, ‘path’, ‘query’, ‘hash’]
    */
    IGH.util.URL_PARTS = [‘url’, ‘scheme’, ‘slash’, ‘host’, ‘port’, ‘path’, ‘query’, ‘hash’];
    IGH.util.parseUrl = function(url) {
    var parse_url = /^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/;
    var result = parse_url.exec(jQuery.trim(url));
    if (result == null) {
    return null;
    }
    var parsedUrl = {};
    for (i = 0; i < this.URL_PARTS.length; i++) {
    parsedUrl[this.URL_PARTS[i]] = result[i] ? result[i] : "";
    }
    return parsedUrl;
    };

    IGH.util.parseQueryParams = function() {
    var str = window.location.search;
    var paramMap = {};
    str.replace(new RegExp( "([^?=&]+)(=([^&]*))?", "g" ),
    function($0, $1, $2, $3) {
    paramMap[$1] = $3;
    }
    );
    return paramMap;
    };

    IGH.util.lightbox = Lightbox.display;

    /*
    * Helper for making a batch update to the graph data model. It calls the function passed in
    * with specified parameters and guarantees only one update event is propagated.
    */
    IGH.util.BatchUpdate = function(fn, param1, param2, param3, param4, param5) {
    var model = IGH.graph.model();

    model.enableNotification(false); // Switch off model events
    var ret = fn(param1, param2, param3, param4, param5); // Call the passed-in function
    model.enableNotification(true); // Re-enable model events
    model.notify(IGH.graph.PARAMS.MODEL_CHANGED_EVENT); // Fire a model changed event
    return ret;
    };

    /*
    * Debugging utility, to display alert of object contents
    */
    IGH.util.LogObject = function(obj) {
    for (var key in obj) {
    try {
    console.log("obj[" + key + "] = " + obj[key]);
    }
    catch (e) {}
    }
    };

    /*
    * Converts XMLObject into string
    */
    IGH.util.xmlToString = function(xml){
    var serialized;
    try {
    serializer = new XMLSerializer();
    serialized = serializer.serializeToString(xml);
    }
    catch (e) {
    // Internet Explorer has a different approach to serializing XML
    serialized = xml.xml ? xml.xml : xml;
    }

    return serialized;
    };

    /*
    * Given a list of param names, removes them from a URL of parameters and returns the trimmed URL
    */
    IGH.util.removeQueryParams = function(url, paramList) {
    var newUrl = url;
    for (var i = 0; i = 0 && i = 0 && i 0) {
    _array = [];
    that.notify(IGH.graph.PARAMS.MODEL_CHANGED_EVENT);
    }
    };
    return other;
    };

    var _createSources = function(){
    return _createArray();
    };

    var _createFunctions = function(){
    return _createArray();
    };

    var _createYAxis = function(){
    var _horizontalLine = _createArray();
    var _logScaling = IGH.MWS.QS_DEFAULTS.LOG_SCALING;
    var _showYAxis = IGH.MWS.QS_DEFAULTS.SHOW_Y_AXIS;
    var _upperValue;
    var _lowerValue;
    var _clipUpperValue;
    var _shrinkBoundsToGraphData = IGH.MWS.QS_DEFAULTS.SHRINK_BOUNDS_TO_GRAPH_DATA;
    var _label;

    var that = {};
    _createGetter(that, IGH.MWS.QS.HORIZONTAL_LINE, _horizontalLine);
    _createGetterAndSetter(that, IGH.MWS.QS.LOG_SCALING, _logScaling, IGH.util.createOptionalBooleanValidator());
    _createGetterAndSetter(that, IGH.MWS.QS.SHOW_Y_AXIS, _showYAxis, IGH.util.createOptionalBooleanValidator());
    _createGetterAndSetter(that, IGH.MWS.QS.UPPER_VALUE, _upperValue);
    _createGetterAndSetter(that, IGH.MWS.QS.LOWER_VALUE, _lowerValue);
    _createGetterAndSetter(that, IGH.MWS.QS.CLIP_UPPER_VALUE, _clipUpperValue);
    _createGetterAndSetter(that, IGH.MWS.QS.SHRINK_BOUNDS_TO_GRAPH_DATA, _shrinkBoundsToGraphData, IGH.util.createOptionalBooleanValidator());
    _createGetterAndSetter(that, IGH.MWS.QS.LABEL, _label);
    return that;
    };

    var _createOptions = function(){
    var _heightInPixels;
    var _widthInPixels;
    var _leftYAxis = _createYAxis();
    var _rightYAxis = _createYAxis();
    var _graphTitle;
    var _showLegend = IGH.MWS.QS_DEFAULTS.SHOW_LEGEND;
    var _legendPlacement = IGH.MWS.QS_DEFAULTS.LEGEND_PLACEMENT;
    var _showXAxisLabel = IGH.MWS.QS_DEFAULTS.SHOW_X_AXIS_LABEL;
    var _decoratePoints = IGH.MWS.QS_DEFAULTS.DECORATE_POINTS;
    var _graphType = IGH.MWS.QS_DEFAULTS.GRAPH_TYPE;
    var _timezone = IGH.MWS.QS_DEFAULTS.TIMEZONE;
    var _showLegendErrors = IGH.MWS.QS_DEFAULTS.SHOW_LEGEND_ERRORS;
    var _showGaps = IGH.MWS.QS_DEFAULTS.SHOW_GAPS;
    var _verticalLine = _createArray();

    var that = {};
    _createGetterAndSetter(that, IGH.MWS.QS.HEIGHT_IN_PIXELS, _heightInPixels);
    _createGetterAndSetter(that, IGH.MWS.QS.WIDTH_IN_PIXELS, _widthInPixels);
    _createGetterAndSetter(that, IGH.MWS.QS.GRAPH_TITLE, _graphTitle);
    _createGetterAndSetter(that, IGH.MWS.QS.SHOW_LEGEND, _showLegend, IGH.util.createOptionalBooleanValidator());
    _createGetterAndSetter(that, IGH.MWS.QS.LEGEND_PLACEMENT, _legendPlacement, IGH.util.createOptionalEnumValidator(IGH.MWS.LegendPlacement));
    _createGetterAndSetter(that, IGH.MWS.QS.SHOW_X_AXIS_LABEL, _showXAxisLabel, IGH.util.createOptionalBooleanValidator());
    _createGetterAndSetter(that, IGH.MWS.QS.DECORATE_POINTS, _decoratePoints, IGH.util.createOptionalBooleanValidator());
    _createGetterAndSetter(that, IGH.MWS.QS.GRAPH_TYPE, _graphType, IGH.util.createOptionalEnumValidator(IGH.MWS.GraphType));
    _createGetterAndSetter(that, IGH.MWS.QS.TIMEZONE, _timezone);
    _createGetterAndSetter(that, IGH.MWS.QS.SHOW_LEGEND_ERRORS, _showLegendErrors, IGH.util.createOptionalBooleanValidator());
    _createGetterAndSetter(that, IGH.MWS.QS.SHOW_GAPS, _showGaps, IGH.util.createOptionalBooleanValidator());
    _createGetter(that, IGH.MWS.YAxisPreference.LEFT + IGH.graph.PARAMS.Y_AXIS, _leftYAxis);
    _createGetter(that, IGH.MWS.YAxisPreference.RIGHT + IGH.graph.PARAMS.Y_AXIS, _rightYAxis);
    _createGetter(that, IGH.MWS.QS.VERTICAL_LINE, _verticalLine);
    return that;
    };

    var _createTimeRanges = function(){
    return _createArray();
    };

    var _timeRanges = _createTimeRanges();
    var _sources = _createSources();
    var _options = _createOptions();
    var _functions = _createFunctions();

    var that = {};
    _createGetter(that, “timeRanges”, _timeRanges);
    _createGetter(that, “sources”, _sources);
    _createGetter(that, “options”, _options);
    _createGetter(that, “functions”, _functions);

    that.reset = function(){
    _timeRanges = _createTimeRanges();
    _sources = _createSources();
    _functions = _createFunctions();
    _options = _createOptions();
    that.notify(IGH.graph.PARAMS.MODEL_CHANGED_EVENT);
    };

    that.createTimeRange = function(type, startTime, endTime){
    var _type = type;
    var _startTime = startTime;
    var _endTime = endTime;

    var that = {};
    _createGetterAndSetter(that, IGH.graph.PARAMS.TYPE, _type, IGH.util.createOptionalEnumValidator(IGH.MWS.TimeRangeType));
    _createGetterAndSetter(that, IGH.MWS.QS.START_TIME, _startTime);
    _createGetterAndSetter(that, IGH.MWS.QS.END_TIME, _endTime);
    return that;
    };

    that.createFunction = function(){
    var _function = {};
    var _expression;
    var _label;
    var _yAxisPreference = IGH.MWS.QS_DEFAULTS.Y_AXIS_PREFERENCE;
    var _operateOnPartialInput = IGH.MWS.QS_DEFAULTS.FUNCTION_OPERATE_ON_PARTIAL_INPUT;
    var that = {};
    _createGetterAndSetter(that, IGH.MWS.QS.FUNCTION_EXPRESSION, _expression);
    _createGetterAndSetter(that, IGH.MWS.QS.FUNCTION_LABEL, _label);
    _createGetterAndSetter(that, IGH.MWS.QS.FUNCTION_Y_AXIS_PREFERENCE, _yAxisPreference, IGH.util.createOptionalEnumValidator(IGH.MWS.YAxisPreference));
    _createGetterAndSetter(that, IGH.MWS.QS.FUNCTION_OPERATE_ON_PARTIAL_INPUT, _operateOnPartialInput, IGH.util.createOptionalBooleanValidator());
    return that;
    };

    that.createGraphSchemaDataSource = function(){
    var _metric = {}; //required
    var _period; //required
    var _stat; // required
    var _valueUnit = IGH.MWS.QS_DEFAULTS.VALUE_UNIT;
    var _statOptions = IGH.MWS.QS_DEFAULTS.STAT_OPTIONS;
    var _yAxisPreference = IGH.MWS.QS_DEFAULTS.Y_AXIS_PREFERENCE;
    var _label;
    var _userLabel; // this is not an MWS parameter to hold a user define label
    var that = {};
    _createGetterAndSetter(that, IGH.graph.PARAMS.METRIC, _metric);
    _createGetterAndSetter(that, IGH.MWS.QS.PERIOD, _period, IGH.util.createOptionalEnumValidator(IGH.Period));
    _createGetterAndSetter(that, IGH.MWS.QS.STAT, _stat, IGH.util.createOptionalEnumValidator(IGH.Stat));
    _createGetterAndSetter(that, IGH.MWS.QS.VALUE_UNIT, _valueUnit, IGH.util.createOptionalEnumValidator(IGH.MWS.ValueUnit));
    _createGetterAndSetter(that, IGH.MWS.QS.STAT_OPTIONS, _statOptions, IGH.util.createOptionalEnumValidator(IGH.MWS.StatOptions));
    _createGetterAndSetter(that, IGH.MWS.QS.Y_AXIS_PREFERENCE, _yAxisPreference, IGH.util.createOptionalEnumValidator(IGH.MWS.YAxisPreference));
    _createGetterAndSetter(that, IGH.MWS.QS.LABEL, _label);
    _createGetterAndSetter(that, IGH.graph.PARAMS.USER_LABEL, _userLabel);
    that.type = function(){
    return IGH.graph.PARAMS.METRIC;
    };
    return that;
    };

    IGH.util.observability(that);
    return that;
    };

    IGH.graph.DataModelHelper = {

    cloneDataSource: function(model, source){
    var clone;
    if (source.type() === IGH.graph.PARAMS.METRIC) {
    clone = model.createGraphSchemaDataSource();
    }
    else {
    clone = model.createBinaryFunctionDataSource();
    }

    for (var func in source) {
    // need a deep copy of the metric object
    if (func === IGH.graph.PARAMS.METRIC) {
    clone[func](this._clone(source[func]()));
    }
    else {
    clone[func](source[func]());
    }
    }
    return clone;
    },

    copyMetricsToFunctions: function(model) {
    var metrics = model.sources();
    for (var i = 1; i 0) || (newMetricsOffset == 0)) && (fromMetrics.size() > 0)) {
    for (var i = 0; i 0) {
    this._setFromAxisToRightIfAllAreLeftForFunctionsOrMetrics(toFunctions, fromFunctions, ‘functionYAxisPreference’);
    }
    this._setFromAxisToRightIfAllAreLeftForFunctionsOrMetrics(toMetrics, fromMetrics, ‘yAxisPreference’);
    },

    _setFromAxisToRightIfAllAreLeftForFunctionsOrMetrics: function(toArray, fromArray, yAxisFunc) {
    var toRight = this._hasRightYAxisPreference(toArray, yAxisFunc);
    var fromRight = this._hasRightYAxisPreference(fromArray, yAxisFunc);
    if (!toRight && !fromRight) {
    this._setYAxisPreference(fromArray, yAxisFunc, IGH.MWS.YAxisPreference.RIGHT);
    }
    },

    _hasRightYAxisPreference: function(array, yAxisFunc) {
    for (var i = 0; i < array.size(); i++) {
    if (array.get(i)[yAxisFunc]() === IGH.MWS.YAxisPreference.RIGHT) {
    return true;
    }
    }
    return false;
    },

    _setYAxisPreference: function(array, yAxisFunc, axisPreference) {
    for (var i = 0; i < array.size(); i++) {
    array.get(i)[yAxisFunc](axisPreference);
    }
    },

    _renumberFunctionExpression: function(expr, offset) {
    return expr.replace(/\b([MS])(\d+)\b/g, function(fullMatch, metricType, index){
    return metricType + (parseInt(index) + offset);
    });
    },

    _mergeGraphTitles: function(toModel, fromModel) {
    var toTitle = toModel.options().graphTitle();
    var fromTitle = fromModel.options().graphTitle();
    if (fromTitle && fromTitle != "") {
    var newTitle = fromTitle;
    if (toTitle && toTitle != "") {
    newTitle = toTitle + " / " + fromTitle;
    }
    toModel.options().graphTitle(newTitle);
    }
    },

    _mergeMetrics: function(toMetrics, fromMetrics) {
    for (var i = 0; i 0) || (fromFunctions.size() > 0)) {
    if (toFunctions.size() == 0) {
    this.copyMetricsToFunctions(toModel);
    }
    if (fromFunctions.size() == 0) {
    this.copyMetricsToFunctions(fromModel);
    }
    }
    },

    _clone: function(map){
    var newMap = {};
    for (var prop in map) {
    if (map.hasOwnProperty(prop)) {
    newMap[prop] = map[prop];
    }
    }
    return newMap;
    }
    };
    /*
    * Implement conversions between model for IGraph graph tab and MWS requests
    */
    // TODO how will we deal with default values, mws treats undefined properties as default values ( it may not always default a boolean to false)

    IGH.graph.createMWSCodec = function(){
    var METRIC_PATTERN = new RegExp(“^[M 0-9]*$”);
    var AMPERSAND = “&”;
    var EQUALS = “=”;
    var EQUALS_ENCODED = “%3D”;
    var EMPTY = “”;
    var NO_SUFFIX = “”;

    var _encodeSources = function(parameters, sources){
    parameters = _encodeMetrics(parameters, sources);
    return parameters;
    };

    var _encodeMetrics = function(parameters, sources){
    var numMetrics = 0;
    // metrics
    for (var i = 0; i < sources.size(); ++i) {
    var source = sources.get(i);
    if (source.type() === IGH.graph.PARAMS.METRIC) {
    numMetrics++;
    for (var func in source) {
    if (func === IGH.graph.PARAMS.METRIC) {
    parameters = _encodeMetric(parameters, source[func](), numMetrics);
    }
    else
    if (func === IGH.graph.PARAMS.TYPE) {
    // ignore Type distinguished Functions and GraphSchema
    }
    else
    if (IGH.startsWith(func, IGH.graph.PARAMS.FUNCTION) || func === IGH.graph.PARAMS.ENABLED) {
    // handle in _encodeFunctions
    }
    else
    if (func === _getFunctionName(IGH.graph.PARAMS.USER_LABEL) || func === _getFunctionName(IGH.MWS.QS.LABEL)) {
    // fallback does not make sense for user labels
    parameters = _addParameter(parameters, source, func, numMetrics);
    }
    else {
    parameters = _addParameterWithFallback(parameters, source, func, numMetrics);
    }
    }
    }
    }
    return parameters;
    };

    var _encodeMetric = function(parameters, metric, index){
    var schema = metric[IGH.MWS.QS.SCHEMA_NAME];
    parameters = _addParameterFromProperty(parameters, metric, IGH.MWS.QS.SCHEMA_NAME, index);
    var fields = IGH.MetricSchemas.schemaDefs[schema];
    if (fields) {
    for (var i = 0; i < fields.length; ++i) {
    parameters = _addParameterFromPropertyWithFallback(parameters, metric, fields[i], index);
    }
    }
    return parameters;
    };

    var _encodeFunctions = function(parameters, functions){
    var numFunctions = 0;
    for (var i = 0; i < functions.size(); ++i) {
    var functionDef = functions.get(i);
    numFunctions++;
    for (var func in functionDef) {
    parameters = _addParameter(parameters, functionDef, func, numFunctions);
    }
    }
    return parameters;
    };

    var _encodeTimeRanges = function(parameters, timeRanges){
    for (var i = 0; i < timeRanges.size(); ++i) {
    parameters = _addParameter(parameters, timeRanges.get(i), IGH.MWS.QS.START_TIME, i + 1);
    parameters = _addParameter(parameters, timeRanges.get(i), IGH.MWS.QS.END_TIME, i + 1);
    }
    return parameters;
    };

    var _encodeOptions = function(parameters, options){
    for (var func in options) {
    if (func === IGH.MWS.YAxisPreference.LEFT + IGH.graph.PARAMS.Y_AXIS) {
    parameters = _encodeYAxis(parameters, options[func](), _getName(IGH.MWS.YAxisPreference.LEFT));
    } else if (func === IGH.MWS.YAxisPreference.RIGHT + IGH.graph.PARAMS.Y_AXIS) {
    parameters = _encodeYAxis(parameters, options[func](), _getName(IGH.MWS.YAxisPreference.RIGHT));
    } else if (func === _getFunctionName(IGH.MWS.QS.VERTICAL_LINE)) {
    parameters = _encodeLineOption(parameters, options, func, NO_SUFFIX);
    } else {
    parameters = _addParameter(parameters, options, func, NO_SUFFIX);
    }
    }
    return parameters;
    };

    var _decodeMetric = function(parameters, source, numMetrics){
    for (var func in source) {
    if (func === IGH.graph.PARAMS.METRIC) {
    _decodeMetricSchema(parameters, source[func](), numMetrics);
    }
    else
    if (func === IGH.graph.PARAMS.TYPE) {
    // handled in _decodeSources
    }
    else
    if (IGH.startsWith(func, IGH.graph.PARAMS.FUNCTION) || func === IGH.graph.PARAMS.ENABLED) {
    // handled in _decodeFunctions
    }
    else
    if (func === _getFunctionName(IGH.graph.PARAMS.USER_LABEL) || func === _getFunctionName(IGH.MWS.QS.LABEL)) {
    // fallback is not appropriate for userLabels
    _getParameter(parameters, source, func, numMetrics);
    }
    else {
    _getParameterWithFallback(parameters, source, func, numMetrics);
    }
    }
    };

    var _decodeMetricSchema = function(parameters, metric, index){
    _getParameterFromProperty(parameters, metric, IGH.MWS.QS.SCHEMA_NAME, index);
    var schema = metric[IGH.MWS.QS.SCHEMA_NAME];
    var fields = IGH.MetricSchemas.schemaDefs[schema];
    if (fields) {
    for (var i = 0; i < fields.length; ++i) {
    _getParameterFromPropertyWithFallback(parameters, metric, fields[i], index);
    }
    }
    };

    var _decodeMetrics = function(model, parameters, sources){
    sources.clear();
    var metrics = _getArray(parameters, IGH.MWS.QS.SCHEMA_NAME);
    var numMetrics = 0;
    var source;
    for (var i = 0; i < metrics.length; ++i) {
    numMetrics++;
    source = model.createGraphSchemaDataSource();
    source.type(IGH.graph.PARAMS.METRIC);
    _decodeMetric(parameters, source, i+1);
    sources.add(source);
    }
    };

    var _decodeFunctions = function(model, parameters, functions){
    functions.clear();
    var expressions = _getArray(parameters, IGH.MWS.QS.FUNCTION_EXPRESSION);
    var numFunctions = 0;
    var functionDef;
    for (var i = 0; i < expressions.length; ++i) {
    numFunctions++;
    functionDef = model.createFunction();
    _decodeFunction(parameters, functionDef, i+1);
    functions.add(functionDef);
    }
    };

    var _decodeFunction = function(parameters, functionDef, numFunctions){
    for (var func in functionDef) {
    _getParameter(parameters, functionDef, func, numFunctions);
    }
    };

    var _decodeTimeRanges = function(model, parameters, timeRanges){
    timeRanges.clear();
    var start = _getArray(parameters, IGH.MWS.QS.START_TIME);
    var end = _getArray(parameters, IGH.MWS.QS.END_TIME);
    // Switch to only understanding StartTime1, EndTime1 until full support for Period over Period
    for (var i = 0; i < Math.min(1, Math.min(start.length, end.length)); ++i) {
    var type = IGH.TimeRangeUtils.getTimeType(start[i]);
    timeRanges.add(model.createTimeRange(type, start[i], end[i]));
    }
    };

    var _decodeOptions = function(parameters, options){
    for (var func in options) {
    if (func === IGH.MWS.YAxisPreference.LEFT + IGH.graph.PARAMS.Y_AXIS) {
    _decodeYAxis(parameters, options[func](), _getName(IGH.MWS.YAxisPreference.LEFT));
    } else if (func === IGH.MWS.YAxisPreference.RIGHT + IGH.graph.PARAMS.Y_AXIS) {
    _decodeYAxis(parameters, options[func](), _getName(IGH.MWS.YAxisPreference.RIGHT));
    } else if (func === _getFunctionName(IGH.MWS.QS.VERTICAL_LINE)) {
    _decodeLineOption(parameters, options, func, NO_SUFFIX);
    } else {
    _getParameter(parameters, options, func, NO_SUFFIX);
    }
    }
    };

    var _decodeYAxis = function(parameters, object, axisName){
    for (var func in object) {
    if (func === _getFunctionName(IGH.MWS.QS.HORIZONTAL_LINE)) {
    _decodeLineOption(parameters, object, func, axisName);
    }
    else {
    _getParameter(parameters, object, func, axisName);
    }
    }
    };

    var _decodeLineOption = function(parameters, object, func, axisName) {
    object[func]().clear();
    var lines = _getArray(parameters, _getName(func) + axisName);
    for (var i = 0; i 0; –i) {
    var value = parameters[name + i];
    if (value) {
    return value;
    }
    }
    };

    var _getParameterInternal = function(parameters, name, suffix){
    return parameters[name + suffix];
    };

    var _encodeYAxis = function(parameters, object, axisName){
    for (var func in object) {
    if (func === _getFunctionName(IGH.MWS.QS.HORIZONTAL_LINE)) {
    parameters = _encodeLineOption(parameters, object, func, axisName);
    }
    else {
    parameters = _addParameter(parameters, object, func, axisName);
    }
    }
    return parameters;
    };

    var _encodeLineOption = function(parameters, object, func, suffix) {
    var lines = object[func]();
    for (var i = 0; i 0; –i) {
    if (parameters[name + i]) {
    return parameters[name + i];
    }
    }
    return _getDefaultValue(name, name, index);
    };

    // uppercase the first letter ( for QS parameter names)
    var _getName = function(parameter){
    return parameter.charAt(0).toUpperCase() + parameter.substring(1);
    };

    // lowercase the first letter ( for method names)
    var _getFunctionName = function(parameter){
    return parameter.charAt(0).toLowerCase() + parameter.substring(1);
    };

    // public methods
    var that = {};

    // translates a data model into an object filed with key/value pairs
    that.encode = function(dataModel){
    var parameters = {};
    parameters = _encodeSources(parameters, dataModel.sources());
    parameters = _encodeOptions(parameters, dataModel.options());
    parameters = _encodeTimeRanges(parameters, dataModel.timeRanges());
    return parameters;
    };

    that.encodeFunctions = function(dataModel){
    var parameters = {};
    parameters = _encodeFunctions(parameters, dataModel.functions());
    return parameters;
    };

    // translates an object filled with key/value pairs into a url segment
    that.toQueryString = function(parameters){
    var out = EMPTY;
    for (var parameter in parameters) {
    if (parameters.hasOwnProperty(parameter)) {
    out += IGH.util.GetQueryArg(parameter, parameters[parameter]);
    }
    }
    return out.length > 0 ? out.substring(1) : out;
    };

    // translates a url segment into an object filled with key/value pairs
    that.fromQueryString = function(urlSegment){
    var parameters = {};
    var params = urlSegment.split(AMPERSAND);
    for (var i = 0; i < params.length; ++i) {
    var keyValue = IGH.util.queryParamToKeyValue(params[i]);
    if (keyValue) {
    parameters[keyValue.key] = keyValue.value;
    }
    }
    return parameters;
    };

    // translates an object filed with key/value pairs into a data model

    that.decode = function(parameters, dataModel){
    _decodeOptions(parameters, dataModel.options());
    _decodeTimeRanges(dataModel, parameters, dataModel.timeRanges());
    _decodeMetrics(dataModel, parameters, dataModel.sources());
    return dataModel;
    };

    that.decodeFunctions = function(parameters, dataModel){
    _decodeFunctions(dataModel, parameters, dataModel.functions());
    return dataModel;
    };

    return that;

    };
    IGH.TimeRangeUtils = {

    TZ_PDT: "PST8PDT",
    XML_DATE: new RegExp('(\\d{4})-(\\d{2})-(\\d{2})'),
    XML_TIME: new RegExp('T(\\d{2}):(\\d{2}):(\\d{2})'),
    XML_TZ: new RegExp('([-+]\\d{2}):00$'),
    DECIMAL: 10,
    MILLISECONDS_IN_MINUTE: 60 * 1000,

    PATTERN: {
    DAY: new RegExp('(\\d*)D'),
    HOUR: new RegExp('(\\d*)H'),
    MINUTE: new RegExp('(\\d*)M')
    },

    DURATIONS: {
    DAY: "D",
    HOUR: "H",
    MINUTE: "M"
    },

    MINUTES: {
    DAY: 24 * 60,
    HOUR: 60,
    MINUTE: 1
    },

    UNITS: {
    MINUTE: "MINUTE",
    HOUR: "HOUR",
    DAY: "DAY"
    },

    ORDERED_UNITS: ["MINUTE", "HOUR", "DAY"],

    // get units and corresponding value form a control
    getControlFromDuration: function(duration){
    var minutes = this.getMinutes(duration);
    var unit = this.getUnits(duration);
    var value = minutes / this.MINUTES[unit];
    var result = {};
    result[unit] = value;
    return result;
    },

    // get number of minutes corresponding to a duration
    getMinutes: function(duration){
    // sign is inverted sign widget is ago
    var sign = duration.match("-P") ? 1 : -1;
    var minutes = 0;
    for (var i = 0; i = 12) {
    hours -= 12;
    amPm = “pm”;
    }
    if (hours === 0) {
    hours = 12;
    }
    var minutes = Math.floor(date.getMinutes() / 5) * 5;
    minutes = (minutes < 10) ? "0" + minutes : minutes;
    return $.datepicker.formatDate(IGH.TimeRanges.FORMAT, date) + " " + hours + ":" + minutes + amPm;
    },

    // get most significant Unit present in a duration
    getUnits: function(duration){
    var unit = this.UNITS.MINUTE;
    for (var i = 0; i < this.ORDERED_UNITS.length; i++) {
    var index = this.ORDERED_UNITS[i];
    var results = this.PATTERN[index].exec(duration);
    if (results && results[1] !== "") {
    unit = index;
    }
    }
    return unit;
    },

    // create a duration form the screen widget
    getDurationFromControl: function(unit, value){
    // sign is inverted sign widget is ago
    var sign = value = this.MINUTES.DAY || unit === this.UNITS.DAY) {
    var days = Math.floor(minutes / this.MINUTES.DAY);
    duration += days + this.DURATIONS.DAY;
    minutes = minutes % this.MINUTES.DAY;
    }
    duration += “T”;
    if (minutes >= this.MINUTES.HOUR || unit === this.UNITS.HOUR) {
    var hours = Math.floor(minutes / this.MINUTES.HOUR);
    duration += hours + this.DURATIONS.HOUR;
    minutes = minutes % this.MINUTES.HOUR;
    }
    if (minutes >= this.MINUTES.MINUTE || unit === this.UNITS.MINUTE) {
    var mins = Math.floor(minutes / this.MINUTES.MINUTE);
    duration += mins + this.DURATIONS.MINUTE;
    }
    if( duration.charAt(duration.length-1) === “T”) {
    duration= duration.slice(0,-1);
    }
    return duration;
    },

    // get a calendar string in UTC from the int values of a javascript date
    getXMLCalendarFromControl: function(year, month, dayOfMonth, hours, minutes){
    var date = new fleegix.date.Date(year, month, dayOfMonth, hours, minutes, this.TZ_PDT, false);
    return this.getXMLCalendarFromDate(date);
    },

    // get a calendar string in UTC from a date
    getXMLCalendarFromDate: function(date){
    return date.getUTCFullYear() + “-” + this.pad(date.getUTCMonth() + 1) + “-” + this.pad(date.getUTCDate()) + “T” + this.pad(date.getUTCHours()) + “:” + this.pad(date.getUTCMinutes()) + “:00Z”;
    },

    // get a date in PDT from an xml calendar in UTC
    getControlFromXMLCalendar: function(xmlCalendar){
    var hour = 0;
    var minute = 0;
    var second = 0;
    var tz = 0;
    var results = this.XML_TZ.exec(xmlCalendar);
    if (results) {
    tz = parseInt(results[1], this.DECIMAL);
    }
    results = this.XML_TIME.exec(xmlCalendar);
    if (results) {
    hour = parseInt(results[1], this.DECIMAL);
    minute = parseInt(results[2], this.DECIMAL);
    second = parseInt(results[3], this.DECIMAL);
    }
    results = this.XML_DATE.exec(xmlCalendar);
    if (results) {
    var year = parseInt(results[1], this.DECIMAL);
    var month = parseInt(results[2], this.DECIMAL) – 1;
    var dayInMonth = parseInt(results[3], this.DECIMAL);
    var utc = Date.UTC(year, month, dayInMonth, hour, minute, second);
    var offset = this.getPDTUTCOffset(utc) – tz;
    return new fleegix.date.Date(year, month, dayInMonth, hour + offset, minute, second, this.TZ_PDT, false);
    }
    return null;
    },

    // get an xml calendar in UTC from a date and an xml duration
    getXMLCalendarFromDuration: function(now, duration){
    var minutes = this.getMinutes(duration);
    now.setMinutes(now.getMinutes() – minutes);
    return this.getXMLCalendarFromDate(now);
    },

    // get an xml calendar in UTC from a date and an xml duration
    getDurationFromXMLCalendar: function(now, calendar){
    var then = this.getControlFromXMLCalendar(calendar);
    var minutes = (now.getTime() – then.getTime()) / this.MILLISECONDS_IN_MINUTE;
    return this.getDurationFromControl(this.UNITS.MINUTE, minutes);
    },

    // get current js date in PDT
    getNowInPDT: function(){
    var date = new Date();
    var offset = this.getPDTUTCOffset(date.getTime());
    return new fleegix.date.Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours() + offset, date.getUTCMinutes(), date.getUTCSeconds(), date.getUTCMilliseconds(), this.TZ_PDT, false);
    },

    // Convert a time range into minute durations
    getTimeRangeInMinutes: function(now, timeRange) {
    // Can’t calculate range with natural time
    if (this.getTimeType(timeRange.startTime()) === IGH.MWS.TimeRangeType.NATURAL) {
    return null;
    }
    var minuteRange = new Object();
    minuteRange.startTime = this._getTimeInMinutes(now, timeRange.startTime());
    minuteRange.endTime = this._getTimeInMinutes(now, timeRange.endTime());
    return minuteRange;
    },

    // Convert a time (duration or fixed) into number of minutes, compared to now
    _getTimeInMinutes: function(now, time) {
    var duration;
    if (! this.isDuration(time)) {
    duration = this.getDurationFromXMLCalendar(now, time);
    }
    else {
    duration = time;
    }
    return this.getMinutes(duration);
    },

    // Return true if time is a duration
    isDuration: function(time) {
    return IGH.TimeRanges.DURATION.test(time);
    },

    getTimeType: function(time) {
    if (this.isDuration(time)) {
    return IGH.MWS.TimeRangeType.RELATIVE;
    }
    if (this.getControlFromXMLCalendar(time) !== null) {
    return IGH.MWS.TimeRangeType.FIXED;
    }
    return IGH.MWS.TimeRangeType.NATURAL;
    },

    pad: function(number){
    if (number =1″, “2:00”, “1:00”, “D”], [“2007”, “max”, “-“, “Mar”, “Sun>=8”, “2:00”, “1:00”, “D”], [“2007”, “max”, “-“, “Nov”, “Sun>=1”, “2:00”, “0”, “S”]]
    }
    };
    _tz.loadZoneDataFromObject(data);
    this.model = IGH.graph.model();
    var options = {
    dateFormat: IGH.TimeRanges.FORMAT,
    showOn: ‘button’,
    buttonImage: ‘/images/calendar.png’,
    buttonImageOnly: true
    };
    // initialize
    IGH.TimeRanges.syncControlsFromModel();
    // listen for changes to the model
    this.model.register(IGH.graph.PARAMS.MODEL_CHANGED_EVENT, function(event){
    IGH.TimeRanges.syncControlsFromModel();
    });
    // add UI listeners
    var self = this;
    $(“.setFixedTimeType”).click(function() { return self.setTimeType(IGH.MWS.TimeRangeType.FIXED); });
    $(“.setRelativeTimeType”).click(function() { return self.setTimeType(IGH.MWS.TimeRangeType.RELATIVE); });
    $(“.setNaturalTimeType”).click(function() { return self.setTimeType(IGH.MWS.TimeRangeType.NATURAL); });
    $(“.startNow”).click(this.start3HoursAgo);
    $(“.endNow”).click(this.endNow);
    var times = [“start”, “end”];
    for (var i in times) {
    if (times.hasOwnProperty(i)) {
    $(“#” + times[i] + “TimeValue”).change(this.updateDurationFromControl(times[i]));
    $(“select[name=” + times[i] + “Value]”).change(this.updateDurationFromControl(times[i]));
    $(“select[name=” + times[i] + “Hours]”).change(this.updateDateFromControl(times[i]));
    $(“select[name=” + times[i] + “Minutes]”).change(this.updateDateFromControl(times[i]));
    $(“#” + times[i] + “Date”).datepicker(options).change(this.updateDateFromControl(times[i]));
    $(“#” + times[i] + “Natural”).change(this.updateNaturalFromControl(times[i]));
    }
    }
    this._addQuickZoomOnClickHandling();
    },

    syncControlsFromModel: function(){
    var self = IGH.TimeRanges;
    if (self.model.timeRanges().size() === 1) {
    var timeRange = self.model.timeRanges().get(0);
    var timeType = IGH.TimeRangeUtils.getTimeType(timeRange.startTime());
    if (timeType === IGH.MWS.TimeRangeType.RELATIVE) {
    self.updateControlFromDuration(“start”);
    self.updateControlFromDuration(“end”);
    self.showControls(“relative”);
    }
    else if (timeType === IGH.MWS.TimeRangeType.FIXED) {
    self.updateControlFromCalendar(“start”);
    self.updateControlFromCalendar(“end”);
    self.showControls(“fixed”);
    }
    else {
    self.updateControlFromNatural(“start”);
    self.updateControlFromNatural(“end”);
    self.showControls(“natural”);
    }
    }
    },

    showControls: function(controlType) {
    $(“.timeSwitch”).show();
    $(“.” + controlType + “TimeSwitch”).hide();
    $(“.timePanel”).hide();
    $(“#” + controlType + “-time”).show();
    },

    start3HoursAgo: function(){
    for (var i = 0; i < IGH.TimeRanges.model.timeRanges().size(); ++i) {
    var timeRange = IGH.TimeRanges.model.timeRanges().get(i);
    if (timeRange.type() === IGH.MWS.TimeRangeType.FIXED) {
    var now = IGH.TimeRangeUtils.getNowInPDT();
    now.setHours(now.getHours() – 3);
    timeRange.startTime(IGH.TimeRangeUtils.getXMLCalendarFromDate(now));
    }
    else if (timeRange.type() === IGH.MWS.TimeRangeType.NATURAL) {
    timeRange.startTime("3 hours ago");
    }
    }
    return false;
    },

    endNow: function(){
    for (var i = 0; i < IGH.TimeRanges.model.timeRanges().size(); ++i) {
    var timeRange = IGH.TimeRanges.model.timeRanges().get(i);
    if (timeRange.type() === IGH.MWS.TimeRangeType.FIXED) {
    timeRange.endTime(IGH.TimeRangeUtils.getXMLCalendarFromDate(IGH.TimeRangeUtils.getNowInPDT()));
    }
    else if (timeRange.type() === IGH.MWS.TimeRangeType.NATURAL) {
    timeRange.endTime("now");
    }
    }
    return false;
    },

    setTimeType: function(newTimeType){
    var self = IGH.TimeRanges;

    // only want one event from this change
    self.model.enableNotification(false);
    for (var i = 0; i update the UI
    updateControlFromNatural: function(name){
    var naturalTime = IGH.TimeRanges.model.timeRanges().get(0)[name + “Time”]();
    IGH.TimeRanges.updateControlOnChange($(“#” + name + “Natural”), naturalTime);
    return false;
    },

    // duration has changes in model -> update the UI
    updateControlFromDuration: function(name){
    var duration = IGH.TimeRanges.model.timeRanges().get(0)[name + “Time”]();
    var control = IGH.TimeRangeUtils.getControlFromDuration(duration);
    for (var prop in control) {
    if (control.hasOwnProperty(prop)) {
    IGH.TimeRanges.updateControlOnChange($(“#” + name + “TimeValue”), Math.round(control[prop] * 10) / 10);
    IGH.TimeRanges.updateControlOnChange($(“select[name=” + name + “Value]”), prop.toLowerCase() + “s”);
    }
    }
    return false;
    },

    // calendar has changed in model -> update the UI
    updateControlFromCalendar: function(name){
    var calendar = IGH.TimeRanges.model.timeRanges().get(0)[name + “Time”]();
    var date = IGH.TimeRangeUtils.getControlFromXMLCalendar(calendar);
    // end dates must be after, start dates must be before
    // if end date is not aligned move to the following aligned value (see floor below)
    if (name === “end” && ( date.getSeconds() !== 0 || date.getMinutes() % 5 !== 0)) {
    date.setMinutes(date.getMinutes() + 5);
    }
    IGH.TimeRanges.updateControlOnChange($(“#” + name + “Date”), $.datepicker.formatDate(IGH.TimeRanges.FORMAT, date));
    IGH.TimeRanges.updateControlOnChange($(“select[name=” + name + “Hours]”), date.getHours());
    IGH.TimeRanges.updateControlOnChange($(“select[name=” + name + “Minutes]”), Math.floor(date.getMinutes() / 5) * 5);
    return false;
    },

    // date control has changes update the model
    updateDateFromControl: function(name){
    return function(){
    var date = $(“#” + name + “Date”).val();
    var hours = parseInt($(“select[name=” + name + “Hours]”).val(), IGH.TimeRangeUtils.DECIMAL);
    var minutes = parseInt($(“select[name=” + name + “Minutes]”).val(minutes), IGH.TimeRangeUtils.DECIMAL);
    var parts = date.split(‘/’);
    if (parts.length === 3) {
    var year = parseInt(parts[0], IGH.TimeRangeUtils.DECIMAL);
    var month = parseInt(parts[1], IGH.TimeRangeUtils.DECIMAL) – 1;
    var dayInMonth = parseInt(parts[2], IGH.TimeRangeUtils.DECIMAL);
    var timeRange = IGH.TimeRanges.model.timeRanges().get(0);
    var newValue = IGH.TimeRangeUtils.getXMLCalendarFromControl(year, month, dayInMonth, hours, minutes);
    timeRange[name + “Time”](newValue);
    }
    return false;
    };
    },

    // natural time control has changes, update the model
    updateNaturalFromControl: function(name){
    return function(){
    var timeRange = IGH.TimeRanges.model.timeRanges().get(0);
    timeRange[name + “Time”]($(“#” + name + “Natural”).val());
    return false;
    };
    },

    // duration control has changes update the model
    updateDurationFromControl: function(name){
    return function(){
    var value = $(“#” + name + “TimeValue”).val();
    var units = $(“select[name=” + name + “Value]”).val();
    units = units.slice(0, -1).toUpperCase();
    var timeRange = IGH.TimeRanges.model.timeRanges().get(0);
    var newValue = IGH.TimeRangeUtils.getDurationFromControl(units, value);
    timeRange[name + “Time”](newValue);
    return false;
    };
    }

    };

    jQuery.fn.iGHSingleDoubleClick = function(singleClickCallback, doubleClickCallback, timeout) {
    return this.each(function() {
    var clicks = 0, self = this;
    jQuery(this).click(function(event) {
    if (event.preventDefault) {
    event.preventDefault();
    }
    if (event.stopPropagation) {
    event.stopPropagation();
    }
    clicks++;
    if (clicks == 1) {
    setTimeout(function() {
    if (clicks == 1) {
    singleClickCallback.call(self, event);
    }
    else {
    doubleClickCallback.call(self, event);
    }
    clicks = 0;
    }, timeout || 300);
    }
    });
    });
    }

    // Initialize and decorate strings
    initialize();
    })(function localGMCode(win, unsafeWin) {
    win.Lightbox = {
    display: function (content, width, height) {
    function initLightbox() {
    var STYLES = ‘\
    #iGraphLightbox {\
    visibility:hidden;\
    position:fixed;\
    background:white;\
    border:2px solid #3c3c3c;\
    color:black;\
    z-index:1510;\
    padding:20px;\
    }\
    #iGraphLightboxDimmer{\
    background: #000;\
    position: fixed;\
    opacity: .5;\
    top: 0;\
    z-index:1509;\
    }’;
    addStyle(STYLES);
    $(‘body’).append(‘

    ‘);
    }

    if (!this.initialized) {
    initLightbox();
    this.initialized = true;
    }

    var lightbox = document.getElementById(“iGraphLightbox”),
    dimmer = document.getElementById(“iGraphLightboxDimmer”);
    $(lightbox).html(content);

    lightbox.style.width = width + ‘px’;
    lightbox.style.height = height + ‘px’;
    dimmer.style.width = window.innerWidth + ‘px’;
    dimmer.style.height = window.innerHeight + ‘px’;

    dimmer.onclick = function () {
    lightbox.style.visibility = ‘hidden’;
    dimmer.style.visibility = ‘hidden’;
    $(lightbox).html(”);
    }

    dimmer.style.visibility = ‘visible’;
    lightbox.style.visibility = ‘visible’;
    lightbox.style.top = (window.innerHeight – height) / 2 + ‘px’;
    lightbox.style.left = (window.innerWidth – width) / 2 + ‘px’;
    return false;
    }
    };

    win.GMUtils = {
    initialize: function() {
    this.injectFunctionsIntoPage();
    },

    injectFunctionsIntoPage: function () {
    var gmInjectFuncs = {
    setValue: function(name, value) { return GM_setValue(name, value); },
    getValue: function(name, def) { return GM_getValue(name, def); },
    setClipboard: function(value, type) { return GM_setClipboard(value, type); },
    getTinyLinkForUrl: function(url, callback) { return getTinyLinkForUrl(url, callback); },
    gmXmlHttpRequest: function(object) { return GM_xmlhttpRequest(object); },
    sendFormDataToS3: function(object) { return sendFormDataToS3(object); },
    sendMessageToChime: function(webhookUrl, message) { return sendMessageToChime(webhookUrl, message); },
    snapshotDisplay: function(snapshotUrl, iGraphUrl, graphId) { if (typeof WikiSnapshot != ‘undefined’) { WikiSnapshot.snapshotDisplay(snapshotUrl, iGraphUrl, graphId); } },
    snapshotDisplayInPopup: function(graphModel) { if (typeof WikiSnapshot != ‘undefined’) { WikiSnapshot.snapshotDisplayInPopup(Lightbox.display, graphModel, ‘CloudWatch graph’); } }
    };
    if ((typeof createObjectIn !== ‘undefined’) && (typeof exportFunction !== ‘undefined’)) {
    var injectedGM = createObjectIn(unsafeWindow, {defineAs: “iGraphHelperGM”});
    exportFunction(gmInjectFuncs.getValue, injectedGM, {defineAs: “getValue” });
    exportFunction(gmInjectFuncs.setValue, injectedGM, {defineAs: “setValue” });
    exportFunction(gmInjectFuncs.setClipboard, injectedGM, {defineAs: “setClipboard” });
    exportFunction(gmInjectFuncs.gmXmlHttpRequest, injectedGM, {defineAs: “gmXmlHttpRequest” });
    exportFunction(gmInjectFuncs.getTinyLinkForUrl, injectedGM, {defineAs: “getTinyLinkForUrl” });
    exportFunction(gmInjectFuncs.sendFormDataToS3, injectedGM, {defineAs: “sendFormDataToS3” });
    exportFunction(gmInjectFuncs.sendMessageToChime, injectedGM, {defineAs: “sendMessageToChime” });
    exportFunction(gmInjectFuncs.snapshotDisplay, injectedGM, {defineAs: “snapshotDisplay” });
    exportFunction(gmInjectFuncs.snapshotDisplayInPopup, injectedGM, {defineAs: “snapshotDisplayInPopup” });
    return true;
    }
    return false;
    },

    log: function(msg) {
    win.console.log(msg);
    },

    getValue: function(key) {
    if (typeof GM_getValue !== ‘undefined’) {
    return GM_getValue(key);
    } else if (typeof iGraphHelperGM !== ‘undefined’) {
    return iGraphHelperGM.getValue(key);
    }
    return null;
    },

    setValue: function(key, value) {
    if (typeof GM_setValue !== ‘undefined’) {
    return GM_setValue(key, value);
    } else if (typeof iGraphHelperGM !== ‘undefined’) {
    return iGraphHelperGM.setValue(key, value);
    }
    return null;
    },

    gmXmlHttpRequest: function(object) {
    if (typeof GM_xmlhttpRequest !== ‘undefined’) {
    return GM_xmlhttpRequest(object);
    } else if (typeof iGraphHelperGM !== ‘undefined’) {
    return iGraphHelperGM.gmXmlHttpRequest(object);
    }
    return null;
    },

    getTinyLinkForUrl: function(url, callback) {
    if (typeof getTinyLinkForUrl !== ‘undefined’) {
    return getTinyLinkForUrl(url, callback);
    } else if (typeof iGraphHelperGM !== ‘undefined’) {
    return iGraphHelperGM.getTinyLinkForUrl(url, callback);
    }
    return null;
    },

    sendFormDataToS3: function(object) {
    if (typeof sendFormDataToS3 !== ‘undefined’) {
    return sendFormDataToS3(object);
    } else if (typeof iGraphHelperGM !== ‘undefined’) {
    return iGraphHelperGM.sendFormDataToS3(object);
    }
    return null;
    },

    sendMessageToChime: function(webhookUrl, message) {
    if (typeof sendMessageToChime !== ‘undefined’) {
    return sendMessageToChime(webhookUrl, message);
    } else if (typeof iGraphHelperGM !== ‘undefined’) {
    return iGraphHelperGM.sendMessageToChime(webhookUrl, message);
    }
    return null;
    },

    setClipboard: function(value, type) {
    if (typeof GM_setClipboard !== ‘undefined’) {
    return GM_setClipboard(value, type);
    } else if (typeof iGraphHelper !== ‘undefined’) {
    return iGraphHelperGM.setClipboard(value, type);
    }
    return null;
    }
    };

    win.WikiSnapshot = {
    SPINNER_IMG: ‘data:image/gif;base64,R0lGODlhEAAQALMAAN7e3s7Ozrm5uampqZiYmIiIiHd3d2dnZ1ZWVkZGRjExMQAAAP///wAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFBwAMACwAAAAAEAAQAAAEZ5BJBqgxM8+QAlBKoGXB0oFAqgUisRDKklYZohABaBwqRQOHhULgmcwqswFCRMoQDrsBLdMrHK6D0fEoKEwlPXAhwVsRxQkCgIBjSQFnRlGAEAzUuJHEoL4DAmpaXmsEFAJfIwICehEAIfkEBQcADAAsAAAAAA8AEAAABFmQycnKDHQemSRIQ8YoyMct2ARMQ6IQyzYZ3ZcUhrKsVJ6kDIFAJDnwiIOCckhkAAgGQ4HZvBCqrIOBeCQcQowBYJUKHBkBQ0AYPE8swSGASrkGxWhsADiJAAAh+QQFBwAMACwAAAAAEAAQAAAEWpDJyUiRgFKTUeqCxmTckTAGE06ZpDDeCgAhUCBCgBwWIhULReuSygACBEVwQBFcKANFoSWwEAKi1mhQeIq+EiZYUyBkNdyQYDU6j6YBrFY0qMnnUEl8rJl9IwAh+QQFBwAMACwAAAAAEAAPAAAEVpDJKQmgGBRpEMdSgGzGwWygNDBCKaHBtAFHMRCHwgw6NQIxiSCRSsUMAcBlwEwZFNCDgEANUnILBUKpFBi5IcIKZGURYoGy5BKaDMDFUJILLM7pykkEACH5BAUHAAwALAAAAAAQAA8AAARbkMnJxqBYElnMDBlwbEzBGAqYMUdQmEp2gaZwJYzA4FpBBABJELHTfUgTQIIQZAQEAmCmgKgWAhYjxhM7UFRJxTWgAkAxgcUi0XwKmxPDIsWAwym2O0B/p/QzEQAh+QQFBwAMACwAAAAAEAAQAAAEWpDJyYSgWA5JCs9SsRUEQyRg5UkBKgGSMMBEKRSIlBzTJcCTwEGBCGAuFCEFEAAAMQPD4UBgBpqZE8qwzCCqjKczuWHwJmMKYtFNDRbcFCaxQKaMFUVZHnxGAAAh+QQFBwAMACwAAAAAEAAQAAAEVZDJyQK9U0wyAWaENUyHh1nAwCEjFWjMIAQBYUjHLb3WVTAGkwTQ6xhaH0zBoPMIKQPEAfFLSo7WjkABtBIKCUWgoEAkFYpfFYZB94oft4X9OSSclAgAIfkEBQcADAAsAgAAAA4AEAAABFeQyRmmlZUJIcfVgMYJxQeMAlBaoVYBQxkYBAPcV4isUmsVnM9FQCgUBr6hYVkTMoA2TI+SUPAkCusAkWgdJoWFIZGo1TKMwEIRqAIQbAtBEYwmPq+lMAIAIfkEBQcADAAsAAAAABAAEAAABFCQyckAoBiHIEWWF7NJxAeKHMGZVjdUhYkRsUyVNpXmUlD8r07Cc8scFgsc6MBQKhYISeJViBISMQCB2EREFaAVJQHwMpghioeTiJZZkt8nAgAh+QQFBwAMACwAAAEAEAAOAAAETZBJBqoFYWp9xf6TAIAc5jHDQGoCca6SkEmFkigFmA7CsSyKA4hAfBEYs8kgiQxtDAhNgmFgIIQBQrXnZBypB48KpIgehIUoSH2WGJIRACH5BAUHAAwALAAAAgAQAA4AAARWkMlJGaihzkuDWkQFcELGCJ8iYGVXLAPGSQlTa4CgB4biFzjBYGAKDBCzDQVgYChMk0IhJkEoJoaAEMiYSoiMgWIgZSA0ksuhCySsNYF3odlFUwYhTQQAIfkECQcADAAsAAAAABAAEAAABFuQSSCrvUykgLtYSdcdywBQGIAwBbMoaRWsDDFYJzoRinDpEsSBhgkYAYVEAkHoGAMogMCA8Vk4itBlQLAyqC1Di9MEdCVWnzVg4DCADESryRi0OneWhADH3DARADs=’,
    SNAPSHOT_IMG: ‘data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsEAAA7BAbiRa+0AAAASdEVYdFNvZnR3YXJlAEdyZWVuc2hvdF5VCAUAAAEVSURBVDhPpZOxDcIwEEUviBIqOliBJRALMAKhYwaHikSICegII7AAYgkKMkDomAH8D184B6cIeZJ1Z/v738lOIiJ62dEZNrJ8Zn8SRRH1XN6Zxo42SeIyn22auuwLOgIw8kiMcdkvoT14eB1JF6GqmrrO60hXQh6qXF/f73Yc4eFdNpwTW204GHC1VRx7QzpAR9Dei4LnoO9iRZZlaJEPjicTOj/ndDvMuAAOYw/RGEOPsnSn6Pf5IRBgAqbrK6Xq3qBBQU1lVFr3kECAmQCNLgi8jrQgP51oMbpwDnTeVJBvPl4uX1bALyBrkofWoMUZtfY1EoHEOnoPsdGoLdrI+7Lx5G045jlHfA6NP20bKqPPtAtEbw8iYxB46Q0cAAAAAElFTkSuQmCC’,
    INTERACTIVE_IMG: ‘data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAASdEVYdFNvZnR3YXJlAEdyZWVuc2hvdF5VCAUAAABdSURBVDhPY2RgYPgPxBQDsEH/j5hCeGQCRpvTDExQNsWAlgaBfAvCIPCRIR3obEabBwzboSK4ABaDQGFPevjTK7B/MEzMINtr5IFRgwgDqhk0jDMt2GsQJiWAgQEAZyAY3kmtuyIAAAAASUVORK5CYII=’,
    SNAPSHOT_HISTORY_KEY: ‘iGraphHelper.snapshotHistory’,
    SNAPSHOT_HISTORY_PREVIOUS_KEY: ‘iGraphHelper.snapshotHistoryPrevious’,
    SNAPSHOT_OUTPUT_MODE_KEY: ‘iGraphHelper.snapshotOutputMode’,
    SNAPSHOT_AUTOSNAP_KEY: ‘iGraphHelper.snapshotAutoSnap’,
    SNAPSHOT_CHIME_ROOMS_KEY: ‘iGraphHelper.chimeRooms’,
    SNAPSHOT_CURRENT_CHIME_ROOM_KEY: ‘iGraphHelper.currentChimeRoom’,
    MAX_HISTORY_ITEMS: 200,
    DECIMAL: 10,
    DURATION: new RegExp(‘^-?P’),
    PATTERN: {
    DAY: new RegExp(‘(\\d*)D’),
    HOUR: new RegExp(‘(\\d*)H’),
    MINUTE: new RegExp(‘(\\d*)M’)
    },
    DURATIONS: {
    DAY: “D”,
    HOUR: “H”,
    MINUTE: “M”
    },
    MINUTES: {
    DAY: 24 * 60,
    HOUR: 60,
    MINUTE: 1
    },
    UNITS: {
    MINUTE: “MINUTE”,
    HOUR: “HOUR”,
    DAY: “DAY”
    },
    ORDERED_UNITS: [“MINUTE”, “HOUR”, “DAY”],
    STYLES: ‘\
    .iGraphWikiSpinner {\
    left: -1px;\
    position: relative;\
    top: 4px;\
    margin-right: 6px;\
    visibility: hidden;\
    vertical-align: unset !important;\
    padding-top: 0px !important;\
    }\
    .iGraphWikiSnapshotPopup, .iGraphWikiSnapshotMessage {\
    font-family: Arial, Helvetica, sans-serif;\
    font-size: 12px;\
    }\
    .iGraphWikiSnapshotControls, .iGraphChimeRoomManagerControls {\
    position: relative;\
    margin-bottom: 5px;\
    }\
    .iGraphWikiSnapshotControls .MPWbutton,\
    .iGraphWikiSnapshotControls .iGHbutton {\
    margin-right: 10px !important;\
    }\
    .iGraphWikiSnapshotMessage {\
    position: absolute;\
    bottom: 20px;\
    left: 25px;\
    }\
    .iGraphWikiSnapshotImageContainer {\
    width: 400px;\
    height: 200px;\
    display: inline-block;\
    vertical-align: top;\
    margin-right: 10px;\
    overflow: hidden;\
    }\
    .iGraphWikiSnapshotImage {\
    max-width: 100%;\
    max-height: 100%;\
    }\
    .iGraphWikiSnapshotImageControls {\
    width: 305px;\
    height: 200px;\
    display: inline-block;\
    vertical-align: top;\
    }\
    .iGraphWikiSnapshotPreview {\
    border: 1px solid #999;\
    margin-left: 5px;\
    width: 750px;\
    height: 250px;\
    vertical-align: top;\
    display: inline-block;\
    overflow: auto;\
    }\
    .iGraphWikiSnapshotTitle {\
    font-size: 15px;\
    font-weight: bold;\
    }\
    .iGraphWikiChimeRooms {\
    width: 100px;\
    padding: 0;\
    font-size: 12px;\
    height: 20px;\
    margin: 0px 10px;\
    }\
    .iGHbutton-bar {\
    display: inline-block;\
    vertical-align: top;\
    margin: 0 0 5px 5px;\
    }\
    .iGHbutton-bar:after {\
    clear: both;\
    }\
    .iGHbutton-bar .iGHbutton-group {\
    margin-right: 0.55556rem;\
    }\
    .iGHbutton-bar .iGHbutton-group div {\
    overflow: hidden;\
    }\
    .iGHbutton-group {\
    left: 0;\
    list-style: outside none none;\
    margin: 0;\
    padding: 0;\
    }\
    .iGHbutton-group:before, .iGHbutton-group:after {\
    content: ” “;\
    display: table;\
    }\
    .iGHbutton-group:after {\
    clear: both;\
    }\
    .iGHbutton-group > li {\
    display: inline-block;\
    margin: 0 -2px;\
    }\
    .iGHbutton-group > li > iGHbutton, .iGHbutton-group > li .iGHbutton {\
    border-color: rgba(255, 255, 255, 0.5);\
    border-left: 1px solid rgba(255, 255, 255, 0.5);\
    }\
    .iGHbutton-group > li:first-child iGHbutton, .iGHbutton-group > li:first-child .iGHbutton {\
    border-left: 0 none;\
    }\
    .iGHbutton-group.iGHround > * {\
    display: inline-block;\
    margin: 0 -2px;\
    }\
    .iGHbutton-group.iGHround > * > iGHbutton, .iGHbutton-group.iGHround > * .iGHbutton {\
    border-color: rgba(255, 255, 255, 0.5);\
    border-left: 1px solid rgba(255, 255, 255, 0.5);\
    }\
    .iGHbutton-group.iGHround > *:first-child iGHbutton, .iGHbutton-group.iGHround > *:first-child .iGHbutton {\
    border-left: 0 none;\
    }\
    .iGHbutton-group.iGHround > *, .iGHbutton-group.iGHround > * > a, .iGHbutton-group.iGHround > * > iGHbutton, .iGHbutton-group.iGHround > * > .iGHbutton {\
    border-radius: 0;\
    }\
    .iGHbutton-group.iGHround > *:first-child, .iGHbutton-group.iGHround > *:first-child > a, .iGHbutton-group.iGHround > *:first-child > iGHbutton, .iGHbutton-group.iGHround > *:first-child > .iGHbutton {\
    border-bottom-left-radius: 1000px;\
    border-top-left-radius: 1000px;\
    }\
    .iGHbutton-group.iGHround > *:last-child, .iGHbutton-group.iGHround > *:last-child > a, .iGHbutton-group.iGHround > *:last-child > iGHbutton, .iGHbutton-group.iGHround > *:last-child > .iGHbutton {\
    border-bottom-right-radius: 1000px;\
    border-top-right-radius: 1000px;\
    }\
    .iGHbutton-group.iGHround.stack > * {\
    display: block;\
    margin: 0;\
    }\
    .iGHbuttonFlat {\
    background-color: #008cba;\
    border-color: #007095;\
    border-radius: 0;\
    border-style: solid;\
    border-width: 1px;\
    color: #ffffff;\
    cursor: pointer;\
    display: inline-block;\
    font-family: Lucida Sans Unicode,Lucida Grande,Verdana,Arial,sans-serif;\
    font-size: 0.88889rem;\
    font-weight: normal;\
    line-height: normal;\
    padding: 0.5rem 1rem;\
    position: relative;\
    text-align: center;\
    text-decoration: none;\
    transition: background-color 300ms ease-out 0s;\
    }\
    .iGHbuttonFlat:hover, .iGHbuttonFlat:focus {\
    background-color: #007095;\
    text-decoration: none;\
    }\
    .iGHbuttonFlat:hover, .iGHbuttonFlat:focus {\
    color: #ffffff;\
    }\
    .iGHbuttonFlat.iGHsecondary {\
    background-color: #e7e7e7;\
    border-color: #b9b9b9;\
    color: #333333;\
    }\
    .iGHbuttonFlat.iGHsecondary:hover {\
    background-color: #dcdcdc;\
    }\
    .iGHbuttonFlat.iGHsecondary.iGHselected {\
    background-color: #b9b9b9;\
    }\
    iGHbuttonFlat.iGHsmall, .iGHbuttonFlat.iGHsmall {\
    font-size: 11px;\
    padding: 2px 15px;\
    }\
    .iGraphChimeManagerTextbox {\
    width: 220px !important;\
    height: 20px !important;\
    margin-right: 10px; !important;\
    padding: 0px !important;\
    border: 1px solid #ccc !important;\
    border-radius: 4px !important;\
    display: inline-block !important;\
    font-size: 12px !important;\
    }\
    .iGraphChimeRoomContainer {\
    margin: 15px;\
    width: 100%;\
    max-width: 100%;\
    font-weight: bold;\
    font-size: 12px;\
    }\
    .iGraphChimeRoomContainer > tbody > tr > td{\
    border: 0px !important;\
    }\
    .iGraphWebhookManagerPageTitle {\
    font-size: 15px;\
    font-weight: bold;\
    margin: 0px 0px 10px 10px;\
    display: inline-block;\
    }\
    #iGraphWebhookManager, #iGraphAddChimeRoomButton, #iGraphWebhookPageBackButton {\
    margin-top: -1px;\
    }\
    ‘,
    callbackFunction: ‘WikiSnapshot.snapshotDisplay’,
    snapshotHistory: [],
    snapshotHistoryPrevious: [],
    chimeRooms: {},
    outputMode: null,
    stylesAdded: false,
    autoSnap: true,
    snapWithData: false,
    takingBulkSnap: false,
    noOfSnapshotsToBeCopied: 0,

    initialize: function() {
    WebLabTimes.waitFor(function () {
    return unsafeWindow.MPW;
    }, WikiSnapshot.interceptGraphHover);
    this.injected = GMUtils.injectFunctionsIntoPage();
    if (this.injected) {
    this.callbackFunction = ‘iGraphHelperGM.snapshotDisplay’;
    }
    this.loadChimeRoomDefinitions();
    this.decorateChimeRoomLinks();
    },

    decorateChimeRoomLinks: function() {
    var chimeRoomsHeader = $(‘.iGraphHelperChimeRooms’),
    self = this;

    if (chimeRoomsHeader.length > 0) {
    this.addStyles();
    chimeRoomsHeader.prepend(‘

    ‘ +

    ‘ +
    ” +

    ‘);
    $(‘.iGHsnapshotSaveChimeRooms’).click(function() {
    $(‘.iGraphHelperChimeRooms a’).each(function () {
    var name = $.trim($(this).text()),
    url = $.trim($(this).attr(‘href’));

    self.chimeRooms[name] = { url: url };
    });
    self.saveChimeRoomDefinitions();
    alert(‘Chime rooms saved to iGraph Helper’);
    });
    $(‘.iGHsnapshotClearChimeRooms’).click(function() {
    if (confirm(‘Are you sure you want to clear all stored Chime rooms in iGraph Helper?’)) {
    self.chimeRooms = {};
    self.saveChimeRoomDefinitions();
    }
    });
    }
    },

    addStyles: function() {
    if (!this.stylesAdded) {
    addStyle(this.STYLES);
    this.stylesAdded = true;
    }
    },

    storeHistory: function() {
    GMUtils.setValue(this.SNAPSHOT_HISTORY_KEY, JSON.stringify(this.snapshotHistory));
    GMUtils.setValue(this.SNAPSHOT_HISTORY_PREVIOUS_KEY, JSON.stringify(this.snapshotHistoryPrevious));
    },

    getHistory: function() {
    var storedHistory = GMUtils.getValue(this.SNAPSHOT_HISTORY_KEY),
    storedHistoryPrevious = GMUtils.getValue(this.SNAPSHOT_HISTORY_PREVIOUS_KEY);

    if (storedHistory) {
    this.snapshotHistory = JSON.parse(storedHistory);
    }
    if (storedHistoryPrevious) {
    this.snapshotHistoryPrevious = JSON.parse(storedHistoryPrevious);
    }
    },

    loadChimeRoomDefinitions: function() {
    var chimeRooms = GMUtils.getValue(this.SNAPSHOT_CHIME_ROOMS_KEY);

    this.currentChimeRoomName = GMUtils.getValue(this.SNAPSHOT_CURRENT_CHIME_ROOM_KEY);
    if (chimeRooms) {
    var rooms = JSON.parse(chimeRooms);
    if (typeof rooms === ‘object’) {
    this.chimeRooms = rooms;
    }
    }
    },

    saveChimeRoomDefinitions: function() {
    GMUtils.setValue(this.SNAPSHOT_CHIME_ROOMS_KEY, JSON.stringify(this.chimeRooms));
    GMUtils.setValue(this.SNAPSHOT_CURRENT_CHIME_ROOM_KEY, this.currentChimeRoomName);
    },

    interceptGraphHover: function () {
    WikiSnapshot.MPW = unsafeWindow.MPW;
    $(‘#iGraphHoverBorderTop’).append(‘

    ‘);
    $(‘#iGraphHoverBorderTop’).append(‘

    ‘);
    document.getElementById(‘iGraphSnapshotIcon’).addEventListener(‘click’, function () {
    return WikiSnapshot.displaySnapshotPopup();
    });
    document.getElementById(‘iGraphInteractiveIcon’).addEventListener(‘click’, function () {
    return WikiSnapshot.goInteractive();
    });
    },

    goInteractive: function() {
    if (this.MPW.hoveredImage) {
    var graphArgs = this.MPW.getGraphArgs(this.MPW.hoveredImage);
    InteractiveWikiGraphs.displayInteractiveGraph(graphArgs);
    }
    return false;
    },

    displaySnapshotPopup: function() {
    if (this.MPW.hoveredImage) {
    var graphArgs = this.MPW.getGraphArgs(this.MPW.hoveredImage);
    this.snapshotDisplayInPopup(Lightbox.display, graphArgs, this.getSnapshotSizeMessage());
    }
    },

    getSnapshotSizeMessage: function() {
    var msg = “The graph to be snapshotted is ” + this.MPW.hoveredImage.width + ” by ” + this.MPW.hoveredImage.height + ” pixels”;
    return msg;
    },

    isCloudWatchGraph: function(graphArgs) {
    return (typeof graphArgs === ‘object’);
    },

    snapshotGraphUrl: function(graphArgs, graphId = undefined) {
    try {
    var url = “https://monitorportal.amazon.com”;
    if (this.isCloudWatchGraph(graphArgs)) {
    url += “/cw/snapshot?metricWidget=” + encodeURIComponent(JSON.stringify(graphArgs)) +
    “&width=” + graphArgs.width + “&height=” + graphArgs.height;
    } else {
    url += “/mws/snapshot?” + this.replaceRelativeWithFixedTime(graphArgs);
    }
    url += “&snapshotCallback=” + this.callbackFunction + (typeof graphId != “undefined” ? “&graphId=” + graphId : “&graphId=0″);

    this.includeScript(url);
    this.setSpinnerVisibility(true);
    !this.takingBulkSnap ? this.displayMessage(‘Snapshotting graph …’) : undefined;
    } catch (e) { console.log(e); }
    },

    /* Function to fetch graph data using chart.cgi if ‘snapWithData’ is true,
    If snapshot is taking from wiki page than this function uses GMUtils.gmXmlHttpRequest, and from iGraph page it uses .ajax call because
    win.snapshot code get injected in iGraph page so callback function of gmXmlHttpRequest does not work because of injection, however
    this is not the case in Wiki page
    */
    getChartData: function(snapshotUrl , iGraphUrl, tinyUrl, graphId) {
    try {
    var self = this,
    snapshotName = this.getSnapshotId(snapshotUrl),
    snapshotName = snapshotName.substring(0,snapshotName.lastIndexOf(‘.’)),
    chartCgiUrl = iGraphUrl.replace(/.*[/]igraph[?]/, ‘https://monitorportal.amazon.com/igraph/chart?’);

    chartCgiUrl = chartCgiUrl.replace(/\bHeightInPixels=\d+\b/,”HeightInPixels=400″);
    chartCgiUrl = chartCgiUrl.replace(/\bWidthInPixels=\d+\b/,”WidthInPixels=900”);

    if (window.location.href.search(/monitorportal.*.amazon.com/) >= 0) {
    self.sendRequestFromIGraph(snapshotUrl , iGraphUrl , chartCgiUrl , snapshotName, tinyUrl, graphId);
    }
    else {
    self.sendRequestFromWiki(snapshotUrl , iGraphUrl , chartCgiUrl , snapshotName, tinyUrl, graphId);
    }
    } catch (e) { console.log(e); }
    },

    sendRequestFromWiki: function(snapshotUrl , iGraphUrl , chartCgiUrl , snapshotName, tinyUrl, graphId) {
    try {
    var self = this;
    setTimeout(function() {
    GMUtils.gmXmlHttpRequest({
    method : ‘POST’,
    timeout : 45000,
    url: chartCgiUrl,
    onload: function(response){
    var responseData = response.responseText;
    var snapshot = self.getSnapshotObject(snapshotUrl, tinyUrl);
    snapshot.hasSnappedData = self.uploadDataToS3(responseData, snapshotName);
    self.takingBulkSnap ? WikiBulkSnapshot.onSnapshotComplete(snapshot, graphId) : self.addHistoryItem(snapshot);
    }.bind(WikiSnapshot),
    ontimeout : function(response){
    alert(“Request timeout \nPlease try again after some time”);
    }
    });
    },0);
    } catch (e) { console.log(e); }
    },

    sendRequestFromIGraph: function(snapshotUrl , iGraphUrl , chartCgiUrl , snapshotName, tinyUrl, graphId) {
    try {
    var self = this;
    $.ajax({
    url: chartCgiUrl,
    success: function(responseData){
    var snapshot = self.getSnapshotObject(snapshotUrl, tinyUrl);
    snapshot.hasSnappedData = self.uploadDataToS3(responseData, snapshotName);
    self.takingBulkSnap ? WikiBulkSnapshot.onSnapshotComplete(snapshot, graphId) : self.addHistoryItem(snapshot);
    }
    });
    } catch (e) { console.log(e); }
    },

    uploadDataToS3: function(responseData, snapshotName) {
    var self = this;
    var chartJson = responseData.substring(responseData.indexOf(‘{‘),responseData.lastIndexOf(‘}’)+1);
    if (eval (“(“+ chartJson +”)”).error.length > 0) {
    alert(eval (“(“+ chartJson +”)”).error+”\n\n*** For this graph snapshot will be taken without data ***”);
    return false;
    }
    else {
    var blob = new Blob([JSON.stringify(chartJson, null, 2)], {type : ‘application/json’});
    var formData = new FormData();
    formData.append(“data”, blob);
    formData.append(“f”, snapshotName + “.json”);
    GMUtils.sendFormDataToS3(formData);
    return true;
    }
    },

    snapshotDisplay: function(snapshotUrl, iGraphUrl, graphId) {
    var self = this;
    if (!this.takingBulkSnap) { this.displayMessage(‘Tinyfying graph URL …’); }
    GMUtils.getTinyLinkForUrl(‘https://tiny.amazon.com/submit/url?comment=snapshot&name=’ + escape(iGraphUrl), function(tinyUrl) {
    if (self.snapWithData) {
    if (!self.takingBulkSnap) { self.displayMessage(‘Collecting graph data …’); }
    self.getChartData(snapshotUrl, iGraphUrl, tinyUrl, graphId);
    }
    else {
    var snapshot = self.getSnapshotObject(snapshotUrl, tinyUrl);
    self.takingBulkSnap ? WikiBulkSnapshot.onSnapshotComplete(snapshot, graphId) : self.addHistoryItem(snapshot);
    }
    });
    },

    getSnapshotObject: function(snapshotUrl, tinyUrl) {
    return {
    snapshotUrl: snapshotUrl,
    iGraphUrl: tinyUrl,
    timestamp: new Date().toLocaleString(),
    hasSnappedData: this.snapWithData
    }
    },

    setSpinnerVisibility: function(isVisible) {
    $(‘.iGraphWikiSpinner’).css(‘visibility’, isVisible ? ‘visible’ : ‘hidden’);
    },

    displayMessage: function(message, delay) {
    if (message) {
    $(‘.iGraphWikiSnapshotMessage’).html(message).css(‘display’, ‘block’).fadeIn(‘slow’);
    if (delay) {
    setTimeout(function() { $(‘.iGraphWikiSnapshotMessage’).fadeOut(‘slow’) }, delay);
    }
    }
    },

    enable: function(selector, enabled) {
    if (enabled) {
    $(selector).attr(‘disabled’, false).css(‘opacity’, ‘1’).css(‘cursor’, ‘pointer’);
    } else {
    $(selector).attr(‘disabled’, true).css(‘opacity’, ‘0.35’).css(‘cursor’, ‘not-allowed’);
    }
    },

    snapshotDisplayInPopup: function(lightboxDisplay, graphArgs, message, takingBulkSnap = false) {
    var self = this;
    lightboxDisplay(this.getPopupHtml(), 760, 335);
    this.displayMessage(message, 5000);
    this.setChimeSelectOptions();
    this.takingBulkSnap = takingBulkSnap;
    this.enable(‘#iGraphWikiSnapshot’, true);
    this.enable(‘#iGraphSnapshotWithData’, true);

    if (this.takingBulkSnap) {
    this.enable(‘#iGraphWikiSnapshot’, false);
    this.enable(‘#iGraphSnapshotWithData’, false);
    WikiBulkSnapshot.snapshotCartGraphs();
    }
    if (this.isCloudWatchGraph(graphArgs)) {
    this.enable(‘#iGraphSnapshotWithData’, false);
    }
    $(‘#iGraphWikiSnapshot’).click(function () {
    self.snapWithData = false ;
    self.snapshotGraphUrl(graphArgs);
    });
    $(‘#iGraphSnapshotWithData’).click(function () {
    self.snapWithData = true ;
    self.snapshotGraphUrl(graphArgs);
    });
    $(‘#iGraphWikiSnapshotClear’).click(function () {
    self.clearHistory();
    });
    $(‘#iGraphWikiSnapshotCopyAll’).click(function () {
    self.noOfSnapshotsToBeCopied = self.snapshotHistory.length;
    self.copyAllHistoryToClipboard();
    });
    $(‘#iGraphWikiSnapshotRestoreHistory’).click(function () {
    self.restoreHistory();
    });
    $(‘.iGHSnapshotOutputMode’).click(function () {
    self.outputModeClicked(this)
    });
    $(‘#iGraphWikiSnapshotAuto’).click(function () {
    self.setAutoSnap(this);
    });
    $(‘#iGraphWebhookManager’).click(function () {
    self.showChimeWebhookManagerPage(this)
    });
    $(‘#iGraphWebhookPageBackButton’).click(function() {
    self.showSnapshotControllerPage();
    });
    $(‘#iGraphAddChimeRoomButton’).click(function () {
    self.addChimeRoom(this);
    });
    this.updateOutputMode();
    this.initAutoSnap(graphArgs);
    },

    initAutoSnap: function(graphArgs) {
    this.autoSnap = GMUtils.getValue(this.SNAPSHOT_AUTOSNAP_KEY) != “false”;
    GMUtils.setValue(this.SNAPSHOT_AUTOSNAP_KEY, this.autoSnap + ”);
    $(‘#iGraphWikiSnapshotAuto’).attr(‘checked’, this.autoSnap);
    if (!this.isTakingBulkSnap && this.autoSnap) {
    this.snapshotGraphUrl(graphArgs);
    }
    },

    setAutoSnap: function(checkbox) {
    this.autoSnap = $(‘#iGraphWikiSnapshotAuto:checked’).length != 0;
    GMUtils.setValue(this.SNAPSHOT_AUTOSNAP_KEY, this.autoSnap + ”);
    },

    outputModeClicked: function(button) {
    this.outputMode = $(button).attr(‘data-mode’);
    this.updateOutputMode();
    if (this.snapshotHistory.length > 0) {
    if (this.takingBulkSnap) {
    this.copyAllHistoryToClipboard();
    }
    else {
    this.copyCodeToClipboard(this.getSnapshotCode(0));
    this.displayMessage(“Code for last snapshot copied to clipboard”, 2000);
    }
    }
    },

    updateOutputMode: function() {
    if (this.outputMode == null) {
    this.outputMode = GMUtils.getValue(this.SNAPSHOT_OUTPUT_MODE_KEY) || “Raw”;
    }
    GMUtils.setValue(this.SNAPSHOT_OUTPUT_MODE_KEY, this.outputMode);
    $(‘.iGHSnapshotOutputMode’).removeClass(“iGHselected”);
    $(‘.iGHSnapshotOutputMode[data-mode=”‘ + this.outputMode + ‘”]’).addClass(“iGHselected”);
    this.updateSnapshots();
    },

    showSnapshotControllerPage: function(button) {
    this.displayMessage(” “);
    $(‘.iGraphWikiSnapshotControls’).show();
    $(‘.iGraphChimeRoomManagerControls’).hide();
    this.updateSnapshots();
    },

    showChimeWebhookManagerPage: function(button) {
    this.displayMessage(” “);
    $(‘.iGraphWikiSnapshotControls’).hide();
    $(‘.iGraphChimeRoomManagerControls’).show();
    this.updateChimeRoomList();
    },

    updateChimeRoomList: function() {
    this.loadChimeRoomDefinitions();
    var self = this;
    var roomListHtml = ‘





    ‘ +

    ‘ +

    ‘ +

    ‘ +

    ‘;
    });
    roomListHtml += ‘

    ‘; var index=1; Object.keys(this.chimeRooms).sort().forEach(function(roomName) { roomListHtml += ‘ ‘ + ‘
    ‘ + index++ + ‘. ‘ + roomName + ‘ ‘ + roomName + ‘\’s chime webhook url…

    ‘;
    $(‘.iGraphWikiSnapshotPreview’).html(roomListHtml);
    $(‘.iGHdeleteChimeRoom’).click(function() {
    var room = $(this).attr(‘data-code’);
    delete self.chimeRooms[room];
    self.saveChimeRoomDefinitions();
    self.updateChimeRoomList();
    self.setChimeSelectOptions();
    self.displayMessage(“Chime room has been deleted.”, 2000);
    });
    },

    copyCodeToClipboard: function(code) {
    GMUtils.setClipboard(code, this.outputMode == “HTML” ? “html” : “text”);
    },

    displayCurrent: function() {
    var index = this.snapshotHistory.length – this.current;
    if (this.current) {
    $(‘.iGraphWikiLink’).text(index >= 0 ? this.getSnapshotCode(index) : ”);
    $(‘.iGraphWikiSnapshotPreview’).html(this.getSnapshotImagePreviewHtml(index));
    }
    $(‘#iGraphWikiSnapshotPrevious’).val(‘Previous (‘ + index + ‘)’);
    if (index == 0) {
    $(‘#iGraphWikiSnapshotPrevious’).attr(‘disabled’, true).css(‘opacity’, ‘0.5’);
    } else {
    $(‘#iGraphWikiSnapshotPrevious’).attr(‘disabled’, false).css(‘opacity’, ‘1’);
    }
    },

    clearHistory: function() {
    if (this.snapshotHistory.length == 0) {
    return;
    }
    this.saveCurrentHistory();
    this.snapshotHistory = [];
    this.storeHistoryAndUpdate();
    },

    addHistoryItem: function(snapshot) {
    this.saveCurrentHistory();
    this.snapshotHistory.unshift(snapshot);
    if (!this.takingBulkSnap) {
    this.copyCodeToClipboard(this.getSnapshotCode(0));
    this.displayMessage(“Snapshot code copied to clipboard.”, 5000);
    }
    if (this.snapshotHistory.length > this.MAX_HISTORY_ITEMS) {
    this.snapshotHistory.pop();
    }
    this.storeHistoryAndUpdate();
    },

    removeHistoryItem: function(index) {
    if (index >= this.snapshotHistory.length) {
    return;
    }
    this.saveCurrentHistory();
    this.snapshotHistory.splice(index, 1);
    this.storeHistoryAndUpdate();
    },

    restoreHistory: function() {
    if (this.snapshotHistoryPrevious.length == 0) {
    return;
    }
    this.snapshotHistory = this.snapshotHistoryPrevious.slice(0);
    this.snapshotHistoryPrevious = [];
    this.storeHistoryAndUpdate();
    },

    storeHistoryAndUpdate: function() {
    this.storeHistory();
    this.updateSnapshots();
    },

    saveCurrentHistory: function() {
    this.snapshotHistoryPrevious = this.snapshotHistory.slice(0);
    },

    copyAllHistoryToClipboard: function() {
    var self = this;
    var count = self.noOfSnapshotsToBeCopied;
    var allCode = this.snapshotHistory.slice(0, count).map(function(snapshot, i) {
    return self.getSnapshotCode(i);
    });
    if (allCode.length > 0) {
    this.copyCodeToClipboard(allCode.join(‘\n\n’));
    this.displayMessage(this.outputMode + ” code for first ” + count + ” snapshot” + ((count > 1)? “s” : “”) + ” copied to clipboard.”, 7000);
    }
    else {
    this.displayMessage(“There isn’t any snapshot to copy.”, 4000);
    }
    },

    addChimeRoom: function() {
    var roomName = $.trim($(‘#iGraphChimeRoomName’).val()),
    url = $.trim($(‘#iGraphChimeWebhookUrl’).val());

    if (roomName !== “” && url !== “”) {
    this.chimeRooms[roomName] = { url: url };
    this.currentChimeRoomName = roomName;
    this.setChimeSelectOptions();
    this.saveChimeRoomDefinitions();
    $(‘#iGraphChimeRoomName’).val(”);
    $(‘#iGraphChimeWebhookUrl’).val(”);
    this.updateChimeRoomList();
    this.displayMessage(“Chime room has been added successfully.”, 2000);
    }
    else {
    alert(“Enter both chime room and its webhook URL.”);
    }
    },

    getUsername: function() {
    var wikiUser = $(‘.userpage’).text(),
    newWikiUser = $(‘.avatarLink’).attr(‘href’),
    portalUser = $(‘.username’).text(),
    wikiParts;

    if (wikiUser !== ”) {
    wikiParts = $.trim(wikiUser).split(‘ ‘);
    return wikiParts[wikiParts.length – 1].toLowerCase();
    } else if (newWikiUser) {
    wikiParts = $.trim(newWikiUser).split(‘/’);
    return wikiParts[wikiParts.length – 1];
    } else if (portalUser !== ”) {
    return portalUser;
    }

    return null;
    },

    handleSendToChimeClick: function(button, doPresent, doMarkdown) {
    var self = this,
    code = decodeURIComponent($(button).attr(‘data-code’)),
    selectedRoomUrl = $(‘.iGraphWikiChimeRooms’).val(),
    bold = doMarkdown ? ‘**’ : ”,
    message,
    username;

    if (selectedRoomUrl === ”) {
    if (Object.keys(self.chimeRooms).length > 0) {
    alert(‘First select a Chime room from the dropdown above’);
    } else {
    alert(‘First you must configure a Chime room webhook.’);
    self.showChimeWebhookManagerPage();
    }
    }

    if (selectedRoomUrl) {
    message = prompt(‘Enter message to accompany Chime post (emojis allowed, use @All to notify everybody)’, ”);

    if (message !== null) {
    username = self.getUsername();
    message = (doMarkdown ? ‘/md\n’ : ”) +
    (doPresent ? ‘@Present ‘ : ”) +
    (username ? bold + ‘(from: ‘ + username + ‘)’ + bold + ‘ ‘ : ”) +
    (message === ” ? code : message + ‘\n’ + code);
    GMUtils.sendMessageToChime(selectedRoomUrl, message);
    }
    }
    },

    updateSnapshots: function() {
    var self = this;
    this.getHistory();
    var history = this.snapshotHistory.map(function(snapshot, i) {
    snapshot.iGraphUrl = snapshot.iGraphUrl || ”;
    return self.getSnapshotImagePreviewHtml(i, self.getSnapshotCode(i), self.getSnapshotCode(i, ‘Chime’), self.getSnapshotCode(i, ‘ChimeMarkdown’));
    });
    $(‘.iGraphWikiSnapshotPreview’).html(history.join(‘
    ‘));
    $(‘#iGraphWikiSnapshotClear’).val(‘Clear History (‘ + history.length + ‘)’);
    $(‘.iGHsnapshotCopyCode’).click(function() {
    var code = $(this).attr(‘data-code’);
    self.displayMessage(“Snapshot code copied to clipboard”, 3000);
    self.copyCodeToClipboard(decodeURIComponent(code));
    });
    $(‘.iGHsnapshotDelete’).click(function() {
    var index = parseInt($(this).attr(‘data-index’));
    self.removeHistoryItem(index);
    });
    $(‘.iGHsnapshotSendToChime’).click(function() { self.handleSendToChimeClick(this, false, false); });
    $(‘.iGHsnapshotSendToChimePresent’).click(function() { self.handleSendToChimeClick(this, true, false); });
    $(‘.iGHsnapshotSendToChimeMarkdown’).click(function() { self.handleSendToChimeClick(this, false, true); });
    this.setSpinnerVisibility(false);
    },

    getSnapshotId: function(snapshotUrl) {
    return snapshotUrl.replace(/.*[=/]/, ”);
    },

    getSnapshotCode: function(index, outputMode) {
    var snapshot = this.snapshotHistory[index];

    outputMode = outputMode || this.outputMode;
    var iGraphAnalyzerUrl = this.getAnalyzerUrl(snapshot, outputMode),
    snapshotId = this.getSnapshotId(snapshot.snapshotUrl);

    switch (outputMode) {
    case “TT”:
    return ‘Graph Snapshot: ‘ + snapshot.snapshotUrl + ‘#TT-EMBED (Link to source graph: ‘ + snapshot.iGraphUrl + ‘).’ + iGraphAnalyzerUrl;
    case “Legacy Wiki”:
    return ‘{{iGraph/snapshotTinyMP|1=’ + snapshotId + ‘|2=’ + snapshot.iGraphUrl + iGraphAnalyzerUrl +’}}’;
    case “New Wiki”:
    if (iGraphAnalyzerUrl === “”) {
    return ‘{{transclude name=”iGraph.Snapshot” args=”f=’ + snapshotId + ‘|tiny=’ + snapshot.iGraphUrl + ‘” /}}’;
    } else {
    return ‘{{transclude name=”iGraph.Snapshot.Data” args=”f=’ + snapshotId + ‘|tiny=’ + snapshot.iGraphUrl + iGraphAnalyzerUrl + ‘” /}}’;
    }
    case “SIM”:
    return ‘Graph Snapshot: ![snapshot](‘ + snapshot.snapshotUrl + ‘) ([Link to source graph](‘ + snapshot.iGraphUrl + ‘))’ + iGraphAnalyzerUrl + ‘.’;
    case “JIRA”:
    return ‘Graph Snapshot ([Link to source graph|’ + snapshot.iGraphUrl + ‘]):\n!’+ snapshot.snapshotUrl + ‘!’;
    case “MCM”:
    return ‘[![Graph Snapshot](‘ + snapshot.snapshotUrl + ‘)](‘ + snapshot.iGraphUrl + ‘)’ + iGraphAnalyzerUrl;
    case “Chime”:
    return ‘Graph snapshot: :aries: ‘ + snapshot.snapshotUrl + ‘ – source graph :chart: ‘ + snapshot.iGraphUrl + iGraphAnalyzerUrl;
    case “ChimeMarkdown”:
    return ‘[![snapshot](‘ + snapshot.snapshotUrl + ‘)](‘ + snapshot.snapshotUrl + ‘)\n[source graph](‘ + snapshot.iGraphUrl + ‘) ‘ + iGraphAnalyzerUrl;
    case “HTML”:
    return ” +

    ‘ +

    Graph Snapshot: ‘ + snapshot.timestamp + ‘

    ‘ +


    ‘ +
    ‘ +
    ‘ +
    ‘ + iGraphAnalyzerUrl +

    ‘;
    default:
    return snapshot.snapshotUrl;
    }
    },

    getAnalyzerUrl: function(snapshot, outputMode) {
    var directLink, id;
    if (snapshot.hasSnappedData) {
    id = this.getSnapshotId(snapshot.snapshotUrl);
    directLink = ‘https://monitorportal.amazon.com/iGraphAnalyzer.html?snapshot=’ + id;

    switch (outputMode) {
    case “TT”:
    return “\n(Link to iGraphAnalyzer: ” + directLink + “).”;
    case “Legacy Wiki”:
    case “New Wiki”:
    return ” | data=” + id;
    case “SIM”:
    return ‘ ([Open with iGraphAnalyzer](‘ + directLink + ‘))’;
    case “HTML”:
    return ‘
    ‘+
    Open with iGraphAnalyzer
    ‘;
    case “Chime”:
    return ‘ – iGraph analyzer :mag: ‘ + directLink;
    case “ChimeMarkdown”:
    return ‘ [iGraph analyzer](‘ + directLink + ‘)’;
    case “MCM”:
    return ‘[(Open with iGraphAnalyzer)](‘ + directLink + ‘)’;

    default:
    return “”;
    }
    }
    return “”;
    },

    getSnapshotImagePreviewHtml: function(index, code, chimeCode, chimeMarkdownCode) {
    var snapshot = this.snapshotHistory[index];
    return ” +

    ‘ +

    ‘ +
    ‘ +
    ‘ +
    ‘ +

    ‘ +

    ‘ +
    ‘ + (index + 1) + ‘. Captured on ‘ + (snapshot.timestamp ? snapshot.timestamp : “unknown date”) + ‘‘ +

    ‘ +
    ” +

    ‘ +
    ” +

    ‘ +
    ” +
    ‘  ‘ +
    ‘  ‘ +

    ‘ +

    ‘;
    },

    setChimeSelectOptions: function() {
    var options = ‘Chime room…’,
    self = this;

    Object.keys(this.chimeRooms).sort().forEach(function(roomName) {
    var selected = roomName === self.currentChimeRoomName ? ‘selected=”selected” ‘ : ”;

    options += ” + roomName + ”;
    });

    $(‘.iGraphWikiChimeRooms’).html(options);
    $(‘.iGraphWikiChimeRooms’).change(function() {
    var optionSelected = $(“option:selected”, this);
    self.currentChimeRoomName = optionSelected.text();
    self.saveChimeRoomDefinitions();
    });
    },

    getPopupHtml: function() {
    this.addStyles();
    this.loadChimeRoomDefinitions();
    var PREVIEW = ‘

    No Snapshot History

    ‘;

    return ” +

    ‘ +

    ‘ +
    this.getOutputTypeHtml() +
    ‘ ‘ +
    ” +
    ” +
    ‘ +
    ” +
    ” +
    ” +
    ” +
    ‘ ‘ +
     ‘ +

    ‘ +

    ‘ +
    ‘<input type="submit" value=" ‘ +
    Manage chime room webhooks for iGraphHelper
    ‘ +
    Chime Room: ‘ +
    ” +
    Webhook Url: ‘ +
    ” +
    ” +

    ‘ +

    ‘ + PREVIEW + ‘

    ‘ +

    ‘ +
    ‘;
    },

    getOutputTypeHtml: function() {
    var self = this;
    var MODES = [ “Raw”, “TT”, “Legacy Wiki”, “New Wiki”, “SIM”, “JIRA”, “HTML”, “MCM” ];
    var html = ‘

      ‘;
      MODES.forEach(function(mode) {
      html += ‘

    • ‘ + mode + ‘
    • ‘;
      });
      html += ‘

    ‘;
    return html;
    },

    // Includes a Javascript a file, given by ‘url’, in the current document
    includeScript: function (url) {
    if (unsafeWin.document.body || unsafeWin.document.head) {
    var script = unsafeWin.document.createElement(‘script’);
    script.setAttribute(‘language’, ‘javascript’);
    script.setAttribute(‘type’, ‘text/javascript’);
    script.setAttribute(‘src’, url);
    (unsafeWin.document.body || unsafeWin.document.head).appendChild(script);
    }
    },

    pad: function(number){
    if (number < 10) {
    return "0" + number;
    }
    return number;
    },

    replaceRelativeWithFixedTime: function(graphArgs) {
    var time = this.getTimeRange(graphArgs);
    if (time.startTime && this.isDuration(time.startTime)) {
    var startMins = this.getDurationInMinutes(time.startTime),
    endMins = this.getDurationInMinutes(time.endTime),
    now = new Date();
    graphArgs = this.removeQueryParams(graphArgs, ["StartTime1", "EndTime1"]);
    graphArgs += '&StartTime1=' + this.getFixedTimeFromDuration(now, startMins) +
    '&EndTime1=' + this.getFixedTimeFromDuration(now, endMins);
    }
    return graphArgs;
    },

    getFixedTimeFromDuration: function(date, minutes){
    var offsetDate = new Date(date.getTime());
    offsetDate.setMinutes(date.getMinutes() – minutes);
    return this.getFixedTimeFromDate(offsetDate);
    },

    getFixedTimeFromDate: function(date){
    return date.getUTCFullYear() + "-" + this.pad(date.getUTCMonth() + 1) + "-" + this.pad(date.getUTCDate()) + "T" + this.pad(date.getUTCHours()) + ":" + this.pad(date.getUTCMinutes()) + ":00Z";
    },

    // get number of minutes corresponding to a duration
    getDurationInMinutes: function(duration){
    // sign is inverted sign widget is ago
    var sign = duration.match("-P") ? 1 : -1;
    var minutes = 0;
    for (var i = 0; i < this.ORDERED_UNITS.length; i++) {
    var index = this.ORDERED_UNITS[i];
    var results = this.PATTERN[index].exec(duration);
    if (results && results[1] !== "") {
    minutes += this.MINUTES[index] * parseInt(results[1], this.DECIMAL);
    }
    }
    return sign * minutes;
    },

    extractQueryValue: function(url, param) {
    var re = new RegExp(param + "=([^&]*)");
    if (null !== url.match(re)) {
    return decodeURIComponent(RegExp.$1);
    }
    return null;
    },

    removeQueryParams: function(url, paramList) {
    var newUrl = url;
    for (var i = 0; i < paramList.length; i++) {
    var re = new RegExp(paramList[i] + "(=|%3D)[^&]*", "gi");
    newUrl = newUrl.replace(re, "");
    }
    return newUrl;
    },

    isDuration: function(time) {
    return this.DURATION.test(time);
    },

    getTimeRange: function(graphArgs) {
    return { startTime: this.extractQueryValue(graphArgs, "StartTime1"),
    endTime: this.extractQueryValue(graphArgs, "EndTime1")};
    }
    };

    win.WikiBulkSnapshot = {

    graphUrls: [],
    snapshots: [],
    numItems: 0,
    completedSnapCount: 0,
    CART_STORAGE_KEY: "MPWcartGraphUrl",

    initialize: function() {
    WebLabTimes.waitFor(function () {
    return unsafeWindow.MPW;
    }, WikiBulkSnapshot.injectSnapshotButtonIntoCart);
    },

    injectSnapshotButtonIntoCart: function() {
    jQuery('.MPWcartButton .dummySnapButton').remove();
    jQuery('.MPWcartButton').append('’);
    jQuery(‘.iGraphSnapshotButton’).click(function(event) {
    WikiSnapshot.snapWithData = false;
    var message = “Started taking bulk snapshots…”;
    if (event.ctrlKey || event.metaKey) {
    WikiSnapshot.snapWithData = true;
    message = “Started taking bulk snapshots with data…”;
    }
    WikiSnapshot.snapshotDisplayInPopup(Lightbox.display, undefined, message, true);
    });
    },

    snapshotCartGraphs: function() {
    this.restoreState();
    var counter = 0;
    var cartGraphs = this.graphUrls;
    var timer = setInterval(function() {
    WikiSnapshot.snapshotGraphUrl(cartGraphs[counter].replace(/.*[?]/, “”), counter);
    if ( counter == cartGraphs.length-1) {
    clearInterval(timer);
    }
    counter++;
    }, 100);
    },

    onSnapshotComplete: function(snapshot, uniqueId) {
    this.snapshots[uniqueId] = snapshot;
    this.completedSnapCount++;
    WikiSnapshot.displayMessage(“Snapshotting graphs : ” + this.completedSnapCount + ” of ” + this.numItems + ” completed.”);
    if (this.completedSnapCount == this.numItems) {
    for (var i=this.snapshots.length-1; i >= 0; i–) {
    WikiSnapshot.addHistoryItem(this.snapshots[i]);
    }
    this.completedSnapCount = 0;
    this.snapshots = [];
    WikiSnapshot.noOfSnapshotsToBeCopied = this.numItems;
    WikiSnapshot.copyAllHistoryToClipboard();
    }
    },

    restoreState: function() {
    if (localStorage && localStorage.getItem(this.CART_STORAGE_KEY)) {
    this.graphUrls = JSON.parse(localStorage.getItem(this.CART_STORAGE_KEY));
    this.numItems = this.graphUrls.length;
    }
    },

    storeState: function() {
    if (localStorage) {
    localStorage.setItem(this.CART_STORAGE_KEY, JSON.stringify(this.graphUrls));
    }
    },
    };
    });

    Drag/drop or double click
    graphs here for merging.