From f4e362702b070e41f20bdbf00aab3174bce66817 Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Thu, 8 Mar 2018 20:03:36 +0530 Subject: [PATCH 01/49] Backup for emergency --- interface/admin.py | 11 +- interface/forms.py | 60 +-- interface/models.py | 224 +++++---- interface/views.py | 809 ++++++------------------------- templates/add_cquestion.html | 110 ----- templates/add_cquestion_old.html | 102 ---- templates/add_mcquestion.html | 110 ----- templates/add_question.html | 62 +++ templates/add_question.js | 162 +++++++ templates/dashboard.html | 20 +- templates/home.html | 2 +- templates/showquestions.html | 74 +++ yaksh/urls.py | 40 +- 13 files changed, 595 insertions(+), 1191 deletions(-) delete mode 100644 templates/add_cquestion.html delete mode 100644 templates/add_cquestion_old.html delete mode 100644 templates/add_mcquestion.html create mode 100644 templates/add_question.html create mode 100644 templates/add_question.js create mode 100644 templates/showquestions.html diff --git a/interface/admin.py b/interface/admin.py index adb5ef4..383492c 100644 --- a/interface/admin.py +++ b/interface/admin.py @@ -1,13 +1,8 @@ from django.contrib import admin -from interface.models import Question, MultipleChoiceQuestion, CodeQuestion, Choice, TestCase, Rating, Review, Input, Output +from interface.models import (Question, TestCase, StdIOBasedTestCase, + Rating, Review) admin.site.register( Question) -admin.site.register( MultipleChoiceQuestion) -admin.site.register( CodeQuestion) -admin.site.register( Choice) admin.site.register( TestCase) admin.site.register( Rating) -admin.site.register( Review) -admin.site.register( Input) -admin.site.register( Output) - +admin.site.register( Review) diff --git a/interface/forms.py b/interface/forms.py index 508306d..48684eb 100644 --- a/interface/forms.py +++ b/interface/forms.py @@ -1,5 +1,5 @@ from django import forms -from models import * +from interface.models import * from django.contrib.auth.models import User from django.utils.translation import ugettext_lazy as _ class RegistrationForm(forms.Form): @@ -21,56 +21,10 @@ def clean(self): raise forms.ValidationError(_("The two password fields did not match.")) return self.cleaned_data -class MultipleChoiceQuestionForm(forms.ModelForm): - class Meta: - model = MultipleChoiceQuestion - fields = [ - "title", - "text", - "language", - "marks", - "status", - "no_of_inputs", - ] +class QuestionForm(forms.ModelForm): + """Creates a form to add or edit a Question. + It has the related fields and functions required.""" -class CodeQuestionForm(forms.ModelForm): - class Meta: - model = CodeQuestion - fields = [ - "title", - "text", - "language", - "marks", - "status", - "function_name", - ] - -class InputForm(forms.ModelForm): - class Meta: - model = Input - fields = [ - "_type", - "value", - ] - - -class OutputForm(forms.ModelForm): - class Meta: - model = Output - fields = [ - "_type", - "value", - ] - - - - -'''class TestCaseForm(forms.ModelForm): - class Meta: - model = TestCase - fields = [ - "no_of_inputs", - "no_of_outputs", - - ]''' - + class Meta: + model = Question + exclude = ['user', "type", "language", "status"] diff --git a/interface/models.py b/interface/models.py index 06eea42..83836f2 100644 --- a/interface/models.py +++ b/interface/models.py @@ -1,28 +1,7 @@ from __future__ import unicode_literals from django.contrib.auth.models import User from django.db import models - -language = ( - ("python", "Python"), - ("bash", "Bash"), - ("c", "C Language"), - ("cpp", "C++ Language"), - ("java", "Java Language"), - ("scilab", "Scilab"), - ) - - -question_types = ( - ("mcq", "Multiple Choice"), - ("mcc", "Multiple Correct Choices"), - ("code", "Code"), - ) - -test_case_types = ( - ("standardtestcase", "Standard Testcase"), - ("stdoutbasedtestcase", "Stdout Based Testcase"), - ("mcqtestcase", "MCQ Testcase"), - ) +import json question_status_choice = ( (1, "approved"), @@ -31,10 +10,10 @@ ) level = ( - (1, "easy"), - (2, "medium"), - (3, "difficult"), - ) + (1, "easy"), + (2, "medium"), + (3, "difficult"), + ) rating_choice = ( (1, "Poor"), @@ -42,102 +21,121 @@ (3, "Good"), (4, "Verygood"), (5, "Excellent"), - ) + ) types = ( - (1, "integer"), - (2, "float"), - (3, "string"), - (4, "boolean"), - ) + (1, "integer"), + (2, "float"), + (3, "string"), + (4, "boolean"), + ) + +originality = ( + ("original", "Original Question"), + ("adapted", "Adapted Question"), + ) + class Question(models.Model): - title = models.CharField(max_length=50, default="") - text = models.TextField(default="") - language = models.CharField(max_length=24, choices=language, default='python') - marks = models.IntegerField(default=0) - status = models.IntegerField(default=0, choices=question_status_choice) - user = models.ForeignKey(User,default=0) - avg_rating=models.IntegerField(default=0) - - def __str__(self): - return self.text - - def approve(self): - self.status=1 - - def disapprove(self): - self.status=0 - -class MultipleChoiceQuestion(Question): - no_of_inputs = models.IntegerField(default=4) - - def __str__(self): - return self.text - -class Choice(models.Model): - text = models.TextField(default='') - question = models.ForeignKey(MultipleChoiceQuestion) - correct = models.BooleanField(default=False) - + """Question for a quiz.""" + + # A one-line summary of the question. + summary = models.CharField(max_length=256) + + # The question text, should be valid HTML. + description = models.TextField() + + # Number of points for the question. + points = models.FloatField(default=1.0) + + # The language for question. + language = models.CharField(max_length=24, + default="python") + + # The type of question. + type = models.CharField(max_length=24, default="code") + + # user for particular question + user = models.ForeignKey(User, related_name="user") + + # solution for question + solution = models.TextField() + + # If the question is cited + citation = models.TextField(null=False) + + # originality of the question + originality = models.CharField(max_length=24, choices=originality, default="original") + + #status of question + status = models.BooleanField(default=False) + def __str__(self): - return self.text + return self.summary + + def _get_test_cases(self): + tc_list = [tc.stdiobasedtestcase for tc in TestCase.objects.filter(question=self)] + return tc_list + + def consolidate_answer_data(self, user_answer, user=None): + question_data = {} + metadata = {} + test_case_data = [] + + test_cases = self._get_test_cases() + for test in test_cases: + test_case_as_dict = test.get_field_value() + test_case_data.append(test_case_as_dict) -class CodeQuestion(Question): - function_name = models.CharField(max_length=100, default=None) - - def __str__(self): - return str(self.text) + question_data['test_case_data'] = test_case_data + metadata['user_answer'] = user_answer + metadata['language'] = self.language + metadata['partial_grading'] = False + question_data['metadata'] = metadata + return json.dumps(question_data) class TestCase(models.Model): - - no_of_inputs = models.IntegerField() - no_of_outputs = models.IntegerField() - question = models.ForeignKey(CodeQuestion) - - - def __str__(self): - return str(self.id) - + question = models.ForeignKey(Question, blank=True, null=True) + type = models.CharField(max_length=24, default="stdiobasedtestcase") + +class StdIOBasedTestCase(TestCase): + expected_input = models.TextField(default=None, blank=True, null=True) + expected_output = models.TextField(default=None) + + def get_field_value(self): + return {"test_case_type": "stdiobasedtestcase", + "expected_output": self.expected_output, + "expected_input": self.expected_input, + "weight": 1 + } + + def __str__(self): + return u'StdIO Based Testcase | Exp. Output: {0} | Exp. Input: {1}'.\ + format( + self.expected_output, self.expected_input + ) + class Rating(models.Model): - user = models.ForeignKey(User) - question = models.ForeignKey(Question) - rate = models.IntegerField(default=3, choices=rating_choice) - - def __str__(self): - return str(self.user) - - class Meta: - unique_together = ('user', 'question',) + user = models.ForeignKey(User) + question = models.ForeignKey(Question) + rate = models.IntegerField(default=3, choices=rating_choice) + + def __str__(self): + return str(self.user) + + class Meta: + unique_together = ('user', 'question',) class Review(models.Model): - reviewer = models.ForeignKey(User) - question = models.ForeignKey(Question) - comments = models.CharField(max_length=24, choices=level) - - def __str__(self): - return str(self.reviewer) - - def update_review(self,new_comments): - self.comments=new_comments - #class Meta: - # unique_together = ('reviewer', 'question',) - - - -class Input(models.Model): - _type = models.CharField(max_length=24, choices=types) - value = models.CharField(max_length=24) - test_cases = models.ForeignKey('TestCase') - - def __str__(self): - return str(self._type) +"+"+ str(self.value) - -class Output(models.Model): - _type = models.CharField(max_length=24, choices=types) - value = models.CharField(max_length=24) - test_cases = models.ForeignKey('TestCase') - - def __str__(self): - return str(self._type) +"+"+ str(self.value) + reviewer = models.ForeignKey(User) + question = models.ForeignKey(Question) + comments = models.CharField(max_length=24, choices=level) + + def __str__(self): + return str(self.reviewer) + + def update_review(self,new_comments): + self.comments=new_comments + #class Meta: + # unique_together = ('reviewer', 'question',) diff --git a/interface/views.py b/interface/views.py index e48366e..aacd5a5 100644 --- a/interface/views.py +++ b/interface/views.py @@ -1,7 +1,9 @@ -from interface.models import Question, MultipleChoiceQuestion, CodeQuestion, Choice, TestCase, Rating, Review, Input, Output +from interface.models import (Question, TestCase, StdIOBasedTestCase, + Rating, Review) from django.shortcuts import render,get_object_or_404 -from django.http import HttpResponse,HttpResponseRedirect -from forms import * +from django.http import HttpResponse,HttpResponseRedirect, JsonResponse +from interface.forms import * +from django.forms.models import inlineformset_factory from django.core.urlresolvers import reverse from django.contrib.auth.decorators import login_required from django.contrib.auth import logout,login @@ -9,14 +11,17 @@ from django.shortcuts import render_to_response from django.template import RequestContext from random import choice +from urllib.parse import urljoin +import requests +import json def show_home(request): - - if request.user.is_authenticated(): - return HttpResponseRedirect(reverse('next_login')) - else: - return render(request, 'home.html', {'type':'guest'}) - + + if request.user.is_authenticated(): + return HttpResponseRedirect(reverse('next_login')) + else: + return render(request, 'home.html', {'type':'guest'}) + def register(request): if request.method == 'POST': form = RegistrationForm(request.POST) @@ -38,660 +43,146 @@ def register_success(request): def logout_page(request): logout(request) - return HttpResponseRedirect(reverse('login')) - -def show_questions_stu(request): - if request.user.is_authenticated(): - groups = request.user.groups.values_list('name', flat=True) - if ('admin' in groups or 'moderator' in groups): - return HttpResponseRedirect(reverse('next_login')) - else: - questions = Question.objects.all() - context = { - "questions" : questions, - } - return render(request, "display_questions.html", context) - else: - return HttpResponseRedirect(reverse('login')) - -def show_questions_mod_mcq(request): - - if request.user.is_authenticated(): - - groups = request.user.groups.values_list('name', flat=True) - if ('admin' in groups or 'moderator' in groups): - questions = MultipleChoiceQuestion.objects.filter(status=0).order_by('-avg_rating') - context = { - "title" : "Unapproved Multiple Choice Questions", - "questions" : questions, - } - return render(request, "display_questions_mod.html", context) - else: - return HttpResponseRedirect(reverse('next_login')) - else: - return HttpResponseRedirect(reverse('login')) - -def show_questions_mod_approved_mcq(request): - - if request.user.is_authenticated(): - - groups = request.user.groups.values_list('name', flat=True) - if ('admin' in groups or 'moderator' in groups): - questions = MultipleChoiceQuestion.objects.filter(status=1).order_by('-avg_rating') - context = { - "title" : "Approved Multiple Choice Questions", - "questions" : questions, - } - return render(request, "display_questions_mod.html", context) - else: - return HttpResponseRedirect(reverse('next_login')) - else: - return HttpResponseRedirect(reverse('login')) - -def show_questions_mod_all(request): - - if request.user.is_authenticated(): - - groups = request.user.groups.values_list('name', flat=True) - if ('admin' in groups or 'moderator' in groups): - questions = Question.objects.all().order_by('-avg_rating') - context = { - "title" : "All Questions", - "questions" : questions, - } - return render(request, "display_questions_mod.html", context) - else: - return HttpResponseRedirect(reverse('next_login')) - else: - return HttpResponseRedirect(reverse('login')) - -def show_questions_mod_cq(request): - - if request.user.is_authenticated(): - - groups = request.user.groups.values_list('name', flat=True) - if ('admin' in groups or 'moderator' in groups): - questions = CodeQuestion.objects.filter(status=0).order_by('-avg_rating') - context = { - "title" : "Unapproved Code Questions", - "questions" : questions, - } - return render(request, "display_questions_mod.html", context) - else: - return HttpResponseRedirect(reverse('next_login')) - else: - return HttpResponseRedirect(reverse('login')) - -def show_questions_mod_approved_cq(request): - - if request.user.is_authenticated(): - - groups = request.user.groups.values_list('name', flat=True) - if ('admin' in groups or 'moderator' in groups): - questions = CodeQuestion.objects.filter(status=1).order_by('-avg_rating') - context = { - "title" : "Approved Code Questions", - "questions" : questions, - } - return render(request, "display_questions_mod.html", context) - else: - return HttpResponseRedirect(reverse('next_login')) - else: - return HttpResponseRedirect(reverse('login')) - - -def base(request): - - return render(request,'navigation.html') - -def add_mcquestion(request): - - if request.user.is_authenticated(): - groups = request.user.groups.values_list('name', flat=True) - if ('admin' in groups or 'moderator' in groups): - return HttpResponseRedirect(reverse('next_login')) - if request.POST: - form = MultipleChoiceQuestionForm(request.POST) - if form.is_valid(): - instance = form.save() - instance.user=request.user - instance.save() - else: - return render(request, "add_mcquestion.html", {"form": form }) - - no_of_inputs = request.POST.get('no_of_inputs') - - for i in range(1, int(no_of_inputs)+1): - choice_text = request.POST.get('choice'+ str(i)) - choice_correct = request.POST.get('correct'+ str(i)) - if (choice_correct==None): - choice_correct = False - new_choice = Choice(text=choice_text, question=instance, correct=choice_correct); - new_choice.save() - - return HttpResponseRedirect(reverse('add_cq')) - else: - form = MultipleChoiceQuestionForm() - return render(request, "add_mcquestion.html", {"form": form }) - else: - return HttpResponseRedirect(reverse('login')) - -def add_cquestion(request): - - if request.user.is_authenticated(): - if request.POST: - groups = request.user.groups.values_list('name', flat=True) - if ('admin' in groups or 'moderator' in groups): - return HttpResponseRedirect(reverse('mod_show')) - form = CodeQuestionForm(request.POST) - if form.is_valid(): - instance = form.save() - instance.user = request.user - instance.save() - else: - return render(request, "add_cquestion.html", {"form": form }) - no_of_testcases = request.POST.get('no_of_testcases') - - inputs = request.POST.get('no_of_inputs') - outputs = request.POST.get('no_of_outputs') - for i in range(1, int(no_of_testcases)+1): - testcase = TestCase(no_of_inputs=inputs, no_of_outputs=outputs, question=instance) - testcase.save() - for j in range(1,int(inputs)+1): - ts_type = request.POST.get('testcase'+str(i)+'_input_'+str(j)+'_type') - ts_value = request.POST.get('testcase'+str(i)+'_input_'+str(j)+'_value') - input_instance = Input(_type=ts_type, value=ts_value, test_cases=testcase) - input_instance.save() - - for j in range(1,int(outputs)+1): - ts_type = request.POST.get('testcase'+str(i)+'_output_'+str(j)+'_type') - ts_value = request.POST.get('testcase'+str(i)+'_output_'+str(j)+'_value') - output_instance =Output(_type=ts_type, value=ts_value, test_cases=testcase) - output_instance.save() - - return render(request,'notice.html',{'notice':"Thank you for your contribution."}) - else: - form = CodeQuestionForm() - return render(request, "add_cquestion.html", {"form": form}) - else: - return HttpResponseRedirect(reverse('login')) + return HttpResponseRedirect(reverse('login')) +@login_required def next_login(request): - if request.user.is_authenticated(): - groups = request.user.groups.values_list('name', flat=True) - if ('admin' in groups or 'moderator' in groups): - return render(request, 'dashboard.html', {'type':'moderator', "name":request.user}) - else: - return render(request, 'dashboard.html', {'type':'user', "name":request.user}) - else: - return render(request, 'home.html', {'type':'guest'}) - - -def approve_questions(request,id=None): - - question = get_object_or_404(Question,pk=id) - questions = Question.objects.filter(id=id) - ratings_empty = True - reviews_empty = True - result_set = [] - for ques in questions: - ratings = Rating.objects.filter(question=ques) - question_dict = { - "Question" : ques, - "Ratings" : ratings, - } - result_set.append(question_dict) - if (ratings): - ratings_empty = False - questions = Question.objects.filter(id=id) - - result_set2 = [] - for ques in questions: - reviews = Review.objects.filter(question=ques) - question_dict = { - "Question" : ques, - "Reviews" : reviews} - result_set2.append(question_dict) - if (reviews): - reviews_empty=False - - questions = MultipleChoiceQuestion.objects.filter(id=id) - result_set3 = [] - for ques in questions: - choices = Choice.objects.filter(question=ques) - question_dict = { - "Question" : ques, - "Choices" : choices, - } - result_set3.append(question_dict) - - questions = CodeQuestion.objects.filter(id=id) - result_set4 = [] - for ques in questions: - testcases = TestCase.objects.filter(question=ques) - each_test = [] - for each_testcase in testcases: - inputs = Input.objects.filter(test_cases=each_testcase) - outputs = Output.objects.filter(test_cases=each_testcase) - testcase = { - "input":inputs, - "output":outputs, - } - each_test.append(testcase) - question_dict = { - "Question" : ques, - "Testcases" : each_test, - } - - result_set4.append(question_dict) - context = { - - "question_ratings" : result_set, - "question_reviews" : result_set2, - "question_choices" : result_set3, - "question_testcases" : result_set4, - 'question' : question, - 'ratings_empty':ratings_empty, - 'reviews_empty':reviews_empty, - } - - return render(request, "moderator.html", context) - -def approve_questions_accept(request,id=None): - - question = get_object_or_404(Question,pk=id) - if question.status==1: - question.status=0 - else: - question.approve() - question.save() - return HttpResponseRedirect("../") - -def show_reviews(request): - - questions = Question.objects.all() - result_set = [] - for ques in questions: - reviews = Review.objects.filter(question=ques) - question_dict = { - "Question" : ques, - "Reviews" : reviews, - } - result_set.append(question_dict) - context = { - "question_reviews" : result_set, - } - return render(request, "display_review.html", context) - -def show_ratings(request): - - questions = Question.objects.all() - result_set = [] - for ques in questions: - ratings = Rating.objects.filter(question=ques) - question_dict = { - "Question" : ques, - "Ratings" : ratings, - } - result_set.append(question_dict) - context = { - "question_ratings" : result_set, - } - - return render(request, "display_rating.html", context) - -def add_comment(request,id): - - question = get_object_or_404(Question,pk=id) - questions = Question.objects.filter(id=id) - ratings_empty=True - reviews_empty=True - result_set = [] - for ques in questions: - reviews = Review.objects.filter(question=ques) - question_dict = { - "Question" : ques, - "Reviews" : reviews, - } - result_set.append(question_dict) - if (reviews): - reviews_empty=False - - questions = Question.objects.filter(id=id) - result_set2 = [] - for ques in questions: - ratings = Rating.objects.filter(question=ques) - question_dict = { - "Question" : ques, - "Ratings" : ratings, - } - result_set2.append(question_dict) - if (ratings): - ratings_empty=False - questions = MultipleChoiceQuestion.objects.filter(id=id) - result_set3 = [] - for ques in questions: - choices = Choice.objects.filter(question=ques) - question_dict = { - "Question" : ques, - "Choices" : choices, - } - result_set3.append(question_dict) - - questions = CodeQuestion.objects.filter(id=id) - result_set4 = [] - for ques in questions: - testcases = TestCase.objects.filter(question=ques) - each_test = [] - for each_testcase in testcases: - inputs = Input.objects.filter(test_cases=each_testcase) - outputs = Output.objects.filter(test_cases=each_testcase) - testcase = { - "input":inputs, - "output":outputs, - } - each_test.append(testcase) - question_dict = { - "Question" : ques, - "Testcases" : each_test, - } - - result_set4.append(question_dict) - - context = { - - "question_reviews" : result_set, - "question_ratings" : result_set2, - "question_choices" : result_set3, - "question_testcases" : result_set4, - 'question' : question , - 'ratings_empty':ratings_empty, - 'reviews_empty':reviews_empty, - } - - - return render(request,'student.html', context) - -def post_comment(request,id): - - if request.POST and request.user.is_authenticated(): - comment = request.POST.get("content") - rating = request.POST.get("rating") - user_type=request.POST.get("type") - rate_type=request.POST.get("rate_type") - user=request.user.id - question = get_object_or_404(Question,pk=id) - if (user_type=='moderator'): - instance = Review(reviewer_id=user, question=question, comments=comment) - instance.save() - return HttpResponseRedirect("../") - try: - instance = get_object_or_404(Review, reviewer=user, question=id) - return render(request,'notice.html',{'notice':"Sorry ! You have already commented on this question.
Go back"}) - - except Exception, e: - try: - instance = get_object_or_404(Rating, user=user, question=id) - return render(request,'notice.html',{'notice':"Sorry ! You have already rated this question.
Go back"}) - except Exception, e: - - instance = Rating(user_id=user, question=question, rate=rating) - instance.save() - instance = Review(reviewer_id=user, question=question, comments=comment) - instance.save() - if (rate_type=='rate_mcq'): - return HttpResponseRedirect(reverse('rate_cq')) - elif (rate_type=='rate_cq'): - return HttpResponseRedirect(reverse('add_mcq')) - return render(request,'notice.html', {'notice':"Thank you ! You have rated this question.
Go back"}) - - - else: - return HttpResponseRedirect("../") - -def rate_post(request): - - if request.POST and request.user.is_authenticated(): - id = request.POST.get("id") - comment = request.POST.get("content") - rating = request.POST.get("rating") - user_type = request.POST.get("type") - rate_type = request.POST.get("rate_type") - user = request.user.id - try: - instance = get_object_or_404(Review, reviewer=user,question=id) - return render(request,'notice.html',{'notice':"Sorry ! You have already commented on this question.
Go back"}) - - except Exception, e: - try: - instance = get_object_or_404(Rating, user=user,question=id) - return render(request,'notice.html',{'notice':"Sorry ! You have already rated this question.
Go back"}) - except Exception, e: - question = get_object_or_404(Question,pk=id) - if (user_type!='moderator'): - instance = Rating(user_id=user,question=question,rate=rating) - instance.save() - - total_rating = 0 - count = 0 - for rating in Rating.objects.filter(question=question): - count+=1 - total_rating+=rating.rate - if (count>0): - question.avg_rating = (total_rating/count) - else: - question.avg_rating = 0 - question.save() - - instance = Review(reviewer_id=user, question=question, comments=comment) - instance.save() - if (rate_type=='rate_mcq'): - return HttpResponseRedirect(reverse('rate_cq')) - elif (rate_type=='rate_cq'): - return HttpResponseRedirect(reverse('add_mcq')) - return render(request,'notice.html',{'notice':"Thank you ! You have rated this question.
Go back"}) - - else: - return HttpResponseRedirect("../") - -def rate_mcq(request): - - if request.user.is_authenticated(): - groups=request.user.groups.values_list('name',flat=True) - if ('admin' in groups or 'moderator' in groups): - return HttpResponseRedirect(reverse('home')) - else: - questions = MultipleChoiceQuestion.objects.all() - flag = False - ratings_empty = True - reviews_empty = True - for each in questions: - try: - get_object_or_404(Rating,user=request.user,question=each) - except Exception: - flag=True - break - if flag==True: - while True: - random_que = choice(questions) - try: - get_object_or_404(Rating, user=request.user, question=random_que) - except Exception: - break - id = random_que.id - question = get_object_or_404(Question, pk=id) - questions = Question.objects.filter(id=id) - result_set = [] - for ques in questions: - reviews = Review.objects.filter(question=ques) - question_dict = { - "Question" : ques, - "Reviews" : reviews, - } - if (reviews): - reviews_empty=False - result_set.append(question_dict) - - - questions = Question.objects.filter(id=id) - result_set2 = [] - for ques in questions: - ratings = Rating.objects.filter(question=ques) - question_dict = { - "Question" : ques, - "Ratings" : ratings, - } - if (ratings): - ratings_empty=False - result_set2.append(question_dict) - - questions = MultipleChoiceQuestion.objects.filter(id=id) - result_set3 = [] - for ques in questions: - choices = Choice.objects.filter(question=ques) - question_dict = { - "Question" : ques, - "Choices" : choices, - } - result_set3.append(question_dict) - - questions = CodeQuestion.objects.filter(id=id) - result_set4 = [] - for ques in questions: - testcases = TestCase.objects.filter(question=ques) - each_test = [] - for each_testcase in testcases: - inputs = Input.objects.filter(test_cases=each_testcase) - outputs = Output.objects.filter(test_cases=each_testcase) - testcase = { - "input":inputs, - "output":outputs, - } - each_test.append(testcase) - question_dict = { - "Question" : ques, - "Testcases" : each_test, - } - - result_set4.append(question_dict) - - context = { - - "question_reviews" : result_set, - "question_ratings" : result_set2, - "question_choices" : result_set3, - "question_testcases" : result_set4, - 'question' : question , - 'rate_type' : 'rate_mcq', - 'ratings_empty':ratings_empty, - 'reviews_empty':reviews_empty, - } - - return render(request,'student.html', context) - else: - #return render(request,'notice.html',{'notice':"Thank you ! You have already rated all questions.
Next"}) - return HttpResponseRedirect(reverse('rate_cq')) - else: - return render(request, 'home.html',{'type':'guest'}) - -def rate_cq(request): - - if request.user.is_authenticated(): - groups = request.user.groups.values_list('name', flat=True) - if ('admin' in groups or 'moderator' in groups): - return HttpResponseRedirect(reverse('home')) - else: - questions = CodeQuestion.objects.all() - flag = False; - ratings_empty = True - reviews_empty = True - for each in questions: - try: - get_object_or_404(Rating, user=request.user, question=each) - except Exception: - flag = True - break - if flag==True: - while True: - random_que = choice(questions) - try: - get_object_or_404(Rating, user=request.user, question=random_que) - except Exception: - break - id = random_que.id - question = get_object_or_404(Question,pk=id) - questions = Question.objects.filter(id=id) - result_set = [] - for ques in questions: - reviews = Review.objects.filter(question=ques) - question_dict = { - "Question" : ques, - "Reviews" : reviews, - } - if (reviews): - reviews_empty=False - result_set.append(question_dict) - - - questions = Question.objects.filter(id=id) - result_set2 = [] - for ques in questions: - ratings = Rating.objects.filter(question=ques) - question_dict = { - "Question" : ques, - "Ratings" : ratings, - } - if (ratings): - ratings_empty=False - result_set2.append(question_dict) - - questions = MultipleChoiceQuestion.objects.filter(id=id) - result_set3 = [] - for ques in questions: - choices = Choice.objects.filter(question=ques) - question_dict = { - "Question" : ques, - "Choices" : choices, - } - result_set3.append(question_dict) + if request.user.is_authenticated(): + groups = request.user.groups.values_list('name', flat=True) + if ('admin' in groups or 'moderator' in groups): + return render(request, 'dashboard.html', {'type':'moderator', "name":request.user}) + else: + return render(request, 'dashboard.html', {'type':'user', "name":request.user}) + else: + return render(request, 'home.html', {'type':'guest'}) - questions = CodeQuestion.objects.filter(id=id) - result_set4 = [] - for ques in questions: - testcases = TestCase.objects.filter(question=ques) - each_test = [] - for each_testcase in testcases: - inputs = Input.objects.filter(test_cases=each_testcase) - outputs = Output.objects.filter(test_cases=each_testcase) - testcase = { - "input":inputs, - "output":outputs, - } - each_test.append(testcase) - question_dict = { - "Question" : ques, - "Testcases" : each_test, - } - - result_set4.append(question_dict) - - context = { +@login_required +def show_all_questions(request): + """Show a list of all the questions currently in the database.""" - "question_reviews" : result_set, - "question_ratings" : result_set2, - "question_choices" : result_set3, - "question_testcases" : result_set4, - 'question' : question , - 'rate_type' : 'rate_cq', - 'ratings_empty':ratings_empty, - 'reviews_empty':reviews_empty, + user = request.user + ci = RequestContext(request) + context = {} + if request.method == 'POST': + if request.POST.get('delete') == 'delete': + data = request.POST.getlist('question') + if data is not None: + questions = Question.objects.filter(id__in=data, + user_id=user.id + ) + for question in questions: + question.delete() + questions = Question.objects.filter(user_id=user.id) + count = questions.count() + remaining = 5-count + context['questions'] = questions + context['remaining'] = remaining + return render(request, "showquestions.html", context) + +@login_required +def add_question(request, question_id=None): + user = request.user + ci = RequestContext(request) + test_case_type = "stdiobasedtestcase" + solution_error, tc_error = [], [] + if Question.objects.filter(user=user).count()>5: + print("count") + return HttpResponseRedirect(reverse('show_all_questions')) + + if question_id is None: + question = Question(user=user) + question.save() + else: + question = Question.objects.get(id=question_id) - } + if request.method == 'POST': + qform = QuestionForm(request.POST, instance=question) + formsets = [] + for testcase in TestCase.__subclasses__(): + formset = inlineformset_factory(Question, testcase, extra=0, + fields='__all__') + formsets.append(formset( + request.POST, instance=question + ) + ) + if qform.is_valid(): + question = qform.save(commit=False) + question.user = user + question.save() + # many-to-many field save function used to save the tags + for formset in formsets: + if formset.is_valid(): + formset.save() + result = submit_to_code_server(question.id) + if result.get("success"): + question.status = True + question.save() + else: + question.status = False + question.save() + errors = result.get("error") + for error in errors: + if error.get("type") == "assertion": + solution_error.append(error) + else: + tc_error.append(error) + test_case_type = request.POST.get('case_type', None) + else: + context = { + 'qform': qform, + 'question': question, + 'formsets': formsets, + "solution_error": solution_error, + "tc_error": tc_error + } + return render_to_response( + "add_question.html", context, context_instance=ci + ) - return render(request,'student.html', context) - else: - #return render(request,'notice.html',{'notice':"Thank you ! You have already rated all questions.
next_login"}) - return HttpResponseRedirect(reverse('add_mcq')) - else: - return render(request, 'home.html',{'type':'guest'}) \ No newline at end of file + qform = QuestionForm(instance=question) + formsets = [] + for testcase in TestCase.__subclasses__(): + if test_case_type == testcase.__name__.lower(): + formset = inlineformset_factory( + Question, testcase, extra=1, fields='__all__' + ) + else: + formset = inlineformset_factory( + Question, testcase, extra=0, fields='__all__' + ) + formsets.append( + formset( + instance=question, + initial=[{'type': test_case_type}] + ) + ) + context = {'qform': qform, 'question': question, + 'formsets': formsets, "solution_error":solution_error, + "tc_error": tc_error} + return render_to_response( + "add_question.html", context, context_instance=ci + ) + +def submit_to_code_server(question_id): + """Check if question solution and testcases are correct.""" + + question = Question.objects.get(id=question_id) + consolidate_answer = question.consolidate_answer_data(question.solution) + url = "http://localhost:55555" + uid = "fellowship" + str(question_id) + status = False + submit = requests.post(url, data=dict(uid=uid, json_data=consolidate_answer, user_dir="/home/mahesh")) + while not status: + result_state = get_result(url, uid) + stat = result_state.get("status") + if stat == "done": + status = True + result = json.loads(result_state.get('result')) + return result + + +def get_result(url, uid): + response = json.loads(requests.get(urljoin(url, uid)).text) + return response + \ No newline at end of file diff --git a/templates/add_cquestion.html b/templates/add_cquestion.html deleted file mode 100644 index 67929b8..0000000 --- a/templates/add_cquestion.html +++ /dev/null @@ -1,110 +0,0 @@ -{% extends "navigation.html" %} -{% block navbar %} -
  • Home
  • -
  • Contribution
  • -
  • Logout
  • - {% endblock %} -{% block content %} -
    - -

    Add Code Question

    - - {{ form.as_table }} - - - - - -
    No of inputs:
    No of outpus:
    No of test cases:
    - {% csrf_token %} -
    - - - - - - -{% endblock %} \ No newline at end of file diff --git a/templates/add_cquestion_old.html b/templates/add_cquestion_old.html deleted file mode 100644 index 851c4b2..0000000 --- a/templates/add_cquestion_old.html +++ /dev/null @@ -1,102 +0,0 @@ -{% extends "navigation.html" %} -{% block navbar %} -
  • Home
  • -
  • Contribution
  • -
  • Logout
  • - {% endblock %} -{% block content %} -
    - -

    Add Code Question

    - - {{ form.as_table }} - - - -
    No of test cases:
    - {% csrf_token %} -
    - - - - - - -{% endblock %} \ No newline at end of file diff --git a/templates/add_mcquestion.html b/templates/add_mcquestion.html deleted file mode 100644 index e2a20b1..0000000 --- a/templates/add_mcquestion.html +++ /dev/null @@ -1,110 +0,0 @@ -{% extends "navigation.html" %} -{% block navbar %} -
  • Home
  • -
  • Contribution
  • -
  • Logout
  • - {% endblock %} -{% block content %} - -
    -

    Add Multiple Choice Question

    - - {{form.as_table}} -
    - - - -
    - -


    - {% csrf_token %} - -       - -
    - - - {% endblock %} - - - diff --git a/templates/add_question.html b/templates/add_question.html new file mode 100644 index 0000000..a8b8b8e --- /dev/null +++ b/templates/add_question.html @@ -0,0 +1,62 @@ +{% extends "navigation.html" %} +{% block script %} + +
    + {% csrf_token %} +
    +
    Summary: {{ qform.summary }}{{ qform.summary.errors }} +
    Points:{{qform.points }}{{ qform.points.errors }} +
    Rendered:

    +
    Description: {{ qform.description}} {{qform.description.errors}} +
    Rendered Solution:

    +
    Solution: {{ qform.solution }}{{qform.solution.errors}} +
    Citation: {{ qform.citation }}{{qform.citations.errors}} +
    Originality: {{ qform.originality }} {{qform.citations.errors}} +
    + {% for formset in formsets %} +
    + {{ formset.management_form }} + + {% for form in formset %} + + {% endfor %} + +
    + {% endfor %} +

    +
    + + +
    +
    +{% endblock %} diff --git a/templates/add_question.js b/templates/add_question.js new file mode 100644 index 0000000..346991a --- /dev/null +++ b/templates/add_question.js @@ -0,0 +1,162 @@ +function increase(frm) +{ + if(frm.points.value == "") + { + frm.points.value = "0.5"; + return; + } + frm.points.value = parseFloat(frm.points.value) + 0.5; +} + +function decrease(frm) +{ + if(frm.points.value > 0) + { + frm.points.value = parseFloat(frm.points.value) - 0.5; + } + else + { + frm.points.value=0; + } + + +} + +function setSelectionRange(input, selectionStart, selectionEnd) +{ + if (input.setSelectionRange) + { + input.focus(); + input.setSelectionRange(selectionStart, selectionEnd); + } + else if (input.createTextRange) + { + var range = input.createTextRange(); + range.collapse(true); + range.moveEnd('character', selectionEnd); + range.moveStart('character', selectionStart); + range.select(); + } +} + +function replaceSelection (input, replaceString) +{ + if (input.setSelectionRange) + { + var selectionStart = input.selectionStart; + var selectionEnd = input.selectionEnd; + input.value = input.value.substring(0, selectionStart)+ replaceString + input.value.substring(selectionEnd); + if (selectionStart != selectionEnd) + { + setSelectionRange(input, selectionStart, selectionStart + replaceString.length); + } + else + { + setSelectionRange(input, selectionStart + replaceString.length, selectionStart + replaceString.length); + } + } + else if (document.selection) + { + var range = document.selection.createRange(); + if (range.parentElement() == input) + { + var isCollapsed = range.text == ''; + range.text = replaceString; + if (!isCollapsed) + { + range.moveStart('character', -replaceString.length); + range.select(); + } + } + } +} + +function textareaformat() +{ + document.getElementById('id_type').setAttribute('class','select-type'); + document.getElementById('id_points').setAttribute('class','mini-text'); + document.getElementById('id_tags').setAttribute('class','tag-text'); + $("[id*="+'test_case_args'+"]").attr('placeholder', + 'Command Line arguments for bash only'); + + $('#id_snippet').bind('keydown', function( event ){ + if(navigator.userAgent.match("Gecko")) + { + c=event.which; + } + else + { + c=event.keyCode; + } + if(c==9) + { + replaceSelection(document.getElementById('id_snippet'),String.fromCharCode(9)); + setTimeout(document.getElementById('id_snippet'),0); + return false; + } + }); + + $('#id_description').bind('focus', function( event ){ + document.getElementById("id_description").rows=5; + document.getElementById("id_description").cols=40; + }); + + $('#id_description').bind('blur', function( event ){ + document.getElementById("id_description").rows=1; + document.getElementById("id_description").cols=40; + }); + + $('#id_description').bind('keypress', function (event){ + document.getElementById('my').innerHTML = document.getElementById('id_description').value ; + }); + + $('#id_solution').bind('keypress', function (event){ + document.getElementById('rend_solution').innerHTML = document.getElementById('id_solution').value ; + }); + + $('#id_type').bind('focus', function(event){ + var type = document.getElementById('id_type'); + type.style.border = '1px solid #ccc'; + }); + + $('#id_language').bind('focus', function(event){ + var language = document.getElementById('id_language'); + language.style.border = '1px solid #ccc'; + }); + document.getElementById('my').innerHTML = document.getElementById('id_description').value ; + document.getElementById('rend_solution').innerHTML = document.getElementById('id_solution').value ; + + if (document.getElementById('id_grade_assignment_upload').checked || + document.getElementById('id_type').value == 'upload'){ + $("#id_grade_assignment_upload").prop("disabled", false); + } + else{ + $("#id_grade_assignment_upload").prop("disabled", true); + } + + $('#id_type').change(function() { + if ($(this).val() == "upload"){ + $("#id_grade_assignment_upload").prop("disabled", false); + } + else{ + $("#id_grade_assignment_upload").prop("disabled", true); + } + }); +} + +function autosubmit() +{ + var language = document.getElementById('id_language'); + if(language.value == 'select') + { + language.style.border="solid red"; + return false; + } + var type = document.getElementById('id_type'); + if(type.value == 'select') + { + type.style.border = 'solid red'; + return false; + } + +} diff --git a/templates/dashboard.html b/templates/dashboard.html index 3a82d01..a5c78f3 100644 --- a/templates/dashboard.html +++ b/templates/dashboard.html @@ -7,20 +7,14 @@ {% endifequal %} {% ifequal type 'user' %}
  • Home
  • -
  • Contribution
  • +
  • Contribution
  • Logout
  • {% endifequal %} {% ifequal type 'moderator' %}
  • Home
  • +
  • Logout
  • {% endifequal %} {% endblock %} @@ -41,17 +35,11 @@

    Welcome {{name}}


    {% ifequal type 'user' %} You can contribute questions here by clicking on Start Contribution. - Before that You should rate one multiple choice question and one code question.

    Start Contribution + For instructions on how to create questions click here. +

    Start Contribution {% endifequal %} {% ifequal type 'moderator' %} You can comment and approve questions here -

    diff --git a/templates/home.html b/templates/home.html index 74c3ae5..b7b5e43 100644 --- a/templates/home.html +++ b/templates/home.html @@ -37,7 +37,7 @@


    -

    Welcome to Chethana Question Contribution


    +

    Welcome to FOSSEE Fellowship Question Contribution Interface


    diff --git a/templates/showquestions.html b/templates/showquestions.html new file mode 100644 index 0000000..b230b1a --- /dev/null +++ b/templates/showquestions.html @@ -0,0 +1,74 @@ +{% extends "dashboard.html" %} + +{% block navbar %} +
  • Home
  • +
  • Contribution
  • +
  • Logout
  • + {% endblock %} + +{% block title %} Questions {% endblock %} + +{% block pagetitle %} Questions {% endblock pagetitle %} + +{% block content %} +
    + +
    +
    +{% csrf_token %} + +
    +
    + {%if remaining > 0 %} +

    You can add {{remaining}} more questions.

    + {% else %} +

    You can add anymore questions. Please edit or delete the existing questions.

    + {% endif %} +
    +{% if questions %} + + + + + + + + + + + + + +{% for question in questions %} + + + + + + +{% if question.status %} + +{% else %} + +{% endif %} + +{% endfor %} + +
    Select Summary Language Type Marks Status
    + +{{question.summary|capfirst}}{{question.language|capfirst}}{{question.type|capfirst}}{{question.points}}
    +{% endif %} +
    +
    +
    +{% if not remaining <= 0 %} +   +{% endif %} + +
    +
    +
    +
    +
    + +{% endblock %} \ No newline at end of file diff --git a/yaksh/urls.py b/yaksh/urls.py index 82e37a8..59972f4 100644 --- a/yaksh/urls.py +++ b/yaksh/urls.py @@ -11,28 +11,30 @@ url(r'^register/success/$', "interface.views.register_success",name="register_success"), url(r'^dashboard/$',"interface.views.next_login",name="next_login"), - url(r'^questions/$',"interface.views.show_questions_stu",name="stu_questions"), - url(r'^questions/ratemcq/$',"interface.views.rate_mcq",name="rate_mcq"), - url(r'^questions/postcomment/$',"interface.views.rate_post",name="rate_post_comment"), - url(r'^questions/ratecq/$',"interface.views.rate_cq",name="rate_cq"), - url(r'^questions/addmcq/$',"interface.views.add_mcquestion",name="add_mcq"), - url(r'^questions/addcq/$',"interface.views.add_cquestion",name="add_cq"), + url(r'^showquestions/$',"interface.views.show_all_questions",name="show_all_questions"), + url(r'^addquestion/$',"interface.views.add_question",name="add_question"), + url(r'^addquestion/(?P\d+)/$',"interface.views.add_question",name="add_question"), +# url(r'^questions/ratemcq/$',"interface.views.rate_mcq",name="rate_mcq"), +# url(r'^questions/postcomment/$',"interface.views.rate_post",name="rate_post_comment"), +# url(r'^questions/ratecq/$',"interface.views.rate_cq",name="rate_cq"), +# url(r'^questions/addmcq/$',"interface.views.add_mcquestion",name="add_mcq"), +# url(r'^questions/addcq/$',"interface.views.add_cquestion",name="add_cq"), - url(r'^questions/(?P\d+)/$',"interface.views.add_comment",name="question_comment"), - url(r'^questions/(?P\d+)/postcomment/$',"interface.views.post_comment",name="question_comment_post"), +# url(r'^questions/(?P\d+)/$',"interface.views.add_comment",name="question_comment"), +# url(r'^questions/(?P\d+)/postcomment/$',"interface.views.post_comment",name="question_comment_post"), - url(r'^moderator/$',"interface.views.next_login",name="mod_show"), - url(r'^moderator/all/$',"interface.views.show_questions_mod_all",name="mod_show_all"), - url(r'^moderator/mcq/$',"interface.views.show_questions_mod_mcq",name="mod_show_mcq"), - url(r'^moderator/cq/$',"interface.views.show_questions_mod_cq",name="mod_show_cq"), - url(r'^moderator/mcq_approved/$',"interface.views.show_questions_mod_approved_mcq",name="mod_show_approved_mcq"), - url(r'^moderator/cq_approved/$',"interface.views.show_questions_mod_approved_cq",name="mod_show_approved_cq"), - url(r'^moderator/(?P\d+)/$',"interface.views.approve_questions",name="mod_questions"), - url(r'^moderator/(?P\d+)/approve/$',"interface.views.approve_questions_accept",name="mod_approve"), - url(r'^moderator/(?P\d+)/postcomment/$',"interface.views.post_comment",name="mod_approve_posted"), +# url(r'^moderator/$',"interface.views.next_login",name="mod_show"), +# url(r'^moderator/all/$',"interface.views.show_questions_mod_all",name="mod_show_all"), +# url(r'^moderator/mcq/$',"interface.views.show_questions_mod_mcq",name="mod_show_mcq"), +# url(r'^moderator/cq/$',"interface.views.show_questions_mod_cq",name="mod_show_cq"), +# url(r'^moderator/mcq_approved/$',"interface.views.show_questions_mod_approved_mcq",name="mod_show_approved_mcq"), +# url(r'^moderator/cq_approved/$',"interface.views.show_questions_mod_approved_cq",name="mod_show_approved_cq"), +# url(r'^moderator/(?P\d+)/$',"interface.views.approve_questions",name="mod_questions"), +# url(r'^moderator/(?P\d+)/approve/$',"interface.views.approve_questions_accept",name="mod_approve"), +# url(r'^moderator/(?P\d+)/postcomment/$',"interface.views.post_comment",name="mod_approve_posted"), - url(r'^reviews/$',"interface.views.show_reviews",name="show_review"), - url(r'^ratings/$',"interface.views.show_ratings",name="show_ratings"), +# url(r'^reviews/$',"interface.views.show_reviews",name="show_review"), +# url(r'^ratings/$',"interface.views.show_ratings",name="show_ratings"), From 84af409cf23e93a81071a80b2b8fca27b64eaa8f Mon Sep 17 00:00:00 2001 From: adityacp Date: Thu, 8 Mar 2018 21:44:24 +0530 Subject: [PATCH 02/49] Change question form in add_question.html --- templates/add_question.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/add_question.html b/templates/add_question.html index a8b8b8e..19ccb2c 100644 --- a/templates/add_question.html +++ b/templates/add_question.html @@ -26,7 +26,7 @@ }); }); -
    + {% csrf_token %}
    Summary: {{ qform.summary }}{{ qform.summary.errors }} @@ -35,7 +35,7 @@
    Description: {{ qform.description}} {{qform.description.errors}}
    Rendered Solution:

    Solution: {{ qform.solution }}{{qform.solution.errors}} -
    Citation: {{ qform.citation }}{{qform.citations.errors}} +
    Citation: {{ qform.citation }}{{qform.citation.errors}}
    Originality: {{ qform.originality }} {{qform.citations.errors}}
    {% for formset in formsets %} From d32c7179af9c22bf448df4bb0d0709ff35463bc2 Mon Sep 17 00:00:00 2001 From: mahesh Date: Fri, 9 Mar 2018 00:34:21 +0530 Subject: [PATCH 03/49] Add requirements.txt --- requirements.txt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 requirements.txt diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..a62a015 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,15 @@ +pytest +python-decouple +six +requests +tornado +psutil +invoke==0.21.0 +django==1.9.5 +django-taggit==0.18.1 +pytz==2016.4 +selenium==2.53.6 +coverage +ruamel.yaml==0.15.23 +markdown==2.6.9 +mysqlclient==1.3.9 From 7dc9393f2e360741aa9d2ba61ce0e1e91bb2f02f Mon Sep 17 00:00:00 2001 From: mahesh Date: Fri, 9 Mar 2018 03:19:55 +0530 Subject: [PATCH 04/49] Add stdio test cases error notifications --- interface/templatetags/__init__.py | 0 interface/templatetags/custom_filter.py | 22 +++++++ interface/views.py | 3 +- templates/add_question.html | 80 ++++++++++++++++++++++--- templates/showquestions.html | 2 +- 5 files changed, 95 insertions(+), 12 deletions(-) create mode 100644 interface/templatetags/__init__.py create mode 100644 interface/templatetags/custom_filter.py diff --git a/interface/templatetags/__init__.py b/interface/templatetags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/interface/templatetags/custom_filter.py b/interface/templatetags/custom_filter.py new file mode 100644 index 0000000..dcbd2db --- /dev/null +++ b/interface/templatetags/custom_filter.py @@ -0,0 +1,22 @@ +from django import template +from django.template.defaultfilters import stringfilter +import os +try: + from itertools import zip_longest +except ImportError: + from itertools import izip_longest as zip_longest + +register = template.Library() + + +@register.filter(name='zip') +def zip_longest_out(a, b): + return zip_longest(a, b) + +@register.simple_tag +def get_testcase_error(error_list, expected_output): + tc_error = None + for error in error_list: + if expected_output == error.get("expected_output")[0]: + tc_error = error + return tc_error diff --git a/interface/views.py b/interface/views.py index aacd5a5..bbca4cd 100644 --- a/interface/views.py +++ b/interface/views.py @@ -86,8 +86,7 @@ def add_question(request, question_id=None): ci = RequestContext(request) test_case_type = "stdiobasedtestcase" solution_error, tc_error = [], [] - if Question.objects.filter(user=user).count()>5: - print("count") + if Question.objects.filter(user=user).count()>=5: return HttpResponseRedirect(reverse('show_all_questions')) if question_id is None: diff --git a/templates/add_question.html b/templates/add_question.html index a8b8b8e..e830d81 100644 --- a/templates/add_question.html +++ b/templates/add_question.html @@ -1,4 +1,5 @@ {% extends "navigation.html" %} +{% load custom_filter %} {% block script %} @@ -33,10 +30,32 @@ Points:{{qform.points }}{{ qform.points.errors }} Rendered:

    Description: {{ qform.description}} {{qform.description.errors}} - Rendered Solution:

    + {% if solution_error %} + Solution: {{ qform.solution }}{{qform.solution.errors}} +

    +

    The following error took place:

    + + + + + + + + + + + {% if soltion_error.0.traceback %} + + + {% endif %} + +
    Exception Name: {{solution_error.0.exception}}
    Exception Message: {{solution_error.0.message}}
    Full Traceback:
    {{error.traceback}}
    + + {% else %} Solution: {{ qform.solution }}{{qform.solution.errors}} - Citation: {{ qform.citation }}{{qform.citations.errors}} - Originality: {{ qform.originality }} {{qform.citations.errors}} + {% endif %} + Citation: {{ qform.citation }}{{qform.citation.errors}} + Originality: {{ qform.originality }} {{qform.originality.errors}} {% for formset in formsets %}
    @@ -44,7 +63,50 @@ {% for form in formset %} {% endfor %} @@ -55,7 +117,7 @@

    - +
    diff --git a/templates/showquestions.html b/templates/showquestions.html index b230b1a..3cc46fe 100644 --- a/templates/showquestions.html +++ b/templates/showquestions.html @@ -22,7 +22,7 @@ {%if remaining > 0 %}

    You can add {{remaining}} more questions.

    {% else %} -

    You can add anymore questions. Please edit or delete the existing questions.

    +

    You cannot add anymore questions. Please edit or delete the existing questions.

    {% endif %}
    {% if questions %} From a87b8e1a424924f9d7b02fa6b1659fcabf8cc962 Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Fri, 9 Mar 2018 15:14:57 +0530 Subject: [PATCH 05/49] Show success for correct testcase --- interface/templatetags/custom_filter.py | 6 +- interface/views.py | 1 - templates/add_question.html | 88 +++++++++++++------------ 3 files changed, 51 insertions(+), 44 deletions(-) diff --git a/interface/templatetags/custom_filter.py b/interface/templatetags/custom_filter.py index dcbd2db..23614e2 100644 --- a/interface/templatetags/custom_filter.py +++ b/interface/templatetags/custom_filter.py @@ -16,7 +16,9 @@ def zip_longest_out(a, b): @register.simple_tag def get_testcase_error(error_list, expected_output): tc_error = None + success= False for error in error_list: - if expected_output == error.get("expected_output")[0]: + if expected_output.split("\r\n") == error.get("expected_output"): tc_error = error - return tc_error + success = True + return {"tc_error":tc_error, "success":success} diff --git a/interface/views.py b/interface/views.py index bbca4cd..fa9036b 100644 --- a/interface/views.py +++ b/interface/views.py @@ -109,7 +109,6 @@ def add_question(request, question_id=None): question = qform.save(commit=False) question.user = user question.save() - # many-to-many field save function used to save the tags for formset in formsets: if formset.is_valid(): formset.save() diff --git a/templates/add_question.html b/templates/add_question.html index e830d81..14b6d04 100644 --- a/templates/add_question.html +++ b/templates/add_question.html @@ -64,50 +64,56 @@ {% for form in formset %} + {% endif %} {# closes form.expected_output.value #} {% endfor %} From 5b38d05ccf828a518572bba7a64f7a1d494153c1 Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Fri, 9 Mar 2018 15:31:45 +0530 Subject: [PATCH 06/49] Allow citation to be null --- interface/models.py | 3 ++- templates/add_question.html | 1 + templates/dashboard.html | 4 ++-- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/interface/models.py b/interface/models.py index 83836f2..fd013b7 100644 --- a/interface/models.py +++ b/interface/models.py @@ -61,7 +61,8 @@ class Question(models.Model): solution = models.TextField() # If the question is cited - citation = models.TextField(null=False) + citation = models.TextField(null=True, blank=True, help_text="Please add appropriate citation\ + if the question is adapted from elsewhere.") # originality of the question originality = models.CharField(max_length=24, choices=originality, default="original") diff --git a/templates/add_question.html b/templates/add_question.html index 14b6d04..178b296 100644 --- a/templates/add_question.html +++ b/templates/add_question.html @@ -22,6 +22,7 @@ document.getElementById('my').innerHTML = document.getElementById('id_description').value ; }); }); +
    {% csrf_token %} diff --git a/templates/dashboard.html b/templates/dashboard.html index a5c78f3..a01e6ae 100644 --- a/templates/dashboard.html +++ b/templates/dashboard.html @@ -34,9 +34,9 @@

    Welcome {{name}}


    {% ifequal type 'user' %} - You can contribute questions here by clicking on Start Contribution. + You can contribute questions here by clicking on Start Contribution.
    For instructions on how to create questions click here. -

    Start Contribution +

    Start Contribution {% endifequal %} {% ifequal type 'moderator' %} You can comment and approve questions here From f4f5835bf60513228718cbfb884652c94a431752 Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Fri, 9 Mar 2018 15:59:32 +0530 Subject: [PATCH 07/49] Remove user dir; Default to yaksh setting. --- interface/models.py | 2 ++ interface/views.py | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/interface/models.py b/interface/models.py index fd013b7..9b9a351 100644 --- a/interface/models.py +++ b/interface/models.py @@ -2,6 +2,7 @@ from django.contrib.auth.models import User from django.db import models import json +import os question_status_choice = ( (1, "approved"), @@ -95,6 +96,7 @@ def consolidate_answer_data(self, user_answer, user=None): question_data['metadata'] = metadata return json.dumps(question_data) + class TestCase(models.Model): question = models.ForeignKey(Question, blank=True, null=True) type = models.CharField(max_length=24, default="stdiobasedtestcase") diff --git a/interface/views.py b/interface/views.py index fa9036b..624dab9 100644 --- a/interface/views.py +++ b/interface/views.py @@ -14,6 +14,7 @@ from urllib.parse import urljoin import requests import json +import os def show_home(request): @@ -170,7 +171,7 @@ def submit_to_code_server(question_id): url = "http://localhost:55555" uid = "fellowship" + str(question_id) status = False - submit = requests.post(url, data=dict(uid=uid, json_data=consolidate_answer, user_dir="/home/mahesh")) + submit = requests.post(url, data=dict(uid=uid, json_data=consolidate_answer, user_dir="")) while not status: result_state = get_result(url, uid) stat = result_state.get("status") @@ -183,4 +184,3 @@ def submit_to_code_server(question_id): def get_result(url, uid): response = json.loads(requests.get(urljoin(url, uid)).text) return response - \ No newline at end of file From 45760863a4fc36aa48498f48b3ec4060e3644159 Mon Sep 17 00:00:00 2001 From: adityacp Date: Fri, 9 Mar 2018 16:54:17 +0530 Subject: [PATCH 08/49] Add documentation and settings --- docs/build/.buildinfo | 4 + docs/build/.doctrees/environment.pickle | Bin 0 -> 1499935 bytes docs/build/.doctrees/index.doctree | Bin 0 -> 18762 bytes docs/build/_images/create_questions.jpg | Bin 0 -> 61036 bytes docs/build/_images/create_testcases.jpg | Bin 0 -> 48772 bytes docs/build/_sources/index.rst.txt | 65 + docs/build/_static/ajax-loader.gif | Bin 0 -> 673 bytes docs/build/_static/alabaster.css | 693 ++ docs/build/_static/basic.css | 665 ++ docs/build/_static/comment-bright.png | Bin 0 -> 756 bytes docs/build/_static/comment-close.png | Bin 0 -> 829 bytes docs/build/_static/comment.png | Bin 0 -> 641 bytes docs/build/_static/custom.css | 1 + docs/build/_static/doctools.js | 311 + docs/build/_static/documentation_options.js | 9 + docs/build/_static/down-pressed.png | Bin 0 -> 222 bytes docs/build/_static/down.png | Bin 0 -> 202 bytes docs/build/_static/file.png | Bin 0 -> 286 bytes docs/build/_static/jquery-3.2.1.js | 10253 ++++++++++++++++++ docs/build/_static/jquery.js | 4 + docs/build/_static/minus.png | Bin 0 -> 90 bytes docs/build/_static/plus.png | Bin 0 -> 90 bytes docs/build/_static/pygments.css | 69 + docs/build/_static/searchtools.js | 761 ++ docs/build/_static/underscore-1.3.1.js | 999 ++ docs/build/_static/underscore.js | 31 + docs/build/_static/up-pressed.png | Bin 0 -> 214 bytes docs/build/_static/up.png | Bin 0 -> 203 bytes docs/build/_static/websupport.js | 808 ++ docs/build/genindex.html | 81 + docs/build/index.html | 191 + docs/build/objects.inv | Bin 0 -> 268 bytes docs/build/search.html | 92 + docs/build/searchindex.js | 1 + docs/source/conf.py | 188 + docs/source/images/create_questions.jpg | Bin 0 -> 61036 bytes docs/source/images/create_testcases.jpg | Bin 0 -> 48772 bytes docs/source/index.rst | 66 + templates/add_question.html | 4 +- yaksh/settings.py | 20 +- 40 files changed, 15310 insertions(+), 6 deletions(-) create mode 100644 docs/build/.buildinfo create mode 100644 docs/build/.doctrees/environment.pickle create mode 100644 docs/build/.doctrees/index.doctree create mode 100644 docs/build/_images/create_questions.jpg create mode 100644 docs/build/_images/create_testcases.jpg create mode 100644 docs/build/_sources/index.rst.txt create mode 100644 docs/build/_static/ajax-loader.gif create mode 100644 docs/build/_static/alabaster.css create mode 100644 docs/build/_static/basic.css create mode 100644 docs/build/_static/comment-bright.png create mode 100644 docs/build/_static/comment-close.png create mode 100644 docs/build/_static/comment.png create mode 100644 docs/build/_static/custom.css create mode 100644 docs/build/_static/doctools.js create mode 100644 docs/build/_static/documentation_options.js create mode 100644 docs/build/_static/down-pressed.png create mode 100644 docs/build/_static/down.png create mode 100644 docs/build/_static/file.png create mode 100644 docs/build/_static/jquery-3.2.1.js create mode 100644 docs/build/_static/jquery.js create mode 100644 docs/build/_static/minus.png create mode 100644 docs/build/_static/plus.png create mode 100644 docs/build/_static/pygments.css create mode 100644 docs/build/_static/searchtools.js create mode 100644 docs/build/_static/underscore-1.3.1.js create mode 100644 docs/build/_static/underscore.js create mode 100644 docs/build/_static/up-pressed.png create mode 100644 docs/build/_static/up.png create mode 100644 docs/build/_static/websupport.js create mode 100644 docs/build/genindex.html create mode 100644 docs/build/index.html create mode 100644 docs/build/objects.inv create mode 100644 docs/build/search.html create mode 100644 docs/build/searchindex.js create mode 100644 docs/source/conf.py create mode 100644 docs/source/images/create_questions.jpg create mode 100644 docs/source/images/create_testcases.jpg create mode 100644 docs/source/index.rst diff --git a/docs/build/.buildinfo b/docs/build/.buildinfo new file mode 100644 index 0000000..964c2fc --- /dev/null +++ b/docs/build/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 80cef55ba893dae5c814937d4802c7d5 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/build/.doctrees/environment.pickle b/docs/build/.doctrees/environment.pickle new file mode 100644 index 0000000000000000000000000000000000000000..150737415b08181e988f7a7e11d905f56bfa542b GIT binary patch literal 1499935 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/build/.doctrees/index.doctree b/docs/build/.doctrees/index.doctree new file mode 100644 index 0000000000000000000000000000000000000000..e68f62d445f43d67adbb1efaaee41eec46b2831f GIT binary patch literal 18762 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 literal 0 HcmV?d00001 diff --git a/docs/build/_images/create_questions.jpg b/docs/build/_images/create_questions.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5cc153579585e72c4eb26f27da348bde584863ef GIT binary patch literal 61036 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 and
    tags. + + * **Solution** - It is the correct expected answer of the question. + For e.g. :: + + a = input() + b = input() + print(a+b) + + * **Citation** - Mention the reference url of the question if the question is adapated + + .. note:: Leave the field blank if the question is original. + + * **Originality** - Specify whether the question is **Original Question** or **Adapted Question** + + 6. Below image shows an example of how to create test cases. + .. figure:: images/create_testcases.jpg + + In **Expected input** field, enter the value(s) that will be passed to the code through a standard I/O stream. + + .. note:: If there are multiple input values in a test case, enter the values in new line as shown in figure. + + In **Expected Output** Field, enter the expected output for that test case. For e.g type 3 if the output of the user code is 3. + + To delete a test case Select **Delete** checkbox and click on **Check and Save** to delete the testcase and save the question. + + + diff --git a/docs/build/_static/ajax-loader.gif b/docs/build/_static/ajax-loader.gif new file mode 100644 index 0000000000000000000000000000000000000000..61faf8cab23993bd3e1560bff0668bd628642330 GIT binary patch literal 673 zcmZ?wbhEHb6krfw_{6~Q|Nno%(3)e{?)x>&1u}A`t?OF7Z|1gRivOgXi&7IyQd1Pl zGfOfQ60;I3a`F>X^fL3(@);C=vM_KlFfb_o=k{|A33hf2a5d61U}gjg=>Rd%XaNQW zW@Cw{|b%Y*pl8F?4B9 zlo4Fz*0kZGJabY|>}Okf0}CCg{u4`zEPY^pV?j2@h+|igy0+Kz6p;@SpM4s6)XEMg z#3Y4GX>Hjlml5ftdH$4x0JGdn8~MX(U~_^d!Hi)=HU{V%g+mi8#UGbE-*ao8f#h+S z2a0-5+vc7MU$e-NhmBjLIC1v|)9+Im8x1yacJ7{^tLX(ZhYi^rpmXm0`@ku9b53aN zEXH@Y3JaztblgpxbJt{AtE1ad1Ca>{v$rwwvK(>{m~Gf_=-Ro7Fk{#;i~+{{>QtvI yb2P8Zac~?~=sRA>$6{!(^3;ZP0TPFR(G_-UDU(8Jl0?(IXu$~#4A!880|o%~Al1tN literal 0 HcmV?d00001 diff --git a/docs/build/_static/alabaster.css b/docs/build/_static/alabaster.css new file mode 100644 index 0000000..be65b13 --- /dev/null +++ b/docs/build/_static/alabaster.css @@ -0,0 +1,693 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +@import url("basic.css"); + +/* -- page layout ----------------------------------------------------------- */ + +body { + font-family: 'goudy old style', 'minion pro', 'bell mt', Georgia, 'Hiragino Mincho Pro', serif; + font-size: 17px; + background-color: #fff; + color: #000; + margin: 0; + padding: 0; +} + + +div.document { + width: 940px; + margin: 30px auto 0 auto; +} + +div.documentwrapper { + float: left; + width: 100%; +} + +div.bodywrapper { + margin: 0 0 0 220px; +} + +div.sphinxsidebar { + width: 220px; + font-size: 14px; + line-height: 1.5; +} + +hr { + border: 1px solid #B1B4B6; +} + +div.body { + background-color: #fff; + color: #3E4349; + padding: 0 30px 0 30px; +} + +div.body > .section { + text-align: left; +} + +div.footer { + width: 940px; + margin: 20px auto 30px auto; + font-size: 14px; + color: #888; + text-align: right; +} + +div.footer a { + color: #888; +} + +p.caption { + font-family: inherit; + font-size: inherit; +} + + +div.relations { + display: none; +} + + +div.sphinxsidebar a { + color: #444; + text-decoration: none; + border-bottom: 1px dotted #999; +} + +div.sphinxsidebar a:hover { + border-bottom: 1px solid #999; +} + +div.sphinxsidebarwrapper { + padding: 18px 10px; +} + +div.sphinxsidebarwrapper p.logo { + padding: 0; + margin: -10px 0 0 0px; + text-align: center; +} + +div.sphinxsidebarwrapper h1.logo { + margin-top: -10px; + text-align: center; + margin-bottom: 5px; + text-align: left; +} + +div.sphinxsidebarwrapper h1.logo-name { + margin-top: 0px; +} + +div.sphinxsidebarwrapper p.blurb { + margin-top: 0; + font-style: normal; +} + +div.sphinxsidebar h3, +div.sphinxsidebar h4 { + font-family: 'Garamond', 'Georgia', serif; + color: #444; + font-size: 24px; + font-weight: normal; + margin: 0 0 5px 0; + padding: 0; +} + +div.sphinxsidebar h4 { + font-size: 20px; +} + +div.sphinxsidebar h3 a { + color: #444; +} + +div.sphinxsidebar p.logo a, +div.sphinxsidebar h3 a, +div.sphinxsidebar p.logo a:hover, +div.sphinxsidebar h3 a:hover { + border: none; +} + +div.sphinxsidebar p { + color: #555; + margin: 10px 0; +} + +div.sphinxsidebar ul { + margin: 10px 0; + padding: 0; + color: #000; +} + +div.sphinxsidebar ul li.toctree-l1 > a { + font-size: 120%; +} + +div.sphinxsidebar ul li.toctree-l2 > a { + font-size: 110%; +} + +div.sphinxsidebar input { + border: 1px solid #CCC; + font-family: 'goudy old style', 'minion pro', 'bell mt', Georgia, 'Hiragino Mincho Pro', serif; + font-size: 1em; +} + +div.sphinxsidebar hr { + border: none; + height: 1px; + color: #AAA; + background: #AAA; + + text-align: left; + margin-left: 0; + width: 50%; +} + +/* -- body styles ----------------------------------------------------------- */ + +a { + color: #004B6B; + text-decoration: underline; +} + +a:hover { + color: #6D4100; + text-decoration: underline; +} + +div.body h1, +div.body h2, +div.body h3, +div.body h4, +div.body h5, +div.body h6 { + font-family: 'Garamond', 'Georgia', serif; + font-weight: normal; + margin: 30px 0px 10px 0px; + padding: 0; +} + +div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } +div.body h2 { font-size: 180%; } +div.body h3 { font-size: 150%; } +div.body h4 { font-size: 130%; } +div.body h5 { font-size: 100%; } +div.body h6 { font-size: 100%; } + +a.headerlink { + color: #DDD; + padding: 0 4px; + text-decoration: none; +} + +a.headerlink:hover { + color: #444; + background: #EAEAEA; +} + +div.body p, div.body dd, div.body li { + line-height: 1.4em; +} + +div.admonition { + margin: 20px 0px; + padding: 10px 30px; + background-color: #EEE; + border: 1px solid #CCC; +} + +div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fafafa; +} + +div.admonition p.admonition-title { + font-family: 'Garamond', 'Georgia', serif; + font-weight: normal; + font-size: 24px; + margin: 0 0 10px 0; + padding: 0; + line-height: 1; +} + +div.admonition p.last { + margin-bottom: 0; +} + +div.highlight { + background-color: #fff; +} + +dt:target, .highlight { + background: #FAF3E8; +} + +div.warning { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.danger { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.error { + background-color: #FCC; + border: 1px solid #FAA; + -moz-box-shadow: 2px 2px 4px #D52C2C; + -webkit-box-shadow: 2px 2px 4px #D52C2C; + box-shadow: 2px 2px 4px #D52C2C; +} + +div.caution { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.attention { + background-color: #FCC; + border: 1px solid #FAA; +} + +div.important { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.note { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.tip { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.hint { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.seealso { + background-color: #EEE; + border: 1px solid #CCC; +} + +div.topic { + background-color: #EEE; +} + +p.admonition-title { + display: inline; +} + +p.admonition-title:after { + content: ":"; +} + +pre, tt, code { + font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; + font-size: 0.9em; +} + +.hll { + background-color: #FFC; + margin: 0 -12px; + padding: 0 12px; + display: block; +} + +img.screenshot { +} + +tt.descname, tt.descclassname, code.descname, code.descclassname { + font-size: 0.95em; +} + +tt.descname, code.descname { + padding-right: 0.08em; +} + +img.screenshot { + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils { + border: 1px solid #888; + -moz-box-shadow: 2px 2px 4px #EEE; + -webkit-box-shadow: 2px 2px 4px #EEE; + box-shadow: 2px 2px 4px #EEE; +} + +table.docutils td, table.docutils th { + border: 1px solid #888; + padding: 0.25em 0.7em; +} + +table.field-list, table.footnote { + border: none; + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +table.footnote { + margin: 15px 0; + width: 100%; + border: 1px solid #EEE; + background: #FDFDFD; + font-size: 0.9em; +} + +table.footnote + table.footnote { + margin-top: -15px; + border-top: none; +} + +table.field-list th { + padding: 0 0.8em 0 0; +} + +table.field-list td { + padding: 0; +} + +table.field-list p { + margin-bottom: 0.8em; +} + +/* Cloned from + * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68 + */ +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +table.footnote td.label { + width: .1px; + padding: 0.3em 0 0.3em 0.5em; +} + +table.footnote td { + padding: 0.3em 0.5em; +} + +dl { + margin: 0; + padding: 0; +} + +dl dd { + margin-left: 30px; +} + +blockquote { + margin: 0 0 0 30px; + padding: 0; +} + +ul, ol { + /* Matches the 30px from the narrow-screen "li > ul" selector below */ + margin: 10px 0 10px 30px; + padding: 0; +} + +pre { + background: #EEE; + padding: 7px 30px; + margin: 15px 0px; + line-height: 1.3em; +} + +div.viewcode-block:target { + background: #ffd; +} + +dl pre, blockquote pre, li pre { + margin-left: 0; + padding-left: 30px; +} + +tt, code { + background-color: #ecf0f3; + color: #222; + /* padding: 1px 2px; */ +} + +tt.xref, code.xref, a tt { + background-color: #FBFBFB; + border-bottom: 1px solid #fff; +} + +a.reference { + text-decoration: none; + border-bottom: 1px dotted #004B6B; +} + +/* Don't put an underline on images */ +a.image-reference, a.image-reference:hover { + border-bottom: none; +} + +a.reference:hover { + border-bottom: 1px solid #6D4100; +} + +a.footnote-reference { + text-decoration: none; + font-size: 0.7em; + vertical-align: top; + border-bottom: 1px dotted #004B6B; +} + +a.footnote-reference:hover { + border-bottom: 1px solid #6D4100; +} + +a:hover tt, a:hover code { + background: #EEE; +} + + +@media screen and (max-width: 870px) { + + div.sphinxsidebar { + display: none; + } + + div.document { + width: 100%; + + } + + div.documentwrapper { + margin-left: 0; + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + } + + div.bodywrapper { + margin-top: 0; + margin-right: 0; + margin-bottom: 0; + margin-left: 0; + } + + ul { + margin-left: 0; + } + + li > ul { + /* Matches the 30px from the "ul, ol" selector above */ + margin-left: 30px; + } + + .document { + width: auto; + } + + .footer { + width: auto; + } + + .bodywrapper { + margin: 0; + } + + .footer { + width: auto; + } + + .github { + display: none; + } + + + +} + + + +@media screen and (max-width: 875px) { + + body { + margin: 0; + padding: 20px 30px; + } + + div.documentwrapper { + float: none; + background: #fff; + } + + div.sphinxsidebar { + display: block; + float: none; + width: 102.5%; + margin: 50px -30px -20px -30px; + padding: 10px 20px; + background: #333; + color: #FFF; + } + + div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, + div.sphinxsidebar h3 a { + color: #fff; + } + + div.sphinxsidebar a { + color: #AAA; + } + + div.sphinxsidebar p.logo { + display: none; + } + + div.document { + width: 100%; + margin: 0; + } + + div.footer { + display: none; + } + + div.bodywrapper { + margin: 0; + } + + div.body { + min-height: 0; + padding: 0; + } + + .rtd_doc_footer { + display: none; + } + + .document { + width: auto; + } + + .footer { + width: auto; + } + + .footer { + width: auto; + } + + .github { + display: none; + } +} + + +/* misc. */ + +.revsys-inline { + display: none!important; +} + +/* Make nested-list/multi-paragraph items look better in Releases changelog + * pages. Without this, docutils' magical list fuckery causes inconsistent + * formatting between different release sub-lists. + */ +div#changelog > div.section > ul > li > p:only-child { + margin-bottom: 0; +} + +/* Hide fugly table cell borders in ..bibliography:: directive output */ +table.docutils.citation, table.docutils.citation td, table.docutils.citation th { + border: none; + /* Below needed in some edge cases; if not applied, bottom shadows appear */ + -moz-box-shadow: none; + -webkit-box-shadow: none; + box-shadow: none; +} \ No newline at end of file diff --git a/docs/build/_static/basic.css b/docs/build/_static/basic.css new file mode 100644 index 0000000..19ced10 --- /dev/null +++ b/docs/build/_static/basic.css @@ -0,0 +1,665 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li div.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 450px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px 7px 0 7px; + background-color: #ffe; + width: 40%; + float: right; +} + +p.sidebar-title { + font-weight: bold; +} + +/* -- topics ---------------------------------------------------------------- */ + +div.topic { + border: 1px solid #ccc; + padding: 7px 7px 0 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +div.admonition dl { + margin-bottom: 0; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +table.footnote td, table.footnote th { + border: 0 !important; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +dl { + margin-bottom: 15px; +} + +dd p { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; +} + +td.linenos pre { + padding: 5px 0px; + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + margin-left: 0.5em; +} + +table.highlighttable td { + padding: 0 0.5em 0 0.5em; +} + +div.code-block-caption { + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +div.code-block-caption + div > div.highlight > pre { + margin-top: 0; +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + padding: 1em 1em 0; +} + +div.literal-block-wrapper div.highlight { + margin: 0; +} + +code.descname { + background-color: transparent; + font-weight: bold; + font-size: 1.2em; +} + +code.descclassname { + background-color: transparent; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: relative; + left: 0px; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/docs/build/_static/comment-bright.png b/docs/build/_static/comment-bright.png new file mode 100644 index 0000000000000000000000000000000000000000..15e27edb12ac25701ac0ac21b97b52bb4e45415e GIT binary patch literal 756 zcmVgfIX78 z$8Pzv({A~p%??+>KickCb#0FM1rYN=mBmQ&Nwp<#JXUhU;{|)}%&s>suq6lXw*~s{ zvHx}3C%<;wE5CH!BR{p5@ml9ws}y)=QN-kL2?#`S5d*6j zk`h<}j1>tD$b?4D^N9w}-k)bxXxFg>+#kme^xx#qg6FI-%iv2U{0h(Y)cs%5a|m%Pn_K3X_bDJ>EH#(Fb73Z zfUt2Q3B>N+ot3qb*DqbTZpFIn4a!#_R-}{?-~Hs=xSS6p&$sZ-k1zDdtqU`Y@`#qL z&zv-~)Q#JCU(dI)Hf;$CEnK=6CK50}q7~wdbI->?E07bJ0R;!GSQTs5Am`#;*WHjvHRvY?&$Lm-vq1a_BzocI^ULXV!lbMd%|^B#fY;XX)n<&R^L z=84u1e_3ziq;Hz-*k5~zwY3*oDKt0;bM@M@@89;@m*4RFgvvM_4;5LB!@OB@^WbVT zjl{t;a8_>od-~P4 m{5|DvB&z#xT;*OnJqG}gk~_7HcNkCr0000W zanA~u9RIXo;n7c96&U)YLgs-FGlx~*_c{Jgvesu1E5(8YEf&5wF=YFPcRe@1=MJmi zag(L*xc2r0(slpcN!vC5CUju;vHJkHc*&70_n2OZsK%O~A=!+YIw z7zLLl7~Z+~RgWOQ=MI6$#0pvpu$Q43 zP@36QAmu6!_9NPM?o<1_!+stoVRRZbW9#SPe!n;#A_6m8f}|xN1;H{`0RoXQ2LM47 zt(g;iZ6|pCb@h2xk&(}S3=EVBUO0e90m2Lp5CB<(SPIaB;n4))3JB87Or#XPOPcum z?<^(g+m9}VNn4Y&B`g8h{t_$+RB1%HKRY6fjtd-<7&EsU;vs0GM(Lmbhi%Gwcfs0FTF}T zL{_M6Go&E0Eg8FuB*(Yn+Z*RVTBE@10eIOb3El^MhO`GabDll(V0&FlJi2k^;q8af zkENdk2}x2)_KVp`5OAwXZM;dG0?M-S)xE1IKDi6BY@5%Or?#aZ9$gcX)dPZ&wA1a< z$rFXHPn|TBf`e?>Are8sKtKrKcjF$i^lp!zkL?C|y^vlHr1HXeVJd;1I~g&Ob-q)& z(fn7s-KI}G{wnKzg_U5G(V%bX6uk zIa+<@>rdmZYd!9Y=C0cuchrbIjuRB_Wq{-RXlic?flu1*_ux}x%(HDH&nT`k^xCeC ziHi1!ChH*sQ6|UqJpTTzX$aw8e(UfcS^f;6yBWd+(1-70zU(rtxtqR%j z-lsH|CKQJXqD{+F7V0OTv8@{~(wp(`oIP^ZykMWgR>&|RsklFMCnOo&Bd{le} zV5F6424Qzl;o2G%oVvmHgRDP9!=rK8fy^!yV8y*4p=??uIRrrr0?>O!(z*g5AvL2!4z0{sq%vhG*Po}`a<6%kTK5TNhtC8}rXNu&h^QH4A&Sk~Autm*s~45(H7+0bi^MraaRVzr05hQ3iK?j` zR#U@^i0WhkIHTg29u~|ypU?sXCQEQgXfObPW;+0YAF;|5XyaMAEM0sQ@4-xCZe=0e z7r$ofiAxn@O5#RodD8rh5D@nKQ;?lcf@tg4o+Wp44aMl~c47azN_(im0N)7OqdPBC zGw;353_o$DqGRDhuhU$Eaj!@m000000NkvXXu0mjfjZ7Z_ literal 0 HcmV?d00001 diff --git a/docs/build/_static/custom.css b/docs/build/_static/custom.css new file mode 100644 index 0000000..2a924f1 --- /dev/null +++ b/docs/build/_static/custom.css @@ -0,0 +1 @@ +/* This file intentionally left blank. */ diff --git a/docs/build/_static/doctools.js b/docs/build/_static/doctools.js new file mode 100644 index 0000000..0c15c00 --- /dev/null +++ b/docs/build/_static/doctools.js @@ -0,0 +1,311 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for all documentation. + * + * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/** + * select a different prefix for underscore + */ +$u = _.noConflict(); + +/** + * make the code below compatible with browsers without + * an installed firebug like debugger +if (!window.console || !console.firebug) { + var names = ["log", "debug", "info", "warn", "error", "assert", "dir", + "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", + "profile", "profileEnd"]; + window.console = {}; + for (var i = 0; i < names.length; ++i) + window.console[names[i]] = function() {}; +} + */ + +/** + * small helper function to urldecode strings + */ +jQuery.urldecode = function(x) { + return decodeURIComponent(x).replace(/\+/g, ' '); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var bbox = span.getBBox(); + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + var parentOfText = node.parentNode.parentNode; + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} + +/** + * Small JavaScript module for the documentation. + */ +var Documentation = { + + init : function() { + this.fixFirefoxAnchorBug(); + this.highlightSearchWords(); + this.initIndexTable(); + + }, + + /** + * i18n support + */ + TRANSLATIONS : {}, + PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, + LOCALE : 'unknown', + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext : function(string) { + var translated = Documentation.TRANSLATIONS[string]; + if (typeof translated === 'undefined') + return string; + return (typeof translated === 'string') ? translated : translated[0]; + }, + + ngettext : function(singular, plural, n) { + var translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated === 'undefined') + return (n == 1) ? singular : plural; + return translated[Documentation.PLURALEXPR(n)]; + }, + + addTranslations : function(catalog) { + for (var key in catalog.messages) + this.TRANSLATIONS[key] = catalog.messages[key]; + this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); + this.LOCALE = catalog.locale; + }, + + /** + * add context elements like header anchor links + */ + addContextElements : function() { + $('div[id] > :header:first').each(function() { + $('
    \u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this headline')). + appendTo(this); + }); + $('dt[id]').each(function() { + $('\u00B6'). + attr('href', '#' + this.id). + attr('title', _('Permalink to this definition')). + appendTo(this); + }); + }, + + /** + * workaround a firefox stupidity + * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 + */ + fixFirefoxAnchorBug : function() { + if (document.location.hash && $.browser.mozilla) + window.setTimeout(function() { + document.location.href += ''; + }, 10); + }, + + /** + * highlight the search words provided in the url in the text + */ + highlightSearchWords : function() { + var params = $.getQueryParameters(); + var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; + if (terms.length) { + var body = $('div.body'); + if (!body.length) { + body = $('body'); + } + window.setTimeout(function() { + $.each(terms, function() { + body.highlightText(this.toLowerCase(), 'highlighted'); + }); + }, 10); + $('') + .appendTo($('#searchbox')); + } + }, + + /** + * init the domain index toggle buttons + */ + initIndexTable : function() { + var togglers = $('img.toggler').click(function() { + var src = $(this).attr('src'); + var idnum = $(this).attr('id').substr(7); + $('tr.cg-' + idnum).toggle(); + if (src.substr(-9) === 'minus.png') + $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); + else + $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); + }).css('display', ''); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { + togglers.click(); + } + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords : function() { + $('#searchbox .highlight-link').fadeOut(300); + $('span.highlighted').removeClass('highlighted'); + }, + + /** + * make the url absolute + */ + makeURL : function(relativeURL) { + return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; + }, + + /** + * get the current relative url + */ + getCurrentURL : function() { + var path = document.location.pathname; + var parts = path.split(/\//); + $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { + if (this === '..') + parts.pop(); + }); + var url = parts.join('/'); + return path.substring(url.lastIndexOf('/') + 1, path.length - 1); + }, + + initOnKeyListeners: function() { + $(document).keyup(function(event) { + var activeElementType = document.activeElement.tagName; + // don't navigate when in search box or textarea + if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT') { + switch (event.keyCode) { + case 37: // left + var prevHref = $('link[rel="prev"]').prop('href'); + if (prevHref) { + window.location.href = prevHref; + return false; + } + case 39: // right + var nextHref = $('link[rel="next"]').prop('href'); + if (nextHref) { + window.location.href = nextHref; + return false; + } + } + } + }); + } +}; + +// quick alias for translations +_ = Documentation.gettext; + +$(document).ready(function() { + Documentation.init(); +}); \ No newline at end of file diff --git a/docs/build/_static/documentation_options.js b/docs/build/_static/documentation_options.js new file mode 100644 index 0000000..fb47b84 --- /dev/null +++ b/docs/build/_static/documentation_options.js @@ -0,0 +1,9 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: '', + VERSION: '0.1', + LANGUAGE: 'None', + COLLAPSE_INDEX: false, + FILE_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt' +}; \ No newline at end of file diff --git a/docs/build/_static/down-pressed.png b/docs/build/_static/down-pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..5756c8cad8854722893dc70b9eb4bb0400343a39 GIT binary patch literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`OFdm2Ln;`PZ^+1>KjR?B@S0W7 z%OS_REiHONoJ6{+Ks@6k3590|7k9F+ddB6!zw3#&!aw#S`x}3V3&=A(a#84O-&F7T z^k3tZB;&iR9siw0|F|E|DAL<8r-F4!1H-;1{e*~yAKZN5f0|Ei6yUmR#Is)EM(Po_ zi`qJR6|P<~+)N+kSDgL7AjdIC_!O7Q?eGb+L+qOjm{~LLinM4NHn7U%HcK%uoMYO5 VJ~8zD2B3o(JYD@<);T3K0RV0%P>BEl literal 0 HcmV?d00001 diff --git a/docs/build/_static/down.png b/docs/build/_static/down.png new file mode 100644 index 0000000000000000000000000000000000000000..1b3bdad2ceffae91cee61b32f3295f9bbe646e48 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6CVIL!hEy=F?b*7pIY7kW{q%Rg zx!yQ<9v8bmJwa`TQk7YSw}WVQ()mRdQ;TC;* literal 0 HcmV?d00001 diff --git a/docs/build/_static/file.png b/docs/build/_static/file.png new file mode 100644 index 0000000000000000000000000000000000000000..a858a410e4faa62ce324d814e4b816fff83a6fb3 GIT binary patch literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( literal 0 HcmV?d00001 diff --git a/docs/build/_static/jquery-3.2.1.js b/docs/build/_static/jquery-3.2.1.js new file mode 100644 index 0000000..d2d8ca4 --- /dev/null +++ b/docs/build/_static/jquery-3.2.1.js @@ -0,0 +1,10253 @@ +/*! + * jQuery JavaScript Library v3.2.1 + * https://jquery.com/ + * + * Includes Sizzle.js + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2017-03-20T18:59Z + */ +( function( global, factory ) { + + "use strict"; + + if ( typeof module === "object" && typeof module.exports === "object" ) { + + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common +// enough that all such attempts are guarded in a try block. +"use strict"; + +var arr = []; + +var document = window.document; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +var concat = arr.concat; + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + +var support = {}; + + + + function DOMEval( code, doc ) { + doc = doc || document; + + var script = doc.createElement( "script" ); + + script.text = code; + doc.head.appendChild( script ).parentNode.removeChild( script ); + } +/* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var + version = "3.2.1", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android <=4.0 only + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } + + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + + if ( copyIsArray ) { + copyIsArray = false; + clone = src && Array.isArray( src ) ? src : []; + + } else { + clone = src && jQuery.isPlainObject( src ) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isFunction: function( obj ) { + return jQuery.type( obj ) === "function"; + }, + + isWindow: function( obj ) { + return obj != null && obj === obj.window; + }, + + isNumeric: function( obj ) { + + // As of jQuery 3.0, isNumeric is limited to + // strings and numbers (primitives or objects) + // that can be coerced to finite numbers (gh-2662) + var type = jQuery.type( obj ); + return ( type === "number" || type === "string" ) && + + // parseFloat NaNs numeric-cast false positives ("") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + !isNaN( obj - parseFloat( obj ) ); + }, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + + /* eslint-disable no-unused-vars */ + // See https://github.com/eslint/eslint/issues/6125 + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; + }, + + // Evaluates a script in a global context + globalEval: function( code ) { + DOMEval( code ); + }, + + // Convert dashed to camelCase; used by the css and data modules + // Support: IE <=9 - 11, Edge 12 - 13 + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // Support: Android <=4.0 only + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var tmp, args, proxy; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: Date.now, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.3.3 + * https://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2016-08-08 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // https://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }, + + disabledAncestor = addCombinator( + function( elem ) { + return elem.disabled === true && ("form" in elem || "label" in elem); + }, + { dir: "parentNode", next: "legend" } + ); + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + + // ID selector + if ( (m = match[1]) ) { + + // Document context + if ( nodeType === 9 ) { + if ( (elem = context.getElementById( m )) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && (elem = newContext.getElementById( m )) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( (m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !compilerCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + + if ( nodeType !== 1 ) { + newContext = context; + newSelector = selector; + + // qSA looks outside Element context, which is not what we want + // Thanks to Andrew Dupont for this workaround technique + // Support: IE <=8 + // Exclude object elements + } else if ( context.nodeName.toLowerCase() !== "object" ) { + + // Capture the context ID, setting it first if necessary + if ( (nid = context.getAttribute( "id" )) ) { + nid = nid.replace( rcssescape, fcssescape ); + } else { + context.setAttribute( "id", (nid = expando) ); + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[i] = "#" + nid + " " + toSelector( groups[i] ); + } + newSelector = groups.join( "," ); + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement("fieldset"); + + try { + return !!fn( el ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + // release memory in IE + el = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + a.sourceIndex - b.sourceIndex; + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11 + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + /* jshint -W018 */ + elem.isDisabled !== !disabled && + disabledAncestor( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9-11, Edge + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + if ( preferredDoc !== document && + (subWindow = document.defaultView) && subWindow.top !== subWindow ) { + + // Support: IE 11, Edge + if ( subWindow.addEventListener ) { + subWindow.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( subWindow.attachEvent ) { + subWindow.attachEvent( "onunload", unloadHandler ); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( el ) { + el.className = "i"; + return !el.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( el ) { + el.appendChild( document.createComment("") ); + return !el.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( el ) { + docElem.appendChild( el ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + }); + + // ID filter and find + if ( support.getById ) { + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode("id"); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( (elem = elems[i++]) ) { + node = elem.getAttributeNode("id"); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See https://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( el ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // https://bugs.jquery.com/ticket/12359 + docElem.appendChild( el ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( el.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !el.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !el.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( el ) { + el.innerHTML = "" + + ""; + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement("input"); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( el.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( el.querySelectorAll(":enabled").length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE9-11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + docElem.appendChild( el ).disabled = true; + if ( el.querySelectorAll(":disabled").length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + el.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( el ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( el, "*" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( el, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === document ? -1 : + b === document ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + !compilerCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.escape = function( sel ) { + return (sel + "").replace( rcssescape, fcssescape ); +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + // Use previously-cached element index if available + if ( useCache ) { + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": createDisabledPseudo( false ), + "disabled": createDisabledPseudo( true ), + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); + + if ( skip && skip === elem.nodeName.toLowerCase() ) { + elem = elem[ dir ] || elem; + } else if ( (oldCache = uniqueCache[ key ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context === document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + if ( !context && elem.ownerDocument !== document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context || document, xml) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( el ) { + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement("fieldset") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( el ) { + el.innerHTML = ""; + return el.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( el ) { + el.innerHTML = ""; + el.firstChild.setAttribute( "value", "" ); + return el.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( el ) { + return el.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; +jQuery.escapeSelector = Sizzle.escape; + + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +}; +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Simple selector that can be filtered directly, removing non-Elements + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + // Complex selector, compare the two sets, removing non-Elements + qualifier = jQuery.filter( qualifier, elements ); + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1; + } ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( nodeName( elem, "iframe" ) ) { + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( jQuery.isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && jQuery.isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && jQuery.isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( jQuery.isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.stackTrace ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the stack, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getStackHook ) { + process.stackTrace = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + jQuery.isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + jQuery.isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + jQuery.isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the master Deferred + master = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + master.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( master.state() === "pending" || + jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return master.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); + } + + return master.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +jQuery.Deferred.exceptionHook = function( error, stack ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ jQuery.camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ jQuery.camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( jQuery.camelCase ); + } else { + key = jQuery.camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + jQuery.contains( elem.ownerDocument, elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + +var swap = function( elem, options, callback, args ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.apply( elem, args || [] ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, + scale = 1, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + do { + + // If previous iteration zeroed out, double until we get *something*. + // Use string for doubling so we don't accidentally see scale as unchanged below + scale = scale || ".5"; + + // Adjust and apply + initialInUnit = initialInUnit / scale; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Update scale, tolerating zero or NaN from tween.cur() + // Break the loop if scale is unchanged or perfect, or if we've just had enough. + } while ( + scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations + ); + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i ); + +var rscriptType = ( /^$|\/(?:java|ecma)script/i ); + + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // Support: IE <=9 only + option: [ 1, "" ], + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
    " ], + col: [ 2, "", "
    " ], + tr: [ 2, "", "
    " ], + td: [ 3, "", "
    " ], + + _default: [ 0, "", "" ] +}; + +// Support: IE <=9 only +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (#15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, contains, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( jQuery.type( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; +} )(); +var documentElement = document.documentElement; + + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 only +// See #13393 for more info +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = {}; + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + // Make a writable jQuery.Event from the native event object + var event = jQuery.event.fix( nativeEvent ); + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: jQuery.isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + this.focus(); + return false; + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (#504, #13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + + which: function( event ) { + var button = event.button; + + // Add which for key events + if ( event.which == null && rkeyEvent.test( event.type ) ) { + return event.charCode != null ? event.charCode : event.keyCode; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { + if ( button & 1 ) { + return 1; + } + + if ( button & 2 ) { + return 3; + } + + if ( button & 4 ) { + return 2; + } + + return 0; + } + + return event.which; + } +}, jQuery.event.addProp ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + + /* eslint-disable max-len */ + + // See https://github.com/eslint/eslint/issues/3229 + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, + + /* eslint-enable */ + + // Support: IE <=10 - 11, Edge 12 - 13 + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return jQuery( ">tbody", elem )[ 0 ] || elem; + } + + return elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + + if ( match ) { + elem.type = match[ 1 ]; + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.access( src ); + pdataCur = dataPriv.set( dest, pdataOld ); + events = pdataOld.events; + + if ( events ) { + delete pdataCur.handle; + pdataCur.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( isFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + DOMEval( node.textContent.replace( rcleanScript, "" ), doc ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html.replace( rxhtmlTag, "<$1>" ); + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = jQuery.contains( elem.ownerDocument, elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rmargin = ( /^margin/ ); + +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (#15098, #14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + div.style.cssText = + "box-sizing:border-box;" + + "position:relative;display:block;" + + "margin:auto;border:1px;padding:1px;" + + "top:1%;width:50%"; + div.innerHTML = ""; + documentElement.appendChild( container ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = divStyle.marginLeft === "2px"; + boxSizingReliableVal = divStyle.width === "4px"; + + // Support: Android 4.0 - 4.3 only + // Some styles come back with percentage values, even though they shouldn't + div.style.marginRight = "50%"; + pixelMarginRightVal = divStyle.marginRight === "4px"; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (#8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" + + "padding:0;margin-top:1px;position:absolute"; + container.appendChild( div ); + + jQuery.extend( support, { + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelMarginRight: function() { + computeStyleTests(); + return pixelMarginRightVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, #12537) + // .css('--customProperty) (#3144) + if ( computed ) { + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return ( this.get = hookFn ).apply( this, arguments ); + } + }; +} + + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + rcustomProp = /^--/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }, + + cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style; + +// Return a css property mapped to a potentially vendor prefixed property +function vendorPropName( name ) { + + // Shortcut for names that are not vendor prefixed + if ( name in emptyStyle ) { + return name; + } + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a property mapped along what jQuery.cssProps suggests or to +// a vendor prefixed property. +function finalPropName( name ) { + var ret = jQuery.cssProps[ name ]; + if ( !ret ) { + ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name; + } + return ret; +} + +function setPositiveNumber( elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { + var i, + val = 0; + + // If we already have the right measurement, avoid augmentation + if ( extra === ( isBorderBox ? "border" : "content" ) ) { + i = 4; + + // Otherwise initialize for horizontal or vertical properties + } else { + i = name === "width" ? 1 : 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin, so add it if we want it + if ( extra === "margin" ) { + val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); + } + + if ( isBorderBox ) { + + // border-box includes padding, so remove it if we want content + if ( extra === "content" ) { + val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // At this point, extra isn't border nor margin, so remove border + if ( extra !== "margin" ) { + val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } else { + + // At this point, extra isn't content, so add padding + val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // At this point, extra isn't content nor padding, so add border + if ( extra !== "padding" ) { + val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + return val; +} + +function getWidthOrHeight( elem, name, extra ) { + + // Start with computed style + var valueIsBorderBox, + styles = getStyles( elem ), + val = curCSS( elem, name, styles ), + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Computed unit is not pixels. Stop here and return. + if ( rnumnonpx.test( val ) ) { + return val; + } + + // Check for style in case a browser which returns unreliable values + // for getComputedStyle silently falls back to the reliable elem.style + valueIsBorderBox = isBorderBox && + ( support.boxSizingReliable() || val === elem.style[ name ] ); + + // Fall back to offsetWidth/Height when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + if ( val === "auto" ) { + val = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ]; + } + + // Normalize "", auto, and prepare for extra + val = parseFloat( val ) || 0; + + // Use the active box-sizing model to add/subtract irrelevant styles + return ( val + + augmentWidthOrHeight( + elem, + name, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + "animationIterationCount": true, + "columnCount": true, + "fillOpacity": true, + "flexGrow": true, + "flexShrink": true, + "fontWeight": true, + "lineHeight": true, + "opacity": true, + "order": true, + "orphans": true, + "widows": true, + "zIndex": true, + "zoom": true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: { + "float": "cssFloat" + }, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = jQuery.camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (#7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug #9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (#7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + if ( type === "number" ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = jQuery.camelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( i, name ) { + jQuery.cssHooks[ name ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, name, extra ); + } ) : + getWidthOrHeight( elem, name, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = extra && getStyles( elem ), + subtract = extra && augmentWidthOrHeight( + elem, + name, + extra, + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + styles + ); + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ name ] = value; + value = jQuery.css( elem, name ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, + function( elem, computed ) { + if ( computed ) { + return ( parseFloat( curCSS( elem, "marginLeft" ) ) || + elem.getBoundingClientRect().left - + swap( elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + } ) + ) + "px"; + } + } +); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( !rmargin.test( prefix ) ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && + ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || + jQuery.cssHooks[ tween.prop ] ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, jQuery.fx.interval ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = jQuery.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 13 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = jQuery.camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + // If there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith( elem, [ animation ] ); + return false; + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( jQuery.isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + jQuery.proxy( result.stop, result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( jQuery.isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( jQuery.isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + jQuery.isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( jQuery.isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue && type !== false ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = jQuery.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + jQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ + // Use proper attribute retrieval(#12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( jQuery.isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( typeof value === "string" && value ) { + classes = value.match( rnothtmlwhite ) || []; + + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + if ( cur.indexOf( " " + clazz + " " ) < 0 ) { + cur += clazz + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + removeClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( jQuery.isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + if ( typeof value === "string" && value ) { + classes = value.match( rnothtmlwhite ) || []; + + while ( ( elem = this[ i++ ] ) ) { + curValue = getClass( elem ); + + // This expression is here for better compressibility (see addClass) + cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + j = 0; + while ( ( clazz = classes[ j++ ] ) ) { + + // Remove *all* instances + while ( cur.indexOf( " " + clazz + " " ) > -1 ) { + cur = cur.replace( " " + clazz + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + elem.setAttribute( "class", finalValue ); + } + } + } + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var type = typeof value; + + if ( typeof stateVal === "boolean" && type === "string" ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( jQuery.isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + return this.each( function() { + var className, i, self, classNames; + + if ( type === "string" ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = value.match( rnothtmlwhite ) || []; + + while ( ( className = classNames[ i++ ] ) ) { + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, isFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + isFunction = jQuery.isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( isFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (#14686, #14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (#2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + elem[ type ](); + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + + "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + + "change select submit keydown keypress keyup contextmenu" ).split( " " ), + function( i, name ) { + + // Handle event binding + jQuery.fn[ name ] = function( data, fn ) { + return arguments.length > 0 ? + this.on( name, null, data, fn ) : + this.trigger( name ); + }; +} ); + +jQuery.fn.extend( { + hover: function( fnOver, fnOut ) { + return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); + } +} ); + + + + +support.focusin = "onfocusin" in window; + + +// Support: Firefox <=44 +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = dataPriv.access( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = dataPriv.access( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + dataPriv.remove( doc, fix ); + + } else { + dataPriv.access( doc, fix, attaches ); + } + } + }; + } ); +} +var location = window.location; + +var nonce = jQuery.now(); + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) { + xml = undefined; + } + + if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { + jQuery.error( "Invalid XML: " + data ); + } + return xml; +}; + + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( Array.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && jQuery.type( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = jQuery.isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ) + .filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ) + .map( function( i, elem ) { + var val = jQuery( this ).val(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // #7653, #8125, #8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( jQuery.isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes #9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; + } + } + match = responseHeaders[ key.toLowerCase() ]; + } + return match == null ? null : match; + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (#10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket #12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 13 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available, append data to url + if ( s.data ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // #9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted + if ( jQuery.isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + + +jQuery._evalUrl = function( url ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (#11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + "throws": true + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( jQuery.isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( jQuery.isFunction( html ) ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var isFunction = jQuery.isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { + try { + return new window.XMLHttpRequest(); + } catch ( e ) {} +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // #1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see #8605, #14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // #14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain requests + if ( s.crossDomain ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( " + + + + + + + + + + + + + + +
    +
    +
    +
    + + +

    Index

    + +
    + +
    + + +
    +
    +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/build/index.html b/docs/build/index.html new file mode 100644 index 0000000..5c068b0 --- /dev/null +++ b/docs/build/index.html @@ -0,0 +1,191 @@ + + + + + + + + Welcome to Question Contribution’s documentation! — Question Contribution 0.1 documentation + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + +
    +

    Welcome to Question Contribution’s documentation!

    +
    +
    +
    +

    Login & Register

    +
    +
      +
    1. Click on the Register button on the main page.
    2. +
    3. After registration login with the username and password
    4. +
    +
    +
    +
    +

    Creating Questions

    +
    +
    +

    Note

    +

    You are allowed to create only 5 questions. So be careful with what you create!

    +
    +
      +
    1. After login click on Start Contribution button to start creating questions.

      +
    2. +
    3. On the contribution interface you can view all your questions.

      +
    4. +
    5. To delete a question Select the question and click on Delete Question button.

      +
    6. +
    7. Click on Add Question button to create a new question.

      +
    8. +
    9. +
      Below image shows an example of creating a question
      +
      +
      +_images/create_questions.jpg +
      +
      +

      Fields to fill while creating questions

      +
        +
      • Summary- Summary or the name of the question.

        +
      • +
      • Points - Points is the marks for a question.

        +
      • +
      • Description - The actual question description is to be written.

        +
        +
        +

        Note

        +

        To add code snippets in question description please use html <code> and <br> tags.

        +
        +
        +
      • +
      • +
        Solution - It is the correct expected answer of the question.
        +

        For e.g.

        +
        a = input()
        +b = input()
        +print(a+b)
        +
        +
        +
        +
        +
      • +
      • Citation - Mention the reference url of the question if the question is adapated

        +
        +
        +

        Note

        +

        Leave the field blank if the question is original.

        +
        +
        +
      • +
      • Originality - Specify whether the question is Original Question or Adapted Question

        +
      • +
      +
      +
      +
    10. +
    11. +
      Below image shows an example of how to create test cases.
      +
      +
      +_images/create_testcases.jpg +
      +
      +

      In Expected input field, enter the value(s) that will be passed to the code through a standard I/O stream.

      +
      +
      +

      Note

      +

      If there are multiple input values in a test case, enter the values in new line as shown in figure.

      +
      +
      +

      In Expected Output Field, enter the expected output for that test case. For e.g type 3 if the output of the user code is 3.

      +

      To delete a test case Select Delete checkbox and click on Check and Save to delete the testcase and save the question.

      +
      +
      +
    12. +
    +
    +
    +
    + + +
    +
    +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/build/objects.inv b/docs/build/objects.inv new file mode 100644 index 0000000000000000000000000000000000000000..8b73ae0df4776720d43c7c26ce275763bc0d7dc6 GIT binary patch literal 268 zcmY#Z2rkIT%&Sny%qvUHE6FdaR47X=D$dN$Q!wIERtPA{&q_@$u~G;uO)V|~i8|-! zl@w(rm4Y}x1z`}yRti9NNJgqcQEF~tW?o8akwSi&LPdY&6kdHQ&r4ZL6);?dsqDs{?}XBrhv zGh#SWHGiH|aP`nS6kI&%b8)b!*C$aX@8E84qtBm3=6wF_)nzo<%W;l7uW`3%!!57k z;Llz{j!IoIJAZ0McihqAlyEV7VLlAkbR-YHfF Iv0T4z0D`D#>;M1& literal 0 HcmV?d00001 diff --git a/docs/build/search.html b/docs/build/search.html new file mode 100644 index 0000000..e6459a0 --- /dev/null +++ b/docs/build/search.html @@ -0,0 +1,92 @@ + + + + + + + + Search — Question Contribution 0.1 documentation + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    +
    + +

    Search

    +
    + +

    + Please activate JavaScript to enable the search + functionality. +

    +
    +

    + From here you can search these documents. Enter your search + words into the box below and click "search". Note that the search + function will automatically search for all of the words. Pages + containing fewer words won't appear in the result list. +

    +
    + + + +
    + +
    + +
    + +
    +
    +
    + +
    +
    + + + + + + + \ No newline at end of file diff --git a/docs/build/searchindex.js b/docs/build/searchindex.js new file mode 100644 index 0000000..3bfbdb9 --- /dev/null +++ b/docs/build/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({docnames:["index"],envversion:53,filenames:["index.rst"],objects:{},objnames:{},objtypes:{},terms:{"case":0,"new":0,"while":0,For:0,The:0,actual:0,adap:0,adapt:0,add:0,after:0,all:0,allow:0,answer:0,below:0,blank:0,button:0,can:0,care:0,check:0,checkbox:0,citat:0,click:0,code:0,correct:0,craet:[],creat:[],create_quest:[],delet:0,descript:0,enter:0,exampl:0,expect:0,field:0,figur:0,fill:0,how:0,html:0,imag:0,index:[],input:0,interfac:0,jpg:[],leav:0,line:0,login:[],main:0,mark:0,mention:0,modul:[],multipl:0,name:0,onli:0,origin:0,output:0,page:0,pass:0,password:0,pleas:0,point:0,print:0,refer:0,regist:[],register:[],registr:0,save:0,search:[],select:0,show:0,shown:0,snippet:0,solut:0,specifi:0,standard:0,start:0,stream:0,student:[],summari:0,tag:0,test:0,testcas:0,through:0,type:0,url:0,use:0,user:0,usernam:0,valu:0,view:0,what:0,whether:0,written:0,you:0,your:0},titles:["Welcome to Question Contribution\u2019s documentation!"],titleterms:{contribut:0,creat:0,document:0,indic:[],login:0,question:0,regist:0,start:[],tabl:[],welcom:0}}) \ No newline at end of file diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 0000000..33bd1b0 --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,188 @@ +# -*- coding: utf-8 -*- +# +# Configuration file for the Sphinx documentation builder. +# +# This file does only contain a selection of the most common options. For a +# full list see the documentation: +# http://www.sphinx-doc.org/en/stable/config + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +# import os +# import sys +# sys.path.insert(0, os.path.abspath('.')) + + +# -- Project information ----------------------------------------------------- + +project = 'Question Contribution' +copyright = '2018, Aditya' +author = 'Aditya' + +# The short X.Y version +version = '' +# The full version, including alpha/beta/rc tags +release = '0.1' + + +# -- General configuration --------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.intersphinx', + 'sphinx.ext.ifconfig', + 'sphinx.ext.viewcode', +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] +source_suffix = '.rst' + +# The master toctree document. +master_doc = 'index' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path . +exclude_patterns = [] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'alabaster' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +# html_theme_options = {} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Custom sidebar templates, must be a dictionary that maps document names +# to template names. +# +# The default sidebars (for documents that don't match any pattern) are +# defined by theme itself. Builtin themes are using these templates by +# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', +# 'searchbox.html']``. +# +# html_sidebars = {} + + +# -- Options for HTMLHelp output --------------------------------------------- + +# Output file base name for HTML help builder. +htmlhelp_basename = 'QuestionContributiondoc' + + +# -- Options for LaTeX output ------------------------------------------------ + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'QuestionContribution.tex', 'Question Contribution Documentation', + 'Aditya', 'manual'), +] + + +# -- Options for manual page output ------------------------------------------ + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'questioncontribution', 'Question Contribution Documentation', + [author], 1) +] + + +# -- Options for Texinfo output ---------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'QuestionContribution', 'Question Contribution Documentation', + author, 'QuestionContribution', 'One line description of project.', + 'Miscellaneous'), +] + + +# -- Options for Epub output ------------------------------------------------- + +# Bibliographic Dublin Core info. +epub_title = project +epub_author = author +epub_publisher = author +epub_copyright = copyright + +# The unique identifier of the text. This can be a ISBN number +# or the project homepage. +# +# epub_identifier = '' + +# A unique identification for the text. +# +# epub_uid = '' + +# A list of files that should not be packed into the epub file. +epub_exclude_files = ['search.html'] + + +# -- Extension configuration ------------------------------------------------- + +# -- Options for intersphinx extension --------------------------------------- + +# Example configuration for intersphinx: refer to the Python standard library. +intersphinx_mapping = {'https://docs.python.org/': None} \ No newline at end of file diff --git a/docs/source/images/create_questions.jpg b/docs/source/images/create_questions.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5cc153579585e72c4eb26f27da348bde584863ef GIT binary patch literal 61036 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 and
    tags. + + * **Solution** - It is the correct expected answer of the question. Please follow Python syntaxes here. + For e.g. :: + + a = input() + b = input() + print(a+b) + + * **Citation** - Mention the reference url of the question if the question is adapated. Please make sure to cite the original source of the question if it is not a original question. + + .. note:: Leave the field blank if the question is original. + + * **Originality** - Specify whether the question is **Original Question** or **Adapted Question** + + 6. Below image shows an example of how to create test cases. + .. figure:: images/create_testcases.jpg + + In **Expected input** field, enter the value(s) that will be passed to the code through a standard I/O stream. + + .. note:: If there are multiple input values in a test case, enter the values in new line as shown in figure. + + In **Expected Output** Field, enter the expected output for that test case. For e.g type 3 if the output of the user code is 3. + + To delete a test case Select **Delete** checkbox and click on **Check and Save** to delete the testcase and save the question. + + + diff --git a/templates/add_question.html b/templates/add_question.html index 19ccb2c..db4fc5a 100644 --- a/templates/add_question.html +++ b/templates/add_question.html @@ -35,8 +35,8 @@ Description: {{ qform.description}} {{qform.description.errors}} Rendered Solution:

    Solution: {{ qform.solution }}{{qform.solution.errors}} - Citation: {{ qform.citation }}{{qform.citation.errors}} - Originality: {{ qform.originality }} {{qform.citations.errors}} + Citation: {{ qform.citation }}{{qform.citations.errors}} + Originality: {{ qform.originality }} {{qform.originality.errors}} {% for formset in formsets %}
    diff --git a/yaksh/settings.py b/yaksh/settings.py index fe37783..1ae7a89 100644 --- a/yaksh/settings.py +++ b/yaksh/settings.py @@ -75,14 +75,24 @@ # Database # https://docs.djangoproject.com/en/1.9/ref/settings/#databases +# DATABASES = { +# 'default': { +# 'ENGINE': 'django.db.backends.sqlite3', +# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), +# } +# } DATABASES = { 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), - } + 'ENGINE': 'django.db.backends.mysql', + 'NAME': "contribute", + # The following settings are not used with sqlite3: + 'USER': "username", + 'PASSWORD': "password", + 'HOST': 'localhost', # Empty for localhost through domain sockets or '1$ + 'PORT': 3306, + }, } - # Password validation # https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators @@ -120,3 +130,5 @@ # https://docs.djangoproject.com/en/1.9/howto/static-files/ STATIC_URL = '/static/' + +STATIC_ROOT = 'templates' From 13251649dd1a391f3bbe8afab576c9f0e1a12c52 Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Fri, 9 Mar 2018 17:24:05 +0530 Subject: [PATCH 09/49] Change doc --- docs/source/index.rst | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/source/index.rst b/docs/source/index.rst index 0929de7..6dac391 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -22,8 +22,7 @@ Creating Questions 1. After login click on **Start Contribution** button to start creating questions. 2. On the contribution interface you can view all your questions. - 3. To delete a question Select the question and click on **Delete Question** button. - .. note:: Once deleted, a question cannot be retrieved back. Please take caution before deletion. + 3. To delete a question Select the question and click on **Delete Question** button. Once deleted, a question cannot be retrieved back. Please take caution before deletion. 4. Click on **Add Question** button to create a new question. 5. Below image shows an example of creating a question .. figure:: images/create_questions.jpg From d7566681ef1943e66171b68380ae549614df2d2d Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Fri, 9 Mar 2018 19:36:57 +0530 Subject: [PATCH 10/49] Update docs --- docs/source/index.rst | 24 +++- interface/migrations/0001_initial.py | 104 +++++------------- .../migrations/0002_auto_20160611_0919.py | 26 ----- .../migrations/0003_auto_20160617_1133.py | 30 ----- .../migrations/0004_auto_20160620_1627.py | 27 ----- interface/migrations/0005_question_user.py | 23 ---- .../migrations/0006_auto_20160621_2147.py | 35 ------ .../migrations/0007_question_avg_rating.py | 20 ---- .../migrations/0008_auto_20160624_1632.py | 19 ---- .../migrations/0009_auto_20160624_1640.py | 23 ---- 10 files changed, 45 insertions(+), 286 deletions(-) delete mode 100644 interface/migrations/0002_auto_20160611_0919.py delete mode 100644 interface/migrations/0003_auto_20160617_1133.py delete mode 100644 interface/migrations/0004_auto_20160620_1627.py delete mode 100644 interface/migrations/0005_question_user.py delete mode 100644 interface/migrations/0006_auto_20160621_2147.py delete mode 100644 interface/migrations/0007_question_avg_rating.py delete mode 100644 interface/migrations/0008_auto_20160624_1632.py delete mode 100644 interface/migrations/0009_auto_20160624_1640.py diff --git a/docs/source/index.rst b/docs/source/index.rst index 6dac391..def154d 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -7,6 +7,16 @@ Welcome to Question Contribution's documentation! :maxdepth: 2 :caption: Contents: +Basic Instructions +------------------ + + 1. Create 5 Python Coding Questions along with 5 test cases each on the above interface. + 2. Avoid trivial questions such as Printing patterns, Reversing strings, Arithmetic operations, etc. + 3. Question description should be grammatically correct and easy to understand. + 4. Questions can be original or adapted from other sources with significant changes in case the question is adapted, the source needs to be cited in the interface). We prefer non-cited, original questions for shortlisting the candidates. + 5. Question should be well tested. + + Login & Register ---------------- @@ -18,7 +28,7 @@ Login & Register Creating Questions ------------------ - .. note:: You are allowed to create only 5 questions. You can edit and delete questions though. + .. note:: You are allowed to create only 5 questions. You can edit and delete those questions though. 1. After login click on **Start Contribution** button to start creating questions. 2. On the contribution interface you can view all your questions. @@ -35,9 +45,9 @@ Creating Questions * **Description** - Write the actual question here. One can use HTML tags to format question text. - .. note:: To add code snippets in question description please use html and
    tags. + .. note:: To add code snippets in question description please use html
    ,  and 
    tags. - * **Solution** - It is the correct expected answer of the question. Please follow Python syntaxes here. + * **Solution** - It is the **correct code answer** of the question. Please follow Python syntaxes here. For e.g. :: a = input() @@ -55,11 +65,17 @@ Creating Questions In **Expected input** field, enter the value(s) that will be passed to the code through a standard I/O stream. - .. note:: If there are multiple input values in a test case, enter the values in new line as shown in figure. + .. note:: If there are multiple input values in a test case, enter the values in a new line as shown in figure. In **Expected Output** Field, enter the expected output for that test case. For e.g type 3 if the output of the user code is 3. To delete a test case Select **Delete** checkbox and click on **Check and Save** to delete the testcase and save the question. + .. note:: Please do not change the type of the testcase i.e **stdiobasedtestcase**. + + 7. If all the test cases for the questions pass, then the question is automatically approved. To see how many questions are approved, you can look at the **status** column in contribution page, where you see all your questions. + + 8. If you have created 5 approved questions, **your question creation task is completed.** + diff --git a/interface/migrations/0001_initial.py b/interface/migrations/0001_initial.py index 1e1f480..8c2671b 100644 --- a/interface/migrations/0001_initial.py +++ b/interface/migrations/0001_initial.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2016-06-08 22:04 +# Generated by Django 1.9.5 on 2018-03-09 12:58 from __future__ import unicode_literals from django.conf import settings @@ -16,39 +16,20 @@ class Migration(migrations.Migration): ] operations = [ - migrations.CreateModel( - name='Choice', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('text', models.TextField(default='')), - ('correct', models.BooleanField(default=False)), - ], - ), - migrations.CreateModel( - name='Input', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_type', models.CharField(default='', max_length=24)), - ('value', models.CharField(max_length=24)), - ], - ), - migrations.CreateModel( - name='Output', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('_type', models.CharField(default='', max_length=24)), - ('value', models.CharField(max_length=24)), - ], - ), migrations.CreateModel( name='Question', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('title', models.CharField(default='', max_length=50)), - ('text', models.TextField(default='')), - ('language', models.CharField(choices=[('python', 'Python'), ('bash', 'Bash'), ('c', 'C Language'), ('cpp', 'C++ Language'), ('java', 'Java Language'), ('scilab', 'Scilab')], default='python', max_length=24)), - ('marks', models.IntegerField(default=0)), - ('status', models.IntegerField(choices=[(1, 'approved'), (0, 'unseen'), (-1, 'discarded')], default=0)), + ('summary', models.CharField(max_length=256)), + ('description', models.TextField()), + ('points', models.FloatField(default=1.0)), + ('language', models.CharField(default='python', max_length=24)), + ('type', models.CharField(default='code', max_length=24)), + ('solution', models.TextField()), + ('citation', models.TextField(blank=True, help_text='Please add appropriate citation if the question is adapted from elsewhere.', null=True)), + ('originality', models.CharField(choices=[('original', 'Original Question'), ('adapted', 'Adapted Question')], default='original', max_length=24)), + ('status', models.BooleanField(default=False)), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='user', to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( @@ -56,6 +37,8 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('rate', models.IntegerField(choices=[(1, 'Poor'), (2, 'Average'), (3, 'Good'), (4, 'Verygood'), (5, 'Excellent')], default=3)), + ('question', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='interface.Question')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( @@ -63,70 +46,33 @@ class Migration(migrations.Migration): fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('comments', models.CharField(choices=[(1, 'easy'), (2, 'medium'), (3, 'difficult')], max_length=24)), + ('question', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='interface.Question')), + ('reviewer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], ), migrations.CreateModel( name='TestCase', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('no_of_inputs', models.IntegerField()), - ('no_of_outputs', models.IntegerField()), + ('type', models.CharField(default='stdiobasedtestcase', max_length=24)), ], ), migrations.CreateModel( - name='CodeQuestion', + name='StdIOBasedTestCase', fields=[ - ('question_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='interface.Question')), - ('function_name', models.CharField(default=False, max_length=100)), + ('testcase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='interface.TestCase')), + ('expected_input', models.TextField(blank=True, default=None, null=True)), + ('expected_output', models.TextField(default=None)), ], - bases=('interface.question',), - ), - migrations.CreateModel( - name='MultipleChoiceQuestion', - fields=[ - ('question_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='interface.Question')), - ('no_of_inputs', models.IntegerField(default=4)), - ], - bases=('interface.question',), + bases=('interface.testcase',), ), migrations.AddField( model_name='testcase', name='question', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='interface.Question'), - ), - migrations.AddField( - model_name='review', - name='question', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='interface.Question'), - ), - migrations.AddField( - model_name='review', - name='reviewer', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='rating', - name='question', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='interface.Question'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='interface.Question'), ), - migrations.AddField( - model_name='rating', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='output', - name='test_cases', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='interface.TestCase'), - ), - migrations.AddField( - model_name='input', - name='test_cases', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='interface.TestCase'), - ), - migrations.AddField( - model_name='choice', - name='question', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='interface.Question'), + migrations.AlterUniqueTogether( + name='rating', + unique_together=set([('user', 'question')]), ), ] diff --git a/interface/migrations/0002_auto_20160611_0919.py b/interface/migrations/0002_auto_20160611_0919.py deleted file mode 100644 index 4002810..0000000 --- a/interface/migrations/0002_auto_20160611_0919.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2016-06-11 09:19 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('interface', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='choice', - name='question', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='interface.MultipleChoiceQuestion'), - ), - migrations.AlterField( - model_name='testcase', - name='question', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='interface.CodeQuestion'), - ), - ] diff --git a/interface/migrations/0003_auto_20160617_1133.py b/interface/migrations/0003_auto_20160617_1133.py deleted file mode 100644 index ba97572..0000000 --- a/interface/migrations/0003_auto_20160617_1133.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.5 on 2016-06-17 11:33 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('interface', '0002_auto_20160611_0919'), - ] - - operations = [ - migrations.AlterField( - model_name='codequestion', - name='function_name', - field=models.CharField(default=None, max_length=100), - ), - migrations.AlterField( - model_name='input', - name='_type', - field=models.CharField(choices=[(1, 'integer'), (2, 'float'), (3, 'string'), (4, 'boolean')], max_length=24), - ), - migrations.AlterField( - model_name='output', - name='_type', - field=models.CharField(choices=[(1, 'integer'), (2, 'float'), (3, 'string'), (4, 'boolean')], max_length=24), - ), - ] diff --git a/interface/migrations/0004_auto_20160620_1627.py b/interface/migrations/0004_auto_20160620_1627.py deleted file mode 100644 index 931b8f9..0000000 --- a/interface/migrations/0004_auto_20160620_1627.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.5 on 2016-06-20 16:27 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('interface', '0003_auto_20160617_1133'), - ] - - operations = [ - migrations.AlterField( - model_name='rating', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, unique=True), - ), - migrations.AlterField( - model_name='review', - name='reviewer', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, unique=True), - ), - ] diff --git a/interface/migrations/0005_question_user.py b/interface/migrations/0005_question_user.py deleted file mode 100644 index 2a17043..0000000 --- a/interface/migrations/0005_question_user.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.5 on 2016-06-21 17:12 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('interface', '0004_auto_20160620_1627'), - ] - - operations = [ - migrations.AddField( - model_name='question', - name='user', - field=models.ForeignKey(default=0, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - ] diff --git a/interface/migrations/0006_auto_20160621_2147.py b/interface/migrations/0006_auto_20160621_2147.py deleted file mode 100644 index 2589db0..0000000 --- a/interface/migrations/0006_auto_20160621_2147.py +++ /dev/null @@ -1,35 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.5 on 2016-06-21 21:47 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('interface', '0005_question_user'), - ] - - operations = [ - migrations.AlterField( - model_name='rating', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - migrations.AlterField( - model_name='review', - name='reviewer', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - migrations.AlterUniqueTogether( - name='rating', - unique_together=set([('user', 'question')]), - ), - migrations.AlterUniqueTogether( - name='review', - unique_together=set([('reviewer', 'question')]), - ), - ] diff --git a/interface/migrations/0007_question_avg_rating.py b/interface/migrations/0007_question_avg_rating.py deleted file mode 100644 index a3785bb..0000000 --- a/interface/migrations/0007_question_avg_rating.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.5 on 2016-06-23 16:56 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('interface', '0006_auto_20160621_2147'), - ] - - operations = [ - migrations.AddField( - model_name='question', - name='avg_rating', - field=models.IntegerField(default=0), - ), - ] diff --git a/interface/migrations/0008_auto_20160624_1632.py b/interface/migrations/0008_auto_20160624_1632.py deleted file mode 100644 index d146d4f..0000000 --- a/interface/migrations/0008_auto_20160624_1632.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2016-06-24 16:32 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('interface', '0007_question_avg_rating'), - ] - - operations = [ - migrations.AlterUniqueTogether( - name='rating', - unique_together=set([]), - ), - ] diff --git a/interface/migrations/0009_auto_20160624_1640.py b/interface/migrations/0009_auto_20160624_1640.py deleted file mode 100644 index 6ad38e8..0000000 --- a/interface/migrations/0009_auto_20160624_1640.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9 on 2016-06-24 16:40 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('interface', '0008_auto_20160624_1632'), - ] - - operations = [ - migrations.AlterUniqueTogether( - name='rating', - unique_together=set([('user', 'question')]), - ), - migrations.AlterUniqueTogether( - name='review', - unique_together=set([]), - ), - ] From 3094c2a742ca52e7fafb36ae33024cffed0362e4 Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Fri, 9 Mar 2018 19:56:53 +0530 Subject: [PATCH 11/49] Add MakeFile to docs --- docs/Makefile | 225 + docs/build/.buildinfo | 4 - docs/build/.doctrees/environment.pickle | Bin 1499935 -> 0 bytes docs/build/.doctrees/index.doctree | Bin 18762 -> 0 bytes docs/build/_sources/index.rst.txt | 65 - docs/build/_static/ajax-loader.gif | Bin 673 -> 0 bytes docs/build/_static/alabaster.css | 693 -- docs/build/_static/basic.css | 665 - docs/build/_static/comment-bright.png | Bin 756 -> 0 bytes docs/build/_static/comment-close.png | Bin 829 -> 0 bytes docs/build/_static/comment.png | Bin 641 -> 0 bytes docs/build/_static/custom.css | 1 - docs/build/_static/doctools.js | 311 - docs/build/_static/documentation_options.js | 9 - docs/build/_static/down-pressed.png | Bin 222 -> 0 bytes docs/build/_static/down.png | Bin 202 -> 0 bytes docs/build/_static/file.png | Bin 286 -> 0 bytes docs/build/_static/jquery-3.2.1.js | 10253 ---------------- docs/build/_static/jquery.js | 4 - docs/build/_static/minus.png | Bin 90 -> 0 bytes docs/build/_static/plus.png | Bin 90 -> 0 bytes docs/build/_static/pygments.css | 69 - docs/build/_static/searchtools.js | 761 -- docs/build/_static/underscore-1.3.1.js | 999 -- docs/build/_static/underscore.js | 31 - docs/build/_static/up-pressed.png | Bin 214 -> 0 bytes docs/build/_static/up.png | Bin 203 -> 0 bytes docs/build/_static/websupport.js | 808 -- docs/build/genindex.html | 81 - docs/build/index.html | 191 - docs/build/objects.inv | Bin 268 -> 0 bytes docs/build/search.html | 92 - docs/build/searchindex.js | 1 - docs/{source => }/conf.py | 0 .../_images => images}/create_questions.jpg | Bin .../_images => images}/create_testcases.jpg | Bin docs/{source => }/index.rst | 0 docs/source/images/create_questions.jpg | Bin 61036 -> 0 bytes docs/source/images/create_testcases.jpg | Bin 48772 -> 0 bytes 39 files changed, 225 insertions(+), 15038 deletions(-) create mode 100644 docs/Makefile delete mode 100644 docs/build/.buildinfo delete mode 100644 docs/build/.doctrees/environment.pickle delete mode 100644 docs/build/.doctrees/index.doctree delete mode 100644 docs/build/_sources/index.rst.txt delete mode 100644 docs/build/_static/ajax-loader.gif delete mode 100644 docs/build/_static/alabaster.css delete mode 100644 docs/build/_static/basic.css delete mode 100644 docs/build/_static/comment-bright.png delete mode 100644 docs/build/_static/comment-close.png delete mode 100644 docs/build/_static/comment.png delete mode 100644 docs/build/_static/custom.css delete mode 100644 docs/build/_static/doctools.js delete mode 100644 docs/build/_static/documentation_options.js delete mode 100644 docs/build/_static/down-pressed.png delete mode 100644 docs/build/_static/down.png delete mode 100644 docs/build/_static/file.png delete mode 100644 docs/build/_static/jquery-3.2.1.js delete mode 100644 docs/build/_static/jquery.js delete mode 100644 docs/build/_static/minus.png delete mode 100644 docs/build/_static/plus.png delete mode 100644 docs/build/_static/pygments.css delete mode 100644 docs/build/_static/searchtools.js delete mode 100644 docs/build/_static/underscore-1.3.1.js delete mode 100644 docs/build/_static/underscore.js delete mode 100644 docs/build/_static/up-pressed.png delete mode 100644 docs/build/_static/up.png delete mode 100644 docs/build/_static/websupport.js delete mode 100644 docs/build/genindex.html delete mode 100644 docs/build/index.html delete mode 100644 docs/build/objects.inv delete mode 100644 docs/build/search.html delete mode 100644 docs/build/searchindex.js rename docs/{source => }/conf.py (100%) rename docs/{build/_images => images}/create_questions.jpg (100%) rename docs/{build/_images => images}/create_testcases.jpg (100%) rename docs/{source => }/index.rst (100%) delete mode 100644 docs/source/images/create_questions.jpg delete mode 100644 docs/source/images/create_testcases.jpg diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..2159ccb --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,225 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " applehelp to make an Apple Help Book" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " epub3 to make an epub3" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + @echo " coverage to run coverage check of the documentation (if enabled)" + @echo " dummy to check syntax errors of document sources" + +.PHONY: clean +clean: + rm -rf $(BUILDDIR)/* + +.PHONY: html +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +.PHONY: dirhtml +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +.PHONY: singlehtml +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +.PHONY: pickle +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +.PHONY: json +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +.PHONY: htmlhelp +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +.PHONY: qthelp +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Yaksh.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Yaksh.qhc" + +.PHONY: applehelp +applehelp: + $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp + @echo + @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." + @echo "N.B. You won't be able to view it unless you put it in" \ + "~/Library/Documentation/Help or install it in your application" \ + "bundle." + +.PHONY: devhelp +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/Yaksh" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Yaksh" + @echo "# devhelp" + +.PHONY: epub +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +.PHONY: epub3 +epub3: + $(SPHINXBUILD) -b epub3 $(ALLSPHINXOPTS) $(BUILDDIR)/epub3 + @echo + @echo "Build finished. The epub3 file is in $(BUILDDIR)/epub3." + +.PHONY: latex +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +.PHONY: latexpdf +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +.PHONY: latexpdfja +latexpdfja: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through platex and dvipdfmx..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +.PHONY: text +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +.PHONY: man +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +.PHONY: texinfo +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +.PHONY: info +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +.PHONY: gettext +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +.PHONY: changes +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +.PHONY: linkcheck +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +.PHONY: doctest +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +.PHONY: coverage +coverage: + $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage + @echo "Testing of coverage in the sources finished, look at the " \ + "results in $(BUILDDIR)/coverage/python.txt." + +.PHONY: xml +xml: + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." + +.PHONY: pseudoxml +pseudoxml: + $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml + @echo + @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." + +.PHONY: dummy +dummy: + $(SPHINXBUILD) -b dummy $(ALLSPHINXOPTS) $(BUILDDIR)/dummy + @echo + @echo "Build finished. Dummy builder generates no files." diff --git a/docs/build/.buildinfo b/docs/build/.buildinfo deleted file mode 100644 index 964c2fc..0000000 --- a/docs/build/.buildinfo +++ /dev/null @@ -1,4 +0,0 @@ -# Sphinx build info version 1 -# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 80cef55ba893dae5c814937d4802c7d5 -tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/build/.doctrees/environment.pickle b/docs/build/.doctrees/environment.pickle deleted file mode 100644 index 150737415b08181e988f7a7e11d905f56bfa542b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1499935 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 z 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 diff --git a/docs/build/.doctrees/index.doctree b/docs/build/.doctrees/index.doctree deleted file mode 100644 index e68f62d445f43d67adbb1efaaee41eec46b2831f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18762 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 diff --git a/docs/build/_sources/index.rst.txt b/docs/build/_sources/index.rst.txt deleted file mode 100644 index 22a8621..0000000 --- a/docs/build/_sources/index.rst.txt +++ /dev/null @@ -1,65 +0,0 @@ -.. Question Contribution documentation master file, created by - -Welcome to Question Contribution's documentation! -================================================= - -.. toctree:: - :maxdepth: 2 - :caption: Contents: - - -Login & Register ----------------- - - 1. Click on the **Register** button on the main page. - 2. After registration login with the username and password - - -Creating Questions ------------------- - - .. note:: You are allowed to create only 5 questions. So be careful with what you create! - - 1. After login click on **Start Contribution** button to start creating questions. - 2. On the contribution interface you can view all your questions. - 3. To delete a question Select the question and click on **Delete Question** button. - 4. Click on **Add Question** button to create a new question. - 5. Below image shows an example of creating a question - .. figure:: images/create_questions.jpg - - Fields to fill while creating questions - - * **Summary**- Summary or the name of the question. - - * **Points** - Points is the marks for a question. - - * **Description** - The actual question description is to be written. - - .. note:: To add code snippets in question description please use html and
    tags. - - * **Solution** - It is the correct expected answer of the question. - For e.g. :: - - a = input() - b = input() - print(a+b) - - * **Citation** - Mention the reference url of the question if the question is adapated - - .. note:: Leave the field blank if the question is original. - - * **Originality** - Specify whether the question is **Original Question** or **Adapted Question** - - 6. Below image shows an example of how to create test cases. - .. figure:: images/create_testcases.jpg - - In **Expected input** field, enter the value(s) that will be passed to the code through a standard I/O stream. - - .. note:: If there are multiple input values in a test case, enter the values in new line as shown in figure. - - In **Expected Output** Field, enter the expected output for that test case. For e.g type 3 if the output of the user code is 3. - - To delete a test case Select **Delete** checkbox and click on **Check and Save** to delete the testcase and save the question. - - - diff --git a/docs/build/_static/ajax-loader.gif b/docs/build/_static/ajax-loader.gif deleted file mode 100644 index 61faf8cab23993bd3e1560bff0668bd628642330..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 673 zcmZ?wbhEHb6krfw_{6~Q|Nno%(3)e{?)x>&1u}A`t?OF7Z|1gRivOgXi&7IyQd1Pl zGfOfQ60;I3a`F>X^fL3(@);C=vM_KlFfb_o=k{|A33hf2a5d61U}gjg=>Rd%XaNQW zW@Cw{|b%Y*pl8F?4B9 zlo4Fz*0kZGJabY|>}Okf0}CCg{u4`zEPY^pV?j2@h+|igy0+Kz6p;@SpM4s6)XEMg z#3Y4GX>Hjlml5ftdH$4x0JGdn8~MX(U~_^d!Hi)=HU{V%g+mi8#UGbE-*ao8f#h+S z2a0-5+vc7MU$e-NhmBjLIC1v|)9+Im8x1yacJ7{^tLX(ZhYi^rpmXm0`@ku9b53aN zEXH@Y3JaztblgpxbJt{AtE1ad1Ca>{v$rwwvK(>{m~Gf_=-Ro7Fk{#;i~+{{>QtvI yb2P8Zac~?~=sRA>$6{!(^3;ZP0TPFR(G_-UDU(8Jl0?(IXu$~#4A!880|o%~Al1tN diff --git a/docs/build/_static/alabaster.css b/docs/build/_static/alabaster.css deleted file mode 100644 index be65b13..0000000 --- a/docs/build/_static/alabaster.css +++ /dev/null @@ -1,693 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -@import url("basic.css"); - -/* -- page layout ----------------------------------------------------------- */ - -body { - font-family: 'goudy old style', 'minion pro', 'bell mt', Georgia, 'Hiragino Mincho Pro', serif; - font-size: 17px; - background-color: #fff; - color: #000; - margin: 0; - padding: 0; -} - - -div.document { - width: 940px; - margin: 30px auto 0 auto; -} - -div.documentwrapper { - float: left; - width: 100%; -} - -div.bodywrapper { - margin: 0 0 0 220px; -} - -div.sphinxsidebar { - width: 220px; - font-size: 14px; - line-height: 1.5; -} - -hr { - border: 1px solid #B1B4B6; -} - -div.body { - background-color: #fff; - color: #3E4349; - padding: 0 30px 0 30px; -} - -div.body > .section { - text-align: left; -} - -div.footer { - width: 940px; - margin: 20px auto 30px auto; - font-size: 14px; - color: #888; - text-align: right; -} - -div.footer a { - color: #888; -} - -p.caption { - font-family: inherit; - font-size: inherit; -} - - -div.relations { - display: none; -} - - -div.sphinxsidebar a { - color: #444; - text-decoration: none; - border-bottom: 1px dotted #999; -} - -div.sphinxsidebar a:hover { - border-bottom: 1px solid #999; -} - -div.sphinxsidebarwrapper { - padding: 18px 10px; -} - -div.sphinxsidebarwrapper p.logo { - padding: 0; - margin: -10px 0 0 0px; - text-align: center; -} - -div.sphinxsidebarwrapper h1.logo { - margin-top: -10px; - text-align: center; - margin-bottom: 5px; - text-align: left; -} - -div.sphinxsidebarwrapper h1.logo-name { - margin-top: 0px; -} - -div.sphinxsidebarwrapper p.blurb { - margin-top: 0; - font-style: normal; -} - -div.sphinxsidebar h3, -div.sphinxsidebar h4 { - font-family: 'Garamond', 'Georgia', serif; - color: #444; - font-size: 24px; - font-weight: normal; - margin: 0 0 5px 0; - padding: 0; -} - -div.sphinxsidebar h4 { - font-size: 20px; -} - -div.sphinxsidebar h3 a { - color: #444; -} - -div.sphinxsidebar p.logo a, -div.sphinxsidebar h3 a, -div.sphinxsidebar p.logo a:hover, -div.sphinxsidebar h3 a:hover { - border: none; -} - -div.sphinxsidebar p { - color: #555; - margin: 10px 0; -} - -div.sphinxsidebar ul { - margin: 10px 0; - padding: 0; - color: #000; -} - -div.sphinxsidebar ul li.toctree-l1 > a { - font-size: 120%; -} - -div.sphinxsidebar ul li.toctree-l2 > a { - font-size: 110%; -} - -div.sphinxsidebar input { - border: 1px solid #CCC; - font-family: 'goudy old style', 'minion pro', 'bell mt', Georgia, 'Hiragino Mincho Pro', serif; - font-size: 1em; -} - -div.sphinxsidebar hr { - border: none; - height: 1px; - color: #AAA; - background: #AAA; - - text-align: left; - margin-left: 0; - width: 50%; -} - -/* -- body styles ----------------------------------------------------------- */ - -a { - color: #004B6B; - text-decoration: underline; -} - -a:hover { - color: #6D4100; - text-decoration: underline; -} - -div.body h1, -div.body h2, -div.body h3, -div.body h4, -div.body h5, -div.body h6 { - font-family: 'Garamond', 'Georgia', serif; - font-weight: normal; - margin: 30px 0px 10px 0px; - padding: 0; -} - -div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; } -div.body h2 { font-size: 180%; } -div.body h3 { font-size: 150%; } -div.body h4 { font-size: 130%; } -div.body h5 { font-size: 100%; } -div.body h6 { font-size: 100%; } - -a.headerlink { - color: #DDD; - padding: 0 4px; - text-decoration: none; -} - -a.headerlink:hover { - color: #444; - background: #EAEAEA; -} - -div.body p, div.body dd, div.body li { - line-height: 1.4em; -} - -div.admonition { - margin: 20px 0px; - padding: 10px 30px; - background-color: #EEE; - border: 1px solid #CCC; -} - -div.admonition tt.xref, div.admonition code.xref, div.admonition a tt { - background-color: #FBFBFB; - border-bottom: 1px solid #fafafa; -} - -div.admonition p.admonition-title { - font-family: 'Garamond', 'Georgia', serif; - font-weight: normal; - font-size: 24px; - margin: 0 0 10px 0; - padding: 0; - line-height: 1; -} - -div.admonition p.last { - margin-bottom: 0; -} - -div.highlight { - background-color: #fff; -} - -dt:target, .highlight { - background: #FAF3E8; -} - -div.warning { - background-color: #FCC; - border: 1px solid #FAA; -} - -div.danger { - background-color: #FCC; - border: 1px solid #FAA; - -moz-box-shadow: 2px 2px 4px #D52C2C; - -webkit-box-shadow: 2px 2px 4px #D52C2C; - box-shadow: 2px 2px 4px #D52C2C; -} - -div.error { - background-color: #FCC; - border: 1px solid #FAA; - -moz-box-shadow: 2px 2px 4px #D52C2C; - -webkit-box-shadow: 2px 2px 4px #D52C2C; - box-shadow: 2px 2px 4px #D52C2C; -} - -div.caution { - background-color: #FCC; - border: 1px solid #FAA; -} - -div.attention { - background-color: #FCC; - border: 1px solid #FAA; -} - -div.important { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.note { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.tip { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.hint { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.seealso { - background-color: #EEE; - border: 1px solid #CCC; -} - -div.topic { - background-color: #EEE; -} - -p.admonition-title { - display: inline; -} - -p.admonition-title:after { - content: ":"; -} - -pre, tt, code { - font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace; - font-size: 0.9em; -} - -.hll { - background-color: #FFC; - margin: 0 -12px; - padding: 0 12px; - display: block; -} - -img.screenshot { -} - -tt.descname, tt.descclassname, code.descname, code.descclassname { - font-size: 0.95em; -} - -tt.descname, code.descname { - padding-right: 0.08em; -} - -img.screenshot { - -moz-box-shadow: 2px 2px 4px #EEE; - -webkit-box-shadow: 2px 2px 4px #EEE; - box-shadow: 2px 2px 4px #EEE; -} - -table.docutils { - border: 1px solid #888; - -moz-box-shadow: 2px 2px 4px #EEE; - -webkit-box-shadow: 2px 2px 4px #EEE; - box-shadow: 2px 2px 4px #EEE; -} - -table.docutils td, table.docutils th { - border: 1px solid #888; - padding: 0.25em 0.7em; -} - -table.field-list, table.footnote { - border: none; - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} - -table.footnote { - margin: 15px 0; - width: 100%; - border: 1px solid #EEE; - background: #FDFDFD; - font-size: 0.9em; -} - -table.footnote + table.footnote { - margin-top: -15px; - border-top: none; -} - -table.field-list th { - padding: 0 0.8em 0 0; -} - -table.field-list td { - padding: 0; -} - -table.field-list p { - margin-bottom: 0.8em; -} - -/* Cloned from - * https://github.com/sphinx-doc/sphinx/commit/ef60dbfce09286b20b7385333d63a60321784e68 - */ -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -table.footnote td.label { - width: .1px; - padding: 0.3em 0 0.3em 0.5em; -} - -table.footnote td { - padding: 0.3em 0.5em; -} - -dl { - margin: 0; - padding: 0; -} - -dl dd { - margin-left: 30px; -} - -blockquote { - margin: 0 0 0 30px; - padding: 0; -} - -ul, ol { - /* Matches the 30px from the narrow-screen "li > ul" selector below */ - margin: 10px 0 10px 30px; - padding: 0; -} - -pre { - background: #EEE; - padding: 7px 30px; - margin: 15px 0px; - line-height: 1.3em; -} - -div.viewcode-block:target { - background: #ffd; -} - -dl pre, blockquote pre, li pre { - margin-left: 0; - padding-left: 30px; -} - -tt, code { - background-color: #ecf0f3; - color: #222; - /* padding: 1px 2px; */ -} - -tt.xref, code.xref, a tt { - background-color: #FBFBFB; - border-bottom: 1px solid #fff; -} - -a.reference { - text-decoration: none; - border-bottom: 1px dotted #004B6B; -} - -/* Don't put an underline on images */ -a.image-reference, a.image-reference:hover { - border-bottom: none; -} - -a.reference:hover { - border-bottom: 1px solid #6D4100; -} - -a.footnote-reference { - text-decoration: none; - font-size: 0.7em; - vertical-align: top; - border-bottom: 1px dotted #004B6B; -} - -a.footnote-reference:hover { - border-bottom: 1px solid #6D4100; -} - -a:hover tt, a:hover code { - background: #EEE; -} - - -@media screen and (max-width: 870px) { - - div.sphinxsidebar { - display: none; - } - - div.document { - width: 100%; - - } - - div.documentwrapper { - margin-left: 0; - margin-top: 0; - margin-right: 0; - margin-bottom: 0; - } - - div.bodywrapper { - margin-top: 0; - margin-right: 0; - margin-bottom: 0; - margin-left: 0; - } - - ul { - margin-left: 0; - } - - li > ul { - /* Matches the 30px from the "ul, ol" selector above */ - margin-left: 30px; - } - - .document { - width: auto; - } - - .footer { - width: auto; - } - - .bodywrapper { - margin: 0; - } - - .footer { - width: auto; - } - - .github { - display: none; - } - - - -} - - - -@media screen and (max-width: 875px) { - - body { - margin: 0; - padding: 20px 30px; - } - - div.documentwrapper { - float: none; - background: #fff; - } - - div.sphinxsidebar { - display: block; - float: none; - width: 102.5%; - margin: 50px -30px -20px -30px; - padding: 10px 20px; - background: #333; - color: #FFF; - } - - div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p, - div.sphinxsidebar h3 a { - color: #fff; - } - - div.sphinxsidebar a { - color: #AAA; - } - - div.sphinxsidebar p.logo { - display: none; - } - - div.document { - width: 100%; - margin: 0; - } - - div.footer { - display: none; - } - - div.bodywrapper { - margin: 0; - } - - div.body { - min-height: 0; - padding: 0; - } - - .rtd_doc_footer { - display: none; - } - - .document { - width: auto; - } - - .footer { - width: auto; - } - - .footer { - width: auto; - } - - .github { - display: none; - } -} - - -/* misc. */ - -.revsys-inline { - display: none!important; -} - -/* Make nested-list/multi-paragraph items look better in Releases changelog - * pages. Without this, docutils' magical list fuckery causes inconsistent - * formatting between different release sub-lists. - */ -div#changelog > div.section > ul > li > p:only-child { - margin-bottom: 0; -} - -/* Hide fugly table cell borders in ..bibliography:: directive output */ -table.docutils.citation, table.docutils.citation td, table.docutils.citation th { - border: none; - /* Below needed in some edge cases; if not applied, bottom shadows appear */ - -moz-box-shadow: none; - -webkit-box-shadow: none; - box-shadow: none; -} \ No newline at end of file diff --git a/docs/build/_static/basic.css b/docs/build/_static/basic.css deleted file mode 100644 index 19ced10..0000000 --- a/docs/build/_static/basic.css +++ /dev/null @@ -1,665 +0,0 @@ -/* - * basic.css - * ~~~~~~~~~ - * - * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/* -- main layout ----------------------------------------------------------- */ - -div.clearer { - clear: both; -} - -/* -- relbar ---------------------------------------------------------------- */ - -div.related { - width: 100%; - font-size: 90%; -} - -div.related h3 { - display: none; -} - -div.related ul { - margin: 0; - padding: 0 0 0 10px; - list-style: none; -} - -div.related li { - display: inline; -} - -div.related li.right { - float: right; - margin-right: 5px; -} - -/* -- sidebar --------------------------------------------------------------- */ - -div.sphinxsidebarwrapper { - padding: 10px 5px 0 10px; -} - -div.sphinxsidebar { - float: left; - width: 230px; - margin-left: -100%; - font-size: 90%; - word-wrap: break-word; - overflow-wrap : break-word; -} - -div.sphinxsidebar ul { - list-style: none; -} - -div.sphinxsidebar ul ul, -div.sphinxsidebar ul.want-points { - margin-left: 20px; - list-style: square; -} - -div.sphinxsidebar ul ul { - margin-top: 0; - margin-bottom: 0; -} - -div.sphinxsidebar form { - margin-top: 10px; -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - -div.sphinxsidebar #searchbox input[type="text"] { - float: left; - width: 80%; - padding: 0.25em; - box-sizing: border-box; -} - -div.sphinxsidebar #searchbox input[type="submit"] { - float: left; - width: 20%; - border-left: none; - padding: 0.25em; - box-sizing: border-box; -} - - -img { - border: 0; - max-width: 100%; -} - -/* -- search page ----------------------------------------------------------- */ - -ul.search { - margin: 10px 0 0 20px; - padding: 0; -} - -ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; -} - -ul.search li a { - font-weight: bold; -} - -ul.search li div.context { - color: #888; - margin: 2px 0 0 30px; - text-align: left; -} - -ul.keywordmatches li.goodmatch a { - font-weight: bold; -} - -/* -- index page ------------------------------------------------------------ */ - -table.contentstable { - width: 90%; - margin-left: auto; - margin-right: auto; -} - -table.contentstable p.biglink { - line-height: 150%; -} - -a.biglink { - font-size: 1.3em; -} - -span.linkdescr { - font-style: italic; - padding-top: 5px; - font-size: 90%; -} - -/* -- general index --------------------------------------------------------- */ - -table.indextable { - width: 100%; -} - -table.indextable td { - text-align: left; - vertical-align: top; -} - -table.indextable ul { - margin-top: 0; - margin-bottom: 0; - list-style-type: none; -} - -table.indextable > tbody > tr > td > ul { - padding-left: 0em; -} - -table.indextable tr.pcap { - height: 10px; -} - -table.indextable tr.cap { - margin-top: 10px; - background-color: #f2f2f2; -} - -img.toggler { - margin-right: 3px; - margin-top: 3px; - cursor: pointer; -} - -div.modindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -div.genindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -/* -- domain module index --------------------------------------------------- */ - -table.modindextable td { - padding: 2px; - border-collapse: collapse; -} - -/* -- general body styles --------------------------------------------------- */ - -div.body { - min-width: 450px; - max-width: 800px; -} - -div.body p, div.body dd, div.body li, div.body blockquote { - -moz-hyphens: auto; - -ms-hyphens: auto; - -webkit-hyphens: auto; - hyphens: auto; -} - -a.headerlink { - visibility: hidden; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink, -caption:hover > a.headerlink, -p.caption:hover > a.headerlink, -div.code-block-caption:hover > a.headerlink { - visibility: visible; -} - -div.body p.caption { - text-align: inherit; -} - -div.body td { - text-align: left; -} - -.first { - margin-top: 0 !important; -} - -p.rubric { - margin-top: 30px; - font-weight: bold; -} - -img.align-left, .figure.align-left, object.align-left { - clear: left; - float: left; - margin-right: 1em; -} - -img.align-right, .figure.align-right, object.align-right { - clear: right; - float: right; - margin-left: 1em; -} - -img.align-center, .figure.align-center, object.align-center { - display: block; - margin-left: auto; - margin-right: auto; -} - -.align-left { - text-align: left; -} - -.align-center { - text-align: center; -} - -.align-right { - text-align: right; -} - -/* -- sidebars -------------------------------------------------------------- */ - -div.sidebar { - margin: 0 0 0.5em 1em; - border: 1px solid #ddb; - padding: 7px 7px 0 7px; - background-color: #ffe; - width: 40%; - float: right; -} - -p.sidebar-title { - font-weight: bold; -} - -/* -- topics ---------------------------------------------------------------- */ - -div.topic { - border: 1px solid #ccc; - padding: 7px 7px 0 7px; - margin: 10px 0 10px 0; -} - -p.topic-title { - font-size: 1.1em; - font-weight: bold; - margin-top: 10px; -} - -/* -- admonitions ----------------------------------------------------------- */ - -div.admonition { - margin-top: 10px; - margin-bottom: 10px; - padding: 7px; -} - -div.admonition dt { - font-weight: bold; -} - -div.admonition dl { - margin-bottom: 0; -} - -p.admonition-title { - margin: 0px 10px 5px 0px; - font-weight: bold; -} - -div.body p.centered { - text-align: center; - margin-top: 25px; -} - -/* -- tables ---------------------------------------------------------------- */ - -table.docutils { - border: 0; - border-collapse: collapse; -} - -table.align-center { - margin-left: auto; - margin-right: auto; -} - -table caption span.caption-number { - font-style: italic; -} - -table caption span.caption-text { -} - -table.docutils td, table.docutils th { - padding: 1px 8px 1px 5px; - border-top: 0; - border-left: 0; - border-right: 0; - border-bottom: 1px solid #aaa; -} - -table.footnote td, table.footnote th { - border: 0 !important; -} - -th { - text-align: left; - padding-right: 5px; -} - -table.citation { - border-left: solid 1px gray; - margin-left: 1px; -} - -table.citation td { - border-bottom: none; -} - -/* -- figures --------------------------------------------------------------- */ - -div.figure { - margin: 0.5em; - padding: 0.5em; -} - -div.figure p.caption { - padding: 0.3em; -} - -div.figure p.caption span.caption-number { - font-style: italic; -} - -div.figure p.caption span.caption-text { -} - -/* -- field list styles ----------------------------------------------------- */ - -table.field-list td, table.field-list th { - border: 0 !important; -} - -.field-list ul { - margin: 0; - padding-left: 1em; -} - -.field-list p { - margin: 0; -} - -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -/* -- other body styles ----------------------------------------------------- */ - -ol.arabic { - list-style: decimal; -} - -ol.loweralpha { - list-style: lower-alpha; -} - -ol.upperalpha { - list-style: upper-alpha; -} - -ol.lowerroman { - list-style: lower-roman; -} - -ol.upperroman { - list-style: upper-roman; -} - -dl { - margin-bottom: 15px; -} - -dd p { - margin-top: 0px; -} - -dd ul, dd table { - margin-bottom: 10px; -} - -dd { - margin-top: 3px; - margin-bottom: 10px; - margin-left: 30px; -} - -dt:target, span.highlighted { - background-color: #fbe54e; -} - -rect.highlighted { - fill: #fbe54e; -} - -dl.glossary dt { - font-weight: bold; - font-size: 1.1em; -} - -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - -.versionmodified { - font-style: italic; -} - -.system-message { - background-color: #fda; - padding: 5px; - border: 3px solid red; -} - -.footnote:target { - background-color: #ffa; -} - -.line-block { - display: block; - margin-top: 1em; - margin-bottom: 1em; -} - -.line-block .line-block { - margin-top: 0; - margin-bottom: 0; - margin-left: 1.5em; -} - -.guilabel, .menuselection { - font-family: sans-serif; -} - -.accelerator { - text-decoration: underline; -} - -.classifier { - font-style: oblique; -} - -abbr, acronym { - border-bottom: dotted 1px; - cursor: help; -} - -/* -- code displays --------------------------------------------------------- */ - -pre { - overflow: auto; - overflow-y: hidden; /* fixes display issues on Chrome browsers */ -} - -span.pre { - -moz-hyphens: none; - -ms-hyphens: none; - -webkit-hyphens: none; - hyphens: none; -} - -td.linenos pre { - padding: 5px 0px; - border: 0; - background-color: transparent; - color: #aaa; -} - -table.highlighttable { - margin-left: 0.5em; -} - -table.highlighttable td { - padding: 0 0.5em 0 0.5em; -} - -div.code-block-caption { - padding: 2px 5px; - font-size: small; -} - -div.code-block-caption code { - background-color: transparent; -} - -div.code-block-caption + div > div.highlight > pre { - margin-top: 0; -} - -div.code-block-caption span.caption-number { - padding: 0.1em 0.3em; - font-style: italic; -} - -div.code-block-caption span.caption-text { -} - -div.literal-block-wrapper { - padding: 1em 1em 0; -} - -div.literal-block-wrapper div.highlight { - margin: 0; -} - -code.descname { - background-color: transparent; - font-weight: bold; - font-size: 1.2em; -} - -code.descclassname { - background-color: transparent; -} - -code.xref, a code { - background-color: transparent; - font-weight: bold; -} - -h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { - background-color: transparent; -} - -.viewcode-link { - float: right; -} - -.viewcode-back { - float: right; - font-family: sans-serif; -} - -div.viewcode-block:target { - margin: -1px -10px; - padding: 0 10px; -} - -/* -- math display ---------------------------------------------------------- */ - -img.math { - vertical-align: middle; -} - -div.body div.math p { - text-align: center; -} - -span.eqno { - float: right; -} - -span.eqno a.headerlink { - position: relative; - left: 0px; - z-index: 1; -} - -div.math:hover a.headerlink { - visibility: visible; -} - -/* -- printout stylesheet --------------------------------------------------- */ - -@media print { - div.document, - div.documentwrapper, - div.bodywrapper { - margin: 0 !important; - width: 100%; - } - - div.sphinxsidebar, - div.related, - div.footer, - #top-link { - display: none; - } -} \ No newline at end of file diff --git a/docs/build/_static/comment-bright.png b/docs/build/_static/comment-bright.png deleted file mode 100644 index 15e27edb12ac25701ac0ac21b97b52bb4e45415e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 756 zcmVgfIX78 z$8Pzv({A~p%??+>KickCb#0FM1rYN=mBmQ&Nwp<#JXUhU;{|)}%&s>suq6lXw*~s{ zvHx}3C%<;wE5CH!BR{p5@ml9ws}y)=QN-kL2?#`S5d*6j zk`h<}j1>tD$b?4D^N9w}-k)bxXxFg>+#kme^xx#qg6FI-%iv2U{0h(Y)cs%5a|m%Pn_K3X_bDJ>EH#(Fb73Z zfUt2Q3B>N+ot3qb*DqbTZpFIn4a!#_R-}{?-~Hs=xSS6p&$sZ-k1zDdtqU`Y@`#qL z&zv-~)Q#JCU(dI)Hf;$CEnK=6CK50}q7~wdbI->?E07bJ0R;!GSQTs5Am`#;*WHjvHRvY?&$Lm-vq1a_BzocI^ULXV!lbMd%|^B#fY;XX)n<&R^L z=84u1e_3ziq;Hz-*k5~zwY3*oDKt0;bM@M@@89;@m*4RFgvvM_4;5LB!@OB@^WbVT zjl{t;a8_>od-~P4 m{5|DvB&z#xT;*OnJqG}gk~_7HcNkCr0000W zanA~u9RIXo;n7c96&U)YLgs-FGlx~*_c{Jgvesu1E5(8YEf&5wF=YFPcRe@1=MJmi zag(L*xc2r0(slpcN!vC5CUju;vHJkHc*&70_n2OZsK%O~A=!+YIw z7zLLl7~Z+~RgWOQ=MI6$#0pvpu$Q43 zP@36QAmu6!_9NPM?o<1_!+stoVRRZbW9#SPe!n;#A_6m8f}|xN1;H{`0RoXQ2LM47 zt(g;iZ6|pCb@h2xk&(}S3=EVBUO0e90m2Lp5CB<(SPIaB;n4))3JB87Or#XPOPcum z?<^(g+m9}VNn4Y&B`g8h{t_$+RB1%HKRY6fjtd-<7&EsU;vs0GM(Lmbhi%Gwcfs0FTF}T zL{_M6Go&E0Eg8FuB*(Yn+Z*RVTBE@10eIOb3El^MhO`GabDll(V0&FlJi2k^;q8af zkENdk2}x2)_KVp`5OAwXZM;dG0?M-S)xE1IKDi6BY@5%Or?#aZ9$gcX)dPZ&wA1a< z$rFXHPn|TBf`e?>Are8sKtKrKcjF$i^lp!zkL?C|y^vlHr1HXeVJd;1I~g&Ob-q)& z(fn7s-KI}G{wnKzg_U5G(V%bX6uk zIa+<@>rdmZYd!9Y=C0cuchrbIjuRB_Wq{-RXlic?flu1*_ux}x%(HDH&nT`k^xCeC ziHi1!ChH*sQ6|UqJpTTzX$aw8e(UfcS^f;6yBWd+(1-70zU(rtxtqR%j z-lsH|CKQJXqD{+F7V0OTv8@{~(wp(`oIP^ZykMWgR>&|RsklFMCnOo&Bd{le} zV5F6424Qzl;o2G%oVvmHgRDP9!=rK8fy^!yV8y*4p=??uIRrrr0?>O!(z*g5AvL2!4z0{sq%vhG*Po}`a<6%kTK5TNhtC8}rXNu&h^QH4A&Sk~Autm*s~45(H7+0bi^MraaRVzr05hQ3iK?j` zR#U@^i0WhkIHTg29u~|ypU?sXCQEQgXfObPW;+0YAF;|5XyaMAEM0sQ@4-xCZe=0e z7r$ofiAxn@O5#RodD8rh5D@nKQ;?lcf@tg4o+Wp44aMl~c47azN_(im0N)7OqdPBC zGw;353_o$DqGRDhuhU$Eaj!@m000000NkvXXu0mjfjZ7Z_ diff --git a/docs/build/_static/custom.css b/docs/build/_static/custom.css deleted file mode 100644 index 2a924f1..0000000 --- a/docs/build/_static/custom.css +++ /dev/null @@ -1 +0,0 @@ -/* This file intentionally left blank. */ diff --git a/docs/build/_static/doctools.js b/docs/build/_static/doctools.js deleted file mode 100644 index 0c15c00..0000000 --- a/docs/build/_static/doctools.js +++ /dev/null @@ -1,311 +0,0 @@ -/* - * doctools.js - * ~~~~~~~~~~~ - * - * Sphinx JavaScript utilities for all documentation. - * - * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/** - * select a different prefix for underscore - */ -$u = _.noConflict(); - -/** - * make the code below compatible with browsers without - * an installed firebug like debugger -if (!window.console || !console.firebug) { - var names = ["log", "debug", "info", "warn", "error", "assert", "dir", - "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", - "profile", "profileEnd"]; - window.console = {}; - for (var i = 0; i < names.length; ++i) - window.console[names[i]] = function() {}; -} - */ - -/** - * small helper function to urldecode strings - */ -jQuery.urldecode = function(x) { - return decodeURIComponent(x).replace(/\+/g, ' '); -}; - -/** - * small helper function to urlencode strings - */ -jQuery.urlencode = encodeURIComponent; - -/** - * This function returns the parsed url parameters of the - * current request. Multiple values per key are supported, - * it will always return arrays of strings for the value parts. - */ -jQuery.getQueryParameters = function(s) { - if (typeof s === 'undefined') - s = document.location.search; - var parts = s.substr(s.indexOf('?') + 1).split('&'); - var result = {}; - for (var i = 0; i < parts.length; i++) { - var tmp = parts[i].split('=', 2); - var key = jQuery.urldecode(tmp[0]); - var value = jQuery.urldecode(tmp[1]); - if (key in result) - result[key].push(value); - else - result[key] = [value]; - } - return result; -}; - -/** - * highlight a given string on a jquery object by wrapping it in - * span elements with the given class name. - */ -jQuery.fn.highlightText = function(text, className) { - function highlight(node, addItems) { - if (node.nodeType === 3) { - var val = node.nodeValue; - var pos = val.toLowerCase().indexOf(text); - if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) { - var span; - var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.className = className; - } - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - node.parentNode.insertBefore(span, node.parentNode.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling)); - node.nodeValue = val.substr(0, pos); - if (isInSVG) { - var bbox = span.getBBox(); - var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute('class', className); - var parentOfText = node.parentNode.parentNode; - addItems.push({ - "parent": node.parentNode, - "target": rect}); - } - } - } - else if (!jQuery(node).is("button, select, textarea")) { - jQuery.each(node.childNodes, function() { - highlight(this, addItems); - }); - } - } - var addItems = []; - var result = this.each(function() { - highlight(this, addItems); - }); - for (var i = 0; i < addItems.length; ++i) { - jQuery(addItems[i].parent).before(addItems[i].target); - } - return result; -}; - -/* - * backward compatibility for jQuery.browser - * This will be supported until firefox bug is fixed. - */ -if (!jQuery.browser) { - jQuery.uaMatch = function(ua) { - ua = ua.toLowerCase(); - - var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || - /(webkit)[ \/]([\w.]+)/.exec(ua) || - /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || - /(msie) ([\w.]+)/.exec(ua) || - ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || - []; - - return { - browser: match[ 1 ] || "", - version: match[ 2 ] || "0" - }; - }; - jQuery.browser = {}; - jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; -} - -/** - * Small JavaScript module for the documentation. - */ -var Documentation = { - - init : function() { - this.fixFirefoxAnchorBug(); - this.highlightSearchWords(); - this.initIndexTable(); - - }, - - /** - * i18n support - */ - TRANSLATIONS : {}, - PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, - LOCALE : 'unknown', - - // gettext and ngettext don't access this so that the functions - // can safely bound to a different name (_ = Documentation.gettext) - gettext : function(string) { - var translated = Documentation.TRANSLATIONS[string]; - if (typeof translated === 'undefined') - return string; - return (typeof translated === 'string') ? translated : translated[0]; - }, - - ngettext : function(singular, plural, n) { - var translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated === 'undefined') - return (n == 1) ? singular : plural; - return translated[Documentation.PLURALEXPR(n)]; - }, - - addTranslations : function(catalog) { - for (var key in catalog.messages) - this.TRANSLATIONS[key] = catalog.messages[key]; - this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); - this.LOCALE = catalog.locale; - }, - - /** - * add context elements like header anchor links - */ - addContextElements : function() { - $('div[id] > :header:first').each(function() { - $('
    \u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this headline')). - appendTo(this); - }); - $('dt[id]').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this definition')). - appendTo(this); - }); - }, - - /** - * workaround a firefox stupidity - * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 - */ - fixFirefoxAnchorBug : function() { - if (document.location.hash && $.browser.mozilla) - window.setTimeout(function() { - document.location.href += ''; - }, 10); - }, - - /** - * highlight the search words provided in the url in the text - */ - highlightSearchWords : function() { - var params = $.getQueryParameters(); - var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; - if (terms.length) { - var body = $('div.body'); - if (!body.length) { - body = $('body'); - } - window.setTimeout(function() { - $.each(terms, function() { - body.highlightText(this.toLowerCase(), 'highlighted'); - }); - }, 10); - $('') - .appendTo($('#searchbox')); - } - }, - - /** - * init the domain index toggle buttons - */ - initIndexTable : function() { - var togglers = $('img.toggler').click(function() { - var src = $(this).attr('src'); - var idnum = $(this).attr('id').substr(7); - $('tr.cg-' + idnum).toggle(); - if (src.substr(-9) === 'minus.png') - $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); - else - $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); - }).css('display', ''); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { - togglers.click(); - } - }, - - /** - * helper function to hide the search marks again - */ - hideSearchWords : function() { - $('#searchbox .highlight-link').fadeOut(300); - $('span.highlighted').removeClass('highlighted'); - }, - - /** - * make the url absolute - */ - makeURL : function(relativeURL) { - return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; - }, - - /** - * get the current relative url - */ - getCurrentURL : function() { - var path = document.location.pathname; - var parts = path.split(/\//); - $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { - if (this === '..') - parts.pop(); - }); - var url = parts.join('/'); - return path.substring(url.lastIndexOf('/') + 1, path.length - 1); - }, - - initOnKeyListeners: function() { - $(document).keyup(function(event) { - var activeElementType = document.activeElement.tagName; - // don't navigate when in search box or textarea - if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT') { - switch (event.keyCode) { - case 37: // left - var prevHref = $('link[rel="prev"]').prop('href'); - if (prevHref) { - window.location.href = prevHref; - return false; - } - case 39: // right - var nextHref = $('link[rel="next"]').prop('href'); - if (nextHref) { - window.location.href = nextHref; - return false; - } - } - } - }); - } -}; - -// quick alias for translations -_ = Documentation.gettext; - -$(document).ready(function() { - Documentation.init(); -}); \ No newline at end of file diff --git a/docs/build/_static/documentation_options.js b/docs/build/_static/documentation_options.js deleted file mode 100644 index fb47b84..0000000 --- a/docs/build/_static/documentation_options.js +++ /dev/null @@ -1,9 +0,0 @@ -var DOCUMENTATION_OPTIONS = { - URL_ROOT: '', - VERSION: '0.1', - LANGUAGE: 'None', - COLLAPSE_INDEX: false, - FILE_SUFFIX: '.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '.txt' -}; \ No newline at end of file diff --git a/docs/build/_static/down-pressed.png b/docs/build/_static/down-pressed.png deleted file mode 100644 index 5756c8cad8854722893dc70b9eb4bb0400343a39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 222 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`OFdm2Ln;`PZ^+1>KjR?B@S0W7 z%OS_REiHONoJ6{+Ks@6k3590|7k9F+ddB6!zw3#&!aw#S`x}3V3&=A(a#84O-&F7T z^k3tZB;&iR9siw0|F|E|DAL<8r-F4!1H-;1{e*~yAKZN5f0|Ei6yUmR#Is)EM(Po_ zi`qJR6|P<~+)N+kSDgL7AjdIC_!O7Q?eGb+L+qOjm{~LLinM4NHn7U%HcK%uoMYO5 VJ~8zD2B3o(JYD@<);T3K0RV0%P>BEl diff --git a/docs/build/_static/down.png b/docs/build/_static/down.png deleted file mode 100644 index 1b3bdad2ceffae91cee61b32f3295f9bbe646e48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!60wlNoGJgf6CVIL!hEy=F?b*7pIY7kW{q%Rg zx!yQ<9v8bmJwa`TQk7YSw}WVQ()mRdQ;TC;* diff --git a/docs/build/_static/file.png b/docs/build/_static/file.png deleted file mode 100644 index a858a410e4faa62ce324d814e4b816fff83a6fb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 286 zcmV+(0pb3MP)s`hMrGg#P~ix$^RISR_I47Y|r1 z_CyJOe}D1){SET-^Amu_i71Lt6eYfZjRyw@I6OQAIXXHDfiX^GbOlHe=Ae4>0m)d(f|Me07*qoM6N<$f}vM^LjV8( diff --git a/docs/build/_static/jquery-3.2.1.js b/docs/build/_static/jquery-3.2.1.js deleted file mode 100644 index d2d8ca4..0000000 --- a/docs/build/_static/jquery-3.2.1.js +++ /dev/null @@ -1,10253 +0,0 @@ -/*! - * jQuery JavaScript Library v3.2.1 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2017-03-20T18:59Z - */ -( function( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 -// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode -// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common -// enough that all such attempts are guarded in a try block. -"use strict"; - -var arr = []; - -var document = window.document; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var concat = arr.concat; - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var fnToString = hasOwn.toString; - -var ObjectFunctionString = fnToString.call( Object ); - -var support = {}; - - - - function DOMEval( code, doc ) { - doc = doc || document; - - var script = doc.createElement( "script" ); - - script.text = code; - doc.head.appendChild( script ).parentNode.removeChild( script ); - } -/* global Symbol */ -// Defining this global in .eslintrc.json would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module - - - -var - version = "3.2.1", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }, - - // Support: Android <=4.0 only - // Make sure we trim BOM and NBSP - rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, - - // Matches dashed string for camelizing - rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return letter.toUpperCase(); - }; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - - // Return all the elements in a clean array - if ( num == null ) { - return slice.call( this ); - } - - // Return just the one element from the set - return num < 0 ? this[ num + this.length ] : this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - - if ( copyIsArray ) { - copyIsArray = false; - clone = src && Array.isArray( src ) ? src : []; - - } else { - clone = src && jQuery.isPlainObject( src ) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isFunction: function( obj ) { - return jQuery.type( obj ) === "function"; - }, - - isWindow: function( obj ) { - return obj != null && obj === obj.window; - }, - - isNumeric: function( obj ) { - - // As of jQuery 3.0, isNumeric is limited to - // strings and numbers (primitives or objects) - // that can be coerced to finite numbers (gh-2662) - var type = jQuery.type( obj ); - return ( type === "number" || type === "string" ) && - - // parseFloat NaNs numeric-cast false positives ("") - // ...but misinterprets leading-number strings, particularly hex literals ("0x...") - // subtraction forces infinities to NaN - !isNaN( obj - parseFloat( obj ) ); - }, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - - /* eslint-disable no-unused-vars */ - // See https://github.com/eslint/eslint/issues/6125 - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - type: function( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; - }, - - // Evaluates a script in a global context - globalEval: function( code ) { - DOMEval( code ); - }, - - // Convert dashed to camelCase; used by the css and data modules - // Support: IE <=9 - 11, Edge 12 - 13 - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // Support: Android <=4.0 only - trim: function( text ) { - return text == null ? - "" : - ( text + "" ).replace( rtrim, "" ); - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - var tmp, args, proxy; - - if ( typeof context === "string" ) { - tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - args = slice.call( arguments, 2 ); - proxy = function() { - return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; - }, - - now: Date.now, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = jQuery.type( obj ); - - if ( type === "function" || jQuery.isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.3 - * https://sizzlejs.com/ - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2016-08-08 - */ -(function( window ) { - -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ({}).hasOwnProperty, - arr = [], - pop = arr.pop, - push_native = arr.push, - push = arr.push, - slice = arr.slice, - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[i] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + - "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - - rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), - funescape = function( _, escaped, escapedWhitespace ) { - var high = "0x" + escaped - 0x10000; - // NaN means non-codepoint - // Support: Firefox<24 - // Workaround erroneous numeric interpretation of +"0x" - return high !== high || escapedWhitespace ? - escaped : - high < 0 ? - // BMP codepoint - String.fromCharCode( high + 0x10000 ) : - // Supplemental Plane codepoint (surrogate pair) - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }, - - disabledAncestor = addCombinator( - function( elem ) { - return elem.disabled === true && ("form" in elem || "label" in elem); - }, - { dir: "parentNode", next: "legend" } - ); - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - (arr = slice.call( preferredDoc.childNodes )), - preferredDoc.childNodes - ); - // Support: Android<4.0 - // Detect silently failing push.apply - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - push_native.apply( target, slice.call(els) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - // Can't trust NodeList.length - while ( (target[j++] = els[i++]) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - - if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { - setDocument( context ); - } - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { - - // ID selector - if ( (m = match[1]) ) { - - // Document context - if ( nodeType === 9 ) { - if ( (elem = context.getElementById( m )) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && (elem = newContext.getElementById( m )) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[2] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( (m = match[3]) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !compilerCache[ selector + " " ] && - (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { - - if ( nodeType !== 1 ) { - newContext = context; - newSelector = selector; - - // qSA looks outside Element context, which is not what we want - // Thanks to Andrew Dupont for this workaround technique - // Support: IE <=8 - // Exclude object elements - } else if ( context.nodeName.toLowerCase() !== "object" ) { - - // Capture the context ID, setting it first if necessary - if ( (nid = context.getAttribute( "id" )) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", (nid = expando) ); - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[i] = "#" + nid + " " + toSelector( groups[i] ); - } - newSelector = groups.join( "," ); - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - } - - if ( newSelector ) { - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return (cache[ key + " " ] = value); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement("fieldset"); - - try { - return !!fn( el ); - } catch (e) { - return false; - } finally { - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - // release memory in IE - el = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split("|"), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[i] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( (cur = cur.nextSibling) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11 - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - /* jshint -W018 */ - elem.isDisabled !== !disabled && - disabledAncestor( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction(function( argument ) { - argument = +argument; - return markFunction(function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ (j = matchIndexes[i]) ] ) { - seed[j] = !(matches[j] = seed[j]); - } - } - }); - }); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = elem && (elem.ownerDocument || elem).documentElement; - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9-11, Edge - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - if ( preferredDoc !== document && - (subWindow = document.defaultView) && subWindow.top !== subWindow ) { - - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } - } - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert(function( el ) { - el.className = "i"; - return !el.getAttribute("className"); - }); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert(function( el ) { - el.appendChild( document.createComment("") ); - return !el.getElementsByTagName("*").length; - }); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert(function( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - }); - - // ID filter and find - if ( support.getById ) { - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute("id") === attrId; - }; - }; - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode("id"); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode("id"); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( (elem = elems[i++]) ) { - node = elem.getAttributeNode("id"); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find["TAG"] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( (elem = results[i++]) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert(function( el ) { - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll("[msallowcapture^='']").length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll("[selected]").length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push("~="); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll(":checked").length ) { - rbuggyQSA.push(":checked"); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push(".#.+[+~]"); - } - }); - - assert(function( el ) { - el.innerHTML = "" + - ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement("input"); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll("[name=d]").length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll(":enabled").length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll(":disabled").length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll("*,:x"); - rbuggyQSA.push(",.*:"); - }); - } - - if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector) )) ) { - - assert(function( el ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - }); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - )); - } : - function( a, b ) { - if ( b ) { - while ( (b = b.parentNode) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { - - // Choose the first element that is related to our preferred document - if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { - return -1; - } - if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - return a === document ? -1 : - b === document ? 1 : - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( (cur = cur.parentNode) ) { - ap.unshift( cur ); - } - cur = b; - while ( (cur = cur.parentNode) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[i] === bp[i] ) { - i++; - } - - return i ? - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[i], bp[i] ) : - - // Otherwise nodes in our document sort first - ap[i] === preferredDoc ? -1 : - bp[i] === preferredDoc ? 1 : - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - // Make sure that attribute selectors are quoted - expr = expr.replace( rattributeQuotes, "='$1']" ); - - if ( support.matchesSelector && documentIsHTML && - !compilerCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch (e) {} - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - // Set document vars if needed - if ( ( context.ownerDocument || context ) !== document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - (val = elem.getAttributeNode(name)) && val.specified ? - val.value : - null; -}; - -Sizzle.escape = function( sel ) { - return (sel + "").replace( rcssescape, fcssescape ); -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( (elem = results[i++]) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - // If no nodeType, this is expected to be an array - while ( (node = elem[i++]) ) { - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[1] = match[1].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); - - if ( match[2] === "~=" ) { - match[3] = " " + match[3] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[1] = match[1].toLowerCase(); - - if ( match[1].slice( 0, 3 ) === "nth" ) { - // nth-* requires argument - if ( !match[3] ) { - Sizzle.error( match[0] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); - match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); - - // other types prohibit arguments - } else if ( match[3] ) { - Sizzle.error( match[0] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[6] && match[2]; - - if ( matchExpr["CHILD"].test( match[0] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[3] ) { - match[2] = match[4] || match[5] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - // Get excess from tokenize (recursively) - (excess = tokenize( unquoted, true )) && - // advance to the next closing parenthesis - (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { - - // excess is a negative index - match[0] = match[0].slice( 0, excess ); - match[2] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { return true; } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && - classCache( className, function( elem ) { - return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); - }); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - }; - }, - - "CHILD": function( type, what, argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( (node = node[ dir ]) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( (node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - (diff = nodeIndex = 0) || start.pop()) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - // Use previously-cached element index if available - if ( useCache ) { - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - // Use the same loop as above to seek `elem` from the start - while ( (node = ++nodeIndex && node && node[ dir ] || - (diff = nodeIndex = 0) || start.pop()) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || (node[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - (outerCache[ node.uniqueID ] = {}); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction(function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[i] ); - seed[ idx ] = !( matches[ idx ] = matched[i] ); - } - }) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - // Potentially complex pseudos - "not": markFunction(function( selector ) { - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction(function( seed, matches, context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( (elem = unmatched[i]) ) { - seed[i] = !(matches[i] = elem); - } - } - }) : - function( elem, context, xml ) { - input[0] = elem; - matcher( input, null, xml, results ); - // Don't keep the element (issue #299) - input[0] = null; - return !results.pop(); - }; - }), - - "has": markFunction(function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - }), - - "contains": markFunction(function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; - }; - }), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - // lang value must be a valid identifier - if ( !ridentifier.test(lang || "") ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( (elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); - return false; - }; - }), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); - }, - - // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), - - "checked": function( elem ) { - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); - }, - - "selected": function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos["empty"]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo(function() { - return [ 0 ]; - }), - - "last": createPositionalPseudo(function( matchIndexes, length ) { - return [ length - 1 ]; - }), - - "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - }), - - "even": createPositionalPseudo(function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "odd": createPositionalPseudo(function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }) - } -}; - -Expr.pseudos["nth"] = Expr.pseudos["eq"]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || (match = rcomma.exec( soFar )) ) { - if ( match ) { - // Don't consume trailing commas as valid - soFar = soFar.slice( match[0].length ) || soFar; - } - groups.push( (tokens = []) ); - } - - matched = false; - - // Combinators - if ( (match = rcombinators.exec( soFar )) ) { - matched = match.shift(); - tokens.push({ - value: matched, - // Cast descendant combinators to space - type: match[0].replace( rtrim, " " ) - }); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || - (match = preFilters[ type ]( match ))) ) { - matched = match.shift(); - tokens.push({ - value: matched, - type: type, - matches: match - }); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[i].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || (elem[ expando ] = {}); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { - elem = elem[ dir ] || elem; - } else if ( (oldCache = uniqueCache[ key ]) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return (newCache[ 2 ] = oldCache[ 2 ]); - } else { - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { - return true; - } - } - } - } - } - return false; - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[i]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[0]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[i], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( (elem = unmatched[i]) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction(function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( (elem = temp[i]) ) { - matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) ) { - // Restore matcherIn since elem is not yet a final match - temp.push( (matcherIn[i] = elem) ); - } - } - postFinder( null, (matcherOut = []), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) && - (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { - - seed[temp] = !(results[temp] = elem); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - }); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[0].type ], - implicitRelative = leadingRelative || Expr.relative[" "], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - (checkContext = context).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( (matcher = Expr.relative[ tokens[i].type ]) ) { - matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; - } else { - matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[j].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), - len = elems.length; - - if ( outermost ) { - outermostContext = context === document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && (elem = elems[i]) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - if ( !context && elem.ownerDocument !== document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( (matcher = elementMatchers[j++]) ) { - if ( matcher( elem, context || document, xml) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - // They will have gone through all possible matchers - if ( (elem = !matcher && elem) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( (matcher = setMatchers[j++]) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !(unmatched[i] || setMatched[i]) ) { - setMatched[i] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[i] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( (selector = compiled.selector || selector) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[0] = match[0].slice( 0 ); - if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { - - context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[i]; - - // Abort if we hit a combinator - if ( Expr.relative[ (type = token.type) ] ) { - break; - } - if ( (find = Expr.find[ type ]) ) { - // Search, expanding context for leading sibling combinators - if ( (seed = find( - token.matches[0].replace( runescape, funescape ), - rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context - )) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert(function( el ) { - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement("fieldset") ) & 1; -}); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert(function( el ) { - el.innerHTML = ""; - return el.firstChild.getAttribute("href") === "#" ; -}) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - }); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert(function( el ) { - el.innerHTML = ""; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; -}) ) { - addHandle( "value", function( elem, name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - }); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert(function( el ) { - return el.getAttribute("disabled") == null; -}) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - (val = elem.getAttributeNode( name )) && val.specified ? - val.value : - null; - } - }); -} - -return Sizzle; - -})( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; - -// Deprecated -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; -jQuery.escapeSelector = Sizzle.escape; - - - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - - - -function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - -}; -var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - -var risSimple = /^.[^:#\[\.,]*$/; - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Simple selector that can be filtered directly, removing non-Elements - if ( risSimple.test( qualifier ) ) { - return jQuery.filter( qualifier, elements, not ); - } - - // Complex selector, compare the two sets, removing non-Elements - qualifier = jQuery.filter( qualifier, elements ); - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not && elem.nodeType === 1; - } ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( jQuery.isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - if ( nodeName( elem, "iframe" ) ) { - return elem.contentDocument; - } - - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } - - return jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = locked || options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( jQuery.isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -function Identity( v ) { - return v; -} -function Thrower( ex ) { - throw ex; -} - -function adoptValue( value, resolve, reject, noValue ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && jQuery.isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && jQuery.isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: - // * false: [ value ].slice( 0 ) => resolve( value ) - // * true: [ value ].slice( 1 ) => resolve() - resolve.apply( undefined, [ value ].slice( noValue ) ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.apply( undefined, [ value ] ); - } -} - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = jQuery.isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - function resolve( depth, deferred, handler, special ) { - return function() { - var that = this, - args = arguments, - mightThrow = function() { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( jQuery.isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function() { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.stackTrace ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the stack, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - jQuery.isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - jQuery.isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - jQuery.isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function() { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the master Deferred - master = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function( i ) { - return function( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - master.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( master.state() === "pending" || - jQuery.isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return master.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); - } - - return master.promise(); - } -} ); - - -// These usually indicate a programmer mistake during development, -// warn about them ASAP rather than swallowing them by default. -var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - -jQuery.Deferred.exceptionHook = function( error, stack ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); - } -}; - - - - -jQuery.readyException = function( error ) { - window.setTimeout( function() { - throw error; - } ); -}; - - - - -// The deferred used on DOM ready -var readyList = jQuery.Deferred(); - -jQuery.fn.ready = function( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function( error ) { - jQuery.readyException( error ); - } ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } -} ); - -jQuery.ready.then = readyList.then; - -// The ready event handler and self cleanup method -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -// Catch cases where $(document).ready() is called -// after the browser event has already occurred. -// Support: IE <=9 - 10 only -// Older IE sometimes signals "interactive" too soon -if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - -} else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); -} - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( jQuery.type( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !jQuery.isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; -}; -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - cache: function( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ jQuery.camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ jQuery.camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ jQuery.camelCase( key ) ]; - }, - access: function( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( Array.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( jQuery.camelCase ); - } else { - key = jQuery.camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? - [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; -} - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = jQuery.camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function() { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || Array.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var isHiddenWithinTree = function( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - jQuery.contains( elem.ownerDocument, elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - -var swap = function( elem, options, callback, args ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.apply( elem, args || [] ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, - scale = 1, - maxIterations = 20, - currentValue = tween ? - function() { - return tween.cur(); - } : - function() { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - do { - - // If previous iteration zeroed out, double until we get *something*. - // Use string for doubling so we don't accidentally see scale as unchanged below - scale = scale || ".5"; - - // Adjust and apply - initialInUnit = initialInUnit / scale; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Update scale, tolerating zero or NaN from tween.cur() - // Break the loop if scale is unchanged or perfect, or if we've just had enough. - } while ( - scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations - ); - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} - - -var defaultDisplayMap = {}; - -function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; -} - -function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; -} - -jQuery.fn.extend( { - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } -} ); -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i ); - -var rscriptType = ( /^$|\/(?:java|ecma)script/i ); - - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // Support: IE <=9 only - option: [ 1, "" ], - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
    " ], - col: [ 2, "", "
    " ], - tr: [ 2, "", "
    " ], - td: [ 3, "", "
    " ], - - _default: [ 0, "", "" ] -}; - -// Support: IE <=9 only -wrapMap.optgroup = wrapMap.option; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - - -function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, contains, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( jQuery.type( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - contains = jQuery.contains( elem.ownerDocument, elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( contains ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; -} )(); -var documentElement = document.documentElement; - - - -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE <=9 only -// See #13393 for more info -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Don't attach events to noData or text/comment nodes (but allow plain objects) - if ( !elemData ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = {}; - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - // Make a writable jQuery.Event from the native event object - var event = jQuery.event.fix( nativeEvent ); - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // Triggered event must either 1) have no namespace, or 2) have namespace(s) - // a subset or equal to those in the bound event (both can have no namespace). - if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: jQuery.isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - focus: { - - // Fire native event if possible so blur/focus sequence is correct - trigger: function() { - if ( this !== safeActiveElement() && this.focus ) { - this.focus(); - return false; - } - }, - delegateType: "focusin" - }, - blur: { - trigger: function() { - if ( this === safeActiveElement() && this.blur ) { - this.blur(); - return false; - } - }, - delegateType: "focusout" - }, - click: { - - // For checkbox, fire native event so checked state will be right - trigger: function() { - if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) { - this.click(); - return false; - } - }, - - // For cross-browser consistency, don't fire native .click() on links - _default: function( event ) { - return nodeName( event.target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - - which: function( event ) { - var button = event.button; - - // Add which for key events - if ( event.which == null && rkeyEvent.test( event.type ) ) { - return event.charCode != null ? event.charCode : event.keyCode; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { - if ( button & 1 ) { - return 1; - } - - if ( button & 2 ) { - return 3; - } - - if ( button & 4 ) { - return 2; - } - - return 0; - } - - return event.which; - } -}, jQuery.event.addProp ); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - - /* eslint-disable max-len */ - - // See https://github.com/eslint/eslint/issues/3229 - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, - - /* eslint-enable */ - - // Support: IE <=10 - 11, Edge 12 - 13 - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - -// Prefer a tbody over its parent table for containing new rows -function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( ">tbody", elem )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - var match = rscriptTypeMasked.exec( elem.type ); - - if ( match ) { - elem.type = match[ 1 ]; - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.access( src ); - pdataCur = dataPriv.set( dest, pdataOld ); - events = pdataOld.events; - - if ( events ) { - delete pdataCur.handle; - pdataCur.events = {}; - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = concat.apply( [], args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - isFunction = jQuery.isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( isFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( isFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl ) { - jQuery._evalUrl( node.src ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), doc ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html.replace( rxhtmlTag, "<$1>" ); - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = jQuery.contains( elem.ownerDocument, elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); -var rmargin = ( /^margin/ ); - -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - - - -( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - div.style.cssText = - "box-sizing:border-box;" + - "position:relative;display:block;" + - "margin:auto;border:1px;padding:1px;" + - "top:1%;width:50%"; - div.innerHTML = ""; - documentElement.appendChild( container ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = divStyle.marginLeft === "2px"; - boxSizingReliableVal = divStyle.width === "4px"; - - // Support: Android 4.0 - 4.3 only - // Some styles come back with percentage values, even though they shouldn't - div.style.marginRight = "50%"; - pixelMarginRightVal = divStyle.marginRight === "4px"; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" + - "padding:0;margin-top:1px;position:absolute"; - container.appendChild( div ); - - jQuery.extend( support, { - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelMarginRight: function() { - computeStyleTests(); - return pixelMarginRightVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) - if ( computed ) { - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }, - - cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style; - -// Return a css property mapped to a potentially vendor prefixed property -function vendorPropName( name ) { - - // Shortcut for names that are not vendor prefixed - if ( name in emptyStyle ) { - return name; - } - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -// Return a property mapped along what jQuery.cssProps suggests or to -// a vendor prefixed property. -function finalPropName( name ) { - var ret = jQuery.cssProps[ name ]; - if ( !ret ) { - ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name; - } - return ret; -} - -function setPositiveNumber( elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) { - var i, - val = 0; - - // If we already have the right measurement, avoid augmentation - if ( extra === ( isBorderBox ? "border" : "content" ) ) { - i = 4; - - // Otherwise initialize for horizontal or vertical properties - } else { - i = name === "width" ? 1 : 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin, so add it if we want it - if ( extra === "margin" ) { - val += jQuery.css( elem, extra + cssExpand[ i ], true, styles ); - } - - if ( isBorderBox ) { - - // border-box includes padding, so remove it if we want content - if ( extra === "content" ) { - val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // At this point, extra isn't border nor margin, so remove border - if ( extra !== "margin" ) { - val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } else { - - // At this point, extra isn't content, so add padding - val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // At this point, extra isn't content nor padding, so add border - if ( extra !== "padding" ) { - val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - return val; -} - -function getWidthOrHeight( elem, name, extra ) { - - // Start with computed style - var valueIsBorderBox, - styles = getStyles( elem ), - val = curCSS( elem, name, styles ), - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Computed unit is not pixels. Stop here and return. - if ( rnumnonpx.test( val ) ) { - return val; - } - - // Check for style in case a browser which returns unreliable values - // for getComputedStyle silently falls back to the reliable elem.style - valueIsBorderBox = isBorderBox && - ( support.boxSizingReliable() || val === elem.style[ name ] ); - - // Fall back to offsetWidth/Height when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - if ( val === "auto" ) { - val = elem[ "offset" + name[ 0 ].toUpperCase() + name.slice( 1 ) ]; - } - - // Normalize "", auto, and prepare for extra - val = parseFloat( val ) || 0; - - // Use the active box-sizing model to add/subtract irrelevant styles - return ( val + - augmentWidthOrHeight( - elem, - name, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: { - "float": "cssFloat" - }, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = jQuery.camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - if ( type === "number" ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = jQuery.camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( i, name ) { - jQuery.cssHooks[ name ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, name, extra ); - } ) : - getWidthOrHeight( elem, name, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = extra && getStyles( elem ), - subtract = extra && augmentWidthOrHeight( - elem, - name, - extra, - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - styles - ); - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ name ] = value; - value = jQuery.css( elem, name ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( !rmargin.test( prefix ) ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && - ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || - jQuery.cssHooks[ tween.prop ] ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } -} - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = jQuery.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 13 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = jQuery.camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( jQuery.isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - jQuery.proxy( result.stop, result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( jQuery.isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( jQuery.isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - jQuery.isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( jQuery.isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue && type !== false ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = jQuery.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); -}; - -jQuery.fx.stop = function() { - inProgress = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -// eslint rule "no-unused-expressions" is disabled for this code -// since it considers such accessions noop -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://html.spec.whatwg.org/multipage/infrastructure.html#strip-and-collapse-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( jQuery.isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( typeof value === "string" && value ) { - classes = value.match( rnothtmlwhite ) || []; - - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( jQuery.isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - if ( typeof value === "string" && value ) { - classes = value.match( rnothtmlwhite ) || []; - - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value; - - if ( typeof stateVal === "boolean" && type === "string" ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( jQuery.isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function() { - var className, i, self, classNames; - - if ( type === "string" ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = value.match( rnothtmlwhite ) || []; - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, isFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - isFunction = jQuery.isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( isFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - elem[ type ](); - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + - "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + - "change select submit keydown keypress keyup contextmenu" ).split( " " ), - function( i, name ) { - - // Handle event binding - jQuery.fn[ name ] = function( data, fn ) { - return arguments.length > 0 ? - this.on( name, null, data, fn ) : - this.trigger( name ); - }; -} ); - -jQuery.fn.extend( { - hover: function( fnOver, fnOut ) { - return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); - } -} ); - - - - -support.focusin = "onfocusin" in window; - - -// Support: Firefox <=44 -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - var doc = this.ownerDocument || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} -var location = window.location; - -var nonce = jQuery.now(); - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) { - xml = undefined; - } - - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; -}; - - -var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && jQuery.type( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = jQuery.isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ) - .filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ) - .map( function( i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( jQuery.isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes #9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; - } - } - match = responseHeaders[ key.toLowerCase() ]; - } - return match == null ? null : match; - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 13 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available, append data to url - if ( s.data ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( jQuery.isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - - -jQuery._evalUrl = function( url ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - "throws": true - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( jQuery.isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( jQuery.isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var isFunction = jQuery.isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } -} ); - - -jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); -}; -jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); -}; - - - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // #14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) -jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } -} ); - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain requests - if ( s.crossDomain ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( " - - - - - - - - - - - - - - -
    -
    -
    -
    - - -

    Index

    - -
    - -
    - - -
    -
    -
    - -
    -
    - - - - - - - \ No newline at end of file diff --git a/docs/build/index.html b/docs/build/index.html deleted file mode 100644 index 5c068b0..0000000 --- a/docs/build/index.html +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - - - Welcome to Question Contribution’s documentation! — Question Contribution 0.1 documentation - - - - - - - - - - - - - - - - - -
    -
    -
    -
    - -
    -

    Welcome to Question Contribution’s documentation!

    -
    -
    -
    -

    Login & Register

    -
    -
      -
    1. Click on the Register button on the main page.
    2. -
    3. After registration login with the username and password
    4. -
    -
    -
    -
    -

    Creating Questions

    -
    -
    -

    Note

    -

    You are allowed to create only 5 questions. So be careful with what you create!

    -
    -
      -
    1. After login click on Start Contribution button to start creating questions.

      -
    2. -
    3. On the contribution interface you can view all your questions.

      -
    4. -
    5. To delete a question Select the question and click on Delete Question button.

      -
    6. -
    7. Click on Add Question button to create a new question.

      -
    8. -
    9. -
      Below image shows an example of creating a question
      -
      -
      -_images/create_questions.jpg -
      -
      -

      Fields to fill while creating questions

      -
        -
      • Summary- Summary or the name of the question.

        -
      • -
      • Points - Points is the marks for a question.

        -
      • -
      • Description - The actual question description is to be written.

        -
        -
        -

        Note

        -

        To add code snippets in question description please use html <code> and <br> tags.

        -
        -
        -
      • -
      • -
        Solution - It is the correct expected answer of the question.
        -

        For e.g.

        -
        a = input()
        -b = input()
        -print(a+b)
        -
        -
        -
        -
        -
      • -
      • Citation - Mention the reference url of the question if the question is adapated

        -
        -
        -

        Note

        -

        Leave the field blank if the question is original.

        -
        -
        -
      • -
      • Originality - Specify whether the question is Original Question or Adapted Question

        -
      • -
      -
      -
      -
    10. -
    11. -
      Below image shows an example of how to create test cases.
      -
      -
      -_images/create_testcases.jpg -
      -
      -

      In Expected input field, enter the value(s) that will be passed to the code through a standard I/O stream.

      -
      -
      -

      Note

      -

      If there are multiple input values in a test case, enter the values in new line as shown in figure.

      -
      -
      -

      In Expected Output Field, enter the expected output for that test case. For e.g type 3 if the output of the user code is 3.

      -

      To delete a test case Select Delete checkbox and click on Check and Save to delete the testcase and save the question.

      -
      -
      -
    12. -
    -
    -
    -
    - - -
    -
    -
    - -
    -
    - - - - - - - \ No newline at end of file diff --git a/docs/build/objects.inv b/docs/build/objects.inv deleted file mode 100644 index 8b73ae0df4776720d43c7c26ce275763bc0d7dc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 268 zcmY#Z2rkIT%&Sny%qvUHE6FdaR47X=D$dN$Q!wIERtPA{&q_@$u~G;uO)V|~i8|-! zl@w(rm4Y}x1z`}yRti9NNJgqcQEF~tW?o8akwSi&LPdY&6kdHQ&r4ZL6);?dsqDs{?}XBrhv zGh#SWHGiH|aP`nS6kI&%b8)b!*C$aX@8E84qtBm3=6wF_)nzo<%W;l7uW`3%!!57k z;Llz{j!IoIJAZ0McihqAlyEV7VLlAkbR-YHfF Iv0T4z0D`D#>;M1& diff --git a/docs/build/search.html b/docs/build/search.html deleted file mode 100644 index e6459a0..0000000 --- a/docs/build/search.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - Search — Question Contribution 0.1 documentation - - - - - - - - - - - - - - - - - - - - - - - -
    -
    -
    -
    - -

    Search

    -
    - -

    - Please activate JavaScript to enable the search - functionality. -

    -
    -

    - From here you can search these documents. Enter your search - words into the box below and click "search". Note that the search - function will automatically search for all of the words. Pages - containing fewer words won't appear in the result list. -

    -
    - - - -
    - -
    - -
    - -
    -
    -
    - -
    -
    - - - - - - - \ No newline at end of file diff --git a/docs/build/searchindex.js b/docs/build/searchindex.js deleted file mode 100644 index 3bfbdb9..0000000 --- a/docs/build/searchindex.js +++ /dev/null @@ -1 +0,0 @@ -Search.setIndex({docnames:["index"],envversion:53,filenames:["index.rst"],objects:{},objnames:{},objtypes:{},terms:{"case":0,"new":0,"while":0,For:0,The:0,actual:0,adap:0,adapt:0,add:0,after:0,all:0,allow:0,answer:0,below:0,blank:0,button:0,can:0,care:0,check:0,checkbox:0,citat:0,click:0,code:0,correct:0,craet:[],creat:[],create_quest:[],delet:0,descript:0,enter:0,exampl:0,expect:0,field:0,figur:0,fill:0,how:0,html:0,imag:0,index:[],input:0,interfac:0,jpg:[],leav:0,line:0,login:[],main:0,mark:0,mention:0,modul:[],multipl:0,name:0,onli:0,origin:0,output:0,page:0,pass:0,password:0,pleas:0,point:0,print:0,refer:0,regist:[],register:[],registr:0,save:0,search:[],select:0,show:0,shown:0,snippet:0,solut:0,specifi:0,standard:0,start:0,stream:0,student:[],summari:0,tag:0,test:0,testcas:0,through:0,type:0,url:0,use:0,user:0,usernam:0,valu:0,view:0,what:0,whether:0,written:0,you:0,your:0},titles:["Welcome to Question Contribution\u2019s documentation!"],titleterms:{contribut:0,creat:0,document:0,indic:[],login:0,question:0,regist:0,start:[],tabl:[],welcom:0}}) \ No newline at end of file diff --git a/docs/source/conf.py b/docs/conf.py similarity index 100% rename from docs/source/conf.py rename to docs/conf.py diff --git a/docs/build/_images/create_questions.jpg b/docs/images/create_questions.jpg similarity index 100% rename from docs/build/_images/create_questions.jpg rename to docs/images/create_questions.jpg diff --git a/docs/build/_images/create_testcases.jpg b/docs/images/create_testcases.jpg similarity index 100% rename from docs/build/_images/create_testcases.jpg rename to docs/images/create_testcases.jpg diff --git a/docs/source/index.rst b/docs/index.rst similarity index 100% rename from docs/source/index.rst rename to docs/index.rst diff --git a/docs/source/images/create_questions.jpg b/docs/source/images/create_questions.jpg deleted file mode 100644 index 5cc153579585e72c4eb26f27da348bde584863ef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61036 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 Date: Tue, 13 Mar 2018 17:39:00 +0530 Subject: [PATCH 12/49] Update documentation --- docs/index.rst | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index def154d..d0f2d5e 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -10,31 +10,35 @@ Welcome to Question Contribution's documentation! Basic Instructions ------------------ - 1. Create 5 Python Coding Questions along with 5 test cases each on the above interface. + 1. Create 5 Python Coding Questions with good quality test cases for each question.(expected 5 test cases). 2. Avoid trivial questions such as Printing patterns, Reversing strings, Arithmetic operations, etc. 3. Question description should be grammatically correct and easy to understand. - 4. Questions can be original or adapted from other sources with significant changes in case the question is adapted, the source needs to be cited in the interface). We prefer non-cited, original questions for shortlisting the candidates. - 5. Question should be well tested. + 4. Questions can be original or adapted from other sources with significant changes in case the question is adapted, the source needs to be cited in the interface. We prefer non-cited, original questions for shortlisting the candidates. + 5. All questions should be well tested. -Login & Register +Register & Login ---------------- + 1. Click on the **Register** link on the |location_link|. - 1. Click on the **Register** button on the main page. - 2. After registration login with the username and password + .. |location_link| raw:: html + + main page + + 2. After registration, login with the username and password. Creating Questions ------------------ - .. note:: You are allowed to create only 5 questions. You can edit and delete those questions though. + .. note:: You are allowed to create only 5 questions. You can edit and delete those questions though. Also please make sure questions are created using Python 3.x. 1. After login click on **Start Contribution** button to start creating questions. 2. On the contribution interface you can view all your questions. - 3. To delete a question Select the question and click on **Delete Question** button. Once deleted, a question cannot be retrieved back. Please take caution before deletion. - 4. Click on **Add Question** button to create a new question. - 5. Below image shows an example of creating a question + 3. Click on **Add Question** button to create a new question. + .. note:: Right click on the image and select **Open image in new tab** to view image properly. + 4. Below image shows an example of creating a question. .. figure:: images/create_questions.jpg Fields to fill while creating questions @@ -52,15 +56,15 @@ Creating Questions a = input() b = input() - print(a+b) + print(int(a)+int(b)) - * **Citation** - Mention the reference url of the question if the question is adapated. Please make sure to cite the original source of the question if it is not a original question. + * **Citation** - Mention the reference url of the question if the question is adapted. Please make sure to cite the original source of the question if it is not a original question. .. note:: Leave the field blank if the question is original. * **Originality** - Specify whether the question is **Original Question** or **Adapted Question** - 6. Below image shows an example of how to create test cases. + 5. Below image shows an example of how to create test cases. .. figure:: images/create_testcases.jpg In **Expected input** field, enter the value(s) that will be passed to the code through a standard I/O stream. @@ -69,10 +73,9 @@ Creating Questions In **Expected Output** Field, enter the expected output for that test case. For e.g type 3 if the output of the user code is 3. - To delete a test case Select **Delete** checkbox and click on **Check and Save** to delete the testcase and save the question. - - .. note:: Please do not change the type of the testcase i.e **stdiobasedtestcase**. + To delete a test case, Select **Delete** checkbox and click on **Check and Save** to delete the testcase and save the question. + 6. To delete a question, Select the question and click on **Delete Question** button. Once deleted, a question cannot be retrieved back. Please take caution before deletion. 7. If all the test cases for the questions pass, then the question is automatically approved. To see how many questions are approved, you can look at the **status** column in contribution page, where you see all your questions. 8. If you have created 5 approved questions, **your question creation task is completed.** From 660c179cda69495806f669020769d6918570f472 Mon Sep 17 00:00:00 2001 From: adityacp Date: Tue, 13 Mar 2018 17:39:52 +0530 Subject: [PATCH 13/49] Change in files - Make type pf test case in add questions readonly - Add Instructions in the nav bar - Avoid creating blank questions - Embed instructions video on login page --- interface/views.py | 17 ++++++++--------- templates/add_question.html | 17 +++++++++++------ templates/dashboard.html | 1 + templates/registration/login.html | 10 ++++++++++ templates/showquestions.html | 5 +++-- 5 files changed, 33 insertions(+), 17 deletions(-) diff --git a/interface/views.py b/interface/views.py index 624dab9..a572c42 100644 --- a/interface/views.py +++ b/interface/views.py @@ -91,25 +91,24 @@ def add_question(request, question_id=None): return HttpResponseRedirect(reverse('show_all_questions')) if question_id is None: - question = Question(user=user) - question.save() + question = None else: question = Question.objects.get(id=question_id) if request.method == 'POST': qform = QuestionForm(request.POST, instance=question) formsets = [] - for testcase in TestCase.__subclasses__(): - formset = inlineformset_factory(Question, testcase, extra=0, - fields='__all__') - formsets.append(formset( - request.POST, instance=question - ) - ) if qform.is_valid(): question = qform.save(commit=False) question.user = user question.save() + for testcase in TestCase.__subclasses__(): + formset = inlineformset_factory(Question, testcase, extra=0, + fields='__all__') + formsets.append(formset( + request.POST, instance=question + ) + ) for formset in formsets: if formset.is_valid(): formset.save() diff --git a/templates/add_question.html b/templates/add_question.html index 49d55f9..75cc580 100644 --- a/templates/add_question.html +++ b/templates/add_question.html @@ -1,13 +1,13 @@ {% extends "navigation.html" %} {% load custom_filter %} {% block script %} - +{% if question %}
    +{% else %} + +{% endif %} {% csrf_token %}
    Summary: {{ qform.summary }}{{ qform.summary.errors }} @@ -56,7 +61,7 @@
    Solution: {{ qform.solution }}{{qform.solution.errors}} {% endif %}
    Citation: {{ qform.citation }}{{qform.citation.errors}} -
    Originality: {{ qform.originality }} {{qform.originality.errors}} +
    Source: {{ qform.originality }} {{qform.originality.errors}}
    {% for formset in formsets %}
    diff --git a/templates/dashboard.html b/templates/dashboard.html index a01e6ae..5fbc697 100644 --- a/templates/dashboard.html +++ b/templates/dashboard.html @@ -8,6 +8,7 @@ {% ifequal type 'user' %}
  • Home
  • Contribution
  • +
  • Instructions
  • Logout
  • {% endifequal %} {% ifequal type 'moderator' %} diff --git a/templates/registration/login.html b/templates/registration/login.html index 2d09453..ce81018 100644 --- a/templates/registration/login.html +++ b/templates/registration/login.html @@ -20,9 +20,19 @@

    Login Here

    {{ form.username }} {{ form.password }} +
    Register +

    +
    +
    + For any queries, please mail us at info@fossee.in +
    +

    + +
    {% endblock %} diff --git a/templates/showquestions.html b/templates/showquestions.html index 3cc46fe..c8aff63 100644 --- a/templates/showquestions.html +++ b/templates/showquestions.html @@ -1,8 +1,9 @@ {% extends "dashboard.html" %} {% block navbar %} -
  • Home
  • -
  • Contribution
  • +
  • Home
  • +
  • Contribution
  • +
  • Instructions
  • Logout
  • {% endblock %} From e9ccfff5e7cf1df27e06ed34c61e19a359163fe0 Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Wed, 14 Mar 2018 15:30:45 +0530 Subject: [PATCH 14/49] Add info on adding new testcase --- docs/index.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/index.rst b/docs/index.rst index d0f2d5e..cff895b 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -75,6 +75,8 @@ Creating Questions To delete a test case, Select **Delete** checkbox and click on **Check and Save** to delete the testcase and save the question. + To **add a new test case**, select ``stdio`` from the drop down box, found just above the ``Check and Save`` button. + 6. To delete a question, Select the question and click on **Delete Question** button. Once deleted, a question cannot be retrieved back. Please take caution before deletion. 7. If all the test cases for the questions pass, then the question is automatically approved. To see how many questions are approved, you can look at the **status** column in contribution page, where you see all your questions. From 3f527306c44b8ba0e0c269375a8bf0a804ba8809 Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Thu, 22 Mar 2018 16:26:16 +0530 Subject: [PATCH 15/49] WIP: Allow moderator to see questions --- interface/views.py | 28 +++++++++++++++++++--------- templates/showquestions.html | 8 ++++++++ 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/interface/views.py b/interface/views.py index a572c42..7af8343 100644 --- a/interface/views.py +++ b/interface/views.py @@ -16,6 +16,12 @@ import json import os + +def is_moderator(user): + """Check if the user is having moderator rights""" + if user.groups.filter(name='moderator').exists(): + return True + def show_home(request): if request.user.is_authenticated(): @@ -50,11 +56,7 @@ def logout_page(request): def next_login(request): if request.user.is_authenticated(): - groups = request.user.groups.values_list('name', flat=True) - if ('admin' in groups or 'moderator' in groups): - return render(request, 'dashboard.html', {'type':'moderator', "name":request.user}) - else: - return render(request, 'dashboard.html', {'type':'user', "name":request.user}) + return render(request, 'dashboard.html', {'type':'user', "name":request.user}) else: return render(request, 'home.html', {'type':'guest'}) @@ -74,11 +76,19 @@ def show_all_questions(request): ) for question in questions: question.delete() - questions = Question.objects.filter(user_id=user.id) - count = questions.count() - remaining = 5-count + if is_moderator(user): + questions = Question.objects.all() + context['admin'] = True + context['remaining'] = "None" + + else: + questions = Question.objects.filter(user_id=user.id) + count = questions.count() + remaining = 5-count + context['remaining'] = remaining + context['admin'] = False + context['questions'] = questions - context['remaining'] = remaining return render(request, "showquestions.html", context) @login_required diff --git a/templates/showquestions.html b/templates/showquestions.html index c8aff63..820737e 100644 --- a/templates/showquestions.html +++ b/templates/showquestions.html @@ -35,6 +35,9 @@ Language Type Marks + {%if admin %} + User + {% endif %} Status @@ -49,6 +52,9 @@ {{question.language|capfirst}} {{question.type|capfirst}} {{question.points}} +{% if admin %} +{{question.user}} +{% endif %} {% if question.status %} {% else %} @@ -62,10 +68,12 @@

    +{% if not admin %} {% if not remaining <= 0 %}    {% endif %} +{% endif %}

    From 709110ae50b0a1b8a3a6641d7888b7d8e764f417 Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Thu, 22 Mar 2018 17:16:47 +0530 Subject: [PATCH 16/49] User cannot see other users' questions --- interface/views.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/interface/views.py b/interface/views.py index 7af8343..c348755 100644 --- a/interface/views.py +++ b/interface/views.py @@ -1,7 +1,7 @@ from interface.models import (Question, TestCase, StdIOBasedTestCase, Rating, Review) from django.shortcuts import render,get_object_or_404 -from django.http import HttpResponse,HttpResponseRedirect, JsonResponse +from django.http import HttpResponse,HttpResponseRedirect, JsonResponse, Http404 from interface.forms import * from django.forms.models import inlineformset_factory from django.core.urlresolvers import reverse @@ -104,6 +104,9 @@ def add_question(request, question_id=None): question = None else: question = Question.objects.get(id=question_id) + if not is_moderator(user): + if question.user != user: + raise Http404("You cannot access this page") if request.method == 'POST': qform = QuestionForm(request.POST, instance=question) From 4ba4e7b355cea928dddb47727507312ac49aee64 Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Fri, 23 Mar 2018 19:42:43 +0530 Subject: [PATCH 17/49] Add review models --- interface/models.py | 68 ++++++++++++++++++++++----------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/interface/models.py b/interface/models.py index 9b9a351..3b7468b 100644 --- a/interface/models.py +++ b/interface/models.py @@ -4,16 +4,10 @@ import json import os -question_status_choice = ( - (1, "approved"), - (0, "unseen"), - (-1, "discarded"), - ) - -level = ( - (1, "easy"), - (2, "medium"), - (3, "difficult"), +question_status_choices = ( + (1, "Question doesn't make sense."), + (2, "Question makes sense, but is too difficult to solve."), + (3, "Question is correct, but the test cases are wrong."), ) rating_choice = ( @@ -23,12 +17,6 @@ (4, "Verygood"), (5, "Excellent"), ) -types = ( - (1, "integer"), - (2, "float"), - (3, "string"), - (4, "boolean"), - ) originality = ( ("original", "Original Question"), @@ -62,8 +50,10 @@ class Question(models.Model): solution = models.TextField() # If the question is cited - citation = models.TextField(null=True, blank=True, help_text="Please add appropriate citation\ - if the question is adapted from elsewhere.") + citation = models.TextField(null=True, blank=True, + help_text="Please add appropriate citation\ + if the question is adapted from elsewhere." + ) # originality of the question originality = models.CharField(max_length=24, choices=originality, default="original") @@ -120,25 +110,35 @@ def __str__(self): class Rating(models.Model): - user = models.ForeignKey(User) question = models.ForeignKey(Question) - rate = models.IntegerField(default=3, choices=rating_choice) - + avg_moderator_rating = models.FloatField(default=0.0) + avg_peer_rating = models.FloatField(default=0.0) + def __str__(self): - return str(self.user) + return "Rating for {0}".format(question.summary) - class Meta: - unique_together = ('user', 'question',) -class Review(models.Model): - reviewer = models.ForeignKey(User) +class QuestionReviewDetails(models.Model): question = models.ForeignKey(Question) - comments = models.CharField(max_length=24, choices=level) - + rating = models.IntegerField(default=3, choices=rating_choice) + comments = models.TextField(null=True, blank=True) + check_citation = models.BooleanField(default=False) + question_status = models.IntegerField(blank=True, null=True, + choices=question_status_choices + ) + skipped = models.BooleanField(default=False) + def __str__(self): - return str(self.reviewer) - - def update_review(self,new_comments): - self.comments=new_comments - #class Meta: - # unique_together = ('reviewer', 'question',) + return "Review for {0}".format(question.summary) + + +class Review(models.Model): + user = models.ForeignKey(User) + admin_review = models.BooleanField(default=False) + question_details = models.ManyToManyField(QuestionReviewDetails, + related_name="question_details" + ) + +class QuestionBank(models.Model): + user = models.ForeignKey(User) + question_bank = models.ManyToManyField(Question) From 19d7cf50120bfe672dbefb08c07d6ce719975700 Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Mon, 26 Mar 2018 15:04:31 +0530 Subject: [PATCH 18/49] Fix bug to atleast 5 questions --- interface/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/views.py b/interface/views.py index c348755..53cbb35 100644 --- a/interface/views.py +++ b/interface/views.py @@ -97,7 +97,7 @@ def add_question(request, question_id=None): ci = RequestContext(request) test_case_type = "stdiobasedtestcase" solution_error, tc_error = [], [] - if Question.objects.filter(user=user).count()>=5: + if Question.objects.filter(user=user).count()>5: return HttpResponseRedirect(reverse('show_all_questions')) if question_id is None: From 279f7b769411561963513ce639142cbc0b3523c4 Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Mon, 26 Mar 2018 16:33:18 +0530 Subject: [PATCH 19/49] Do not allow more than 5 questions --- interface/views.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/interface/views.py b/interface/views.py index 53cbb35..26b2584 100644 --- a/interface/views.py +++ b/interface/views.py @@ -97,9 +97,9 @@ def add_question(request, question_id=None): ci = RequestContext(request) test_case_type = "stdiobasedtestcase" solution_error, tc_error = [], [] - if Question.objects.filter(user=user).count()>5: - return HttpResponseRedirect(reverse('show_all_questions')) + if Question.objects.filter(user=user).count()>=5 and not question_id: + return HttpResponseRedirect(reverse('show_all_questions')) if question_id is None: question = None else: @@ -109,6 +109,7 @@ def add_question(request, question_id=None): raise Http404("You cannot access this page") if request.method == 'POST': + qform = QuestionForm(request.POST, instance=question) formsets = [] if qform.is_valid(): @@ -171,6 +172,7 @@ def add_question(request, question_id=None): context = {'qform': qform, 'question': question, 'formsets': formsets, "solution_error":solution_error, "tc_error": tc_error} + return render_to_response( "add_question.html", context, context_instance=ci ) From 5fba6480c804e8db84658307e91ca48cbff5e570 Mon Sep 17 00:00:00 2001 From: adityacp Date: Tue, 27 Mar 2018 15:54:13 +0530 Subject: [PATCH 20/49] Review interface for users --- interface/views.py | 42 ++++++++++++++++- templates/show_review_questions.html | 67 ++++++++++++++++++++++++++++ yaksh/urls.py | 2 + 3 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 templates/show_review_questions.html diff --git a/interface/views.py b/interface/views.py index 26b2584..108920a 100644 --- a/interface/views.py +++ b/interface/views.py @@ -1,5 +1,5 @@ from interface.models import (Question, TestCase, StdIOBasedTestCase, - Rating, Review) + Rating, Review, QuestionBank) from django.shortcuts import render,get_object_or_404 from django.http import HttpResponse,HttpResponseRedirect, JsonResponse, Http404 from interface.forms import * @@ -15,6 +15,7 @@ import requests import json import os +import random def is_moderator(user): @@ -22,6 +23,10 @@ def is_moderator(user): if user.groups.filter(name='moderator').exists(): return True +def is_reviewer(user): + if user.groups.filter(name='reviewer').exists(): + return True + def show_home(request): if request.user.is_authenticated(): @@ -56,6 +61,8 @@ def logout_page(request): def next_login(request): if request.user.is_authenticated(): + if is_reviewer(request.user): + return show_review_questions(request) return render(request, 'dashboard.html', {'type':'user', "name":request.user}) else: return render(request, 'home.html', {'type':'guest'}) @@ -67,6 +74,8 @@ def show_all_questions(request): user = request.user ci = RequestContext(request) context = {} + if is_reviewer(user): + return show_review_questions(request) if request.method == 'POST': if request.POST.get('delete') == 'delete': data = request.POST.getlist('question') @@ -95,6 +104,8 @@ def show_all_questions(request): def add_question(request, question_id=None): user = request.user ci = RequestContext(request) + if is_reviewer(user): + return show_review_questions(request) test_case_type = "stdiobasedtestcase" solution_error, tc_error = [], [] @@ -198,3 +209,32 @@ def submit_to_code_server(question_id): def get_result(url, uid): response = json.loads(requests.get(urljoin(url, uid)).text) return response + + +@login_required +def show_review_questions(request): + user = request.user + context = {} + if is_moderator(user): + context['questions'] = Question.objects.all() + status = "moderator" + if is_reviewer(user): + ques_bank = QuestionBank.objects.filter(user=user) + if ques_bank.exists(): + context['questions'] = ques_bank.first().question_bank.all() + else: + questions = get_reviewer_questions(user) + que_bank = QuestionBank.objects.create(user=user) + que_bank.question_bank.add(*questions) + context['questions'] = questions + status = "reviewer" + context['status'] = status + return render_to_response( + "show_review_questions.html", context + ) + + +def get_reviewer_questions(user): + questions = list(Question.objects.all().exclude(user=user)) + random.shuffle(questions) + return questions[:10] diff --git a/templates/show_review_questions.html b/templates/show_review_questions.html new file mode 100644 index 0000000..9686115 --- /dev/null +++ b/templates/show_review_questions.html @@ -0,0 +1,67 @@ +{% extends "dashboard.html" %} + +{% block navbar %} +
  • Home
  • +
  • Contribution
  • +
  • Instructions
  • +
  • Logout
  • + {% endblock %} + +{% block title %} Questions {% endblock %} + +{% block subtitle %} Review Questions {% endblock subtitle %} + +{% block content %} +
    +

    Review Questions

    +
    +{% if status %} +
    +

    You are now a {{status}}

    +
    +{% endif %} +
    +
    + +
    +
    +{% csrf_token %} + +
    +{% if questions %} + + + + + + + + + + + + +{% for question in questions %} + + + + + +{% if question.status %} + +{% else %} + +{% endif %} + +{% endfor %} + +
    Summary Language Type Marks Status
    {{question.summary|capfirst}}{{question.language|capfirst}}{{question.type|capfirst}}{{question.points}}
    +{% endif %} +
    +
    +
    +
    +
    + + +{% endblock %} \ No newline at end of file diff --git a/yaksh/urls.py b/yaksh/urls.py index 59972f4..c540868 100644 --- a/yaksh/urls.py +++ b/yaksh/urls.py @@ -14,6 +14,8 @@ url(r'^showquestions/$',"interface.views.show_all_questions",name="show_all_questions"), url(r'^addquestion/$',"interface.views.add_question",name="add_question"), url(r'^addquestion/(?P\d+)/$',"interface.views.add_question",name="add_question"), + url(r'^show_review_questions/$', "interface.views.show_review_questions", + name="show_review_questions") # url(r'^questions/ratemcq/$',"interface.views.rate_mcq",name="rate_mcq"), # url(r'^questions/postcomment/$',"interface.views.rate_post",name="rate_post_comment"), # url(r'^questions/ratecq/$',"interface.views.rate_cq",name="rate_cq"), From 7312bd4dabdfe2b8cf4dd2903d8ffbe3c89499d2 Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Tue, 27 Mar 2018 17:38:21 +0530 Subject: [PATCH 21/49] Add admin feature to add/remove users from reviewer group --- interface/admin.py | 51 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 45 insertions(+), 6 deletions(-) diff --git a/interface/admin.py b/interface/admin.py index 383492c..359caab 100644 --- a/interface/admin.py +++ b/interface/admin.py @@ -1,8 +1,47 @@ -from django.contrib import admin +from django.contrib import admin, messages from interface.models import (Question, TestCase, StdIOBasedTestCase, - Rating, Review) + Rating, Review) +from django.contrib.auth.models import User, Group +from django.contrib.auth.admin import GroupAdmin -admin.site.register( Question) -admin.site.register( TestCase) -admin.site.register( Rating) -admin.site.register( Review) +admin.site.register(Question) +admin.site.register(TestCase) +admin.site.register(Rating) +admin.site.register(Review) + + +class ReviewerAdmin(admin.ModelAdmin): + actions = ['make_reviewer', 'remove_reviewer'] + + def make_reviewer(self, request, users): + try: + group = Group.objects.get(name="reviewer") + group.user_set.add(*users) + messages.add_message(request, messages.SUCCESS, + 'Selected users have been added to the group.' + ) + except Exception as e: + messages.add_message(request, messages.ERROR, + 'You have an error:\n {0}.'.format(e) + ) + + + def remove_reviewer(self, request, users): + try: + group = Group.objects.get(name="reviewer") + group.user_set.remove(*users) + messages.add_message( + request, messages.SUCCESS, + 'Selected users have been removed from the group.' + ) + except Exception as e: + messages.add_message(request, messages.ERROR, + 'You have an error:\n {0}.'.format(e) + ) + + make_reviewer.short_description = "Add Users in reviewer Group" + remove_reviewer.short_description = "Remove Users from reviewer Group" + + +admin.site.unregister(User) +admin.site.register(User, ReviewerAdmin) From 90d8b0378d805df8ee714676616e6a03b6c68500 Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Wed, 28 Mar 2018 18:31:11 +0530 Subject: [PATCH 22/49] Allot review questions to reviewers and allow reviewers to check questions --- interface/views.py | 47 ++++++++++++++++++++-------- templates/checkquestion.html | 14 +++++++++ templates/show_review_questions.html | 2 +- yaksh/urls.py | 14 ++++++--- 4 files changed, 59 insertions(+), 18 deletions(-) create mode 100644 templates/checkquestion.html diff --git a/interface/views.py b/interface/views.py index 108920a..307eaa6 100644 --- a/interface/views.py +++ b/interface/views.py @@ -4,6 +4,7 @@ from django.http import HttpResponse,HttpResponseRedirect, JsonResponse, Http404 from interface.forms import * from django.forms.models import inlineformset_factory +from django.db.models import Q from django.core.urlresolvers import reverse from django.contrib.auth.decorators import login_required from django.contrib.auth import logout,login @@ -74,7 +75,7 @@ def show_all_questions(request): user = request.user ci = RequestContext(request) context = {} - if is_reviewer(user): + if is_reviewer(user) or is_moderator(user): return show_review_questions(request) if request.method == 'POST': if request.POST.get('delete') == 'delete': @@ -102,6 +103,7 @@ def show_all_questions(request): @login_required def add_question(request, question_id=None): + """Create/edit Questions on the interface""" user = request.user ci = RequestContext(request) if is_reviewer(user): @@ -216,17 +218,13 @@ def show_review_questions(request): user = request.user context = {} if is_moderator(user): - context['questions'] = Question.objects.all() + context['questions'] = Question.objects.filter(status=True) status = "moderator" if is_reviewer(user): - ques_bank = QuestionBank.objects.filter(user=user) - if ques_bank.exists(): - context['questions'] = ques_bank.first().question_bank.all() - else: - questions = get_reviewer_questions(user) - que_bank = QuestionBank.objects.create(user=user) - que_bank.question_bank.add(*questions) - context['questions'] = questions + ques_bank,created = QuestionBank.objects.get_or_create(user=user) + questions = get_reviewer_questions(user, ques_bank) + ques_bank.question_bank.add(*questions) + context['questions'] = ques_bank.question_bank.all() status = "reviewer" context['status'] = status return render_to_response( @@ -234,7 +232,30 @@ def show_review_questions(request): ) -def get_reviewer_questions(user): - questions = list(Question.objects.all().exclude(user=user)) +def get_reviewer_questions(user, question_bank): + existing_questions = question_bank.question_bank\ + .values_list("id", flat=True) + questions = list(Question.objects.all().exclude(Q(user=user) + | Q(status=False) + | Q(id__in=existing_questions) + ) + ) random.shuffle(questions) - return questions[:10] + return questions[:(9-question_bank.question_bank.count())] + + +@login_required +def check_question(request, question_id): + """Review question on the interface.""" + + user = request.user + ci = RequestContext(request) + context = {} + if not is_reviewer(user) and not is_moderator(user): + raise Http404("You are not allowed to view this page.") + try: + question = Question.objects.get(id=question_id) + except Question.DOesNotExist: + raise Http404("The Question you are trying to review doesn't exist.") + context['question'] = question + return render(request, "checkquestion.html", context) \ No newline at end of file diff --git a/templates/checkquestion.html b/templates/checkquestion.html new file mode 100644 index 0000000..ad5b32b --- /dev/null +++ b/templates/checkquestion.html @@ -0,0 +1,14 @@ +{% extends "navigation.html" %} +{% load custom_filter %} +{% block script %} + + + + + + +
    +

    Python mode

    + +
    + + +

    Cython mode

    + +
    + + +

    Configuration Options for Python mode:

    +
      +
    • version - 2/3 - The version of Python to recognize. Default is 2.
    • +
    • singleLineStringErrors - true/false - If you have a single-line string that is not terminated at the end of the line, this will show subsequent lines as errors if true, otherwise it will consider the newline as the end of the string. Default is false.
    • +
    • hangingIndent - int - If you want to write long arguments to a function starting on a new line, how much that line should be indented. Defaults to one normal indentation unit.
    • +
    +

    Advanced Configuration Options:

    +

    Usefull for superset of python syntax like Enthought enaml, IPython magics and questionmark help

    +
      +
    • singleOperators - RegEx - Regular Expression for single operator matching, default :
      ^[\\+\\-\\*/%&|\\^~<>!]
      including
      @
      on Python 3
    • +
    • singleDelimiters - RegEx - Regular Expression for single delimiter matching, default :
      ^[\\(\\)\\[\\]\\{\\}@,:`=;\\.]
    • +
    • doubleOperators - RegEx - Regular Expression for double operators matching, default :
      ^((==)|(!=)|(<=)|(>=)|(<>)|(<<)|(>>)|(//)|(\\*\\*))
    • +
    • doubleDelimiters - RegEx - Regular Expression for double delimiters matching, default :
      ^((\\+=)|(\\-=)|(\\*=)|(%=)|(/=)|(&=)|(\\|=)|(\\^=))
    • +
    • tripleDelimiters - RegEx - Regular Expression for triple delimiters matching, default :
      ^((//=)|(>>=)|(<<=)|(\\*\\*=))
    • +
    • identifiers - RegEx - Regular Expression for identifier, default :
      ^[_A-Za-z][_A-Za-z0-9]*
      on Python 2 and
      ^[_A-Za-z\u00A1-\uFFFF][_A-Za-z0-9\u00A1-\uFFFF]*
      on Python 3.
    • +
    • extra_keywords - list of string - List of extra words ton consider as keywords
    • +
    • extra_builtins - list of string - List of extra words ton consider as builtins
    • +
    + + +

    MIME types defined: text/x-python and text/x-cython.

    +
    diff --git a/interface/static/js/codemirror/mode/python/python.js b/interface/static/js/codemirror/mode/python/python.js new file mode 100644 index 0000000..ec662b1 --- /dev/null +++ b/interface/static/js/codemirror/mode/python/python.js @@ -0,0 +1,340 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + function wordRegexp(words) { + return new RegExp("^((" + words.join(")|(") + "))\\b"); + } + + var wordOperators = wordRegexp(["and", "or", "not", "is"]); + var commonKeywords = ["as", "assert", "break", "class", "continue", + "def", "del", "elif", "else", "except", "finally", + "for", "from", "global", "if", "import", + "lambda", "pass", "raise", "return", + "try", "while", "with", "yield", "in"]; + var commonBuiltins = ["abs", "all", "any", "bin", "bool", "bytearray", "callable", "chr", + "classmethod", "compile", "complex", "delattr", "dict", "dir", "divmod", + "enumerate", "eval", "filter", "float", "format", "frozenset", + "getattr", "globals", "hasattr", "hash", "help", "hex", "id", + "input", "int", "isinstance", "issubclass", "iter", "len", + "list", "locals", "map", "max", "memoryview", "min", "next", + "object", "oct", "open", "ord", "pow", "property", "range", + "repr", "reversed", "round", "set", "setattr", "slice", + "sorted", "staticmethod", "str", "sum", "super", "tuple", + "type", "vars", "zip", "__import__", "NotImplemented", + "Ellipsis", "__debug__"]; + CodeMirror.registerHelper("hintWords", "python", commonKeywords.concat(commonBuiltins)); + + function top(state) { + return state.scopes[state.scopes.length - 1]; + } + + CodeMirror.defineMode("python", function(conf, parserConf) { + var ERRORCLASS = "error"; + + var singleDelimiters = parserConf.singleDelimiters || /^[\(\)\[\]\{\}@,:`=;\.]/; + var doubleOperators = parserConf.doubleOperators || /^([!<>]==|<>|<<|>>|\/\/|\*\*)/; + var doubleDelimiters = parserConf.doubleDelimiters || /^(\+=|\-=|\*=|%=|\/=|&=|\|=|\^=)/; + var tripleDelimiters = parserConf.tripleDelimiters || /^(\/\/=|>>=|<<=|\*\*=)/; + + var hangingIndent = parserConf.hangingIndent || conf.indentUnit; + + var myKeywords = commonKeywords, myBuiltins = commonBuiltins; + if (parserConf.extra_keywords != undefined) + myKeywords = myKeywords.concat(parserConf.extra_keywords); + + if (parserConf.extra_builtins != undefined) + myBuiltins = myBuiltins.concat(parserConf.extra_builtins); + + var py3 = parserConf.version && parseInt(parserConf.version, 10) == 3 + if (py3) { + // since http://legacy.python.org/dev/peps/pep-0465/ @ is also an operator + var singleOperators = parserConf.singleOperators || /^[\+\-\*\/%&|\^~<>!@]/; + var identifiers = parserConf.identifiers|| /^[_A-Za-z\u00A1-\uFFFF][_A-Za-z0-9\u00A1-\uFFFF]*/; + myKeywords = myKeywords.concat(["nonlocal", "False", "True", "None", "async", "await"]); + myBuiltins = myBuiltins.concat(["ascii", "bytes", "exec", "print"]); + var stringPrefixes = new RegExp("^(([rbuf]|(br))?('{3}|\"{3}|['\"]))", "i"); + } else { + var singleOperators = parserConf.singleOperators || /^[\+\-\*\/%&|\^~<>!]/; + var identifiers = parserConf.identifiers|| /^[_A-Za-z][_A-Za-z0-9]*/; + myKeywords = myKeywords.concat(["exec", "print"]); + myBuiltins = myBuiltins.concat(["apply", "basestring", "buffer", "cmp", "coerce", "execfile", + "file", "intern", "long", "raw_input", "reduce", "reload", + "unichr", "unicode", "xrange", "False", "True", "None"]); + var stringPrefixes = new RegExp("^(([rub]|(ur)|(br))?('{3}|\"{3}|['\"]))", "i"); + } + var keywords = wordRegexp(myKeywords); + var builtins = wordRegexp(myBuiltins); + + // tokenizers + function tokenBase(stream, state) { + if (stream.sol()) state.indent = stream.indentation() + // Handle scope changes + if (stream.sol() && top(state).type == "py") { + var scopeOffset = top(state).offset; + if (stream.eatSpace()) { + var lineOffset = stream.indentation(); + if (lineOffset > scopeOffset) + pushPyScope(state); + else if (lineOffset < scopeOffset && dedent(stream, state)) + state.errorToken = true; + return null; + } else { + var style = tokenBaseInner(stream, state); + if (scopeOffset > 0 && dedent(stream, state)) + style += " " + ERRORCLASS; + return style; + } + } + return tokenBaseInner(stream, state); + } + + function tokenBaseInner(stream, state) { + if (stream.eatSpace()) return null; + + var ch = stream.peek(); + + // Handle Comments + if (ch == "#") { + stream.skipToEnd(); + return "comment"; + } + + // Handle Number Literals + if (stream.match(/^[0-9\.]/, false)) { + var floatLiteral = false; + // Floats + if (stream.match(/^\d*\.\d+(e[\+\-]?\d+)?/i)) { floatLiteral = true; } + if (stream.match(/^\d+\.\d*/)) { floatLiteral = true; } + if (stream.match(/^\.\d+/)) { floatLiteral = true; } + if (floatLiteral) { + // Float literals may be "imaginary" + stream.eat(/J/i); + return "number"; + } + // Integers + var intLiteral = false; + // Hex + if (stream.match(/^0x[0-9a-f]+/i)) intLiteral = true; + // Binary + if (stream.match(/^0b[01]+/i)) intLiteral = true; + // Octal + if (stream.match(/^0o[0-7]+/i)) intLiteral = true; + // Decimal + if (stream.match(/^[1-9]\d*(e[\+\-]?\d+)?/)) { + // Decimal literals may be "imaginary" + stream.eat(/J/i); + // TODO - Can you have imaginary longs? + intLiteral = true; + } + // Zero by itself with no other piece of number. + if (stream.match(/^0(?![\dx])/i)) intLiteral = true; + if (intLiteral) { + // Integer literals may be "long" + stream.eat(/L/i); + return "number"; + } + } + + // Handle Strings + if (stream.match(stringPrefixes)) { + state.tokenize = tokenStringFactory(stream.current()); + return state.tokenize(stream, state); + } + + // Handle operators and Delimiters + if (stream.match(tripleDelimiters) || stream.match(doubleDelimiters)) + return "punctuation"; + + if (stream.match(doubleOperators) || stream.match(singleOperators)) + return "operator"; + + if (stream.match(singleDelimiters)) + return "punctuation"; + + if (state.lastToken == "." && stream.match(identifiers)) + return "property"; + + if (stream.match(keywords) || stream.match(wordOperators)) + return "keyword"; + + if (stream.match(builtins)) + return "builtin"; + + if (stream.match(/^(self|cls)\b/)) + return "variable-2"; + + if (stream.match(identifiers)) { + if (state.lastToken == "def" || state.lastToken == "class") + return "def"; + return "variable"; + } + + // Handle non-detected items + stream.next(); + return ERRORCLASS; + } + + function tokenStringFactory(delimiter) { + while ("rub".indexOf(delimiter.charAt(0).toLowerCase()) >= 0) + delimiter = delimiter.substr(1); + + var singleline = delimiter.length == 1; + var OUTCLASS = "string"; + + function tokenString(stream, state) { + while (!stream.eol()) { + stream.eatWhile(/[^'"\\]/); + if (stream.eat("\\")) { + stream.next(); + if (singleline && stream.eol()) + return OUTCLASS; + } else if (stream.match(delimiter)) { + state.tokenize = tokenBase; + return OUTCLASS; + } else { + stream.eat(/['"]/); + } + } + if (singleline) { + if (parserConf.singleLineStringErrors) + return ERRORCLASS; + else + state.tokenize = tokenBase; + } + return OUTCLASS; + } + tokenString.isString = true; + return tokenString; + } + + function pushPyScope(state) { + while (top(state).type != "py") state.scopes.pop() + state.scopes.push({offset: top(state).offset + conf.indentUnit, + type: "py", + align: null}) + } + + function pushBracketScope(stream, state, type) { + var align = stream.match(/^([\s\[\{\(]|#.*)*$/, false) ? null : stream.column() + 1 + state.scopes.push({offset: state.indent + hangingIndent, + type: type, + align: align}) + } + + function dedent(stream, state) { + var indented = stream.indentation(); + while (top(state).offset > indented) { + if (top(state).type != "py") return true; + state.scopes.pop(); + } + return top(state).offset != indented; + } + + function tokenLexer(stream, state) { + if (stream.sol()) state.beginningOfLine = true; + + var style = state.tokenize(stream, state); + var current = stream.current(); + + // Handle decorators + if (state.beginningOfLine && current == "@") + return stream.match(identifiers, false) ? "meta" : py3 ? "operator" : ERRORCLASS; + + if (/\S/.test(current)) state.beginningOfLine = false; + + if ((style == "variable" || style == "builtin") + && state.lastToken == "meta") + style = "meta"; + + // Handle scope changes. + if (current == "pass" || current == "return") + state.dedent += 1; + + if (current == "lambda") state.lambda = true; + if (current == ":" && !state.lambda && top(state).type == "py") + pushPyScope(state); + + var delimiter_index = current.length == 1 ? "[({".indexOf(current) : -1; + if (delimiter_index != -1) + pushBracketScope(stream, state, "])}".slice(delimiter_index, delimiter_index+1)); + + delimiter_index = "])}".indexOf(current); + if (delimiter_index != -1) { + if (top(state).type == current) state.indent = state.scopes.pop().offset - hangingIndent + else return ERRORCLASS; + } + if (state.dedent > 0 && stream.eol() && top(state).type == "py") { + if (state.scopes.length > 1) state.scopes.pop(); + state.dedent -= 1; + } + + return style; + } + + var external = { + startState: function(basecolumn) { + return { + tokenize: tokenBase, + scopes: [{offset: basecolumn || 0, type: "py", align: null}], + indent: basecolumn || 0, + lastToken: null, + lambda: false, + dedent: 0 + }; + }, + + token: function(stream, state) { + var addErr = state.errorToken; + if (addErr) state.errorToken = false; + var style = tokenLexer(stream, state); + + if (style && style != "comment") + state.lastToken = (style == "keyword" || style == "punctuation") ? stream.current() : style; + if (style == "punctuation") style = null; + + if (stream.eol() && state.lambda) + state.lambda = false; + return addErr ? style + " " + ERRORCLASS : style; + }, + + indent: function(state, textAfter) { + if (state.tokenize != tokenBase) + return state.tokenize.isString ? CodeMirror.Pass : 0; + + var scope = top(state), closing = scope.type == textAfter.charAt(0) + if (scope.align != null) + return scope.align - (closing ? 1 : 0) + else + return scope.offset - (closing ? hangingIndent : 0) + }, + + electricInput: /^\s*[\}\]\)]$/, + closeBrackets: {triples: "'\""}, + lineComment: "#", + fold: "indent" + }; + return external; + }); + + CodeMirror.defineMIME("text/x-python", "python"); + + var words = function(str) { return str.split(" "); }; + + CodeMirror.defineMIME("text/x-cython", { + name: "python", + extra_keywords: words("by cdef cimport cpdef ctypedef enum except"+ + "extern gil include nogil property public"+ + "readonly struct union DEF IF ELIF ELSE") + }); + +}); diff --git a/interface/static/js/codemirror/mode/python/test.js b/interface/static/js/codemirror/mode/python/test.js new file mode 100644 index 0000000..c1a9c6a --- /dev/null +++ b/interface/static/js/codemirror/mode/python/test.js @@ -0,0 +1,30 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function() { + var mode = CodeMirror.getMode({indentUnit: 4}, + {name: "python", + version: 3, + singleLineStringErrors: false}); + function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } + + // Error, because "foobarhello" is neither a known type or property, but + // property was expected (after "and"), and it should be in parentheses. + MT("decoratorStartOfLine", + "[meta @dec]", + "[keyword def] [def function]():", + " [keyword pass]"); + + MT("decoratorIndented", + "[keyword class] [def Foo]:", + " [meta @dec]", + " [keyword def] [def function]():", + " [keyword pass]"); + + MT("matmulWithSpace:", "[variable a] [operator @] [variable b]"); + MT("matmulWithoutSpace:", "[variable a][operator @][variable b]"); + MT("matmulSpaceBefore:", "[variable a] [operator @][variable b]"); + + MT("fValidStringPrefix", "[string f'this is a {formatted} string']"); + MT("uValidStringPrefix", "[string u'this is an unicode string']"); +})(); diff --git a/templates/add_question.html b/interface/static/templates/add_question.html similarity index 100% rename from templates/add_question.html rename to interface/static/templates/add_question.html diff --git a/interface/static/templates/checkquestion.html b/interface/static/templates/checkquestion.html new file mode 100644 index 0000000..519ac66 --- /dev/null +++ b/interface/static/templates/checkquestion.html @@ -0,0 +1,60 @@ +{% extends "navigation.html" %} +{% load custom_filter %} +{% load staticfiles %} +{% block script %} + + +{% endblock %} + +{% block navbar %} +
  • Home
  • +
  • Contribution
  • +
  • Instructions
  • +
  • Logout
  • + {% endblock %} + + {% block content %} +
    +
    +

    + {{ question.summary }} + Points : {{ question.points }} +

    +
    + +
    +
    + {{ question.description|safe }} +
    +
    +
    + +
    +
    +

    Write your program below:

    +
    +
    +
    +
    + + +
    +{% endblock %} \ No newline at end of file diff --git a/interface/static/templates/dashboard.html b/interface/static/templates/dashboard.html new file mode 100644 index 0000000..540088a --- /dev/null +++ b/interface/static/templates/dashboard.html @@ -0,0 +1,27 @@ +{% extends "navigation.html" %} +{% block navbar %} +
  • Home
  • +
  • Contribution
  • +
  • Instructions
  • +
  • Logout
  • +{% endblock %} + +{% block content %} + + + +
    + +

    +

    Welcome {{name}}


    +

    + You can contribute questions here by clicking on Start Contribution.
    + For instructions on how to create questions click here. +

    Start Contribution +

    + +
    + + + +{% endblock %} \ No newline at end of file diff --git a/templates/notice.html b/interface/static/templates/home.html similarity index 57% rename from templates/notice.html rename to interface/static/templates/home.html index d60b5ed..2d0b2d3 100644 --- a/templates/notice.html +++ b/interface/static/templates/home.html @@ -1,10 +1,10 @@ {% extends "navigation.html" %} {% block navbar %} -
  • Home
  • -
  • Contribution
  • -
  • Logout
  • +
  • Login
  • +
  • Signup
  • {% endblock %} + {% block content %} @@ -14,11 +14,10 @@


    -

    {{ notice|safe }}

    - +

    Welcome to FOSSEE Fellowship Question Contribution Interface


    -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/templates/registration/login.html b/interface/static/templates/login.html similarity index 100% rename from templates/registration/login.html rename to interface/static/templates/login.html diff --git a/templates/moderator.html b/interface/static/templates/moderator.html similarity index 100% rename from templates/moderator.html rename to interface/static/templates/moderator.html diff --git a/templates/navigation.html b/interface/static/templates/navigation.html similarity index 100% rename from templates/navigation.html rename to interface/static/templates/navigation.html diff --git a/templates/registration/register.html b/interface/static/templates/register.html similarity index 68% rename from templates/registration/register.html rename to interface/static/templates/register.html index a5f3df4..fd62c69 100644 --- a/templates/registration/register.html +++ b/interface/static/templates/register.html @@ -8,19 +8,27 @@
  • Login
  • Signup
  • - {% endblock %} {% block content %} +{% if messages %} +{% for message in messages %} +
    +
    +
  • {{ message|safe }}
  • +
    +
    + {% endfor %} +{% endif %}

    Register here

    -
    {% csrf_token %} + {% csrf_token %} {{ form.as_table }}


    - Login + Login
    {% endblock %} diff --git a/templates/show_review_questions.html b/interface/static/templates/show_review_questions.html similarity index 100% rename from templates/show_review_questions.html rename to interface/static/templates/show_review_questions.html diff --git a/templates/showquestions.html b/interface/static/templates/showquestions.html similarity index 100% rename from templates/showquestions.html rename to interface/static/templates/showquestions.html diff --git a/interface/views.py b/interface/views.py index 307eaa6..6e7aeba 100644 --- a/interface/views.py +++ b/interface/views.py @@ -1,13 +1,16 @@ from interface.models import (Question, TestCase, StdIOBasedTestCase, Rating, Review, QuestionBank) +from yaksh.settings import CODESERVER_HOSTNAME,CODESERVER_PORT +from interface.forms import (RegistrationForm, QuestionForm) from django.shortcuts import render,get_object_or_404 -from django.http import HttpResponse,HttpResponseRedirect, JsonResponse, Http404 -from interface.forms import * +from django.http import HttpResponse,HttpResponseRedirect, Http404 from django.forms.models import inlineformset_factory from django.db.models import Q from django.core.urlresolvers import reverse +from django.contrib import messages from django.contrib.auth.decorators import login_required from django.contrib.auth import logout,login +from django.contrib.auth.models import User from django.views.decorators.csrf import csrf_protect from django.shortcuts import render_to_response from django.template import RequestContext @@ -20,20 +23,20 @@ def is_moderator(user): - """Check if the user is having moderator rights""" + """Check if the user is in the moderator group""" if user.groups.filter(name='moderator').exists(): return True def is_reviewer(user): + """Check if the user is in the reviewer group""" if user.groups.filter(name='reviewer').exists(): return True -def show_home(request): - +def show_home(request): if request.user.is_authenticated(): return HttpResponseRedirect(reverse('next_login')) else: - return render(request, 'home.html', {'type':'guest'}) + return render(request, 'home.html') def register(request): if request.method == 'POST': @@ -44,15 +47,15 @@ def register(request): password=form.cleaned_data['password1'], email=form.cleaned_data['email'] ) - return render(request,'notice.html',{'notice':"Thank you ! Your registration success.
    Login"}) + messages.add_message(request, messages.SUCCESS, + """You have successfully registered! + You can login now. + """) else: form = RegistrationForm() variables = RequestContext(request, {'form': form}) - return render_to_response('registration/register.html', variables) - -def register_success(request): - return render_to_response('registration/success.html') + return render_to_response('register.html', variables) def logout_page(request): logout(request) @@ -60,13 +63,12 @@ def logout_page(request): @login_required def next_login(request): - if request.user.is_authenticated(): if is_reviewer(request.user): return show_review_questions(request) - return render(request, 'dashboard.html', {'type':'user', "name":request.user}) + return render(request, 'dashboard.html') else: - return render(request, 'home.html', {'type':'guest'}) + return render(request, 'home.html') @login_required def show_all_questions(request): @@ -86,18 +88,10 @@ def show_all_questions(request): ) for question in questions: question.delete() - if is_moderator(user): - questions = Question.objects.all() - context['admin'] = True - context['remaining'] = "None" - - else: - questions = Question.objects.filter(user_id=user.id) - count = questions.count() - remaining = 5-count - context['remaining'] = remaining - context['admin'] = False - + questions = Question.objects.filter(user_id=user.id) + count = questions.count() + remaining = 5-count + context['remaining'] = remaining context['questions'] = questions return render(request, "showquestions.html", context) @@ -195,10 +189,14 @@ def submit_to_code_server(question_id): question = Question.objects.get(id=question_id) consolidate_answer = question.consolidate_answer_data(question.solution) - url = "http://localhost:55555" + url = "http://{0}:{1}".format(CODESERVER_HOSTNAME, CODESERVER_PORT) uid = "fellowship" + str(question_id) status = False - submit = requests.post(url, data=dict(uid=uid, json_data=consolidate_answer, user_dir="")) + submit = requests.post(url, data=dict(uid=uid, + json_data=consolidate_answer, + user_dir="" + ) + ) while not status: result_state = get_result(url, uid) stat = result_state.get("status") @@ -235,10 +233,11 @@ def show_review_questions(request): def get_reviewer_questions(user, question_bank): existing_questions = question_bank.question_bank\ .values_list("id", flat=True) - questions = list(Question.objects.all().exclude(Q(user=user) - | Q(status=False) - | Q(id__in=existing_questions) - ) + questions = list(Question.objects.all().exclude( + Q(user=user) + | Q(status=False) + | Q(id__in=existing_questions) + ) ) random.shuffle(questions) return questions[:(9-question_bank.question_bank.count())] diff --git a/templates/add_question.js b/templates/add_question.js deleted file mode 100644 index 346991a..0000000 --- a/templates/add_question.js +++ /dev/null @@ -1,162 +0,0 @@ -function increase(frm) -{ - if(frm.points.value == "") - { - frm.points.value = "0.5"; - return; - } - frm.points.value = parseFloat(frm.points.value) + 0.5; -} - -function decrease(frm) -{ - if(frm.points.value > 0) - { - frm.points.value = parseFloat(frm.points.value) - 0.5; - } - else - { - frm.points.value=0; - } - - -} - -function setSelectionRange(input, selectionStart, selectionEnd) -{ - if (input.setSelectionRange) - { - input.focus(); - input.setSelectionRange(selectionStart, selectionEnd); - } - else if (input.createTextRange) - { - var range = input.createTextRange(); - range.collapse(true); - range.moveEnd('character', selectionEnd); - range.moveStart('character', selectionStart); - range.select(); - } -} - -function replaceSelection (input, replaceString) -{ - if (input.setSelectionRange) - { - var selectionStart = input.selectionStart; - var selectionEnd = input.selectionEnd; - input.value = input.value.substring(0, selectionStart)+ replaceString + input.value.substring(selectionEnd); - if (selectionStart != selectionEnd) - { - setSelectionRange(input, selectionStart, selectionStart + replaceString.length); - } - else - { - setSelectionRange(input, selectionStart + replaceString.length, selectionStart + replaceString.length); - } - } - else if (document.selection) - { - var range = document.selection.createRange(); - if (range.parentElement() == input) - { - var isCollapsed = range.text == ''; - range.text = replaceString; - if (!isCollapsed) - { - range.moveStart('character', -replaceString.length); - range.select(); - } - } - } -} - -function textareaformat() -{ - document.getElementById('id_type').setAttribute('class','select-type'); - document.getElementById('id_points').setAttribute('class','mini-text'); - document.getElementById('id_tags').setAttribute('class','tag-text'); - $("[id*="+'test_case_args'+"]").attr('placeholder', - 'Command Line arguments for bash only'); - - $('#id_snippet').bind('keydown', function( event ){ - if(navigator.userAgent.match("Gecko")) - { - c=event.which; - } - else - { - c=event.keyCode; - } - if(c==9) - { - replaceSelection(document.getElementById('id_snippet'),String.fromCharCode(9)); - setTimeout(document.getElementById('id_snippet'),0); - return false; - } - }); - - $('#id_description').bind('focus', function( event ){ - document.getElementById("id_description").rows=5; - document.getElementById("id_description").cols=40; - }); - - $('#id_description').bind('blur', function( event ){ - document.getElementById("id_description").rows=1; - document.getElementById("id_description").cols=40; - }); - - $('#id_description').bind('keypress', function (event){ - document.getElementById('my').innerHTML = document.getElementById('id_description').value ; - }); - - $('#id_solution').bind('keypress', function (event){ - document.getElementById('rend_solution').innerHTML = document.getElementById('id_solution').value ; - }); - - $('#id_type').bind('focus', function(event){ - var type = document.getElementById('id_type'); - type.style.border = '1px solid #ccc'; - }); - - $('#id_language').bind('focus', function(event){ - var language = document.getElementById('id_language'); - language.style.border = '1px solid #ccc'; - }); - document.getElementById('my').innerHTML = document.getElementById('id_description').value ; - document.getElementById('rend_solution').innerHTML = document.getElementById('id_solution').value ; - - if (document.getElementById('id_grade_assignment_upload').checked || - document.getElementById('id_type').value == 'upload'){ - $("#id_grade_assignment_upload").prop("disabled", false); - } - else{ - $("#id_grade_assignment_upload").prop("disabled", true); - } - - $('#id_type').change(function() { - if ($(this).val() == "upload"){ - $("#id_grade_assignment_upload").prop("disabled", false); - } - else{ - $("#id_grade_assignment_upload").prop("disabled", true); - } - }); -} - -function autosubmit() -{ - var language = document.getElementById('id_language'); - if(language.value == 'select') - { - language.style.border="solid red"; - return false; - } - var type = document.getElementById('id_type'); - if(type.value == 'select') - { - type.style.border = 'solid red'; - return false; - } - -} diff --git a/templates/base.html b/templates/base.html deleted file mode 100644 index 6ba7f32..0000000 --- a/templates/base.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - {% load staticfiles %} - Django Login Application | - {% block title %}{% endblock %} - - -

    {% block head %}{% endblock %}

    - {% block content %}{% endblock %} - - - \ No newline at end of file diff --git a/templates/checkquestion.html b/templates/checkquestion.html deleted file mode 100644 index ad5b32b..0000000 --- a/templates/checkquestion.html +++ /dev/null @@ -1,14 +0,0 @@ -{% extends "navigation.html" %} -{% load custom_filter %} -{% block script %} - - - -{% endblock %} diff --git a/yaksh/settings.py b/yaksh/settings.py index 1ae7a89..7f7339b 100644 --- a/yaksh/settings.py +++ b/yaksh/settings.py @@ -56,7 +56,7 @@ TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [os.path.join(BASE_DIR,"templates")], + 'DIRS': ["interface/static/templates"], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ @@ -75,23 +75,23 @@ # Database # https://docs.djangoproject.com/en/1.9/ref/settings/#databases -# DATABASES = { -# 'default': { -# 'ENGINE': 'django.db.backends.sqlite3', -# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), -# } -# } DATABASES = { 'default': { - 'ENGINE': 'django.db.backends.mysql', - 'NAME': "contribute", - # The following settings are not used with sqlite3: - 'USER': "username", - 'PASSWORD': "password", - 'HOST': 'localhost', # Empty for localhost through domain sockets or '1$ - 'PORT': 3306, - }, + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + } } +# DATABASES = { +# 'default': { +# 'ENGINE': 'django.db.backends.mysql', +# 'NAME': "contribute", +# # The following settings are not used with sqlite3: +# 'USER': "username", +# 'PASSWORD': "password", +# 'HOST': 'localhost', # Empty for localhost through domain sockets or '1$ +# 'PORT': 3306, +# }, +# } # Password validation # https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators @@ -131,4 +131,10 @@ STATIC_URL = '/static/' -STATIC_ROOT = 'templates' +STATIC_ROOT='interface/static/' + +LOGIN_URL = "/login/" + +CODESERVER_HOSTNAME = "localhost" # Address of the yaksh code server + +CODESERVER_PORT = 55555 diff --git a/yaksh/urls.py b/yaksh/urls.py index ba64cd4..67e0044 100644 --- a/yaksh/urls.py +++ b/yaksh/urls.py @@ -1,26 +1,27 @@ from django.conf.urls import url, include from django.contrib import admin +from django.contrib.auth import views as auth_views from interface.views import * + urlpatterns = [ url(r'^admin/', admin.site.urls), - url(r'^$',"interface.views.show_home",name="home"), + url(r'^$',show_home,name="home"), - url(r'^login/$', 'django.contrib.auth.views.login', name="login"), - url(r'^logout/$', "interface.views.logout_page",name="logout_page"), - url(r'^register/$', "interface.views.register", name="register_page"), - url(r'^register/success/$', "interface.views.register_success", - name="register_success"), - url(r'^dashboard/$',"interface.views.next_login",name="next_login"), + url(r'^login/$', auth_views.login, + {'template_name': 'login.html'}, name="login"), + url(r'^logout/$', logout_page,name="logout_page"), + url(r'^register/$', register, name="register_page"), + url(r'^dashboard/$',next_login,name="next_login"), - url(r'^showquestions/$',"interface.views.show_all_questions", + url(r'^showquestions/$',show_all_questions, name="show_all_questions"), - url(r'^addquestion/$',"interface.views.add_question",name="add_question"), - url(r'^addquestion/(?P\d+)/$',"interface.views.add_question", + url(r'^addquestion/$',add_question,name="add_question"), + url(r'^addquestion/(?P\d+)/$',add_question, name="add_question"), - url(r'^show_review_questions/$', "interface.views.show_review_questions", + url(r'^show_review_questions/$', show_review_questions, name="show_review_questions"), url(r'^checkquestion/(?P\d+)/$', - "interface.views.check_question",name="check_question"), + check_question,name="check_question"), # url(r'^questions/ratemcq/$',"interface.views.rate_mcq",name="rate_mcq"), # url(r'^questions/postcomment/$',"interface.views.rate_post",name="rate_post_comment"), From d20de2339a2d5feae6d91dd1983c12e8d79730b5 Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Wed, 4 Apr 2018 18:04:23 +0530 Subject: [PATCH 24/49] Make PEP8 changes --- interface/models.py | 5 ++--- interface/views.py | 21 ++++++++------------- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/interface/models.py b/interface/models.py index 3b7468b..6d3ebb2 100644 --- a/interface/models.py +++ b/interface/models.py @@ -2,7 +2,6 @@ from django.contrib.auth.models import User from django.db import models import json -import os question_status_choices = ( (1, "Question doesn't make sense."), @@ -115,7 +114,7 @@ class Rating(models.Model): avg_peer_rating = models.FloatField(default=0.0) def __str__(self): - return "Rating for {0}".format(question.summary) + return "Rating for {0}".format(self.question.summary) class QuestionReviewDetails(models.Model): @@ -129,7 +128,7 @@ class QuestionReviewDetails(models.Model): skipped = models.BooleanField(default=False) def __str__(self): - return "Review for {0}".format(question.summary) + return "Review for {0}".format(self.question.summary) class Review(models.Model): diff --git a/interface/views.py b/interface/views.py index 6e7aeba..966a107 100644 --- a/interface/views.py +++ b/interface/views.py @@ -2,23 +2,20 @@ Rating, Review, QuestionBank) from yaksh.settings import CODESERVER_HOSTNAME,CODESERVER_PORT from interface.forms import (RegistrationForm, QuestionForm) -from django.shortcuts import render,get_object_or_404 -from django.http import HttpResponse,HttpResponseRedirect, Http404 +from django.shortcuts import render +from django.http import HttpResponseRedirect, Http404 from django.forms.models import inlineformset_factory from django.db.models import Q from django.core.urlresolvers import reverse from django.contrib import messages from django.contrib.auth.decorators import login_required -from django.contrib.auth import logout,login +from django.contrib.auth import logout from django.contrib.auth.models import User -from django.views.decorators.csrf import csrf_protect from django.shortcuts import render_to_response from django.template import RequestContext -from random import choice from urllib.parse import urljoin import requests import json -import os import random @@ -42,7 +39,7 @@ def register(request): if request.method == 'POST': form = RegistrationForm(request.POST) if form.is_valid(): - user = User.objects.create_user( + User.objects.create_user( username=form.cleaned_data['username'], password=form.cleaned_data['password1'], email=form.cleaned_data['email'] @@ -75,7 +72,6 @@ def show_all_questions(request): """Show a list of all the questions currently in the database.""" user = request.user - ci = RequestContext(request) context = {} if is_reviewer(user) or is_moderator(user): return show_review_questions(request) @@ -192,11 +188,10 @@ def submit_to_code_server(question_id): url = "http://{0}:{1}".format(CODESERVER_HOSTNAME, CODESERVER_PORT) uid = "fellowship" + str(question_id) status = False - submit = requests.post(url, data=dict(uid=uid, - json_data=consolidate_answer, - user_dir="" - ) - ) + requests.post(url, data=dict(uid=uid, json_data=consolidate_answer, + user_dir="" + ) + ) while not status: result_state = get_result(url, uid) stat = result_state.get("status") From a904d426398e7a122dd7028cbed065b7ff467bd5 Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Fri, 6 Apr 2018 16:16:47 +0530 Subject: [PATCH 25/49] Add admin feature to check and update all questions --- interface/admin.py | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/interface/admin.py b/interface/admin.py index 359caab..bfc3367 100644 --- a/interface/admin.py +++ b/interface/admin.py @@ -1,8 +1,8 @@ from django.contrib import admin, messages -from interface.models import (Question, TestCase, StdIOBasedTestCase, - Rating, Review) from django.contrib.auth.models import User, Group from django.contrib.auth.admin import GroupAdmin +from interface.models import Question, TestCase, Rating, Review +from interface.views import submit_to_code_server admin.site.register(Question) admin.site.register(TestCase) @@ -42,6 +42,35 @@ def remove_reviewer(self, request, users): make_reviewer.short_description = "Add Users in reviewer Group" remove_reviewer.short_description = "Remove Users from reviewer Group" +class QuestionAdmin(admin.ModelAdmin): + list_display = ["summary", "user", 'status'] + actions = ["update_question_status"] + + def update_question_status(self, request, questions): + try: + selected_questions = Question.objects.filter(id__in=questions) + for question in selected_questions: + result = submit_to_code_server(question.id) + if result.get("success"): + question.status = True + question.save() + else: + question.status = False + question.save() + + messages.add_message(request, messages.SUCCESS, + "Question Status successfully updated." + ) + + except Exception as e: + messages.add_message(request, messages.ERROR, + 'You have an error:\n {0}.'.format(e) + ) + + update_question_status.short_description = """Check and update + question status""" admin.site.unregister(User) admin.site.register(User, ReviewerAdmin) +admin.site.unregister(Question) +admin.site.register(Question, QuestionAdmin) From 2f0377b4a1022212dc88d4214912e985740b058c Mon Sep 17 00:00:00 2001 From: adityacp Date: Tue, 27 Mar 2018 15:54:13 +0530 Subject: [PATCH 26/49] Review interface for users --- interface/views.py | 42 ++++++++++++++++- templates/show_review_questions.html | 67 ++++++++++++++++++++++++++++ yaksh/urls.py | 2 + 3 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 templates/show_review_questions.html diff --git a/interface/views.py b/interface/views.py index 26b2584..108920a 100644 --- a/interface/views.py +++ b/interface/views.py @@ -1,5 +1,5 @@ from interface.models import (Question, TestCase, StdIOBasedTestCase, - Rating, Review) + Rating, Review, QuestionBank) from django.shortcuts import render,get_object_or_404 from django.http import HttpResponse,HttpResponseRedirect, JsonResponse, Http404 from interface.forms import * @@ -15,6 +15,7 @@ import requests import json import os +import random def is_moderator(user): @@ -22,6 +23,10 @@ def is_moderator(user): if user.groups.filter(name='moderator').exists(): return True +def is_reviewer(user): + if user.groups.filter(name='reviewer').exists(): + return True + def show_home(request): if request.user.is_authenticated(): @@ -56,6 +61,8 @@ def logout_page(request): def next_login(request): if request.user.is_authenticated(): + if is_reviewer(request.user): + return show_review_questions(request) return render(request, 'dashboard.html', {'type':'user', "name":request.user}) else: return render(request, 'home.html', {'type':'guest'}) @@ -67,6 +74,8 @@ def show_all_questions(request): user = request.user ci = RequestContext(request) context = {} + if is_reviewer(user): + return show_review_questions(request) if request.method == 'POST': if request.POST.get('delete') == 'delete': data = request.POST.getlist('question') @@ -95,6 +104,8 @@ def show_all_questions(request): def add_question(request, question_id=None): user = request.user ci = RequestContext(request) + if is_reviewer(user): + return show_review_questions(request) test_case_type = "stdiobasedtestcase" solution_error, tc_error = [], [] @@ -198,3 +209,32 @@ def submit_to_code_server(question_id): def get_result(url, uid): response = json.loads(requests.get(urljoin(url, uid)).text) return response + + +@login_required +def show_review_questions(request): + user = request.user + context = {} + if is_moderator(user): + context['questions'] = Question.objects.all() + status = "moderator" + if is_reviewer(user): + ques_bank = QuestionBank.objects.filter(user=user) + if ques_bank.exists(): + context['questions'] = ques_bank.first().question_bank.all() + else: + questions = get_reviewer_questions(user) + que_bank = QuestionBank.objects.create(user=user) + que_bank.question_bank.add(*questions) + context['questions'] = questions + status = "reviewer" + context['status'] = status + return render_to_response( + "show_review_questions.html", context + ) + + +def get_reviewer_questions(user): + questions = list(Question.objects.all().exclude(user=user)) + random.shuffle(questions) + return questions[:10] diff --git a/templates/show_review_questions.html b/templates/show_review_questions.html new file mode 100644 index 0000000..9686115 --- /dev/null +++ b/templates/show_review_questions.html @@ -0,0 +1,67 @@ +{% extends "dashboard.html" %} + +{% block navbar %} +
  • Home
  • +
  • Contribution
  • +
  • Instructions
  • +
  • Logout
  • + {% endblock %} + +{% block title %} Questions {% endblock %} + +{% block subtitle %} Review Questions {% endblock subtitle %} + +{% block content %} +
    +

    Review Questions

    +
    +{% if status %} +
    +

    You are now a {{status}}

    +
    +{% endif %} +
    +
    + +
    +
    +{% csrf_token %} + +
    +{% if questions %} + + + + + + + + + + + + +{% for question in questions %} + + + + + +{% if question.status %} + +{% else %} + +{% endif %} + +{% endfor %} + +
    Summary Language Type Marks Status
    {{question.summary|capfirst}}{{question.language|capfirst}}{{question.type|capfirst}}{{question.points}}
    +{% endif %} +
    +
    +
    +
    +
    + + +{% endblock %} \ No newline at end of file diff --git a/yaksh/urls.py b/yaksh/urls.py index 59972f4..c540868 100644 --- a/yaksh/urls.py +++ b/yaksh/urls.py @@ -14,6 +14,8 @@ url(r'^showquestions/$',"interface.views.show_all_questions",name="show_all_questions"), url(r'^addquestion/$',"interface.views.add_question",name="add_question"), url(r'^addquestion/(?P\d+)/$',"interface.views.add_question",name="add_question"), + url(r'^show_review_questions/$', "interface.views.show_review_questions", + name="show_review_questions") # url(r'^questions/ratemcq/$',"interface.views.rate_mcq",name="rate_mcq"), # url(r'^questions/postcomment/$',"interface.views.rate_post",name="rate_post_comment"), # url(r'^questions/ratecq/$',"interface.views.rate_cq",name="rate_cq"), From 68e3f70e7ca47574a0d3c9c926a96bfaf0538dfe Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Wed, 28 Mar 2018 18:31:11 +0530 Subject: [PATCH 27/49] Allot review questions to reviewers and allow reviewers to check questions --- interface/views.py | 47 ++++++++++++++++++++-------- templates/checkquestion.html | 14 +++++++++ templates/show_review_questions.html | 2 +- yaksh/urls.py | 14 ++++++--- 4 files changed, 59 insertions(+), 18 deletions(-) create mode 100644 templates/checkquestion.html diff --git a/interface/views.py b/interface/views.py index 108920a..307eaa6 100644 --- a/interface/views.py +++ b/interface/views.py @@ -4,6 +4,7 @@ from django.http import HttpResponse,HttpResponseRedirect, JsonResponse, Http404 from interface.forms import * from django.forms.models import inlineformset_factory +from django.db.models import Q from django.core.urlresolvers import reverse from django.contrib.auth.decorators import login_required from django.contrib.auth import logout,login @@ -74,7 +75,7 @@ def show_all_questions(request): user = request.user ci = RequestContext(request) context = {} - if is_reviewer(user): + if is_reviewer(user) or is_moderator(user): return show_review_questions(request) if request.method == 'POST': if request.POST.get('delete') == 'delete': @@ -102,6 +103,7 @@ def show_all_questions(request): @login_required def add_question(request, question_id=None): + """Create/edit Questions on the interface""" user = request.user ci = RequestContext(request) if is_reviewer(user): @@ -216,17 +218,13 @@ def show_review_questions(request): user = request.user context = {} if is_moderator(user): - context['questions'] = Question.objects.all() + context['questions'] = Question.objects.filter(status=True) status = "moderator" if is_reviewer(user): - ques_bank = QuestionBank.objects.filter(user=user) - if ques_bank.exists(): - context['questions'] = ques_bank.first().question_bank.all() - else: - questions = get_reviewer_questions(user) - que_bank = QuestionBank.objects.create(user=user) - que_bank.question_bank.add(*questions) - context['questions'] = questions + ques_bank,created = QuestionBank.objects.get_or_create(user=user) + questions = get_reviewer_questions(user, ques_bank) + ques_bank.question_bank.add(*questions) + context['questions'] = ques_bank.question_bank.all() status = "reviewer" context['status'] = status return render_to_response( @@ -234,7 +232,30 @@ def show_review_questions(request): ) -def get_reviewer_questions(user): - questions = list(Question.objects.all().exclude(user=user)) +def get_reviewer_questions(user, question_bank): + existing_questions = question_bank.question_bank\ + .values_list("id", flat=True) + questions = list(Question.objects.all().exclude(Q(user=user) + | Q(status=False) + | Q(id__in=existing_questions) + ) + ) random.shuffle(questions) - return questions[:10] + return questions[:(9-question_bank.question_bank.count())] + + +@login_required +def check_question(request, question_id): + """Review question on the interface.""" + + user = request.user + ci = RequestContext(request) + context = {} + if not is_reviewer(user) and not is_moderator(user): + raise Http404("You are not allowed to view this page.") + try: + question = Question.objects.get(id=question_id) + except Question.DOesNotExist: + raise Http404("The Question you are trying to review doesn't exist.") + context['question'] = question + return render(request, "checkquestion.html", context) \ No newline at end of file diff --git a/templates/checkquestion.html b/templates/checkquestion.html new file mode 100644 index 0000000..ad5b32b --- /dev/null +++ b/templates/checkquestion.html @@ -0,0 +1,14 @@ +{% extends "navigation.html" %} +{% load custom_filter %} +{% block script %} + + + + + + +
    +

    Python mode

    + +
    + + +

    Cython mode

    + +
    + + +

    Configuration Options for Python mode:

    +
      +
    • version - 2/3 - The version of Python to recognize. Default is 2.
    • +
    • singleLineStringErrors - true/false - If you have a single-line string that is not terminated at the end of the line, this will show subsequent lines as errors if true, otherwise it will consider the newline as the end of the string. Default is false.
    • +
    • hangingIndent - int - If you want to write long arguments to a function starting on a new line, how much that line should be indented. Defaults to one normal indentation unit.
    • +
    +

    Advanced Configuration Options:

    +

    Usefull for superset of python syntax like Enthought enaml, IPython magics and questionmark help

    +
      +
    • singleOperators - RegEx - Regular Expression for single operator matching, default :
      ^[\\+\\-\\*/%&|\\^~<>!]
      including
      @
      on Python 3
    • +
    • singleDelimiters - RegEx - Regular Expression for single delimiter matching, default :
      ^[\\(\\)\\[\\]\\{\\}@,:`=;\\.]
    • +
    • doubleOperators - RegEx - Regular Expression for double operators matching, default :
      ^((==)|(!=)|(<=)|(>=)|(<>)|(<<)|(>>)|(//)|(\\*\\*))
    • +
    • doubleDelimiters - RegEx - Regular Expression for double delimiters matching, default :
      ^((\\+=)|(\\-=)|(\\*=)|(%=)|(/=)|(&=)|(\\|=)|(\\^=))
    • +
    • tripleDelimiters - RegEx - Regular Expression for triple delimiters matching, default :
      ^((//=)|(>>=)|(<<=)|(\\*\\*=))
    • +
    • identifiers - RegEx - Regular Expression for identifier, default :
      ^[_A-Za-z][_A-Za-z0-9]*
      on Python 2 and
      ^[_A-Za-z\u00A1-\uFFFF][_A-Za-z0-9\u00A1-\uFFFF]*
      on Python 3.
    • +
    • extra_keywords - list of string - List of extra words ton consider as keywords
    • +
    • extra_builtins - list of string - List of extra words ton consider as builtins
    • +
    + + +

    MIME types defined: text/x-python and text/x-cython.

    +
    diff --git a/interface/static/js/codemirror/mode/python/python.js b/interface/static/js/codemirror/mode/python/python.js new file mode 100644 index 0000000..ec662b1 --- /dev/null +++ b/interface/static/js/codemirror/mode/python/python.js @@ -0,0 +1,340 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function(mod) { + if (typeof exports == "object" && typeof module == "object") // CommonJS + mod(require("../../lib/codemirror")); + else if (typeof define == "function" && define.amd) // AMD + define(["../../lib/codemirror"], mod); + else // Plain browser env + mod(CodeMirror); +})(function(CodeMirror) { + "use strict"; + + function wordRegexp(words) { + return new RegExp("^((" + words.join(")|(") + "))\\b"); + } + + var wordOperators = wordRegexp(["and", "or", "not", "is"]); + var commonKeywords = ["as", "assert", "break", "class", "continue", + "def", "del", "elif", "else", "except", "finally", + "for", "from", "global", "if", "import", + "lambda", "pass", "raise", "return", + "try", "while", "with", "yield", "in"]; + var commonBuiltins = ["abs", "all", "any", "bin", "bool", "bytearray", "callable", "chr", + "classmethod", "compile", "complex", "delattr", "dict", "dir", "divmod", + "enumerate", "eval", "filter", "float", "format", "frozenset", + "getattr", "globals", "hasattr", "hash", "help", "hex", "id", + "input", "int", "isinstance", "issubclass", "iter", "len", + "list", "locals", "map", "max", "memoryview", "min", "next", + "object", "oct", "open", "ord", "pow", "property", "range", + "repr", "reversed", "round", "set", "setattr", "slice", + "sorted", "staticmethod", "str", "sum", "super", "tuple", + "type", "vars", "zip", "__import__", "NotImplemented", + "Ellipsis", "__debug__"]; + CodeMirror.registerHelper("hintWords", "python", commonKeywords.concat(commonBuiltins)); + + function top(state) { + return state.scopes[state.scopes.length - 1]; + } + + CodeMirror.defineMode("python", function(conf, parserConf) { + var ERRORCLASS = "error"; + + var singleDelimiters = parserConf.singleDelimiters || /^[\(\)\[\]\{\}@,:`=;\.]/; + var doubleOperators = parserConf.doubleOperators || /^([!<>]==|<>|<<|>>|\/\/|\*\*)/; + var doubleDelimiters = parserConf.doubleDelimiters || /^(\+=|\-=|\*=|%=|\/=|&=|\|=|\^=)/; + var tripleDelimiters = parserConf.tripleDelimiters || /^(\/\/=|>>=|<<=|\*\*=)/; + + var hangingIndent = parserConf.hangingIndent || conf.indentUnit; + + var myKeywords = commonKeywords, myBuiltins = commonBuiltins; + if (parserConf.extra_keywords != undefined) + myKeywords = myKeywords.concat(parserConf.extra_keywords); + + if (parserConf.extra_builtins != undefined) + myBuiltins = myBuiltins.concat(parserConf.extra_builtins); + + var py3 = parserConf.version && parseInt(parserConf.version, 10) == 3 + if (py3) { + // since http://legacy.python.org/dev/peps/pep-0465/ @ is also an operator + var singleOperators = parserConf.singleOperators || /^[\+\-\*\/%&|\^~<>!@]/; + var identifiers = parserConf.identifiers|| /^[_A-Za-z\u00A1-\uFFFF][_A-Za-z0-9\u00A1-\uFFFF]*/; + myKeywords = myKeywords.concat(["nonlocal", "False", "True", "None", "async", "await"]); + myBuiltins = myBuiltins.concat(["ascii", "bytes", "exec", "print"]); + var stringPrefixes = new RegExp("^(([rbuf]|(br))?('{3}|\"{3}|['\"]))", "i"); + } else { + var singleOperators = parserConf.singleOperators || /^[\+\-\*\/%&|\^~<>!]/; + var identifiers = parserConf.identifiers|| /^[_A-Za-z][_A-Za-z0-9]*/; + myKeywords = myKeywords.concat(["exec", "print"]); + myBuiltins = myBuiltins.concat(["apply", "basestring", "buffer", "cmp", "coerce", "execfile", + "file", "intern", "long", "raw_input", "reduce", "reload", + "unichr", "unicode", "xrange", "False", "True", "None"]); + var stringPrefixes = new RegExp("^(([rub]|(ur)|(br))?('{3}|\"{3}|['\"]))", "i"); + } + var keywords = wordRegexp(myKeywords); + var builtins = wordRegexp(myBuiltins); + + // tokenizers + function tokenBase(stream, state) { + if (stream.sol()) state.indent = stream.indentation() + // Handle scope changes + if (stream.sol() && top(state).type == "py") { + var scopeOffset = top(state).offset; + if (stream.eatSpace()) { + var lineOffset = stream.indentation(); + if (lineOffset > scopeOffset) + pushPyScope(state); + else if (lineOffset < scopeOffset && dedent(stream, state)) + state.errorToken = true; + return null; + } else { + var style = tokenBaseInner(stream, state); + if (scopeOffset > 0 && dedent(stream, state)) + style += " " + ERRORCLASS; + return style; + } + } + return tokenBaseInner(stream, state); + } + + function tokenBaseInner(stream, state) { + if (stream.eatSpace()) return null; + + var ch = stream.peek(); + + // Handle Comments + if (ch == "#") { + stream.skipToEnd(); + return "comment"; + } + + // Handle Number Literals + if (stream.match(/^[0-9\.]/, false)) { + var floatLiteral = false; + // Floats + if (stream.match(/^\d*\.\d+(e[\+\-]?\d+)?/i)) { floatLiteral = true; } + if (stream.match(/^\d+\.\d*/)) { floatLiteral = true; } + if (stream.match(/^\.\d+/)) { floatLiteral = true; } + if (floatLiteral) { + // Float literals may be "imaginary" + stream.eat(/J/i); + return "number"; + } + // Integers + var intLiteral = false; + // Hex + if (stream.match(/^0x[0-9a-f]+/i)) intLiteral = true; + // Binary + if (stream.match(/^0b[01]+/i)) intLiteral = true; + // Octal + if (stream.match(/^0o[0-7]+/i)) intLiteral = true; + // Decimal + if (stream.match(/^[1-9]\d*(e[\+\-]?\d+)?/)) { + // Decimal literals may be "imaginary" + stream.eat(/J/i); + // TODO - Can you have imaginary longs? + intLiteral = true; + } + // Zero by itself with no other piece of number. + if (stream.match(/^0(?![\dx])/i)) intLiteral = true; + if (intLiteral) { + // Integer literals may be "long" + stream.eat(/L/i); + return "number"; + } + } + + // Handle Strings + if (stream.match(stringPrefixes)) { + state.tokenize = tokenStringFactory(stream.current()); + return state.tokenize(stream, state); + } + + // Handle operators and Delimiters + if (stream.match(tripleDelimiters) || stream.match(doubleDelimiters)) + return "punctuation"; + + if (stream.match(doubleOperators) || stream.match(singleOperators)) + return "operator"; + + if (stream.match(singleDelimiters)) + return "punctuation"; + + if (state.lastToken == "." && stream.match(identifiers)) + return "property"; + + if (stream.match(keywords) || stream.match(wordOperators)) + return "keyword"; + + if (stream.match(builtins)) + return "builtin"; + + if (stream.match(/^(self|cls)\b/)) + return "variable-2"; + + if (stream.match(identifiers)) { + if (state.lastToken == "def" || state.lastToken == "class") + return "def"; + return "variable"; + } + + // Handle non-detected items + stream.next(); + return ERRORCLASS; + } + + function tokenStringFactory(delimiter) { + while ("rub".indexOf(delimiter.charAt(0).toLowerCase()) >= 0) + delimiter = delimiter.substr(1); + + var singleline = delimiter.length == 1; + var OUTCLASS = "string"; + + function tokenString(stream, state) { + while (!stream.eol()) { + stream.eatWhile(/[^'"\\]/); + if (stream.eat("\\")) { + stream.next(); + if (singleline && stream.eol()) + return OUTCLASS; + } else if (stream.match(delimiter)) { + state.tokenize = tokenBase; + return OUTCLASS; + } else { + stream.eat(/['"]/); + } + } + if (singleline) { + if (parserConf.singleLineStringErrors) + return ERRORCLASS; + else + state.tokenize = tokenBase; + } + return OUTCLASS; + } + tokenString.isString = true; + return tokenString; + } + + function pushPyScope(state) { + while (top(state).type != "py") state.scopes.pop() + state.scopes.push({offset: top(state).offset + conf.indentUnit, + type: "py", + align: null}) + } + + function pushBracketScope(stream, state, type) { + var align = stream.match(/^([\s\[\{\(]|#.*)*$/, false) ? null : stream.column() + 1 + state.scopes.push({offset: state.indent + hangingIndent, + type: type, + align: align}) + } + + function dedent(stream, state) { + var indented = stream.indentation(); + while (top(state).offset > indented) { + if (top(state).type != "py") return true; + state.scopes.pop(); + } + return top(state).offset != indented; + } + + function tokenLexer(stream, state) { + if (stream.sol()) state.beginningOfLine = true; + + var style = state.tokenize(stream, state); + var current = stream.current(); + + // Handle decorators + if (state.beginningOfLine && current == "@") + return stream.match(identifiers, false) ? "meta" : py3 ? "operator" : ERRORCLASS; + + if (/\S/.test(current)) state.beginningOfLine = false; + + if ((style == "variable" || style == "builtin") + && state.lastToken == "meta") + style = "meta"; + + // Handle scope changes. + if (current == "pass" || current == "return") + state.dedent += 1; + + if (current == "lambda") state.lambda = true; + if (current == ":" && !state.lambda && top(state).type == "py") + pushPyScope(state); + + var delimiter_index = current.length == 1 ? "[({".indexOf(current) : -1; + if (delimiter_index != -1) + pushBracketScope(stream, state, "])}".slice(delimiter_index, delimiter_index+1)); + + delimiter_index = "])}".indexOf(current); + if (delimiter_index != -1) { + if (top(state).type == current) state.indent = state.scopes.pop().offset - hangingIndent + else return ERRORCLASS; + } + if (state.dedent > 0 && stream.eol() && top(state).type == "py") { + if (state.scopes.length > 1) state.scopes.pop(); + state.dedent -= 1; + } + + return style; + } + + var external = { + startState: function(basecolumn) { + return { + tokenize: tokenBase, + scopes: [{offset: basecolumn || 0, type: "py", align: null}], + indent: basecolumn || 0, + lastToken: null, + lambda: false, + dedent: 0 + }; + }, + + token: function(stream, state) { + var addErr = state.errorToken; + if (addErr) state.errorToken = false; + var style = tokenLexer(stream, state); + + if (style && style != "comment") + state.lastToken = (style == "keyword" || style == "punctuation") ? stream.current() : style; + if (style == "punctuation") style = null; + + if (stream.eol() && state.lambda) + state.lambda = false; + return addErr ? style + " " + ERRORCLASS : style; + }, + + indent: function(state, textAfter) { + if (state.tokenize != tokenBase) + return state.tokenize.isString ? CodeMirror.Pass : 0; + + var scope = top(state), closing = scope.type == textAfter.charAt(0) + if (scope.align != null) + return scope.align - (closing ? 1 : 0) + else + return scope.offset - (closing ? hangingIndent : 0) + }, + + electricInput: /^\s*[\}\]\)]$/, + closeBrackets: {triples: "'\""}, + lineComment: "#", + fold: "indent" + }; + return external; + }); + + CodeMirror.defineMIME("text/x-python", "python"); + + var words = function(str) { return str.split(" "); }; + + CodeMirror.defineMIME("text/x-cython", { + name: "python", + extra_keywords: words("by cdef cimport cpdef ctypedef enum except"+ + "extern gil include nogil property public"+ + "readonly struct union DEF IF ELIF ELSE") + }); + +}); diff --git a/interface/static/js/codemirror/mode/python/test.js b/interface/static/js/codemirror/mode/python/test.js new file mode 100644 index 0000000..c1a9c6a --- /dev/null +++ b/interface/static/js/codemirror/mode/python/test.js @@ -0,0 +1,30 @@ +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: http://codemirror.net/LICENSE + +(function() { + var mode = CodeMirror.getMode({indentUnit: 4}, + {name: "python", + version: 3, + singleLineStringErrors: false}); + function MT(name) { test.mode(name, mode, Array.prototype.slice.call(arguments, 1)); } + + // Error, because "foobarhello" is neither a known type or property, but + // property was expected (after "and"), and it should be in parentheses. + MT("decoratorStartOfLine", + "[meta @dec]", + "[keyword def] [def function]():", + " [keyword pass]"); + + MT("decoratorIndented", + "[keyword class] [def Foo]:", + " [meta @dec]", + " [keyword def] [def function]():", + " [keyword pass]"); + + MT("matmulWithSpace:", "[variable a] [operator @] [variable b]"); + MT("matmulWithoutSpace:", "[variable a][operator @][variable b]"); + MT("matmulSpaceBefore:", "[variable a] [operator @][variable b]"); + + MT("fValidStringPrefix", "[string f'this is a {formatted} string']"); + MT("uValidStringPrefix", "[string u'this is an unicode string']"); +})(); diff --git a/templates/add_question.html b/interface/static/templates/add_question.html similarity index 100% rename from templates/add_question.html rename to interface/static/templates/add_question.html diff --git a/interface/static/templates/checkquestion.html b/interface/static/templates/checkquestion.html new file mode 100644 index 0000000..519ac66 --- /dev/null +++ b/interface/static/templates/checkquestion.html @@ -0,0 +1,60 @@ +{% extends "navigation.html" %} +{% load custom_filter %} +{% load staticfiles %} +{% block script %} + + +{% endblock %} + +{% block navbar %} +
  • Home
  • +
  • Contribution
  • +
  • Instructions
  • +
  • Logout
  • + {% endblock %} + + {% block content %} +
    +
    +

    + {{ question.summary }} + Points : {{ question.points }} +

    +
    + +
    +
    + {{ question.description|safe }} +
    +
    +
    + +
    +
    +

    Write your program below:

    +
    +
    +
    +
    + + +
    +{% endblock %} \ No newline at end of file diff --git a/interface/static/templates/dashboard.html b/interface/static/templates/dashboard.html new file mode 100644 index 0000000..540088a --- /dev/null +++ b/interface/static/templates/dashboard.html @@ -0,0 +1,27 @@ +{% extends "navigation.html" %} +{% block navbar %} +
  • Home
  • +
  • Contribution
  • +
  • Instructions
  • +
  • Logout
  • +{% endblock %} + +{% block content %} + + + +
    + +

    +

    Welcome {{name}}


    +

    + You can contribute questions here by clicking on Start Contribution.
    + For instructions on how to create questions click here. +

    Start Contribution +

    + +
    + + + +{% endblock %} \ No newline at end of file diff --git a/templates/notice.html b/interface/static/templates/home.html similarity index 57% rename from templates/notice.html rename to interface/static/templates/home.html index d60b5ed..2d0b2d3 100644 --- a/templates/notice.html +++ b/interface/static/templates/home.html @@ -1,10 +1,10 @@ {% extends "navigation.html" %} {% block navbar %} -
  • Home
  • -
  • Contribution
  • -
  • Logout
  • +
  • Login
  • +
  • Signup
  • {% endblock %} + {% block content %} @@ -14,11 +14,10 @@


    -

    {{ notice|safe }}

    - +

    Welcome to FOSSEE Fellowship Question Contribution Interface


    -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/templates/registration/login.html b/interface/static/templates/login.html similarity index 100% rename from templates/registration/login.html rename to interface/static/templates/login.html diff --git a/templates/moderator.html b/interface/static/templates/moderator.html similarity index 100% rename from templates/moderator.html rename to interface/static/templates/moderator.html diff --git a/templates/navigation.html b/interface/static/templates/navigation.html similarity index 100% rename from templates/navigation.html rename to interface/static/templates/navigation.html diff --git a/templates/registration/register.html b/interface/static/templates/register.html similarity index 68% rename from templates/registration/register.html rename to interface/static/templates/register.html index a5f3df4..fd62c69 100644 --- a/templates/registration/register.html +++ b/interface/static/templates/register.html @@ -8,19 +8,27 @@
  • Login
  • Signup
  • - {% endblock %} {% block content %} +{% if messages %} +{% for message in messages %} +
    +
    +
  • {{ message|safe }}
  • +
    +
    + {% endfor %} +{% endif %}

    Register here

    -
    {% csrf_token %} + {% csrf_token %} {{ form.as_table }}


    - Login + Login
    {% endblock %} diff --git a/templates/show_review_questions.html b/interface/static/templates/show_review_questions.html similarity index 100% rename from templates/show_review_questions.html rename to interface/static/templates/show_review_questions.html diff --git a/templates/showquestions.html b/interface/static/templates/showquestions.html similarity index 100% rename from templates/showquestions.html rename to interface/static/templates/showquestions.html diff --git a/interface/views.py b/interface/views.py index 307eaa6..6e7aeba 100644 --- a/interface/views.py +++ b/interface/views.py @@ -1,13 +1,16 @@ from interface.models import (Question, TestCase, StdIOBasedTestCase, Rating, Review, QuestionBank) +from yaksh.settings import CODESERVER_HOSTNAME,CODESERVER_PORT +from interface.forms import (RegistrationForm, QuestionForm) from django.shortcuts import render,get_object_or_404 -from django.http import HttpResponse,HttpResponseRedirect, JsonResponse, Http404 -from interface.forms import * +from django.http import HttpResponse,HttpResponseRedirect, Http404 from django.forms.models import inlineformset_factory from django.db.models import Q from django.core.urlresolvers import reverse +from django.contrib import messages from django.contrib.auth.decorators import login_required from django.contrib.auth import logout,login +from django.contrib.auth.models import User from django.views.decorators.csrf import csrf_protect from django.shortcuts import render_to_response from django.template import RequestContext @@ -20,20 +23,20 @@ def is_moderator(user): - """Check if the user is having moderator rights""" + """Check if the user is in the moderator group""" if user.groups.filter(name='moderator').exists(): return True def is_reviewer(user): + """Check if the user is in the reviewer group""" if user.groups.filter(name='reviewer').exists(): return True -def show_home(request): - +def show_home(request): if request.user.is_authenticated(): return HttpResponseRedirect(reverse('next_login')) else: - return render(request, 'home.html', {'type':'guest'}) + return render(request, 'home.html') def register(request): if request.method == 'POST': @@ -44,15 +47,15 @@ def register(request): password=form.cleaned_data['password1'], email=form.cleaned_data['email'] ) - return render(request,'notice.html',{'notice':"Thank you ! Your registration success.
    Login"}) + messages.add_message(request, messages.SUCCESS, + """You have successfully registered! + You can login now. + """) else: form = RegistrationForm() variables = RequestContext(request, {'form': form}) - return render_to_response('registration/register.html', variables) - -def register_success(request): - return render_to_response('registration/success.html') + return render_to_response('register.html', variables) def logout_page(request): logout(request) @@ -60,13 +63,12 @@ def logout_page(request): @login_required def next_login(request): - if request.user.is_authenticated(): if is_reviewer(request.user): return show_review_questions(request) - return render(request, 'dashboard.html', {'type':'user', "name":request.user}) + return render(request, 'dashboard.html') else: - return render(request, 'home.html', {'type':'guest'}) + return render(request, 'home.html') @login_required def show_all_questions(request): @@ -86,18 +88,10 @@ def show_all_questions(request): ) for question in questions: question.delete() - if is_moderator(user): - questions = Question.objects.all() - context['admin'] = True - context['remaining'] = "None" - - else: - questions = Question.objects.filter(user_id=user.id) - count = questions.count() - remaining = 5-count - context['remaining'] = remaining - context['admin'] = False - + questions = Question.objects.filter(user_id=user.id) + count = questions.count() + remaining = 5-count + context['remaining'] = remaining context['questions'] = questions return render(request, "showquestions.html", context) @@ -195,10 +189,14 @@ def submit_to_code_server(question_id): question = Question.objects.get(id=question_id) consolidate_answer = question.consolidate_answer_data(question.solution) - url = "http://localhost:55555" + url = "http://{0}:{1}".format(CODESERVER_HOSTNAME, CODESERVER_PORT) uid = "fellowship" + str(question_id) status = False - submit = requests.post(url, data=dict(uid=uid, json_data=consolidate_answer, user_dir="")) + submit = requests.post(url, data=dict(uid=uid, + json_data=consolidate_answer, + user_dir="" + ) + ) while not status: result_state = get_result(url, uid) stat = result_state.get("status") @@ -235,10 +233,11 @@ def show_review_questions(request): def get_reviewer_questions(user, question_bank): existing_questions = question_bank.question_bank\ .values_list("id", flat=True) - questions = list(Question.objects.all().exclude(Q(user=user) - | Q(status=False) - | Q(id__in=existing_questions) - ) + questions = list(Question.objects.all().exclude( + Q(user=user) + | Q(status=False) + | Q(id__in=existing_questions) + ) ) random.shuffle(questions) return questions[:(9-question_bank.question_bank.count())] diff --git a/templates/add_question.js b/templates/add_question.js deleted file mode 100644 index 346991a..0000000 --- a/templates/add_question.js +++ /dev/null @@ -1,162 +0,0 @@ -function increase(frm) -{ - if(frm.points.value == "") - { - frm.points.value = "0.5"; - return; - } - frm.points.value = parseFloat(frm.points.value) + 0.5; -} - -function decrease(frm) -{ - if(frm.points.value > 0) - { - frm.points.value = parseFloat(frm.points.value) - 0.5; - } - else - { - frm.points.value=0; - } - - -} - -function setSelectionRange(input, selectionStart, selectionEnd) -{ - if (input.setSelectionRange) - { - input.focus(); - input.setSelectionRange(selectionStart, selectionEnd); - } - else if (input.createTextRange) - { - var range = input.createTextRange(); - range.collapse(true); - range.moveEnd('character', selectionEnd); - range.moveStart('character', selectionStart); - range.select(); - } -} - -function replaceSelection (input, replaceString) -{ - if (input.setSelectionRange) - { - var selectionStart = input.selectionStart; - var selectionEnd = input.selectionEnd; - input.value = input.value.substring(0, selectionStart)+ replaceString + input.value.substring(selectionEnd); - if (selectionStart != selectionEnd) - { - setSelectionRange(input, selectionStart, selectionStart + replaceString.length); - } - else - { - setSelectionRange(input, selectionStart + replaceString.length, selectionStart + replaceString.length); - } - } - else if (document.selection) - { - var range = document.selection.createRange(); - if (range.parentElement() == input) - { - var isCollapsed = range.text == ''; - range.text = replaceString; - if (!isCollapsed) - { - range.moveStart('character', -replaceString.length); - range.select(); - } - } - } -} - -function textareaformat() -{ - document.getElementById('id_type').setAttribute('class','select-type'); - document.getElementById('id_points').setAttribute('class','mini-text'); - document.getElementById('id_tags').setAttribute('class','tag-text'); - $("[id*="+'test_case_args'+"]").attr('placeholder', - 'Command Line arguments for bash only'); - - $('#id_snippet').bind('keydown', function( event ){ - if(navigator.userAgent.match("Gecko")) - { - c=event.which; - } - else - { - c=event.keyCode; - } - if(c==9) - { - replaceSelection(document.getElementById('id_snippet'),String.fromCharCode(9)); - setTimeout(document.getElementById('id_snippet'),0); - return false; - } - }); - - $('#id_description').bind('focus', function( event ){ - document.getElementById("id_description").rows=5; - document.getElementById("id_description").cols=40; - }); - - $('#id_description').bind('blur', function( event ){ - document.getElementById("id_description").rows=1; - document.getElementById("id_description").cols=40; - }); - - $('#id_description').bind('keypress', function (event){ - document.getElementById('my').innerHTML = document.getElementById('id_description').value ; - }); - - $('#id_solution').bind('keypress', function (event){ - document.getElementById('rend_solution').innerHTML = document.getElementById('id_solution').value ; - }); - - $('#id_type').bind('focus', function(event){ - var type = document.getElementById('id_type'); - type.style.border = '1px solid #ccc'; - }); - - $('#id_language').bind('focus', function(event){ - var language = document.getElementById('id_language'); - language.style.border = '1px solid #ccc'; - }); - document.getElementById('my').innerHTML = document.getElementById('id_description').value ; - document.getElementById('rend_solution').innerHTML = document.getElementById('id_solution').value ; - - if (document.getElementById('id_grade_assignment_upload').checked || - document.getElementById('id_type').value == 'upload'){ - $("#id_grade_assignment_upload").prop("disabled", false); - } - else{ - $("#id_grade_assignment_upload").prop("disabled", true); - } - - $('#id_type').change(function() { - if ($(this).val() == "upload"){ - $("#id_grade_assignment_upload").prop("disabled", false); - } - else{ - $("#id_grade_assignment_upload").prop("disabled", true); - } - }); -} - -function autosubmit() -{ - var language = document.getElementById('id_language'); - if(language.value == 'select') - { - language.style.border="solid red"; - return false; - } - var type = document.getElementById('id_type'); - if(type.value == 'select') - { - type.style.border = 'solid red'; - return false; - } - -} diff --git a/templates/base.html b/templates/base.html deleted file mode 100644 index 6ba7f32..0000000 --- a/templates/base.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - {% load staticfiles %} - Django Login Application | - {% block title %}{% endblock %} - - -

    {% block head %}{% endblock %}

    - {% block content %}{% endblock %} - - - \ No newline at end of file diff --git a/templates/checkquestion.html b/templates/checkquestion.html deleted file mode 100644 index ad5b32b..0000000 --- a/templates/checkquestion.html +++ /dev/null @@ -1,14 +0,0 @@ -{% extends "navigation.html" %} -{% load custom_filter %} -{% block script %} - - - -{% endblock %} diff --git a/yaksh/settings.py b/yaksh/settings.py index 1ae7a89..7f7339b 100644 --- a/yaksh/settings.py +++ b/yaksh/settings.py @@ -56,7 +56,7 @@ TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [os.path.join(BASE_DIR,"templates")], + 'DIRS': ["interface/static/templates"], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ @@ -75,23 +75,23 @@ # Database # https://docs.djangoproject.com/en/1.9/ref/settings/#databases -# DATABASES = { -# 'default': { -# 'ENGINE': 'django.db.backends.sqlite3', -# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), -# } -# } DATABASES = { 'default': { - 'ENGINE': 'django.db.backends.mysql', - 'NAME': "contribute", - # The following settings are not used with sqlite3: - 'USER': "username", - 'PASSWORD': "password", - 'HOST': 'localhost', # Empty for localhost through domain sockets or '1$ - 'PORT': 3306, - }, + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + } } +# DATABASES = { +# 'default': { +# 'ENGINE': 'django.db.backends.mysql', +# 'NAME': "contribute", +# # The following settings are not used with sqlite3: +# 'USER': "username", +# 'PASSWORD': "password", +# 'HOST': 'localhost', # Empty for localhost through domain sockets or '1$ +# 'PORT': 3306, +# }, +# } # Password validation # https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators @@ -131,4 +131,10 @@ STATIC_URL = '/static/' -STATIC_ROOT = 'templates' +STATIC_ROOT='interface/static/' + +LOGIN_URL = "/login/" + +CODESERVER_HOSTNAME = "localhost" # Address of the yaksh code server + +CODESERVER_PORT = 55555 diff --git a/yaksh/urls.py b/yaksh/urls.py index ba64cd4..67e0044 100644 --- a/yaksh/urls.py +++ b/yaksh/urls.py @@ -1,26 +1,27 @@ from django.conf.urls import url, include from django.contrib import admin +from django.contrib.auth import views as auth_views from interface.views import * + urlpatterns = [ url(r'^admin/', admin.site.urls), - url(r'^$',"interface.views.show_home",name="home"), + url(r'^$',show_home,name="home"), - url(r'^login/$', 'django.contrib.auth.views.login', name="login"), - url(r'^logout/$', "interface.views.logout_page",name="logout_page"), - url(r'^register/$', "interface.views.register", name="register_page"), - url(r'^register/success/$', "interface.views.register_success", - name="register_success"), - url(r'^dashboard/$',"interface.views.next_login",name="next_login"), + url(r'^login/$', auth_views.login, + {'template_name': 'login.html'}, name="login"), + url(r'^logout/$', logout_page,name="logout_page"), + url(r'^register/$', register, name="register_page"), + url(r'^dashboard/$',next_login,name="next_login"), - url(r'^showquestions/$',"interface.views.show_all_questions", + url(r'^showquestions/$',show_all_questions, name="show_all_questions"), - url(r'^addquestion/$',"interface.views.add_question",name="add_question"), - url(r'^addquestion/(?P\d+)/$',"interface.views.add_question", + url(r'^addquestion/$',add_question,name="add_question"), + url(r'^addquestion/(?P\d+)/$',add_question, name="add_question"), - url(r'^show_review_questions/$', "interface.views.show_review_questions", + url(r'^show_review_questions/$', show_review_questions, name="show_review_questions"), url(r'^checkquestion/(?P\d+)/$', - "interface.views.check_question",name="check_question"), + check_question,name="check_question"), # url(r'^questions/ratemcq/$',"interface.views.rate_mcq",name="rate_mcq"), # url(r'^questions/postcomment/$',"interface.views.rate_post",name="rate_post_comment"), From bc774eec662d5b5a5e6f37d0893bba51160b17cb Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Wed, 4 Apr 2018 18:04:23 +0530 Subject: [PATCH 29/49] Make PEP8 changes --- interface/models.py | 5 ++--- interface/views.py | 21 ++++++++------------- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/interface/models.py b/interface/models.py index 3b7468b..6d3ebb2 100644 --- a/interface/models.py +++ b/interface/models.py @@ -2,7 +2,6 @@ from django.contrib.auth.models import User from django.db import models import json -import os question_status_choices = ( (1, "Question doesn't make sense."), @@ -115,7 +114,7 @@ class Rating(models.Model): avg_peer_rating = models.FloatField(default=0.0) def __str__(self): - return "Rating for {0}".format(question.summary) + return "Rating for {0}".format(self.question.summary) class QuestionReviewDetails(models.Model): @@ -129,7 +128,7 @@ class QuestionReviewDetails(models.Model): skipped = models.BooleanField(default=False) def __str__(self): - return "Review for {0}".format(question.summary) + return "Review for {0}".format(self.question.summary) class Review(models.Model): diff --git a/interface/views.py b/interface/views.py index 6e7aeba..966a107 100644 --- a/interface/views.py +++ b/interface/views.py @@ -2,23 +2,20 @@ Rating, Review, QuestionBank) from yaksh.settings import CODESERVER_HOSTNAME,CODESERVER_PORT from interface.forms import (RegistrationForm, QuestionForm) -from django.shortcuts import render,get_object_or_404 -from django.http import HttpResponse,HttpResponseRedirect, Http404 +from django.shortcuts import render +from django.http import HttpResponseRedirect, Http404 from django.forms.models import inlineformset_factory from django.db.models import Q from django.core.urlresolvers import reverse from django.contrib import messages from django.contrib.auth.decorators import login_required -from django.contrib.auth import logout,login +from django.contrib.auth import logout from django.contrib.auth.models import User -from django.views.decorators.csrf import csrf_protect from django.shortcuts import render_to_response from django.template import RequestContext -from random import choice from urllib.parse import urljoin import requests import json -import os import random @@ -42,7 +39,7 @@ def register(request): if request.method == 'POST': form = RegistrationForm(request.POST) if form.is_valid(): - user = User.objects.create_user( + User.objects.create_user( username=form.cleaned_data['username'], password=form.cleaned_data['password1'], email=form.cleaned_data['email'] @@ -75,7 +72,6 @@ def show_all_questions(request): """Show a list of all the questions currently in the database.""" user = request.user - ci = RequestContext(request) context = {} if is_reviewer(user) or is_moderator(user): return show_review_questions(request) @@ -192,11 +188,10 @@ def submit_to_code_server(question_id): url = "http://{0}:{1}".format(CODESERVER_HOSTNAME, CODESERVER_PORT) uid = "fellowship" + str(question_id) status = False - submit = requests.post(url, data=dict(uid=uid, - json_data=consolidate_answer, - user_dir="" - ) - ) + requests.post(url, data=dict(uid=uid, json_data=consolidate_answer, + user_dir="" + ) + ) while not status: result_state = get_result(url, uid) stat = result_state.get("status") From 572706337bea73f049732c2ad458f187f1e1ed04 Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Wed, 4 Apr 2018 20:23:45 +0530 Subject: [PATCH 30/49] Check user solution to solve question --- interface/models.py | 1 + .../static/css/codemirror/lib/codemirror.css | 338 ++++++++++++++++++ interface/static/templates/checkquestion.html | 92 ++++- interface/views.py | 17 +- 4 files changed, 436 insertions(+), 12 deletions(-) create mode 100644 interface/static/css/codemirror/lib/codemirror.css diff --git a/interface/models.py b/interface/models.py index 6d3ebb2..4805ecb 100644 --- a/interface/models.py +++ b/interface/models.py @@ -125,6 +125,7 @@ class QuestionReviewDetails(models.Model): question_status = models.IntegerField(blank=True, null=True, choices=question_status_choices ) + last_answer = models.TextField(null=True, blank=True) skipped = models.BooleanField(default=False) def __str__(self): diff --git a/interface/static/css/codemirror/lib/codemirror.css b/interface/static/css/codemirror/lib/codemirror.css new file mode 100644 index 0000000..4bd815e --- /dev/null +++ b/interface/static/css/codemirror/lib/codemirror.css @@ -0,0 +1,338 @@ +/* BASICS */ + +.CodeMirror { + /* Set height, width, borders, and global font properties here */ + font-family: monospace; + height: 300px; + color: black; +} + +/* PADDING */ + +.CodeMirror-lines { + padding: 4px 0; /* Vertical padding around content */ +} +.CodeMirror pre { + padding: 0 4px; /* Horizontal padding of content */ +} + +.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { + background-color: white; /* The little square between H and V scrollbars */ +} + +/* GUTTER */ + +.CodeMirror-gutters { + border-right: 1px solid #ddd; + background-color: #f7f7f7; + white-space: nowrap; +} +.CodeMirror-linenumbers {} +.CodeMirror-linenumber { + padding: 0 3px 0 5px; + min-width: 20px; + text-align: right; + color: #999; + white-space: nowrap; +} + +.CodeMirror-guttermarker { color: black; } +.CodeMirror-guttermarker-subtle { color: #999; } + +/* CURSOR */ + +.CodeMirror-cursor { + border-left: 1px solid black; + border-right: none; + width: 0; +} +/* Shown when moving in bi-directional text */ +.CodeMirror div.CodeMirror-secondarycursor { + border-left: 1px solid silver; +} +.cm-fat-cursor .CodeMirror-cursor { + width: auto; + border: 0 !important; + background: #7e7; +} +.cm-fat-cursor div.CodeMirror-cursors { + z-index: 1; +} + +.cm-animate-fat-cursor { + width: auto; + border: 0; + -webkit-animation: blink 1.06s steps(1) infinite; + -moz-animation: blink 1.06s steps(1) infinite; + animation: blink 1.06s steps(1) infinite; + background-color: #7e7; +} +@-moz-keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} +@-webkit-keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} +@keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} + +/* Can style cursor different in overwrite (non-insert) mode */ +.CodeMirror-overwrite .CodeMirror-cursor {} + +.cm-tab { display: inline-block; text-decoration: inherit; } + +.CodeMirror-ruler { + border-left: 1px solid #ccc; + position: absolute; +} + +/* DEFAULT THEME */ + +.cm-s-default .cm-header {color: blue;} +.cm-s-default .cm-quote {color: #090;} +.cm-negative {color: #d44;} +.cm-positive {color: #292;} +.cm-header, .cm-strong {font-weight: bold;} +.cm-em {font-style: italic;} +.cm-link {text-decoration: underline;} +.cm-strikethrough {text-decoration: line-through;} + +.cm-s-default .cm-keyword {color: #708;} +.cm-s-default .cm-atom {color: #219;} +.cm-s-default .cm-number {color: #164;} +.cm-s-default .cm-def {color: #00f;} +.cm-s-default .cm-variable, +.cm-s-default .cm-punctuation, +.cm-s-default .cm-property, +.cm-s-default .cm-operator {} +.cm-s-default .cm-variable-2 {color: #05a;} +.cm-s-default .cm-variable-3 {color: #085;} +.cm-s-default .cm-comment {color: #a50;} +.cm-s-default .cm-string {color: #a11;} +.cm-s-default .cm-string-2 {color: #f50;} +.cm-s-default .cm-meta {color: #555;} +.cm-s-default .cm-qualifier {color: #555;} +.cm-s-default .cm-builtin {color: #30a;} +.cm-s-default .cm-bracket {color: #997;} +.cm-s-default .cm-tag {color: #170;} +.cm-s-default .cm-attribute {color: #00c;} +.cm-s-default .cm-hr {color: #999;} +.cm-s-default .cm-link {color: #00c;} + +.cm-s-default .cm-error {color: #f00;} +.cm-invalidchar {color: #f00;} + +.CodeMirror-composing { border-bottom: 2px solid; } + +/* Default styles for common addons */ + +div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;} +div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;} +.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); } +.CodeMirror-activeline-background {background: #e8f2ff;} + +/* STOP */ + +/* The rest of this file contains styles related to the mechanics of + the editor. You probably shouldn't touch them. */ + +.CodeMirror { + position: relative; + overflow: hidden; + background: white; +} + +.CodeMirror-scroll { + overflow: scroll !important; /* Things will break if this is overridden */ + /* 30px is the magic margin used to hide the element's real scrollbars */ + /* See overflow: hidden in .CodeMirror */ + margin-bottom: -30px; margin-right: -30px; + padding-bottom: 30px; + height: 100%; + outline: none; /* Prevent dragging from highlighting the element */ + position: relative; +} +.CodeMirror-sizer { + position: relative; + border-right: 30px solid transparent; +} + +/* The fake, visible scrollbars. Used to force redraw during scrolling + before actual scrolling happens, thus preventing shaking and + flickering artifacts. */ +.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { + position: absolute; + z-index: 6; + display: none; +} +.CodeMirror-vscrollbar { + right: 0; top: 0; + overflow-x: hidden; + overflow-y: scroll; +} +.CodeMirror-hscrollbar { + bottom: 0; left: 0; + overflow-y: hidden; + overflow-x: scroll; +} +.CodeMirror-scrollbar-filler { + right: 0; bottom: 0; +} +.CodeMirror-gutter-filler { + left: 0; bottom: 0; +} + +.CodeMirror-gutters { + position: absolute; left: 0; top: 0; + min-height: 100%; + z-index: 3; +} +.CodeMirror-gutter { + white-space: normal; + height: 100%; + display: inline-block; + vertical-align: top; + margin-bottom: -30px; + /* Hack to make IE7 behave */ + *zoom:1; + *display:inline; +} +.CodeMirror-gutter-wrapper { + position: absolute; + z-index: 4; + background: none !important; + border: none !important; +} +.CodeMirror-gutter-background { + position: absolute; + top: 0; bottom: 0; + z-index: 4; +} +.CodeMirror-gutter-elt { + position: absolute; + cursor: default; + z-index: 4; +} +.CodeMirror-gutter-wrapper { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.CodeMirror-lines { + cursor: text; + min-height: 1px; /* prevents collapsing before first draw */ +} +.CodeMirror pre { + /* Reset some styles that the rest of the page might have set */ + -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; + border-width: 0; + background: transparent; + font-family: inherit; + font-size: inherit; + margin: 0; + white-space: pre; + word-wrap: normal; + line-height: inherit; + color: inherit; + z-index: 2; + position: relative; + overflow: visible; + -webkit-tap-highlight-color: transparent; + -webkit-font-variant-ligatures: none; + font-variant-ligatures: none; +} +.CodeMirror-wrap pre { + word-wrap: break-word; + white-space: pre-wrap; + word-break: normal; +} + +.CodeMirror-linebackground { + position: absolute; + left: 0; right: 0; top: 0; bottom: 0; + z-index: 0; +} + +.CodeMirror-linewidget { + position: relative; + z-index: 2; + overflow: auto; +} + +.CodeMirror-widget {} + +.CodeMirror-code { + outline: none; +} + +/* Force content-box sizing for the elements where we expect it */ +.CodeMirror-scroll, +.CodeMirror-sizer, +.CodeMirror-gutter, +.CodeMirror-gutters, +.CodeMirror-linenumber { + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +.CodeMirror-measure { + position: absolute; + width: 100%; + height: 0; + overflow: hidden; + visibility: hidden; +} + +.CodeMirror-cursor { position: absolute; } +.CodeMirror-measure pre { position: static; } + +div.CodeMirror-cursors { + visibility: hidden; + position: relative; + z-index: 3; +} +div.CodeMirror-dragcursors { + visibility: visible; +} + +.CodeMirror-focused div.CodeMirror-cursors { + visibility: visible; +} + +.CodeMirror-selected { background: #d9d9d9; } +.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; } +.CodeMirror-crosshair { cursor: crosshair; } +.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; } +.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; } + +.cm-searching { + background: #ffa; + background: rgba(255, 255, 0, .4); +} + +/* IE7 hack to prevent it from returning funny offsetTops on the spans */ +.CodeMirror span { *vertical-align: text-bottom; } + +/* Used to force a border model for a node */ +.cm-force-border { padding-right: .1px; } + +@media print { + /* Hide the cursor when printing */ + .CodeMirror div.CodeMirror-cursors { + visibility: hidden; + } +} + +/* See issue #2901 */ +.cm-tab-wrap-hack:after { content: ''; } + +/* Help users use markselection to safely style text background */ +span.CodeMirror-selectedtext { background: none; } diff --git a/interface/static/templates/checkquestion.html b/interface/static/templates/checkquestion.html index 519ac66..9facab7 100644 --- a/interface/static/templates/checkquestion.html +++ b/interface/static/templates/checkquestion.html @@ -1,11 +1,6 @@ {% extends "navigation.html" %} {% load custom_filter %} {% load staticfiles %} -{% block script %} - - -{% endblock %} {% block navbar %}
  • Home
  • @@ -15,6 +10,14 @@ {% endblock %} {% block content %} + + +
    + {% csrf_token %}

    @@ -34,10 +37,10 @@

    Write your program below:

    -
    -

    + +
    +   + +

    +{% if result %} +
    +

    Hey, we checked your answer. We encountered the following error:

    +
    +{%for error in result %} + {% if error.type == 'assertion' %} + +

    The following error took place:

    + + + + + + + + + + + {% if error.traceback %} + + + {% endif %} + +
    Exception Name: {{error.exception}}
    Exception Message: {{error.message}}
    Full Traceback:
    {{error.traceback}}
    + + {% elif error.type == 'stdio' %} + {% if error.given_input %} + + + + + + +
    For given Input value(s):{{error.given_input}}
    + {% endif %} + + + + + + + + + + + + + {% for expected,user in error.expected_output|zip:error.user_output %} + + + + {% if forloop.counter0 in error.error_line_numbers or not expected or not user %} + + {% else %} + + {% endif %} + + {% endfor %} +
    Line No.
    Expected Output
    User output
    Status
    {{forloop.counter}} {{expected|default:""}} {{user|default:""}}
    + + + + + + +
    Error:{{error.error_msg}}
    +{% endif %} +{% endfor %} +{% endif %} + {% endblock %} \ No newline at end of file diff --git a/interface/views.py b/interface/views.py index 966a107..371249b 100644 --- a/interface/views.py +++ b/interface/views.py @@ -180,11 +180,16 @@ def add_question(request, question_id=None): "add_question.html", context, context_instance=ci ) -def submit_to_code_server(question_id): +def submit_to_code_server(question_id, solution=None): """Check if question solution and testcases are correct.""" question = Question.objects.get(id=question_id) - consolidate_answer = question.consolidate_answer_data(question.solution) + if solution: + consolidate_answer = question.consolidate_answer_data(solution) + else: + consolidate_answer = question.consolidate_answer_data( + question.solution + ) url = "http://{0}:{1}".format(CODESERVER_HOSTNAME, CODESERVER_PORT) uid = "fellowship" + str(question_id) status = False @@ -243,10 +248,16 @@ def check_question(request, question_id): """Review question on the interface.""" user = request.user - ci = RequestContext(request) context = {} if not is_reviewer(user) and not is_moderator(user): raise Http404("You are not allowed to view this page.") + if request.method == 'POST': + if request.POST.get('answer'): + result = submit_to_code_server(question_id, + request.POST.get("answer") + ) + if result.get("success") == False: + context["result"] = result.get("error") try: question = Question.objects.get(id=question_id) except Question.DOesNotExist: From 46d14f965f08df86c8cc4c77186a2a49c82630d5 Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Thu, 5 Apr 2018 18:06:51 +0530 Subject: [PATCH 31/49] Modify model and create check answer feature --- interface/admin.py | 4 +-- interface/forms.py | 4 +-- interface/models.py | 34 +++++++++---------- interface/static/templates/checkquestion.html | 30 +++++++++++++++- interface/templatetags/custom_filter.py | 24 ++++++++----- interface/views.py | 27 +++++++++------ 6 files changed, 82 insertions(+), 41 deletions(-) diff --git a/interface/admin.py b/interface/admin.py index bfc3367..6612484 100644 --- a/interface/admin.py +++ b/interface/admin.py @@ -1,12 +1,12 @@ from django.contrib import admin, messages from django.contrib.auth.models import User, Group from django.contrib.auth.admin import GroupAdmin -from interface.models import Question, TestCase, Rating, Review +from interface.models import Question, TestCase, AverageRating, Review from interface.views import submit_to_code_server admin.site.register(Question) admin.site.register(TestCase) -admin.site.register(Rating) +admin.site.register(AverageRating) admin.site.register(Review) diff --git a/interface/forms.py b/interface/forms.py index ec45df6..e6e3f94 100644 --- a/interface/forms.py +++ b/interface/forms.py @@ -1,6 +1,6 @@ from django import forms from interface.models import (Question, TestCase, StdIOBasedTestCase, - Rating, Review, QuestionBank) + AverageRating, Review, QuestionBank) from django.contrib.auth.models import User from django.utils.translation import ugettext_lazy as _ class RegistrationForm(forms.Form): @@ -28,4 +28,4 @@ class QuestionForm(forms.ModelForm): class Meta: model = Question - exclude = ['user', "type", "language", "status"] + exclude = ['user', "type", "language", "status", "reviews"] diff --git a/interface/models.py b/interface/models.py index 4805ecb..3a66fd5 100644 --- a/interface/models.py +++ b/interface/models.py @@ -3,7 +3,7 @@ from django.db import models import json -question_status_choices = ( +question_skip_choices = ( (1, "Question doesn't make sense."), (2, "Question makes sense, but is too difficult to solve."), (3, "Question is correct, but the test cases are wrong."), @@ -60,6 +60,9 @@ class Question(models.Model): #status of question status = models.BooleanField(default=False) + # All reviews for the question + reviews = models.ManyToManyField("Review") + def __str__(self): return self.summary @@ -90,6 +93,7 @@ class TestCase(models.Model): question = models.ForeignKey(Question, blank=True, null=True) type = models.CharField(max_length=24, default="stdiobasedtestcase") + class StdIOBasedTestCase(TestCase): expected_input = models.TextField(default=None, blank=True, null=True) expected_output = models.TextField(default=None) @@ -106,38 +110,32 @@ def __str__(self): format( self.expected_output, self.expected_input ) - -class Rating(models.Model): + +class AverageRating(models.Model): + # Average Rating by moderators and peers for a question. question = models.ForeignKey(Question) avg_moderator_rating = models.FloatField(default=0.0) avg_peer_rating = models.FloatField(default=0.0) def __str__(self): - return "Rating for {0}".format(self.question.summary) - + return "Average Rating for {0}".format(self.question.summary) -class QuestionReviewDetails(models.Model): - question = models.ForeignKey(Question) + +class Review(models.Model): + reviewer = models.ForeignKey(User) rating = models.IntegerField(default=3, choices=rating_choice) comments = models.TextField(null=True, blank=True) check_citation = models.BooleanField(default=False) - question_status = models.IntegerField(blank=True, null=True, - choices=question_status_choices + reason_for_skip = models.IntegerField(blank=True, null=True, + choices=question_skip_choices ) + status = models.BooleanField(default=False) last_answer = models.TextField(null=True, blank=True) - skipped = models.BooleanField(default=False) def __str__(self): - return "Review for {0}".format(self.question.summary) - + return "Review by {0}".format(self.reviewer.get_full_name()) -class Review(models.Model): - user = models.ForeignKey(User) - admin_review = models.BooleanField(default=False) - question_details = models.ManyToManyField(QuestionReviewDetails, - related_name="question_details" - ) class QuestionBank(models.Model): user = models.ForeignKey(User) diff --git a/interface/static/templates/checkquestion.html b/interface/static/templates/checkquestion.html index 9facab7..c5aa149 100644 --- a/interface/static/templates/checkquestion.html +++ b/interface/static/templates/checkquestion.html @@ -41,6 +41,16 @@

    Write your program below:

    + +{% if last_answer %} + +{% else %} + +{% endif %}
    -   +   + + + + + Go Back to Questions +   + +   +

    {% if result %} diff --git a/interface/templatetags/custom_filter.py b/interface/templatetags/custom_filter.py index 23614e2..58e5402 100644 --- a/interface/templatetags/custom_filter.py +++ b/interface/templatetags/custom_filter.py @@ -1,6 +1,5 @@ from django import template from django.template.defaultfilters import stringfilter -import os try: from itertools import zip_longest except ImportError: @@ -8,6 +7,15 @@ register = template.Library() +@stringfilter +@register.filter(name='escape_quotes') +def escape_quotes(value): + if type(value) != str: + value = value.decode("utf-8") + escape_single_quotes = value.replace("'", "\\'") + escape_single_and_double_quotes = escape_single_quotes.replace('"', '\\"') + + return escape_single_and_double_quotes @register.filter(name='zip') def zip_longest_out(a, b): @@ -15,10 +23,10 @@ def zip_longest_out(a, b): @register.simple_tag def get_testcase_error(error_list, expected_output): - tc_error = None - success= False - for error in error_list: - if expected_output.split("\r\n") == error.get("expected_output"): - tc_error = error - success = True - return {"tc_error":tc_error, "success":success} + tc_error = None + success= False + for error in error_list: + if expected_output.split("\r\n") == error.get("expected_output"): + tc_error = error + success = True + return {"tc_error":tc_error, "success":success} diff --git a/interface/views.py b/interface/views.py index 371249b..fd9e995 100644 --- a/interface/views.py +++ b/interface/views.py @@ -1,5 +1,5 @@ from interface.models import (Question, TestCase, StdIOBasedTestCase, - Rating, Review, QuestionBank) + AverageRating, Review, QuestionBank) from yaksh.settings import CODESERVER_HOSTNAME,CODESERVER_PORT from interface.forms import (RegistrationForm, QuestionForm) from django.shortcuts import render @@ -251,16 +251,23 @@ def check_question(request, question_id): context = {} if not is_reviewer(user) and not is_moderator(user): raise Http404("You are not allowed to view this page.") - if request.method == 'POST': - if request.POST.get('answer'): - result = submit_to_code_server(question_id, - request.POST.get("answer") - ) - if result.get("success") == False: - context["result"] = result.get("error") + try: question = Question.objects.get(id=question_id) - except Question.DOesNotExist: + review, created = question.reviews.get_or_create(reviewer=user) + except Question.DoesNotExist: raise Http404("The Question you are trying to review doesn't exist.") + except Review.MultipleObjectsReturned: + review = question.reviews.filter(reviewer=user).order_by("id").last() + + if request.method == 'POST' and 'check' in request.POST: + if request.POST.get('answer'): + answer = request.POST.get('answer') + review.last_answer = answer + review.save() + result = submit_to_code_server(question_id, answer) + if result.get("success") == False: + context["result"] = result.get("error") context['question'] = question - return render(request, "checkquestion.html", context) \ No newline at end of file + context['last_answer'] = review.last_answer + return render(request, "checkquestion.html", context) From ecef64547f5c9acb89da578ddc191e4f1ab1fb61 Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Fri, 6 Apr 2018 16:02:50 +0530 Subject: [PATCH 32/49] Add skip review feature to reviewers --- interface/forms.py | 15 ++++++---- .../templates/show_review_questions.html | 6 ++++ interface/static/templates/skipquestion.html | 23 +++++++++++++++ interface/views.py | 28 +++++++++++++++++-- yaksh/settings.py | 1 + yaksh/urls.py | 2 ++ 6 files changed, 68 insertions(+), 7 deletions(-) create mode 100644 interface/static/templates/skipquestion.html diff --git a/interface/forms.py b/interface/forms.py index e6e3f94..d9d296b 100644 --- a/interface/forms.py +++ b/interface/forms.py @@ -1,8 +1,9 @@ from django import forms -from interface.models import (Question, TestCase, StdIOBasedTestCase, - AverageRating, Review, QuestionBank) +from interface.models import (Question, Review) from django.contrib.auth.models import User from django.utils.translation import ugettext_lazy as _ + + class RegistrationForm(forms.Form): username = forms.RegexField(regex=r'^\w+$', widget=forms.TextInput(attrs=dict(required=True, max_length=30)), label=_("Username"), error_messages={ 'invalid': _("This value must contain only letters, numbers and underscores.") }) email = forms.EmailField(widget=forms.TextInput(attrs=dict(required=True, max_length=30)), label=_("Email address")) @@ -23,9 +24,13 @@ def clean(self): return self.cleaned_data class QuestionForm(forms.ModelForm): - """Creates a form to add or edit a Question. - It has the related fields and functions required.""" - + """Creates a form to add or edit a Question.""" class Meta: model = Question exclude = ['user', "type", "language", "status", "reviews"] + +class SkipForm(forms.ModelForm): + """Creates a form to skip question and give reasons for it.""" + class Meta: + model = Review + fields = ["reason_for_skip", "comments"] \ No newline at end of file diff --git a/interface/static/templates/show_review_questions.html b/interface/static/templates/show_review_questions.html index 32b3f44..6dcbed7 100644 --- a/interface/static/templates/show_review_questions.html +++ b/interface/static/templates/show_review_questions.html @@ -12,6 +12,7 @@ {% block subtitle %} Review Questions {% endblock subtitle %} {% block content %} +

    Review Questions


    @@ -21,6 +22,11 @@

    You are now a {{status}}

    {% endif %} +{% if messages %} +{% for message in messages %} +
    {{message|safe}}
    +{% endfor %} +{% endif %}
    diff --git a/interface/static/templates/skipquestion.html b/interface/static/templates/skipquestion.html new file mode 100644 index 0000000..09fb664 --- /dev/null +++ b/interface/static/templates/skipquestion.html @@ -0,0 +1,23 @@ +{% extends "navigation.html" %} +{% load custom_filter %} +{% load staticfiles %} + +{% block navbar %} +
  • Home
  • +
  • Contribution
  • +
  • Instructions
  • +
  • Logout
  • +{% endblock %} + +{% block content %} +
    + {% csrf_token %} +
    + {{skip_form.as_p}} +
    +   +
    +
    +{% endblock %} diff --git a/interface/views.py b/interface/views.py index fd9e995..3c28b69 100644 --- a/interface/views.py +++ b/interface/views.py @@ -1,8 +1,8 @@ from interface.models import (Question, TestCase, StdIOBasedTestCase, AverageRating, Review, QuestionBank) from yaksh.settings import CODESERVER_HOSTNAME,CODESERVER_PORT -from interface.forms import (RegistrationForm, QuestionForm) -from django.shortcuts import render +from interface.forms import (RegistrationForm, QuestionForm, SkipForm) +from django.shortcuts import render, redirect from django.http import HttpResponseRedirect, Http404 from django.forms.models import inlineformset_factory from django.db.models import Q @@ -268,6 +268,30 @@ def check_question(request, question_id): result = submit_to_code_server(question_id, answer) if result.get("success") == False: context["result"] = result.get("error") + elif request.method == 'POST' and 'skip' in request.POST: + return redirect("/skipquestion/{0}".format(question.id)) + context['question'] = question context['last_answer'] = review.last_answer return render(request, "checkquestion.html", context) + +@login_required +def skip_question(request, question_id): + user = request.user + context = {} + try: + question = Question.objects.get(id=question_id) + except Question.DoesNotExist: + raise Http404("The Question you are trying to review doesn't exist.") + review = question.reviews.filter(reviewer=user).order_by("id").last() + skip_form = SkipForm(instance=review) + if request.method == 'POST': + qform = SkipForm(request.POST, instance=review) + if qform.is_valid(): + qform.save() + messages.add_message(request, messages.SUCCESS, + "Your review has been successfully submitted." + ) + return redirect("/dashboard") + context["skip_form"] = skip_form + return render(request, "skipquestion.html", context) diff --git a/yaksh/settings.py b/yaksh/settings.py index 7f7339b..675b93d 100644 --- a/yaksh/settings.py +++ b/yaksh/settings.py @@ -138,3 +138,4 @@ CODESERVER_HOSTNAME = "localhost" # Address of the yaksh code server CODESERVER_PORT = 55555 +MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage' \ No newline at end of file diff --git a/yaksh/urls.py b/yaksh/urls.py index 67e0044..c61d258 100644 --- a/yaksh/urls.py +++ b/yaksh/urls.py @@ -22,6 +22,8 @@ name="show_review_questions"), url(r'^checkquestion/(?P\d+)/$', check_question,name="check_question"), + url(r'^skipquestion/(?P\d+)/$', + skip_question,name="skip_question"), # url(r'^questions/ratemcq/$',"interface.views.rate_mcq",name="rate_mcq"), # url(r'^questions/postcomment/$',"interface.views.rate_post",name="rate_post_comment"), From e4394670881964629f8779e6a7935bc05ea7836e Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Fri, 6 Apr 2018 20:58:42 +0530 Subject: [PATCH 33/49] Allow reviewers to submit review or skip --- interface/forms.py | 9 ++- interface/models.py | 8 ++- interface/static/templates/checkquestion.html | 1 - interface/static/templates/skipquestion.html | 6 +- interface/views.py | 57 +++++++++++++------ yaksh/urls.py | 4 +- 6 files changed, 59 insertions(+), 26 deletions(-) diff --git a/interface/forms.py b/interface/forms.py index d9d296b..550c56a 100644 --- a/interface/forms.py +++ b/interface/forms.py @@ -33,4 +33,11 @@ class SkipForm(forms.ModelForm): """Creates a form to skip question and give reasons for it.""" class Meta: model = Review - fields = ["reason_for_skip", "comments"] \ No newline at end of file + fields = ["reason_for_skip", "comments"] + + +class ReviewForm(forms.ModelForm): + """Creates a form to skip question and give reasons for it.""" + class Meta: + model = Review + fields = ["rating", "comments", "check_citation"] diff --git a/interface/models.py b/interface/models.py index 3a66fd5..cda450b 100644 --- a/interface/models.py +++ b/interface/models.py @@ -13,7 +13,7 @@ (1, "Poor"), (2, "Average"), (3, "Good"), - (4, "Verygood"), + (4, "Very Good"), (5, "Excellent"), ) @@ -126,7 +126,11 @@ class Review(models.Model): reviewer = models.ForeignKey(User) rating = models.IntegerField(default=3, choices=rating_choice) comments = models.TextField(null=True, blank=True) - check_citation = models.BooleanField(default=False) + check_citation = models.BooleanField(default=False, + help_text="""Check if citation + provided is correct or not. + """ + ) reason_for_skip = models.IntegerField(blank=True, null=True, choices=question_skip_choices ) diff --git a/interface/static/templates/checkquestion.html b/interface/static/templates/checkquestion.html index c5aa149..f8390f3 100644 --- a/interface/static/templates/checkquestion.html +++ b/interface/static/templates/checkquestion.html @@ -158,5 +158,4 @@

    Write your program below:

    {% endif %} {% endfor %} {% endif %} - {% endblock %} \ No newline at end of file diff --git a/interface/static/templates/skipquestion.html b/interface/static/templates/skipquestion.html index 09fb664..757dee5 100644 --- a/interface/static/templates/skipquestion.html +++ b/interface/static/templates/skipquestion.html @@ -13,10 +13,10 @@
    {% csrf_token %}
    - {{skip_form.as_p}} + {{rform.as_p}}
    -  
    diff --git a/interface/views.py b/interface/views.py index 3c28b69..daf033f 100644 --- a/interface/views.py +++ b/interface/views.py @@ -1,7 +1,10 @@ from interface.models import (Question, TestCase, StdIOBasedTestCase, - AverageRating, Review, QuestionBank) + AverageRating, Review, QuestionBank + ) from yaksh.settings import CODESERVER_HOSTNAME,CODESERVER_PORT -from interface.forms import (RegistrationForm, QuestionForm, SkipForm) +from interface.forms import (RegistrationForm, QuestionForm, + SkipForm, ReviewForm + ) from django.shortcuts import render, redirect from django.http import HttpResponseRedirect, Http404 from django.forms.models import inlineformset_factory @@ -10,7 +13,7 @@ from django.contrib import messages from django.contrib.auth.decorators import login_required from django.contrib.auth import logout -from django.contrib.auth.models import User +from django.contrib.auth.models import User, Group from django.shortcuts import render_to_response from django.template import RequestContext from urllib.parse import urljoin @@ -39,11 +42,14 @@ def register(request): if request.method == 'POST': form = RegistrationForm(request.POST) if form.is_valid(): - User.objects.create_user( + user = User.objects.create_user( username=form.cleaned_data['username'], password=form.cleaned_data['password1'], email=form.cleaned_data['email'] ) + group = Group.objects.filter(name="reviewer") + if group.exists(): + user.groups.add(*group) messages.add_message(request, messages.SUCCESS, """You have successfully registered! You can login now. @@ -266,17 +272,19 @@ def check_question(request, question_id): review.last_answer = answer review.save() result = submit_to_code_server(question_id, answer) - if result.get("success") == False: + if not result.get("success"): context["result"] = result.get("error") + elif result.get("success"): + return redirect("/postreview/submit/{0}".format(question.id)) elif request.method == 'POST' and 'skip' in request.POST: - return redirect("/skipquestion/{0}".format(question.id)) + return redirect("/postreview/skip/{0}".format(question.id)) context['question'] = question context['last_answer'] = review.last_answer return render(request, "checkquestion.html", context) @login_required -def skip_question(request, question_id): +def post_review(request, submit, question_id): user = request.user context = {} try: @@ -284,14 +292,29 @@ def skip_question(request, question_id): except Question.DoesNotExist: raise Http404("The Question you are trying to review doesn't exist.") review = question.reviews.filter(reviewer=user).order_by("id").last() - skip_form = SkipForm(instance=review) - if request.method == 'POST': - qform = SkipForm(request.POST, instance=review) - if qform.is_valid(): - qform.save() - messages.add_message(request, messages.SUCCESS, - "Your review has been successfully submitted." - ) - return redirect("/dashboard") - context["skip_form"] = skip_form + if submit=="skip": + rform = SkipForm(instance=review) + if request.method == 'POST': + qform = SkipForm(request.POST, instance=review) + if qform.is_valid(): + qform.save() + messages.add_message(request, messages.SUCCESS, + """Your review has been + successfully submitted. + """ + ) + return redirect("/dashboard") + else: + rform = ReviewForm(instance=review) + if request.method == 'POST': + qform = ReviewForm(request.POST, instance=review) + if qform.is_valid(): + qform.save() + messages.add_message(request, messages.SUCCESS, + """Your review has been + successfully submitted. + """ + ) + return redirect("/dashboard") + context["rform"] = rform return render(request, "skipquestion.html", context) diff --git a/yaksh/urls.py b/yaksh/urls.py index c61d258..aec6ba3 100644 --- a/yaksh/urls.py +++ b/yaksh/urls.py @@ -22,8 +22,8 @@ name="show_review_questions"), url(r'^checkquestion/(?P\d+)/$', check_question,name="check_question"), - url(r'^skipquestion/(?P\d+)/$', - skip_question,name="skip_question"), + url(r'^postreview/(?Pskip|submit)/(?P\d+)/$', + post_review,name="post_review"), # url(r'^questions/ratemcq/$',"interface.views.rate_mcq",name="rate_mcq"), # url(r'^questions/postcomment/$',"interface.views.rate_post",name="rate_post_comment"), From f1cad6834325381506e43858e70729449073c95b Mon Sep 17 00:00:00 2001 From: mahesh Date: Sat, 7 Apr 2018 03:04:11 +0530 Subject: [PATCH 34/49] Allow reviewers to submit ratings and reviews --- interface/models.py | 6 +- interface/static/templates/checkquestion.html | 1 - .../templates/show_review_questions.html | 7 ++- interface/static/templates/skipquestion.html | 23 ------- interface/static/templates/submit_review.html | 61 +++++++++++++++++++ interface/templatetags/custom_filter.py | 8 +++ interface/views.py | 43 +++++++------ yaksh/settings.py | 2 - 8 files changed, 101 insertions(+), 50 deletions(-) delete mode 100644 interface/static/templates/skipquestion.html create mode 100644 interface/static/templates/submit_review.html diff --git a/interface/models.py b/interface/models.py index cda450b..4e6cf9b 100644 --- a/interface/models.py +++ b/interface/models.py @@ -127,15 +127,17 @@ class Review(models.Model): rating = models.IntegerField(default=3, choices=rating_choice) comments = models.TextField(null=True, blank=True) check_citation = models.BooleanField(default=False, - help_text="""Check if citation - provided is correct or not. + help_text="""(Check if the citation + provided is correct or not) """ ) reason_for_skip = models.IntegerField(blank=True, null=True, choices=question_skip_choices ) + skipped = models.BooleanField(default=False) status = models.BooleanField(default=False) last_answer = models.TextField(null=True, blank=True) + correct_answer = models.BooleanField(default=False) def __str__(self): return "Review by {0}".format(self.reviewer.get_full_name()) diff --git a/interface/static/templates/checkquestion.html b/interface/static/templates/checkquestion.html index 220f704..f8390f3 100644 --- a/interface/static/templates/checkquestion.html +++ b/interface/static/templates/checkquestion.html @@ -37,7 +37,6 @@

    Write your program below:

    -

    diff --git a/interface/static/templates/show_review_questions.html b/interface/static/templates/show_review_questions.html index 69a91cc..9c37713 100644 --- a/interface/static/templates/show_review_questions.html +++ b/interface/static/templates/show_review_questions.html @@ -1,5 +1,5 @@ {% extends "dashboard.html" %} - +{% load custom_filter %} {% block navbar %}
  • Home
  • Contribution
  • @@ -43,7 +43,7 @@

    You are now a {{status}}

    Language Type Marks - Status + Reviewed @@ -54,7 +54,8 @@

    You are now a {{status}}

    {{question.language|capfirst}} {{question.type|capfirst}} {{question.points}} -{% if question.status %} +{% get_review_status question user as review_status %} +{% if review_status %} {% else %} diff --git a/interface/static/templates/skipquestion.html b/interface/static/templates/skipquestion.html deleted file mode 100644 index 757dee5..0000000 --- a/interface/static/templates/skipquestion.html +++ /dev/null @@ -1,23 +0,0 @@ -{% extends "navigation.html" %} -{% load custom_filter %} -{% load staticfiles %} - -{% block navbar %} -
  • Home
  • -
  • Contribution
  • -
  • Instructions
  • -
  • Logout
  • -{% endblock %} - -{% block content %} -
    - {% csrf_token %} -
    - {{rform.as_p}} -
    -   -
    -
    -{% endblock %} diff --git a/interface/static/templates/submit_review.html b/interface/static/templates/submit_review.html new file mode 100644 index 0000000..6e713b4 --- /dev/null +++ b/interface/static/templates/submit_review.html @@ -0,0 +1,61 @@ +{% extends "navigation.html" %} +{% load custom_filter %} +{% load staticfiles %} + +{% block navbar %} +
  • Home
  • +
  • Contribution
  • +
  • Instructions
  • +
  • Logout
  • +{% endblock %} + +{% block content %} +
    + {% csrf_token %} +
    + {% if submit == "submit" %} +

    Question Details:

    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    Question Summary:{{question.summary}}
    Question Points:{{question.points}}
    Question Description:{{question.description}}
    Question Creator's Solution:
    {{question.solution}}
    Original or Adapted{{ question.originality|capfirst }}
    Cited Source: (if any){{ question.citation }}
    +

    +

    Submit your review:

    + {% else %} +

    State reasons for skipping question:

    + {% endif %} + +
    {{rform.as_p}}
    +
    +   + Go back +
    +
    +
    +

    +{% endblock %} diff --git a/interface/templatetags/custom_filter.py b/interface/templatetags/custom_filter.py index 58e5402..0e8e562 100644 --- a/interface/templatetags/custom_filter.py +++ b/interface/templatetags/custom_filter.py @@ -30,3 +30,11 @@ def get_testcase_error(error_list, expected_output): tc_error = error success = True return {"tc_error":tc_error, "success":success} + +@register.simple_tag +def get_review_status(question, user): + try: + review_status = question.reviews.get(reviewer=user).status + except: + review_status = False + return review_status diff --git a/interface/views.py b/interface/views.py index 0947203..c0b91dc 100644 --- a/interface/views.py +++ b/interface/views.py @@ -41,7 +41,7 @@ def register(request): if request.method == 'POST': form = RegistrationForm(request.POST) if form.is_valid(): - User.objects.create_user( + user = User.objects.create_user( username=form.cleaned_data['username'], password=form.cleaned_data['password1'], email=form.cleaned_data['email'] @@ -220,6 +220,7 @@ def get_result(url, uid): def show_review_questions(request): user = request.user context = {} + context["user"] = user if is_moderator(user): context['questions'] = Question.objects.filter(status=True) status = "moderator" @@ -274,6 +275,8 @@ def check_question(request, question_id): if not result.get("success"): context["result"] = result.get("error") elif result.get("success"): + review.correct_answer = True + review.save() return redirect("/postreview/submit/{0}".format(question.id)) elif request.method == 'POST' and 'skip' in request.POST: return redirect("/postreview/skip/{0}".format(question.id)) @@ -296,24 +299,26 @@ def post_review(request, submit, question_id): if request.method == 'POST': qform = SkipForm(request.POST, instance=review) if qform.is_valid(): - qform.save() - messages.add_message(request, messages.SUCCESS, - """Your review has been - successfully submitted. - """ - ) + question_review = qform.save(commit=False) + question_review.skipped = True + question_review.status = True + question_review.save() return redirect("/dashboard") else: - rform = ReviewForm(instance=review) - if request.method == 'POST': - qform = ReviewForm(request.POST, instance=review) - if qform.is_valid(): - qform.save() - messages.add_message(request, messages.SUCCESS, - """Your review has been - successfully submitted. - """ - ) - return redirect("/dashboard") + if review.correct_answer: + rform = ReviewForm(instance=review) + if request.method == 'POST': + qform = ReviewForm(request.POST, instance=review) + if qform.is_valid(): + question_review = qform.save(commit=False) + question_review.skipped = False + question_review.status = True + question_review.reasons_for_skip = None + question_review.save() + return redirect("/dashboard") + else: + return redirect("/dashboard") context["rform"] = rform - return render(request, "skipquestion.html", context) + context["submit"] = submit + context["question"] = question + return render(request, "submit_review.html", context) diff --git a/yaksh/settings.py b/yaksh/settings.py index 309ed9a..7f7339b 100644 --- a/yaksh/settings.py +++ b/yaksh/settings.py @@ -138,5 +138,3 @@ CODESERVER_HOSTNAME = "localhost" # Address of the yaksh code server CODESERVER_PORT = 55555 - -MESSAGE_STORAGE = 'django.contrib.messages.storage.session.SessionStorage' From 1b3ee5c577dc692a22595992cb93305f342c14f4 Mon Sep 17 00:00:00 2001 From: mahesh Date: Mon, 9 Apr 2018 00:00:04 +0530 Subject: [PATCH 35/49] Change button to submit review instead of check answer on submitting correct answer --- interface/static/templates/checkquestion.html | 10 ++++++++-- interface/static/templates/submit_review.html | 2 +- interface/views.py | 1 + 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/interface/static/templates/checkquestion.html b/interface/static/templates/checkquestion.html index f8390f3..6dc0f9e 100644 --- a/interface/static/templates/checkquestion.html +++ b/interface/static/templates/checkquestion.html @@ -71,11 +71,17 @@

    Write your program below:

    // Setting code editors initial content
    +{% if not correct_answer %}    - + +{% else %} + +Submit Review + +{% endif %} +    diff --git a/interface/static/templates/submit_review.html b/interface/static/templates/submit_review.html index 6e713b4..eda7bb8 100644 --- a/interface/static/templates/submit_review.html +++ b/interface/static/templates/submit_review.html @@ -12,7 +12,7 @@ {% block content %}
    {% csrf_token %} -
    +
    {% if submit == "submit" %}

    Question Details:


    diff --git a/interface/views.py b/interface/views.py index c0b91dc..4d682e5 100644 --- a/interface/views.py +++ b/interface/views.py @@ -283,6 +283,7 @@ def check_question(request, question_id): context['question'] = question context['last_answer'] = review.last_answer + context['correct_answer'] = review.correct_answer return render(request, "checkquestion.html", context) @login_required From 71f7d536f79d51deba798299569bc2c0b855f27e Mon Sep 17 00:00:00 2001 From: adityacp Date: Mon, 9 Apr 2018 13:06:31 +0530 Subject: [PATCH 36/49] Fix bug to display multiline solution in Code mirror --- interface/views.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/interface/views.py b/interface/views.py index 4d682e5..83d1943 100644 --- a/interface/views.py +++ b/interface/views.py @@ -282,7 +282,10 @@ def check_question(request, question_id): return redirect("/postreview/skip/{0}".format(question.id)) context['question'] = question - context['last_answer'] = review.last_answer + if review.last_answer: + context['last_answer'] = review.last_answer.encode('unicode-escape') + else: + context['last_answer'] = None context['correct_answer'] = review.correct_answer return render(request, "checkquestion.html", context) From 9eab5945ac799df5a9189f725111061deeb09311 Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Mon, 9 Apr 2018 15:55:45 +0530 Subject: [PATCH 37/49] Add users to reviewer group on login --- interface/admin.py | 1 + interface/models.py | 2 +- interface/views.py | 14 ++++++++++++-- yaksh/urls.py | 25 ------------------------- 4 files changed, 14 insertions(+), 28 deletions(-) diff --git a/interface/admin.py b/interface/admin.py index 6612484..a9ab949 100644 --- a/interface/admin.py +++ b/interface/admin.py @@ -11,6 +11,7 @@ class ReviewerAdmin(admin.ModelAdmin): + search_fields = ['username' ] actions = ['make_reviewer', 'remove_reviewer'] def make_reviewer(self, request, users): diff --git a/interface/models.py b/interface/models.py index cda450b..4b65fc7 100644 --- a/interface/models.py +++ b/interface/models.py @@ -138,7 +138,7 @@ class Review(models.Model): last_answer = models.TextField(null=True, blank=True) def __str__(self): - return "Review by {0}".format(self.reviewer.get_full_name()) + return "Review by {0}".format(self.reviewer.username) class QuestionBank(models.Model): diff --git a/interface/views.py b/interface/views.py index daf033f..dabe37e 100644 --- a/interface/views.py +++ b/interface/views.py @@ -66,7 +66,11 @@ def logout_page(request): @login_required def next_login(request): - if request.user.is_authenticated(): + user = request.user + if user.is_authenticated(): + group = Group.objects.filter(name="reviewer") + if group.exists(): + user.groups.add(*group) if is_reviewer(request.user): return show_review_questions(request) return render(request, 'dashboard.html') @@ -246,8 +250,14 @@ def get_reviewer_questions(user, question_bank): ) ) random.shuffle(questions) - return questions[:(9-question_bank.question_bank.count())] + all_questions = questions[:(10-question_bank.question_bank.count())] + mod_group = Group.objects.get(name="moderator").user_set.all() + mod_questions = Question.objects.filter(user=mod_group) + if mod_questions: + mod_choice = random.choice(mod_questions) + all_questions[-1] = mod_choice + return all_questions @login_required def check_question(request, question_id): diff --git a/yaksh/urls.py b/yaksh/urls.py index aec6ba3..39034c4 100644 --- a/yaksh/urls.py +++ b/yaksh/urls.py @@ -24,29 +24,4 @@ check_question,name="check_question"), url(r'^postreview/(?Pskip|submit)/(?P\d+)/$', post_review,name="post_review"), - -# url(r'^questions/ratemcq/$',"interface.views.rate_mcq",name="rate_mcq"), -# url(r'^questions/postcomment/$',"interface.views.rate_post",name="rate_post_comment"), -# url(r'^questions/ratecq/$',"interface.views.rate_cq",name="rate_cq"), -# url(r'^questions/addmcq/$',"interface.views.add_mcquestion",name="add_mcq"), -# url(r'^questions/addcq/$',"interface.views.add_cquestion",name="add_cq"), - -# url(r'^questions/(?P\d+)/$',"interface.views.add_comment",name="question_comment"), -# url(r'^questions/(?P\d+)/postcomment/$',"interface.views.post_comment",name="question_comment_post"), - -# url(r'^moderator/$',"interface.views.next_login",name="mod_show"), -# url(r'^moderator/all/$',"interface.views.show_questions_mod_all",name="mod_show_all"), -# url(r'^moderator/mcq/$',"interface.views.show_questions_mod_mcq",name="mod_show_mcq"), -# url(r'^moderator/cq/$',"interface.views.show_questions_mod_cq",name="mod_show_cq"), -# url(r'^moderator/mcq_approved/$',"interface.views.show_questions_mod_approved_mcq",name="mod_show_approved_mcq"), -# url(r'^moderator/cq_approved/$',"interface.views.show_questions_mod_approved_cq",name="mod_show_approved_cq"), -# url(r'^moderator/(?P\d+)/$',"interface.views.approve_questions",name="mod_questions"), -# url(r'^moderator/(?P\d+)/approve/$',"interface.views.approve_questions_accept",name="mod_approve"), -# url(r'^moderator/(?P\d+)/postcomment/$',"interface.views.post_comment",name="mod_approve_posted"), - -# url(r'^reviews/$',"interface.views.show_reviews",name="show_review"), -# url(r'^ratings/$',"interface.views.show_ratings",name="show_ratings"), - - - ] From 597a0f53d8c0e6e259389a513abd1b9e93ea2d98 Mon Sep 17 00:00:00 2001 From: adityacp Date: Mon, 9 Apr 2018 16:59:28 +0530 Subject: [PATCH 38/49] Fix a bug to get moderator question --- interface/views.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/interface/views.py b/interface/views.py index 1c1313f..fa831a3 100644 --- a/interface/views.py +++ b/interface/views.py @@ -252,9 +252,9 @@ def get_reviewer_questions(user, question_bank): random.shuffle(questions) all_questions = questions[:(10-question_bank.question_bank.count())] - mod_group = Group.objects.get(name="moderator").user_set.all() - mod_questions = Question.objects.filter(user=mod_group) - if mod_questions: + mod_group = Group.objects.get(name="moderator").user_set.all().values_list("id", flat=True) + mod_questions = Question.objects.filter(user_id__in=mod_group) + if mod_questions.count() > 0: mod_choice = random.choice(mod_questions) all_questions[-1] = mod_choice return all_questions From 9ee138806fcfec673b3ccdd71d91f51558bd26be Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Mon, 9 Apr 2018 17:39:44 +0530 Subject: [PATCH 39/49] Bugfix for adding questions in question bank --- interface/views.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/interface/views.py b/interface/views.py index dabe37e..53c6a13 100644 --- a/interface/views.py +++ b/interface/views.py @@ -230,8 +230,9 @@ def show_review_questions(request): status = "moderator" if is_reviewer(user): ques_bank,created = QuestionBank.objects.get_or_create(user=user) - questions = get_reviewer_questions(user, ques_bank) - ques_bank.question_bank.add(*questions) + if ques_bank.question_bank.all().count() < 10: + questions = get_reviewer_questions(user, ques_bank) + ques_bank.question_bank.add(*questions) context['questions'] = ques_bank.question_bank.all() status = "reviewer" context['status'] = status From 124a747049ec3c5c032e1f8396d9716174622f43 Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Mon, 9 Apr 2018 18:01:39 +0530 Subject: [PATCH 40/49] Add instructions for reviewing question --- docs/index.rst | 106 ++++++++++++++++++++++++++++++------------------- 1 file changed, 65 insertions(+), 41 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index cff895b..077c8f7 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -10,77 +10,101 @@ Welcome to Question Contribution's documentation! Basic Instructions ------------------ - 1. Create 5 Python Coding Questions with good quality test cases for each question.(expected 5 test cases). - 2. Avoid trivial questions such as Printing patterns, Reversing strings, Arithmetic operations, etc. - 3. Question description should be grammatically correct and easy to understand. - 4. Questions can be original or adapted from other sources with significant changes in case the question is adapted, the source needs to be cited in the interface. We prefer non-cited, original questions for shortlisting the candidates. - 5. All questions should be well tested. + 1. Create 5 Python Coding Questions with good quality test cases for each question.(expected 5 test cases). + 2. Avoid trivial questions such as Printing patterns, Reversing strings, Arithmetic operations, etc. + 3. Question description should be grammatically correct and easy to understand. + 4. Questions can be original or adapted from other sources with significant changes in case the question is adapted, the source needs to be cited in the interface. We prefer non-cited, original questions for shortlisting the candidates. + 5. All questions should be well tested. Register & Login ---------------- - 1. Click on the **Register** link on the |location_link|. + 1. Click on the **Register** link on the |location_link|. - .. |location_link| raw:: html + .. |location_link| raw:: html -
    main page + main page - 2. After registration, login with the username and password. + 2. After registration, login with the username and password. Creating Questions ------------------ - - .. note:: You are allowed to create only 5 questions. You can edit and delete those questions though. Also please make sure questions are created using Python 3.x. + + .. note:: You are allowed to create only 5 questions. You can edit and delete those questions though. Also please make sure questions are created using Python 3.x. - 1. After login click on **Start Contribution** button to start creating questions. - 2. On the contribution interface you can view all your questions. - 3. Click on **Add Question** button to create a new question. - .. note:: Right click on the image and select **Open image in new tab** to view image properly. - 4. Below image shows an example of creating a question. - .. figure:: images/create_questions.jpg + 1. After login click on **Start Contribution** button to start creating questions. + 2. On the contribution interface you can view all your questions. + 3. Click on **Add Question** button to create a new question. + .. note:: Right click on the image and select **Open image in new tab** to view image properly. + 4. Below image shows an example of creating a question. + .. figure:: images/create_questions.jpg - Fields to fill while creating questions - - * **Summary**- Short summary or the name of the question. Cannot be more than 256 characters. + Fields to fill while creating questions + + * **Summary**- Short summary or the name of the question. Cannot be more than 256 characters. - * **Points** - Points is the marks for a question. It can be in decimal digits. + * **Points** - Points is the marks for a question. It can be in decimal digits. - * **Description** - Write the actual question here. One can use HTML tags to format question text. + * **Description** - Write the actual question here. One can use HTML tags to format question text. - .. note:: To add code snippets in question description please use html
    ,  and 
    tags. + .. note:: To add code snippets in question description please use html
    ,  and 
    tags. - * **Solution** - It is the **correct code answer** of the question. Please follow Python syntaxes here. - For e.g. :: + * **Solution** - It is the **correct code answer** of the question. Please follow Python syntaxes here. + For e.g. :: - a = input() - b = input() - print(int(a)+int(b)) + a = input() + b = input() + print(int(a)+int(b)) - * **Citation** - Mention the reference url of the question if the question is adapted. Please make sure to cite the original source of the question if it is not a original question. + * **Citation** - Mention the reference url of the question if the question is adapted. Please make sure to cite the original source of the question if it is not a original question. - .. note:: Leave the field blank if the question is original. + .. note:: Leave the field blank if the question is original. - * **Originality** - Specify whether the question is **Original Question** or **Adapted Question** + * **Originality** - Specify whether the question is **Original Question** or **Adapted Question** - 5. Below image shows an example of how to create test cases. - .. figure:: images/create_testcases.jpg + 5. Below image shows an example of how to create test cases. + .. figure:: images/create_testcases.jpg - In **Expected input** field, enter the value(s) that will be passed to the code through a standard I/O stream. + In **Expected input** field, enter the value(s) that will be passed to the code through a standard I/O stream. - .. note:: If there are multiple input values in a test case, enter the values in a new line as shown in figure. + .. note:: If there are multiple input values in a test case, enter the values in a new line as shown in figure. - In **Expected Output** Field, enter the expected output for that test case. For e.g type 3 if the output of the user code is 3. + In **Expected Output** Field, enter the expected output for that test case. For e.g type 3 if the output of the user code is 3. - To delete a test case, Select **Delete** checkbox and click on **Check and Save** to delete the testcase and save the question. + To delete a test case, Select **Delete** checkbox and click on **Check and Save** to delete the testcase and save the question. - To **add a new test case**, select ``stdio`` from the drop down box, found just above the ``Check and Save`` button. + To **add a new test case**, select ``stdio`` from the drop down box, found just above the ``Check and Save`` button. - 6. To delete a question, Select the question and click on **Delete Question** button. Once deleted, a question cannot be retrieved back. Please take caution before deletion. - 7. If all the test cases for the questions pass, then the question is automatically approved. To see how many questions are approved, you can look at the **status** column in contribution page, where you see all your questions. + 6. To delete a question, Select the question and click on **Delete Question** button. Once deleted, a question cannot be retrieved back. Please take caution before deletion. + 7. If all the test cases for the questions pass, then the question is automatically approved. To see how many questions are approved, you can look at the **status** column in contribution page, where you see all your questions. - 8. If you have created 5 approved questions, **your question creation task is completed.** + 8. If you have created 5 approved questions, **your question creation task is completed.** +Reviewing Questions +------------------- + 1. After login, click on **Start Contribution** button to start reviewing questions. + 2. On the contribution interface you can view all the questions to review. + 3. Click on the **Question sumary** link to review a question. + 4. Read the **question description** and try to solve it by writing the solution code. Click on **Check Answer** button to check if your solution passes the question creator's testcases. You will see errors for the testcases that do not pass. Read the errors properly and try to fix your solution. + 5. You can **skip** the question if you find the following reasons for not being able to solve the question - + a. If the question is incomprehensible + b. If the question is comprehensible but its solution is too difficult. + c. If the question is comprehensible and its solution is fairly easy, but the testcases provided are wrong for the question. + + .. note:: If you find any other problem other than the three mentioned reasons, you can add it in the comments field. Otherwise it can be kept blank. + 6. If you are able to solve the question, you will be automatically redirected to the **review submission** page. Here you have to review the following attributes of the question - + a. Check if the Question summary and description provided are grammatically correct and simple to understand. + b. If the marks/points provided by the question creator is worth the question. A really simple question should not have more than single digit marks and really tough question should have atleast high two digit marks. + c. Check Citation for the following cases - + 1. If the question is stated to be original, please investigate if the question is truly original. Check on the internet to see if the question is directly copied or influenced by a similar question. + 2. If the question has been cited from a source, please investigate if the cited source is correct or not. + 3. If the question is not directly copied but is a generic question, like print Armstrong numbers, or factorial of a number or prime number or Fibonacci sequence, please treat the question as original question. But please make sure that you rate the question less. + d. Please check **Check Citation** checkbox if the mentioned citation is correct. **Do not check the Check Citation checkbox if an original question is found out to be copied or if a cited source is wrong.** In such a case, please mention the actual source of question in the comments section. + e. Rate the question, according to the overall quality, originality and toughness of the question. + f. Comment, if you have some insights or problems with the question. Although Comments are optional, they will be appreciated. + + 7. Once a review is submitted, you will be taken back to the dashboard. You can always edit your review or submit review for other questions. From afc2d1ad56bb20da0ba58790df385e53ee4771d5 Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Mon, 9 Apr 2018 18:36:54 +0530 Subject: [PATCH 41/49] Add only non reviewers in review group --- interface/views.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/interface/views.py b/interface/views.py index 245fcfe..9a3b363 100644 --- a/interface/views.py +++ b/interface/views.py @@ -67,10 +67,11 @@ def logout_page(request): def next_login(request): user = request.user if user.is_authenticated(): - group = Group.objects.filter(name="reviewer") - if group.exists(): - user.groups.add(*group) - if is_reviewer(request.user): + if not is_moderator(user) and not is_reviewer(user): + group = Group.objects.filter(name="reviewer") + if group.exists(): + user.groups.add(*group) + if is_reviewer(user): return show_review_questions(request) return render(request, 'dashboard.html') else: From 7c320668f49edb7932b60ec7e7b8ff2a58bf9b55 Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Thu, 12 Apr 2018 16:31:38 +0530 Subject: [PATCH 42/49] Add search for questions in admin interface --- interface/admin.py | 1 + interface/views.py | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/interface/admin.py b/interface/admin.py index a9ab949..771a3d2 100644 --- a/interface/admin.py +++ b/interface/admin.py @@ -44,6 +44,7 @@ def remove_reviewer(self, request, users): remove_reviewer.short_description = "Remove Users from reviewer Group" class QuestionAdmin(admin.ModelAdmin): + search_fields = ['user__username', 'summary'] list_display = ["summary", "user", 'status'] actions = ["update_question_status"] diff --git a/interface/views.py b/interface/views.py index 9a3b363..0f605a7 100644 --- a/interface/views.py +++ b/interface/views.py @@ -254,7 +254,8 @@ def get_reviewer_questions(user, question_bank): random.shuffle(questions) all_questions = questions[:(10-question_bank.question_bank.count())] - mod_group = Group.objects.get(name="moderator").user_set.all().values_list("id", flat=True) + mod_group = Group.objects.get(name="moderator").user_set.all()\ + .values_list("id", flat=True) mod_questions = Question.objects.filter(user_id__in=mod_group) if mod_questions.count() > 0: mod_choice = random.choice(mod_questions) From 3205291a29ff390a16cc4cd2febb622d012004b7 Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Thu, 12 Apr 2018 18:21:08 +0530 Subject: [PATCH 43/49] Update average ratings for questions --- interface/admin.py | 30 ++++++++++++++++++++++++++++++ interface/models.py | 21 +++++++++++++++++++++ interface/views.py | 12 ++++++++---- 3 files changed, 59 insertions(+), 4 deletions(-) diff --git a/interface/admin.py b/interface/admin.py index 771a3d2..2284e49 100644 --- a/interface/admin.py +++ b/interface/admin.py @@ -72,7 +72,37 @@ def update_question_status(self, request, questions): update_question_status.short_description = """Check and update question status""" + +class AverageRatingAdmin(admin.ModelAdmin): + search_fields = ['question__summary'] + list_display = ["question", "avg_moderator_rating", + "avg_peer_rating" + ] + ordering = ["-avg_peer_rating"] + actions = ["update_ratings"] + + def update_ratings(self, request, questions): + try: + selected_questions = Question.objects.filter(id__in=questions) + for question in selected_questions: + ratings = AverageRating.objects.get(question=question) + ratings.set_average_marks() + messages.add_message(request, messages.SUCCESS, + "Ratings updated." + ) + + except Exception as e: + messages.add_message(request, messages.ERROR, + 'You have an error:\n {0}.'.format(e) + ) + + update_ratings.short_description = """Update marks for + selected questions + """ + admin.site.unregister(User) admin.site.register(User, ReviewerAdmin) +admin.site.unregister(AverageRating) +admin.site.register(AverageRating, AverageRatingAdmin) admin.site.unregister(Question) admin.site.register(Question, QuestionAdmin) diff --git a/interface/models.py b/interface/models.py index 04d4f50..817cfae 100644 --- a/interface/models.py +++ b/interface/models.py @@ -3,6 +3,7 @@ from django.db import models import json + question_skip_choices = ( (1, "Question doesn't make sense."), (2, "Question makes sense, but is too difficult to solve."), @@ -121,6 +122,26 @@ class AverageRating(models.Model): def __str__(self): return "Average Rating for {0}".format(self.question.summary) + def set_average_marks(self): + reviews = self.question.reviews.all() + mod_marks, reviewer_marks = [],[] + for review in reviews: + if review.status and review.correct_answer: + if review.reviewer.groups.filter(name='moderator').exists(): + mod_marks.append(review.rating) + elif review.reviewer.groups.filter(name='reviewer').exists(): + reviewer_marks.append(review.rating) + if mod_marks: + self.avg_moderator_rating = round( + sum(mod_marks)/len(mod_marks), 2 + ) + if reviewer_marks: + self.avg_peer_rating = round( + sum(reviewer_marks)/len(reviewer_marks),2 + ) + self.save() + return self.avg_moderator_rating, self.avg_peer_rating + class Review(models.Model): reviewer = models.ForeignKey(User) diff --git a/interface/views.py b/interface/views.py index 0f605a7..8157e98 100644 --- a/interface/views.py +++ b/interface/views.py @@ -227,15 +227,19 @@ def show_review_questions(request): context = {} context["user"] = user if is_moderator(user): - context['questions'] = Question.objects.filter(status=True) + questions = Question.objects.filter(status=True) status = "moderator" if is_reviewer(user): ques_bank,created = QuestionBank.objects.get_or_create(user=user) if ques_bank.question_bank.all().count() < 10: - questions = get_reviewer_questions(user, ques_bank) - ques_bank.question_bank.add(*questions) - context['questions'] = ques_bank.question_bank.all() + quests = get_reviewer_questions(user, ques_bank) + ques_bank.question_bank.add(*quests) + questions = ques_bank.question_bank.all() status = "reviewer" + for question in questions: + rating, stat = AverageRating.objects.get_or_create(question=question) + rating.set_average_marks() + context['questions'] = questions context['status'] = status return render_to_response( "show_review_questions.html", context From e1f0688eb7e9b6e5d847d6087d97a37f4d2f5b3c Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Mon, 16 Apr 2018 18:02:42 +0530 Subject: [PATCH 44/49] Divide questions between moderators --- interface/admin.py | 4 +++- interface/models.py | 2 +- interface/views.py | 25 ++++++++++++++++++++++++- 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/interface/admin.py b/interface/admin.py index 2284e49..022f0de 100644 --- a/interface/admin.py +++ b/interface/admin.py @@ -85,7 +85,9 @@ def update_ratings(self, request, questions): try: selected_questions = Question.objects.filter(id__in=questions) for question in selected_questions: - ratings = AverageRating.objects.get(question=question) + ratings,status = AverageRating.objects.get_or_create( + question=question + ) ratings.set_average_marks() messages.add_message(request, messages.SUCCESS, "Ratings updated." diff --git a/interface/models.py b/interface/models.py index 817cfae..2223bf4 100644 --- a/interface/models.py +++ b/interface/models.py @@ -1,5 +1,5 @@ from __future__ import unicode_literals -from django.contrib.auth.models import User +from django.contrib.auth.models import User, Group from django.db import models import json diff --git a/interface/views.py b/interface/views.py index 8157e98..578472c 100644 --- a/interface/views.py +++ b/interface/views.py @@ -227,7 +227,11 @@ def show_review_questions(request): context = {} context["user"] = user if is_moderator(user): - questions = Question.objects.filter(status=True) + ques_bank,created = QuestionBank.objects.get_or_create(user=user) + if ques_bank.question_bank.all().count() < 100: + quests = get_moderator_questions(user, ques_bank) + ques_bank.question_bank.add(*quests) + questions = ques_bank.question_bank.all() status = "moderator" if is_reviewer(user): ques_bank,created = QuestionBank.objects.get_or_create(user=user) @@ -266,6 +270,25 @@ def get_reviewer_questions(user, question_bank): all_questions[-1] = mod_choice return all_questions + +def get_moderator_questions(user, question_bank): + all_questions = [] + moderators = Group.objects.get(name="moderator")\ + .user_set.all().exclude(id=user.id)\ + .values_list("id", flat=True) + mod_qb = QuestionBank.objects.filter(user_id__in=moderators) + for q in mod_qb: + user_question = q.question_bank.all().values_list("id", flat=True) + all_questions.extend(user_question) + if all_questions: + remaining = Question.objects.filter(status=True)\ + .exclude(id__in=all_questions) + else: + remaining = Question.objects.filter(status=True) + random.shuffle(list(remaining)) + questions = remaining[:(100-question_bank.question_bank.count())] + return questions + @login_required def check_question(request, question_id): """Review question on the interface.""" From fd2adbf33d86fcba3bb9a32cb189c0c89ee95896 Mon Sep 17 00:00:00 2001 From: mahesh Date: Sat, 21 Apr 2018 11:09:27 +0530 Subject: [PATCH 45/49] Close submissions for reviewers --- .../static/templates/submissions_over.html | 25 +++++++++++++++++++ interface/views.py | 10 ++++++++ 2 files changed, 35 insertions(+) create mode 100644 interface/static/templates/submissions_over.html diff --git a/interface/static/templates/submissions_over.html b/interface/static/templates/submissions_over.html new file mode 100644 index 0000000..6b7aacf --- /dev/null +++ b/interface/static/templates/submissions_over.html @@ -0,0 +1,25 @@ +{% extends "navigation.html" %} +{% block navbar %} +
  • Home
  • +
  • Contribution
  • +
  • Instructions
  • +
  • Logout
  • +{% endblock %} + +{% block content %} + + + +
    + +

    +

    Sorry !!!


    +

    + Submissions for FOSSEE Fellowship 2018 are now over. Please comeback later. +

    + +
    + + + +{% endblock %} \ No newline at end of file diff --git a/interface/views.py b/interface/views.py index 578472c..fba7ca8 100644 --- a/interface/views.py +++ b/interface/views.py @@ -72,6 +72,8 @@ def next_login(request): if group.exists(): user.groups.add(*group) if is_reviewer(user): + return task_closed(request) + if is_moderator(user): return show_review_questions(request) return render(request, 'dashboard.html') else: @@ -234,6 +236,7 @@ def show_review_questions(request): questions = ques_bank.question_bank.all() status = "moderator" if is_reviewer(user): + return task_closed(request) ques_bank,created = QuestionBank.objects.get_or_create(user=user) if ques_bank.question_bank.all().count() < 10: quests = get_reviewer_questions(user, ques_bank) @@ -297,6 +300,8 @@ def check_question(request, question_id): context = {} if not is_reviewer(user) and not is_moderator(user): raise Http404("You are not allowed to view this page.") + if is_reviewer(user): + return task_closed(request) try: question = Question.objects.get(id=question_id) @@ -333,6 +338,8 @@ def check_question(request, question_id): def post_review(request, submit, question_id): user = request.user context = {} + if is_reviewer(user): + return task_closed(request) try: question = Question.objects.get(id=question_id) except Question.DoesNotExist: @@ -366,3 +373,6 @@ def post_review(request, submit, question_id): context["submit"] = submit context["question"] = question return render(request, "submit_review.html", context) + +def task_closed(request): + return render(request, "submissions_over.html") From 301a06be52c7100ab2cc23ecf39c532d2e6584ec Mon Sep 17 00:00:00 2001 From: mahesh Date: Thu, 26 Apr 2018 04:27:58 +0530 Subject: [PATCH 46/49] Get question unreviewed by moderators for students who have fullfilled all criteria --- interface/admin.py | 45 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/interface/admin.py b/interface/admin.py index 022f0de..48f1c71 100644 --- a/interface/admin.py +++ b/interface/admin.py @@ -1,8 +1,9 @@ from django.contrib import admin, messages from django.contrib.auth.models import User, Group from django.contrib.auth.admin import GroupAdmin +from django.http import HttpResponse from interface.models import Question, TestCase, AverageRating, Review -from interface.views import submit_to_code_server +from interface.views import submit_to_code_server, is_moderator admin.site.register(Question) admin.site.register(TestCase) @@ -79,7 +80,44 @@ class AverageRatingAdmin(admin.ModelAdmin): "avg_peer_rating" ] ordering = ["-avg_peer_rating"] - actions = ["update_ratings"] + actions = ["update_ratings", "get_unreviewed_questions"] + + def get_unreviewed_questions(self, request, selected_reviews): + users = User.objects.all() + qualified = [] + for user in users: + if not is_moderator(user) \ + and Review.objects.filter(reviewer=user,status=True).count()==10\ + and Question.objects.filter(user=user, status=True).count()==5: + qualified.append(user) + + question = Question.objects.get(id=475) + cited_users = [] + for user in qualified: + try: + if question.reviews.get(reviewer=user).check_citation == False: + cited_users.append(user) + except: + pass + + qualified_questions = [] + for user in cited_users: + qualified_questions.extend( + Question.objects.filter(user=user,status=True) + ) + + unreviewed_questions = [] + for question in qualified_questions: + for review in question.reviews.all(): + if review and is_moderator(review.reviewer): + break + else: + unreviewed_questions.append(question.id) + filename = "unreviewed_questions.txt" + content = str(unreviewed_questions) + response = HttpResponse(content, content_type='text/plain') + response['Content-Disposition'] = 'attachment; filename={0}'.format(filename) + return response def update_ratings(self, request, questions): try: @@ -101,6 +139,9 @@ def update_ratings(self, request, questions): update_ratings.short_description = """Update marks for selected questions """ + get_unreviewed_questions.short_description = """Get unreviewed questions + """ + admin.site.unregister(User) admin.site.register(User, ReviewerAdmin) From e5ed0fd5789a6e161b99e83095df31cbdd3e4ffa Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Thu, 26 Apr 2018 12:42:39 +0530 Subject: [PATCH 47/49] Add google analytics --- interface/static/templates/navigation.html | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/interface/static/templates/navigation.html b/interface/static/templates/navigation.html index 5589f38..b3ecef8 100644 --- a/interface/static/templates/navigation.html +++ b/interface/static/templates/navigation.html @@ -1,6 +1,16 @@ + + + + {% load staticfiles %} Yaksh | Home From eaffd195e58ec7580a351969fa145d1ce3f48342 Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Thu, 26 Apr 2018 16:43:44 +0530 Subject: [PATCH 48/49] Check if review is completed --- interface/admin.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/interface/admin.py b/interface/admin.py index 48f1c71..ee25b61 100644 --- a/interface/admin.py +++ b/interface/admin.py @@ -109,7 +109,8 @@ def get_unreviewed_questions(self, request, selected_reviews): unreviewed_questions = [] for question in qualified_questions: for review in question.reviews.all(): - if review and is_moderator(review.reviewer): + if review and is_moderator(review.reviewer)\ + and review.status: break else: unreviewed_questions.append(question.id) From 28b4274353b34a6562532a9075a328a902b21867 Mon Sep 17 00:00:00 2001 From: maheshgudi Date: Fri, 2 Nov 2018 17:24:25 +0530 Subject: [PATCH 49/49] Show all questions to admin --- interface/static/templates/show_review_questions.html | 5 +++++ interface/views.py | 10 ++++++++++ yaksh/urls.py | 2 ++ 3 files changed, 17 insertions(+) diff --git a/interface/static/templates/show_review_questions.html b/interface/static/templates/show_review_questions.html index 9c37713..8edaf30 100644 --- a/interface/static/templates/show_review_questions.html +++ b/interface/static/templates/show_review_questions.html @@ -44,6 +44,8 @@

    You are now a {{status}}

    Type Marks Reviewed + Avg Peer Rating + Avg Moderator Rating @@ -60,6 +62,9 @@

    You are now a {{status}}

    {% else %} {% endif %} +{{question.averagerating_set.get.avg_peer_rating}} +{{question.averagerating_set.get.avg_moderator_rating}} + {% endfor %} diff --git a/interface/views.py b/interface/views.py index fba7ca8..f11d7f2 100644 --- a/interface/views.py +++ b/interface/views.py @@ -376,3 +376,13 @@ def post_review(request, submit, question_id): def task_closed(request): return render(request, "submissions_over.html") + +def really_show_all_questions(request): + user = request.user + context = {} + if user.is_superuser: + questions = Question.objects.all().distinct() + context['questions'] = questions + return render(request, "show_review_questions.html", context) + else: + raise Http404("Not an admin!") \ No newline at end of file diff --git a/yaksh/urls.py b/yaksh/urls.py index 39034c4..af30ce5 100644 --- a/yaksh/urls.py +++ b/yaksh/urls.py @@ -15,6 +15,8 @@ url(r'^showquestions/$',show_all_questions, name="show_all_questions"), + url(r'^reallyshowquestions/$',really_show_all_questions, + name="show_all_questions"), url(r'^addquestion/$',add_question,name="add_question"), url(r'^addquestion/(?P\d+)/$',add_question, name="add_question"),