From 8e87b085adbca8afb6f3a6737a53ade4efdc14dd Mon Sep 17 00:00:00 2001 From: p31729568 <winse.wang@foxmail.com> Date: Tue, 29 Oct 2019 15:51:19 +0800 Subject: [PATCH] admin: edit subject --- .../admins/modals/admin-edit-subject-modal.js | 18 + .../javascripts/admins/subjects/index.js | 57 + app/assets/javascripts/common.js | 4 +- app/controllers/admins/subjects_controller.rb | 63 + app/models/subject.rb | 2 +- app/views/admins/subjects/edit.js.erb | 2 + .../shared/_edit_subject_modal.html.erb | 33 + .../admins/subjects/shared/_list.html.erb | 36 +- config/routes.rb | 11 +- ...fest-4627fa5586ef7fed55ca286af7c028e9.json | 2 +- ...321e4023837568abab1d3ee9a28b2faa5925.js.gz | Bin 995576 -> 0 bytes ...083cf39b8e04f2318f67bfbf1923fe208456b3.js} | 79 +- ...3cf39b8e04f2318f67bfbf1923fe208456b3.js.gz | Bin 0 -> 996102 bytes ...53ec090e49ba7ad885879ffa02a11b6efd79d74.js | 136259 +++++++++++++++ ...c090e49ba7ad885879ffa02a11b6efd79d74.js.gz | Bin 0 -> 966858 bytes 15 files changed, 136541 insertions(+), 25 deletions(-) create mode 100644 app/assets/javascripts/admins/modals/admin-edit-subject-modal.js create mode 100644 app/views/admins/subjects/edit.js.erb create mode 100644 app/views/admins/subjects/shared/_edit_subject_modal.html.erb delete mode 100644 public/assets/admin-ba909dfe0de4d216bedb3c743144321e4023837568abab1d3ee9a28b2faa5925.js.gz rename public/assets/{admin-ba909dfe0de4d216bedb3c743144321e4023837568abab1d3ee9a28b2faa5925.js => admin-e975e2039206e9ae2b6a072fee083cf39b8e04f2318f67bfbf1923fe208456b3.js} (99%) create mode 100644 public/assets/admin-e975e2039206e9ae2b6a072fee083cf39b8e04f2318f67bfbf1923fe208456b3.js.gz create mode 100644 public/assets/cooperative-a309d245cd0b0b9c653db471c53ec090e49ba7ad885879ffa02a11b6efd79d74.js create mode 100644 public/assets/cooperative-a309d245cd0b0b9c653db471c53ec090e49ba7ad885879ffa02a11b6efd79d74.js.gz diff --git a/app/assets/javascripts/admins/modals/admin-edit-subject-modal.js b/app/assets/javascripts/admins/modals/admin-edit-subject-modal.js new file mode 100644 index 000000000..c76449936 --- /dev/null +++ b/app/assets/javascripts/admins/modals/admin-edit-subject-modal.js @@ -0,0 +1,18 @@ +$(document).on('turbolinks:load', function() { + $('.admin-modal-container').on('show.bs.modal', '.modal.admin-edit-subject-modal', function(){ + var $modal = $('.modal.admin-edit-subject-modal'); + var $form = $modal.find('form.admin-edit-subject-form'); + + $modal.on('click', '.submit-btn', function(){ + $form.find('.error').html(''); + var url = $form.attr('action'); + + $.ajax({ + method: 'PATCH', + dataType: 'script', + url: url, + data: $form.serialize() + }); + }); + }) +}); \ No newline at end of file diff --git a/app/assets/javascripts/admins/subjects/index.js b/app/assets/javascripts/admins/subjects/index.js index 0d63ae4cd..6198d56aa 100644 --- a/app/assets/javascripts/admins/subjects/index.js +++ b/app/assets/javascripts/admins/subjects/index.js @@ -46,5 +46,62 @@ $(document).on('turbolinks:load', function() { $imageElement.show(); $imageElement.next().html('重新上传'); }) + + // 定义状态切换监听事件 + var defineStatusChangeFunc = function(doElement, undoElement, url, callback){ + $('.subject-list-container').on('click', doElement, function(){ + var $doAction = $(this); + var $undoAction = $doAction.siblings(undoElement); + + var subjectId = $doAction.data('id'); + customConfirm({ + content: '确认进行该操作吗?', + ok: function(){ + $.ajax({ + url: '/admins/subjects/' + subjectId + url, + method: 'POST', + dataType: 'json', + success: function() { + show_success_flash(); + $doAction.hide(); + $undoAction.show(); + if(callback && typeof callback === "function"){ + callback(subjectId, url); + } + } + }); + } + }); + }); + } + // 隐藏与取消隐藏 + defineStatusChangeFunc('.hide-action', '.active-action', '/hide'); + defineStatusChangeFunc('.active-action', '.hide-action', '/cancel_hide'); + + // 首页展示与取消首页展示 + var homepageShowCallback = function(subjectId, url){ + var $subjectItem = $('.subject-list-container').find('.subject-item-' + subjectId); + + if(url === '/homepage_show'){ + $subjectItem.find('.homepage-show-badge').show(); + } else { + $subjectItem.find('.homepage-show-badge').hide(); + } + } + defineStatusChangeFunc('.homepage-show-action', '.homepage-hide-action', '/homepage_show', homepageShowCallback); + defineStatusChangeFunc('.homepage-hide-action', '.homepage-show-action', '/cancel_homepage_show', homepageShowCallback); + + // 设为金课与取消金课 + var excellentCallback = function(subjectId, url){ + var $subjectItem = $('.subject-list-container').find('.subject-item-' + subjectId); + + if(url === '/excellent'){ + $subjectItem.find('.excellent-badge').show(); + } else { + $subjectItem.find('.excellent-badge').hide(); + } + } + defineStatusChangeFunc('.excellent-action', '.cancel-excellent-action', '/excellent', excellentCallback); + defineStatusChangeFunc('.cancel-excellent-action', '.excellent-action', '/cancel_excellent', excellentCallback); } }); \ No newline at end of file diff --git a/app/assets/javascripts/common.js b/app/assets/javascripts/common.js index 66158b17e..a88ad5006 100644 --- a/app/assets/javascripts/common.js +++ b/app/assets/javascripts/common.js @@ -66,9 +66,9 @@ function customConfirm(opts){ return $.confirm($.extend({}, defaultOpts, opts)) } -function show_success_flash(){ +function show_success_flash(message){ $.notify({ - message: '操作成功' + message: message || '操作成功' },{ type: 'success' }); diff --git a/app/controllers/admins/subjects_controller.rb b/app/controllers/admins/subjects_controller.rb index 6795440ac..ae0840f78 100644 --- a/app/controllers/admins/subjects_controller.rb +++ b/app/controllers/admins/subjects_controller.rb @@ -5,4 +5,67 @@ class Admins::SubjectsController < Admins::BaseController subjects = Admins::SubjectQuery.call(params) @subjects = paginate subjects.includes(:repertoire, :subject_level_system, user: { user_extension: :school }) end + + def edit + @subject = current_subject + end + + def update + current_subject.update!(update_params) + + flash[:success] = '保存成功' + redirect_to admins_subjects_path + end + + def destroy + current_subject.destroy! + + render_delete_success + end + + # 隐藏 + def hide + current_subject.update!(hidden: true) + render_ok + end + + # 展示 + def cancel_hide + current_subject.update!(hidden: false) + render_ok + end + + # 设为主页展示 + def homepage_show + current_subject.update!(homepage_show: true) + render_ok + end + + # 取消主页展示 + def cancel_homepage_show + current_subject.update!(homepage_show: false) + render_ok + end + + # 设为金课 + def excellent + current_subject.update!(excellent: true) + render_ok + end + + # 取消金课 + def cancel_excellent + current_subject.update!(excellent: false) + render_ok + end + + private + + def current_subject + @_current_subject ||= Subject.find(params[:id]) + end + + def update_params + params.require(:subject).permit(:repertoire_id, :subject_level_system_id, :student_count) + end end \ No newline at end of file diff --git a/app/models/subject.rb b/app/models/subject.rb index d96b6b06c..e8f592419 100644 --- a/app/models/subject.rb +++ b/app/models/subject.rb @@ -5,7 +5,7 @@ class Subject < ApplicationRecord include Searchable::Subject #status :0 编辑中 1 审核中 2 发布 - belongs_to :repertoire + belongs_to :repertoire, optional: true belongs_to :user belongs_to :subject_level_system, optional: true diff --git a/app/views/admins/subjects/edit.js.erb b/app/views/admins/subjects/edit.js.erb new file mode 100644 index 000000000..b2e12f9bb --- /dev/null +++ b/app/views/admins/subjects/edit.js.erb @@ -0,0 +1,2 @@ +$('.admin-modal-container').html("<%= j( render partial: 'admins/subjects/shared/edit_subject_modal', locals: { subject: @subject } ) %>"); +$('.modal.admin-edit-subject-modal').modal('show'); \ No newline at end of file diff --git a/app/views/admins/subjects/shared/_edit_subject_modal.html.erb b/app/views/admins/subjects/shared/_edit_subject_modal.html.erb new file mode 100644 index 000000000..6e9aa871a --- /dev/null +++ b/app/views/admins/subjects/shared/_edit_subject_modal.html.erb @@ -0,0 +1,33 @@ +<div class="modal fade admin-edit-subject-modal" tabindex="-1" role="dialog" aria-hidden="true"> + <div class="modal-dialog modal-dialog-centered" role="document"> + <div class="modal-content"> + <div class="modal-header"> + <h5 class="modal-title">编辑课程信息</h5> + <button type="button" class="close" data-dismiss="modal" aria-label="Close"> + <span aria-hidden="true">×</span> + </button> + </div> + <div class="modal-body"> + <%= simple_form_for([:admins, subject], html: { class: 'admin-edit-subject-form' }, defaults: { wrapper_html: { class: 'offset-md-1 col-md-10' } }) do |f| %> + <%= f.input :repertoire_id, label: '技术体系:' do %> + <% repertoire_options = Repertoire.order('CONVERT(name USING gbk) COLLATE gbk_chinese_ci ASC').map{|r| [r.name, r.id]} %> + <%= f.select :repertoire_id, [['请选择', '']] + repertoire_options, {}, class: 'form-control' %> + <% end %> + + <%= f.input :subject_level_system_id, label: '等级体系:' do %> + <% level_options = SubjectLevelSystem.all.map{|r| [r.name, r.id]} %> + <%= f.select :subject_level_system_id, [['请选择', '']] + level_options, {}, class: 'form-control' %> + <% end %> + + <%= f.input :student_count, as: :integer, label: '开课人数:' %> + + <div class="error text-danger"></div> + <% end %> + </div> + <div class="modal-footer"> + <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button> + <button type="button" class="btn btn-primary submit-btn">确认</button> + </div> + </div> + </div> +</div> \ No newline at end of file diff --git a/app/views/admins/subjects/shared/_list.html.erb b/app/views/admins/subjects/shared/_list.html.erb index 64fa91f1b..0d670604f 100644 --- a/app/views/admins/subjects/shared/_list.html.erb +++ b/app/views/admins/subjects/shared/_list.html.erb @@ -7,12 +7,12 @@ <th width="8%">技术体系</th> <th width="8%">等级体系</th> <th width="8%">封面</th> - <th width="8%">创建者</th> + <th width="7%">创建者</th> <th width="10%">单位</th> <th width="8%">开课人数</th> <th width="10%"><%= sort_tag('创建时间', name: 'created_at', path: admins_subjects_path) %></th> <th width="7%">状态</th> - <th width="14%">操作</th> + <th width="15%">操作</th> </tr> </thead> <tbody> @@ -40,26 +40,26 @@ <td> <%= display_subject_status(subject) %> </td> - <td> - <%#= javascript_void_link('编辑', class: 'edit-action') %> + <td class="action-container"> + <%= link_to('编辑', edit_admins_subject_path(subject), remote: true, class: 'edit-action') %> - <%#= javascript_void_link('隐藏', class: 'hide-action', style: subject.hidden? ? 'display:none' : '') %> - <%#= javascript_void_link('取消隐藏', class: 'active-action', style: subject.hidden? ? '' : 'display:none') %> + <%= javascript_void_link('隐藏', class: 'hide-action', data: { id: subject.id }, style: subject.hidden? ? 'display:none' : '') %> + <%= javascript_void_link('取消隐藏', class: 'active-action', data: { id: subject.id }, style: subject.hidden? ? '' : 'display:none') %> - <%# if subject.published? %> -<!-- <div class="d-inline">--> - <%#= javascript_void_link('更多', class: 'action dropdown-toggle', 'data-toggle': 'dropdown', 'aria-haspopup': true, 'aria-expanded': false) %> -<!-- <div class="dropdown-menu more-action-dropdown">--> - <%#= javascript_void_link('首页展示', class: 'dropdown-item homepage-show-action', style: subject.homepage_show? ? 'display:none' : '') %> - <%#= javascript_void_link('取消首页展示', class: 'dropdown-item homepage-hide-action', style: subject.homepage_show? ? '' : 'display:none') %> + <div class="d-inline"> + <%= javascript_void_link('更多', class: 'action dropdown-toggle', 'data-toggle': 'dropdown', 'aria-haspopup': true, 'aria-expanded': false) %> + <div class="dropdown-menu more-action-dropdown"> + <% if subject.published? %> + <%= javascript_void_link('首页展示', class: 'dropdown-item homepage-show-action', data: { id: subject.id }, style: subject.homepage_show? ? 'display:none' : '') %> + <%= javascript_void_link('取消首页展示', class: 'dropdown-item homepage-hide-action', data: { id: subject.id }, style: subject.homepage_show? ? '' : 'display:none') %> - <%#= javascript_void_link('选为金课', class: 'dropdown-item excellent-action', style: subject.excellent? ? 'display:none' : '') %> - <%#= javascript_void_link('取消金课', class: 'dropdown-item cancel-excellent-action', style: subject.excellent? ? '' : 'display:none') %> + <%= javascript_void_link('选为金课', class: 'dropdown-item excellent-action', data: { id: subject.id }, style: subject.excellent? ? 'display:none' : '') %> + <%= javascript_void_link('取消金课', class: 'dropdown-item cancel-excellent-action', data: { id: subject.id }, style: subject.excellent? ? '' : 'display:none') %> + <% end %> - <%#= delete_link '删除', admins_subjects_path(subject, element: ".subject-item-#{subject.id}"), class: 'delete-subject-action' %> -<!-- </div>--> -<!-- </div>--> - <%# end %> + <%= delete_link '删除', admins_subject_path(subject, element: ".subject-item-#{subject.id}"), class: 'dropdown-item delete-subject-action' %> + </div> + </div> </td> </tr> <% end %> diff --git a/config/routes.rb b/config/routes.rb index 6de79b36e..2f8f3d958 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1052,7 +1052,16 @@ Rails.application.routes.draw do post :drag, on: :collection end - resources :subjects, only: [:index] + resources :subjects, only: [:index, :edit, :update, :destroy] do + member do + post :hide + post :cancel_hide + post :homepage_show + post :cancel_homepage_show + post :excellent + post :cancel_excellent + end + end end namespace :cooperative do diff --git a/public/assets/.sprockets-manifest-4627fa5586ef7fed55ca286af7c028e9.json b/public/assets/.sprockets-manifest-4627fa5586ef7fed55ca286af7c028e9.json index 153fec9a2..adc15be40 100644 --- a/public/assets/.sprockets-manifest-4627fa5586ef7fed55ca286af7c028e9.json +++ b/public/assets/.sprockets-manifest-4627fa5586ef7fed55ca286af7c028e9.json @@ -1 +1 @@ -{"files":{"admin-cd9ca8bacc973ce2dbace30c97f6c40bc08e2c2ee44972f668e738e1902c0121.js":{"logical_path":"admin.js","mtime":"2019-09-11T16:20:07+08:00","size":4350881,"digest":"cd9ca8bacc973ce2dbace30c97f6c40bc08e2c2ee44972f668e738e1902c0121","integrity":"sha256-zZyousyXPOLbrOMMl/bEC8COLC7kSXL2aOc44ZAsASE="},"admin-a1b3356efe50ff4717cf22475639b5333c5354ba03fd107c9b7a8d4ae76f47aa.css":{"logical_path":"admin.css","mtime":"2019-09-11T16:20:07+08:00","size":773445,"digest":"a1b3356efe50ff4717cf22475639b5333c5354ba03fd107c9b7a8d4ae76f47aa","integrity":"sha256-obM1bv5Q/0cXzyJHVjm1MzxTVLoD/RB8m3qNSudvR6o="},"font-awesome/fontawesome-webfont-7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979.eot":{"logical_path":"font-awesome/fontawesome-webfont.eot","mtime":"2019-08-14T17:22:43+08:00","size":165742,"digest":"7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979","integrity":"sha256-e/yrbbmdXPvxcFygU23ceFhUMsxfpBu9etDwCQM7KXk="},"font-awesome/fontawesome-webfont-2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe.woff2":{"logical_path":"font-awesome/fontawesome-webfont.woff2","mtime":"2019-08-14T17:22:43+08:00","size":77160,"digest":"2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe","integrity":"sha256-Kt78vAQefRj88tQXh53FoJmXqmTWdbejxLbOM9oT8/4="},"font-awesome/fontawesome-webfont-ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07.woff":{"logical_path":"font-awesome/fontawesome-webfont.woff","mtime":"2019-08-14T17:22:43+08:00","size":98024,"digest":"ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07","integrity":"sha256-ugxZ3rVFD1y0Gz+TYJ7i0NmVQVh33foiPoqKdTNHTwc="},"font-awesome/fontawesome-webfont-aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8.ttf":{"logical_path":"font-awesome/fontawesome-webfont.ttf","mtime":"2019-08-14T17:22:43+08:00","size":165548,"digest":"aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8","integrity":"sha256-qljzPyOaD7AvXHpsRcBD16msmgkzNYBmlOzW1O3A1qg="},"font-awesome/fontawesome-webfont-ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4.svg":{"logical_path":"font-awesome/fontawesome-webfont.svg","mtime":"2019-08-14T17:22:43+08:00","size":444379,"digest":"ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4","integrity":"sha256-rWFXkmwWIrpOHQPUePFUE2hSS/xG9R5C/g2UX37zI+Q="},"college-18f5e8400331634e898a35acc2187815c096c25e0ab74aba341ae916166cd287.js":{"logical_path":"college.js","mtime":"2019-10-24T15:25:17+08:00","size":3352744,"digest":"18f5e8400331634e898a35acc2187815c096c25e0ab74aba341ae916166cd287","integrity":"sha256-GPXoQAMxY06JijWswhh4FcCWwl4Kt0q6NBrpFhZs0oc="},"college-944d4273f62c7538368b9017fdd3387b5e3bea31a87873770eb231324546d4d9.css":{"logical_path":"college.css","mtime":"2019-09-11T16:20:07+08:00","size":546841,"digest":"944d4273f62c7538368b9017fdd3387b5e3bea31a87873770eb231324546d4d9","integrity":"sha256-lE1Cc/YsdTg2i5AX/dM4e1476jGoeHN3DrIxMkVG1Nk="},"logo-7ff112568709bf97f9898fe87249b7a8f200ff1f48d537d85af87215f1870423.png":{"logical_path":"logo.png","mtime":"2019-09-03T08:55:53+08:00","size":2816,"digest":"7ff112568709bf97f9898fe87249b7a8f200ff1f48d537d85af87215f1870423","integrity":"sha256-f/ESVocJv5f5iY/ockm3qPIA/x9I1TfYWvhyFfGHBCM="},"application-9cfbc3d792599a1d0de5c7b84209e1c2b2e60336f0f01e19f0581663918708fb.js":{"logical_path":"application.js","mtime":"2019-10-24T15:25:17+08:00","size":600706,"digest":"9cfbc3d792599a1d0de5c7b84209e1c2b2e60336f0f01e19f0581663918708fb","integrity":"sha256-nPvD15JZmh0N5ce4QgnhwrLmAzbw8B4Z8FgWY5GHCPs="},"application-5eb87c6e13676d0183317debce17fade27e68c4acee28c419438da15d53c94f2.css":{"logical_path":"application.css","mtime":"2019-09-11T16:20:07+08:00","size":1844002,"digest":"5eb87c6e13676d0183317debce17fade27e68c4acee28c419438da15d53c94f2","integrity":"sha256-Xrh8bhNnbQGDMX3rzhf63ifmjErO4oxBlDjaFdU8lPI="},"admin-c9e5ebe6191548550e27514196ea125cfbb402820ec125a0c9acf99d2d378fe4.js":{"logical_path":"admin.js","mtime":"2019-09-21T15:28:08+08:00","size":4382031,"digest":"c9e5ebe6191548550e27514196ea125cfbb402820ec125a0c9acf99d2d378fe4","integrity":"sha256-yeXr5hkVSFUOJ1FBluoSXPu0AoIOwSWgyaz5nS03j+Q="},"admin-59c59f8cae8bef4a8359286c985458110c9d03ea121516595c988943f4717c38.css":{"logical_path":"admin.css","mtime":"2019-09-21T14:49:04+08:00","size":840093,"digest":"59c59f8cae8bef4a8359286c985458110c9d03ea121516595c988943f4717c38","integrity":"sha256-WcWfjK6L70qDWShsmFRYEQydA+oSFRZZXJiJQ/RxfDg="},"college-38f953d6ba5b85d3fab63cb3c2bbf0d057ccc6454d07cfaafac3b06da37b8437.css":{"logical_path":"college.css","mtime":"2019-09-16T13:56:09+08:00","size":579109,"digest":"38f953d6ba5b85d3fab63cb3c2bbf0d057ccc6454d07cfaafac3b06da37b8437","integrity":"sha256-OPlT1rpbhdP6tjyzwrvw0FfMxkVNB8+q+sOwbaN7hDc="},"application-646b1158a4e8c1f13e684d6fe9025abc75f8d3ba5256e440802c0398223374f3.css":{"logical_path":"application.css","mtime":"2019-09-21T14:49:04+08:00","size":1988767,"digest":"646b1158a4e8c1f13e684d6fe9025abc75f8d3ba5256e440802c0398223374f3","integrity":"sha256-ZGsRWKTowfE+aE1v6QJavHX407pSVuRAgCwDmCIzdPM="},"admin-a47e37c0ec7cf5f22380249776d1e82d65b6b6aa272ed7389185aa200fa40751.js":{"logical_path":"admin.js","mtime":"2019-09-25T15:33:05+08:00","size":4383107,"digest":"a47e37c0ec7cf5f22380249776d1e82d65b6b6aa272ed7389185aa200fa40751","integrity":"sha256-pH43wOx89fIjgCSXdtHoLWW2tqonLtc4kYWqIA+kB1E="},"admin-432c4eac09b036c57ff1e88d902b8aa7df81164e4b419bac557cf1366c1d3ad9.js":{"logical_path":"admin.js","mtime":"2019-09-25T15:35:20+08:00","size":4383103,"digest":"432c4eac09b036c57ff1e88d902b8aa7df81164e4b419bac557cf1366c1d3ad9","integrity":"sha256-QyxOrAmwNsV/8eiNkCuKp9+BFk5LQZusVXzxNmwdOtk="},"admin-978e5ce607f77c26814a174f480da79ac246c2201868ef84654aa03bb6727b5a.js":{"logical_path":"admin.js","mtime":"2019-09-30T14:43:41+08:00","size":4387200,"digest":"978e5ce607f77c26814a174f480da79ac246c2201868ef84654aa03bb6727b5a","integrity":"sha256-l45c5gf3fCaBShdPSA2nmsJGwiAYaO+EZUqgO7Zye1o="},"admin-896281f4731722b0c084dbb1af21d0f34a5bc142d58aff57b391864ab71ddca7.css":{"logical_path":"admin.css","mtime":"2019-09-30T14:43:41+08:00","size":842269,"digest":"896281f4731722b0c084dbb1af21d0f34a5bc142d58aff57b391864ab71ddca7","integrity":"sha256-iWKB9HMXIrDAhNuxryHQ80pbwULViv9Xs5GGSrcd3Kc="},"application-97f313e9bb7d25476649f7d7215959cf421480fd0a3785d1956953bf94a1e8bd.css":{"logical_path":"application.css","mtime":"2019-09-30T14:43:41+08:00","size":1993118,"digest":"97f313e9bb7d25476649f7d7215959cf421480fd0a3785d1956953bf94a1e8bd","integrity":"sha256-l/MT6bt9JUdmSffXIVlZz0IUgP0KN4XRlWlTv5Sh6L0="},"admin-2cdb23442fa735025385b88f2900df04fef38b61530041a6dbe375ef0f0ae888.js":{"logical_path":"admin.js","mtime":"2019-10-11T14:38:33+08:00","size":4394616,"digest":"2cdb23442fa735025385b88f2900df04fef38b61530041a6dbe375ef0f0ae888","integrity":"sha256-LNsjRC+nNQJThbiPKQDfBP7zi2FTAEGm2+N17w8K6Ig="},"admin-2c2854b9a02158ded5a809aaf7144a8630b10354ab4e56fecc4dffcc713796cc.css":{"logical_path":"admin.css","mtime":"2019-10-10T17:12:05+08:00","size":846514,"digest":"2c2854b9a02158ded5a809aaf7144a8630b10354ab4e56fecc4dffcc713796cc","integrity":"sha256-LChUuaAhWN7VqAmq9xRKhjCxA1SrTlb+zE3/zHE3lsw="},"application-50059ae929866043b47015128702fcfba53d32a2df148e64e1d961c10651c6af.css":{"logical_path":"application.css","mtime":"2019-10-10T17:12:05+08:00","size":2001607,"digest":"50059ae929866043b47015128702fcfba53d32a2df148e64e1d961c10651c6af","integrity":"sha256-UAWa6SmGYEO0cBUShwL8+6U9MqLfFI5k4dlhwQZRxq8="},"admin-992cde09b6d17f00a49576ae2d9f1ced127244ba401ef5b7d677cab9741688d2.js":{"logical_path":"admin.js","mtime":"2019-10-16T16:11:32+08:00","size":4394790,"digest":"992cde09b6d17f00a49576ae2d9f1ced127244ba401ef5b7d677cab9741688d2","integrity":"sha256-mSzeCbbRfwCklXauLZ8c7RJyRLpAHvW31nfKuXQWiNI="},"admin-84f2a7791e275d6f820514370b3f968176b994b9dd7b8c3ba8bf48336b03f257.css":{"logical_path":"admin.css","mtime":"2019-10-16T19:25:40+08:00","size":846676,"digest":"84f2a7791e275d6f820514370b3f968176b994b9dd7b8c3ba8bf48336b03f257","integrity":"sha256-hPKneR4nXW+CBRQ3Cz+WgXa5lLnde4w7qL9IM2sD8lc="},"application-ef6bab84852baaf69a91fe6af875b6e1b118c55b4c7d165665c488fac80c4997.css":{"logical_path":"application.css","mtime":"2019-10-16T19:25:40+08:00","size":2001931,"digest":"ef6bab84852baaf69a91fe6af875b6e1b118c55b4c7d165665c488fac80c4997","integrity":"sha256-72urhIUrqvaakf5q+HW24bEYxVtMfRZWZcSI+sgMSZc="},"admin-c99030d305662f740aa84b6c925a1adbbaadaa07fd74e2655e64d44b4b97fc4a.js":{"logical_path":"admin.js","mtime":"2019-10-17T09:44:58+08:00","size":4394897,"digest":"c99030d305662f740aa84b6c925a1adbbaadaa07fd74e2655e64d44b4b97fc4a","integrity":"sha256-yZAw0wVmL3QKqEtskloa27qtqgf9dOJlXmTUS0uX/Eo="},"admin-534bde871d67f4d6fc8da611917d78be4066fc7593ba53ee92aa17068a199d6d.css":{"logical_path":"admin.css","mtime":"2019-10-17T10:22:41+08:00","size":846699,"digest":"534bde871d67f4d6fc8da611917d78be4066fc7593ba53ee92aa17068a199d6d","integrity":"sha256-U0vehx1n9Nb8jaYRkX14vkBm/HWTulPukqoXBooZnW0="},"cooperative-04cd6a60d41220d38ee45ce40b1d004e1d0bcd87c132fb1a7bab6144c1deb8d7.js":{"logical_path":"cooperative.js","mtime":"2019-10-17T10:17:56+08:00","size":4330072,"digest":"04cd6a60d41220d38ee45ce40b1d004e1d0bcd87c132fb1a7bab6144c1deb8d7","integrity":"sha256-BM1qYNQSINOO5FzkCx0ATh0LzYfBMvsae6thRMHeuNc="},"cooperative-a345bbfd8e38b70c9285ecc1747012ffcde429187983e2aea5657abb56b9b4f3.css":{"logical_path":"cooperative.css","mtime":"2019-10-17T10:21:41+08:00","size":830628,"digest":"a345bbfd8e38b70c9285ecc1747012ffcde429187983e2aea5657abb56b9b4f3","integrity":"sha256-o0W7/Y44twyShezBdHAS/83kKRh5g+KupWV6u1a5tPM="},"application-0e417478d56f42467e857cd186b29cbbc0d6c7c6e85c8a6f42f39ac618943de8.css":{"logical_path":"application.css","mtime":"2019-09-03T08:55:53+08:00","size":442932,"digest":"0e417478d56f42467e857cd186b29cbbc0d6c7c6e85c8a6f42f39ac618943de8","integrity":"sha256-DkF0eNVvQkZ+hXzRhrKcu8DWx8boXIpvQvOaxhiUPeg="},"cooperative-149f47b8675d60a8014ccff50f00f932ff69e2be286ffb74343bc4a3effb135b.js":{"logical_path":"cooperative.js","mtime":"2019-10-17T14:03:03+08:00","size":4338033,"digest":"149f47b8675d60a8014ccff50f00f932ff69e2be286ffb74343bc4a3effb135b","integrity":"sha256-FJ9HuGddYKgBTM/1DwD5Mv9p4r4ob/t0NDvEo+/7E1s="},"cooperative-6273b766d6ef11dd56174d868bab55e7f17af17546c888d2ba0dd0a6bcda76c8.css":{"logical_path":"cooperative.css","mtime":"2019-10-17T11:13:07+08:00","size":832914,"digest":"6273b766d6ef11dd56174d868bab55e7f17af17546c888d2ba0dd0a6bcda76c8","integrity":"sha256-YnO3ZtbvEd1WF02Gi6tV5/F68XVGyIjSug3Qprzadsg="},"admin-82f66cc80b5649c6530a562567f28fe8d05f7bc3b8221e0695b2216255c52ba6.js":{"logical_path":"admin.js","mtime":"2019-10-21T13:51:43+08:00","size":4397012,"digest":"82f66cc80b5649c6530a562567f28fe8d05f7bc3b8221e0695b2216255c52ba6","integrity":"sha256-gvZsyAtWScZTClYlZ/KP6NBfe8O4Ih4GlbIhYlXFK6Y="},"admin-1b5728d94f6bccfbcef452a760d94c3b6f31966bc65d7f89be077fc2ea512bec.js":{"logical_path":"admin.js","mtime":"2019-10-21T16:41:06+08:00","size":4397437,"digest":"1b5728d94f6bccfbcef452a760d94c3b6f31966bc65d7f89be077fc2ea512bec","integrity":"sha256-G1co2U9rzPvO9FKnYNlMO28xlmvGXX+Jvgd/wupRK+w="},"admin-c8c127fefa5eca98bca19832c246619318164e8f242635c07033e2423cc18a6f.js":{"logical_path":"admin.js","mtime":"2019-10-22T09:53:29+08:00","size":4408150,"digest":"c8c127fefa5eca98bca19832c246619318164e8f242635c07033e2423cc18a6f","integrity":"sha256-yMEn/vpeypi8oZgywkZhkxgWTo8kJjXAcDPiQjzBim8="},"admin-60d200c1fcdf61a60537d29ccf4479c6b1e5e904208870a63b8ee677c96b347e.css":{"logical_path":"admin.css","mtime":"2019-10-22T09:43:20+08:00","size":851150,"digest":"60d200c1fcdf61a60537d29ccf4479c6b1e5e904208870a63b8ee677c96b347e","integrity":"sha256-YNIAwfzfYaYFN9Kcz0R5xrHl6QQgiHCmO47md8lrNH4="},"cooperative-9fb7ac4ad44081fafd5ad2a3a1bfb7f4329ac96f28bc6446d1ff52b1e2e71286.js":{"logical_path":"cooperative.js","mtime":"2019-10-22T09:55:26+08:00","size":4338142,"digest":"9fb7ac4ad44081fafd5ad2a3a1bfb7f4329ac96f28bc6446d1ff52b1e2e71286","integrity":"sha256-n7esStRAgfr9WtKjob+39DKayW8ovGRG0f9SseLnEoY="},"admin-a11066081d60365ddf25d5867560d1ccdd3197dbe82a5b6e969cc940e3429ff1.js":{"logical_path":"admin.js","mtime":"2019-10-24T14:16:30+08:00","size":4524252,"digest":"a11066081d60365ddf25d5867560d1ccdd3197dbe82a5b6e969cc940e3429ff1","integrity":"sha256-oRBmCB1gNl3fJdWGdWDRzN0xl9voKltulpzJQONCn/E="},"admin-7ce3dd717f7d12fcbc64caf14200230a1e68db439be0ba1879077599ff2c32c6.css":{"logical_path":"admin.css","mtime":"2019-10-24T10:10:08+08:00","size":852772,"digest":"7ce3dd717f7d12fcbc64caf14200230a1e68db439be0ba1879077599ff2c32c6","integrity":"sha256-fOPdcX99Evy8ZMrxQgAjCh5o20Ob4LoYeQd1mf8sMsY="},"college-93904c65d52c125aec0a463b9fd98bedda0018b78707f806be22685cca5d3747.css":{"logical_path":"college.css","mtime":"2019-10-24T10:10:08+08:00","size":579546,"digest":"93904c65d52c125aec0a463b9fd98bedda0018b78707f806be22685cca5d3747","integrity":"sha256-k5BMZdUsElrsCkY7n9mL7doAGLeHB/gGviJoXMpdN0c="},"cooperative-84c79d26a36aff5b496551b6d21b1bfb726b1bbc4153435a366115e96c204e06.js":{"logical_path":"cooperative.js","mtime":"2019-10-24T14:17:15+08:00","size":4338225,"digest":"84c79d26a36aff5b496551b6d21b1bfb726b1bbc4153435a366115e96c204e06","integrity":"sha256-hMedJqNq/1tJZVG20hsb+3JrG7xBU0NaNmEV6WwgTgY="},"cooperative-10a9ee5177e196572573ccea460e133c748072e223fdb473d05ee72c991fbbe3.css":{"logical_path":"cooperative.css","mtime":"2019-10-24T10:10:08+08:00","size":833351,"digest":"10a9ee5177e196572573ccea460e133c748072e223fdb473d05ee72c991fbbe3","integrity":"sha256-EKnuUXfhllclc8zqRg4TPHSAcuIj/bRz0F7nLJkfu+M="},"admin-441d8f3722e5f73e5748aaeb6f517101474cb1eb48a99f119e561f08b9e9dc60.js":{"logical_path":"admin.js","mtime":"2019-10-24T16:08:56+08:00","size":4525031,"digest":"441d8f3722e5f73e5748aaeb6f517101474cb1eb48a99f119e561f08b9e9dc60","integrity":"sha256-RB2PNyLl9z5XSKrrb1FxAUdMsetIqZ8RnlYfCLnp3GA="},"admin-76c52986591f274f639ad48dfbb480a1aeeec7647b6fa28fa541e78a064b6316.css":{"logical_path":"admin.css","mtime":"2019-10-24T15:25:17+08:00","size":867945,"digest":"76c52986591f274f639ad48dfbb480a1aeeec7647b6fa28fa541e78a064b6316","integrity":"sha256-dsUphlkfJ09jmtSN+7SAoa7ux2R7b6KPpUHnigZLYxY="},"cooperative-6c4c663b6b5071535bab2b76cc5e05ab5682665857763a76bf4f01afef51be5a.js":{"logical_path":"cooperative.js","mtime":"2019-10-24T17:56:20+08:00","size":4339039,"digest":"6c4c663b6b5071535bab2b76cc5e05ab5682665857763a76bf4f01afef51be5a","integrity":"sha256-bExmO2tQcVNbqyt2zF4Fq1aCZlhXdjp2v08Br+9Rvlo="},"admin-c63acadd431434979db50540a0bf7e65c75e1de0d1b449919f2cce89a0548d43.js":{"logical_path":"admin.js","mtime":"2019-10-24T18:12:33+08:00","size":4533182,"digest":"c63acadd431434979db50540a0bf7e65c75e1de0d1b449919f2cce89a0548d43","integrity":"sha256-xjrK3UMUNJedtQVAoL9+ZcdeHeDRtEmRnyzOiaBUjUM="},"admin-bd832b9a35eb3743dde9218beab61f9bcde1508767ad68dbedb1c89a4bb65c3a.css":{"logical_path":"admin.css","mtime":"2019-10-24T17:56:20+08:00","size":861450,"digest":"bd832b9a35eb3743dde9218beab61f9bcde1508767ad68dbedb1c89a4bb65c3a","integrity":"sha256-vYMrmjXrN0Pd6SGL6rYfm83hUIdnrWjb7bHImku2XDo="},"college-fa202780f3e7f96cb9b5916c6f0d7dd9e03cb746864bbd2dd491ed001c30ad8f.css":{"logical_path":"college.css","mtime":"2019-10-24T17:56:20+08:00","size":571936,"digest":"fa202780f3e7f96cb9b5916c6f0d7dd9e03cb746864bbd2dd491ed001c30ad8f","integrity":"sha256-+iAngPPn+Wy5tZFsbw192eA8t0aGS70t1JHtABwwrY8="},"cooperative-4f233e8963b0bd80bc56b71c209d31464d314240ac8d686806baf99511c53ad0.css":{"logical_path":"cooperative.css","mtime":"2019-10-24T17:56:20+08:00","size":825741,"digest":"4f233e8963b0bd80bc56b71c209d31464d314240ac8d686806baf99511c53ad0","integrity":"sha256-TyM+iWOwvYC8VrccIJ0xRk0xQkCsjWhoBrr5lRHFOtA="},"application-8c9d6bb61c50908f584b3070c79aeb95f25c1166d39e07da5e95438b39ca0de9.css":{"logical_path":"application.css","mtime":"2019-10-21T22:52:15+08:00","size":436995,"digest":"8c9d6bb61c50908f584b3070c79aeb95f25c1166d39e07da5e95438b39ca0de9","integrity":"sha256-jJ1rthxQkI9YSzBwx5rrlfJcEWbTngfaXpVDiznKDek="},"admin-bf2bd889f02d15c4913aa260497d72afeb26d701aac49a4ef6a75619af030152.js":{"logical_path":"admin.js","mtime":"2019-10-25T10:12:17+08:00","size":4533673,"digest":"bf2bd889f02d15c4913aa260497d72afeb26d701aac49a4ef6a75619af030152","integrity":"sha256-vyvYifAtFcSROqJgSX1yr+sm1wGqxJpO9qdWGa8DAVI="},"admin-46e564d29ffae5c71ae9b5e36dc0bd5de57b10f396eb2005bfb9cf51e7744cdd.css":{"logical_path":"admin.css","mtime":"2019-10-25T10:12:17+08:00","size":870355,"digest":"46e564d29ffae5c71ae9b5e36dc0bd5de57b10f396eb2005bfb9cf51e7744cdd","integrity":"sha256-RuVk0p/65cca6bXjbcC9XeV7EPOW6yAFv7nPUed0TN0="},"college-2299e05f5e9b640e333ece624d4ab18a678fdabff0bc18b69a9c2e3de49cba8e.css":{"logical_path":"college.css","mtime":"2019-10-25T10:12:17+08:00","size":580077,"digest":"2299e05f5e9b640e333ece624d4ab18a678fdabff0bc18b69a9c2e3de49cba8e","integrity":"sha256-IpngX16bZA4zPs5iTUqximeP2r/wvBi2mpwuPeScuo4="},"cooperative-f1ac8f14ad6ade8d1f79ca49ea9c79be77d49aae9d2705ca672e78444481700d.js":{"logical_path":"cooperative.js","mtime":"2019-10-25T11:01:38+08:00","size":4409145,"digest":"f1ac8f14ad6ade8d1f79ca49ea9c79be77d49aae9d2705ca672e78444481700d","integrity":"sha256-8ayPFK1q3o0fecpJ6px5vnfUmq6dJwXKZy54RESBcA0="},"cooperative-8057adee2454dbc9d648305faf9ede9824f40d3bd0184e816e8035bb7f1e730b.css":{"logical_path":"cooperative.css","mtime":"2019-10-25T10:12:17+08:00","size":833882,"digest":"8057adee2454dbc9d648305faf9ede9824f40d3bd0184e816e8035bb7f1e730b","integrity":"sha256-gFet7iRU28nWSDBfr57emCT0DTvQGE6BboA1u38ecws="},"admin-6f9bb9720e7e5040ae559a8fae11553313f77552a76416b3a9fe77198471964d.js":{"logical_path":"admin.js","mtime":"2019-10-25T17:00:09+08:00","size":4554537,"digest":"6f9bb9720e7e5040ae559a8fae11553313f77552a76416b3a9fe77198471964d","integrity":"sha256-b5u5cg5+UECuVZqPrhFVMxP3dVKnZBazqf53GYRxlk0="},"admin-ab3e0f7240ae4df8d1585c8d5e99df41edd3305ecc2abadcf8820796e1d9fc65.css":{"logical_path":"admin.css","mtime":"2019-10-25T09:55:22+08:00","size":862288,"digest":"ab3e0f7240ae4df8d1585c8d5e99df41edd3305ecc2abadcf8820796e1d9fc65","integrity":"sha256-qz4PckCuTfjRWFyNXpnfQe3TMF7MKrrc+IIHluHZ/GU="},"college-2fdfc5431b46ad4a454a25386dbcbc390466886f76b85fdb7e3f75018196a870.css":{"logical_path":"college.css","mtime":"2019-10-25T09:55:22+08:00","size":572010,"digest":"2fdfc5431b46ad4a454a25386dbcbc390466886f76b85fdb7e3f75018196a870","integrity":"sha256-L9/FQxtGrUpFSiU4bby8OQRmiG92uF/bfj91AYGWqHA="},"cooperative-47d516a0904d0633e82c1de39a6ec4c9e6de0a37813843e01d4bacf97e8b2ebf.css":{"logical_path":"cooperative.css","mtime":"2019-10-25T09:55:22+08:00","size":825815,"digest":"47d516a0904d0633e82c1de39a6ec4c9e6de0a37813843e01d4bacf97e8b2ebf","integrity":"sha256-R9UWoJBNBjPoLB3jmm7EyebeCjeBOEPgHUus+X6LLr8="},"admin-839af7c0d2917a8f8019d0376ea17cec050ef4d19d98c6c10de91f5d2bc81adf.js":{"logical_path":"admin.js","mtime":"2019-10-26T11:25:08+08:00","size":4554543,"digest":"839af7c0d2917a8f8019d0376ea17cec050ef4d19d98c6c10de91f5d2bc81adf","integrity":"sha256-g5r3wNKReo+AGdA3bqF87AUO9NGdmMbBDekfXSvIGt8="},"admin-52d692608c620ae47717a2ac88377e55b9b58af0acdf3f777814a1fd47b6594b.js":{"logical_path":"admin.js","mtime":"2019-10-26T17:16:18+08:00","size":4553202,"digest":"52d692608c620ae47717a2ac88377e55b9b58af0acdf3f777814a1fd47b6594b","integrity":"sha256-UtaSYIxiCuR3F6KsiDd+Vbm1ivCs3z93eBSh/Ue2WUs="},"admin-b58555ae641bbaa61e3af0ddd2756acc3c5de9023c737815c72132cc67c9a403.js":{"logical_path":"admin.js","mtime":"2019-10-27T13:06:02+08:00","size":4553607,"digest":"b58555ae641bbaa61e3af0ddd2756acc3c5de9023c737815c72132cc67c9a403","integrity":"sha256-tYVVrmQbuqYeOvDd0nVqzDxd6QI8c3gVxyEyzGfJpAM="},"admin-b95c48ea51f392ce7c4024d0d8b2c42dfe48528a1898ec3f7818e0cda2a4f224.js":{"logical_path":"admin.js","mtime":"2019-10-28T10:46:29+08:00","size":4554008,"digest":"b95c48ea51f392ce7c4024d0d8b2c42dfe48528a1898ec3f7818e0cda2a4f224","integrity":"sha256-uVxI6lHzks58QCTQ2LLELf5IUooYmOw/eBjgzaKk8iQ="},"admin-1f2e5a2a28462df8bcddfbdbfbebdc36a761ca7a94962ae71d37fb8c06fc5f94.js":{"logical_path":"admin.js","mtime":"2019-10-29T08:57:11+08:00","size":4554938,"digest":"1f2e5a2a28462df8bcddfbdbfbebdc36a761ca7a94962ae71d37fb8c06fc5f94","integrity":"sha256-Hy5aKihGLfi83fvb++vcNqdhynqUlirnHTf7jAb8X5Q="},"admin-cb3d4541758ef2bcbfe16f518d48f85097d0547a587de222d2fc13dbdd474b4b.js":{"logical_path":"admin.js","mtime":"2019-10-29T14:06:13+08:00","size":4556541,"digest":"cb3d4541758ef2bcbfe16f518d48f85097d0547a587de222d2fc13dbdd474b4b","integrity":"sha256-yz1FQXWO8ry/4W9RjUj4UJfQVHpYfeIi0vwT291HS0s="},"admin-6a76c25b6691b4f436608be28606d90c907ba8f033f5f47c6c20d7bf11251cb6.css":{"logical_path":"admin.css","mtime":"2019-10-29T14:22:47+08:00","size":871031,"digest":"6a76c25b6691b4f436608be28606d90c907ba8f033f5f47c6c20d7bf11251cb6","integrity":"sha256-anbCW2aRtPQ2YIvihgbZDJB7qPAz9fR8bCDXvxElHLY="},"admin-ba909dfe0de4d216bedb3c743144321e4023837568abab1d3ee9a28b2faa5925.js":{"logical_path":"admin.js","mtime":"2019-10-29T14:43:01+08:00","size":4556622,"digest":"ba909dfe0de4d216bedb3c743144321e4023837568abab1d3ee9a28b2faa5925","integrity":"sha256-upCd/g3k0ha+2zx0MUQyHkAjg3Voq6sdPumiiy+qWSU="}},"assets":{"admin.js":"admin-ba909dfe0de4d216bedb3c743144321e4023837568abab1d3ee9a28b2faa5925.js","admin.css":"admin-6a76c25b6691b4f436608be28606d90c907ba8f033f5f47c6c20d7bf11251cb6.css","font-awesome/fontawesome-webfont.eot":"font-awesome/fontawesome-webfont-7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979.eot","font-awesome/fontawesome-webfont.woff2":"font-awesome/fontawesome-webfont-2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe.woff2","font-awesome/fontawesome-webfont.woff":"font-awesome/fontawesome-webfont-ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07.woff","font-awesome/fontawesome-webfont.ttf":"font-awesome/fontawesome-webfont-aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8.ttf","font-awesome/fontawesome-webfont.svg":"font-awesome/fontawesome-webfont-ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4.svg","college.js":"college-18f5e8400331634e898a35acc2187815c096c25e0ab74aba341ae916166cd287.js","college.css":"college-2299e05f5e9b640e333ece624d4ab18a678fdabff0bc18b69a9c2e3de49cba8e.css","logo.png":"logo-7ff112568709bf97f9898fe87249b7a8f200ff1f48d537d85af87215f1870423.png","application.js":"application-9cfbc3d792599a1d0de5c7b84209e1c2b2e60336f0f01e19f0581663918708fb.js","application.css":"application-0e417478d56f42467e857cd186b29cbbc0d6c7c6e85c8a6f42f39ac618943de8.css","cooperative.js":"cooperative-f1ac8f14ad6ade8d1f79ca49ea9c79be77d49aae9d2705ca672e78444481700d.js","cooperative.css":"cooperative-8057adee2454dbc9d648305faf9ede9824f40d3bd0184e816e8035bb7f1e730b.css"}} \ No newline at end of file +{"files":{"admin-cd9ca8bacc973ce2dbace30c97f6c40bc08e2c2ee44972f668e738e1902c0121.js":{"logical_path":"admin.js","mtime":"2019-09-11T16:20:07+08:00","size":4350881,"digest":"cd9ca8bacc973ce2dbace30c97f6c40bc08e2c2ee44972f668e738e1902c0121","integrity":"sha256-zZyousyXPOLbrOMMl/bEC8COLC7kSXL2aOc44ZAsASE="},"admin-a1b3356efe50ff4717cf22475639b5333c5354ba03fd107c9b7a8d4ae76f47aa.css":{"logical_path":"admin.css","mtime":"2019-09-11T16:20:07+08:00","size":773445,"digest":"a1b3356efe50ff4717cf22475639b5333c5354ba03fd107c9b7a8d4ae76f47aa","integrity":"sha256-obM1bv5Q/0cXzyJHVjm1MzxTVLoD/RB8m3qNSudvR6o="},"font-awesome/fontawesome-webfont-7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979.eot":{"logical_path":"font-awesome/fontawesome-webfont.eot","mtime":"2019-08-14T17:22:43+08:00","size":165742,"digest":"7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979","integrity":"sha256-e/yrbbmdXPvxcFygU23ceFhUMsxfpBu9etDwCQM7KXk="},"font-awesome/fontawesome-webfont-2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe.woff2":{"logical_path":"font-awesome/fontawesome-webfont.woff2","mtime":"2019-08-14T17:22:43+08:00","size":77160,"digest":"2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe","integrity":"sha256-Kt78vAQefRj88tQXh53FoJmXqmTWdbejxLbOM9oT8/4="},"font-awesome/fontawesome-webfont-ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07.woff":{"logical_path":"font-awesome/fontawesome-webfont.woff","mtime":"2019-08-14T17:22:43+08:00","size":98024,"digest":"ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07","integrity":"sha256-ugxZ3rVFD1y0Gz+TYJ7i0NmVQVh33foiPoqKdTNHTwc="},"font-awesome/fontawesome-webfont-aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8.ttf":{"logical_path":"font-awesome/fontawesome-webfont.ttf","mtime":"2019-08-14T17:22:43+08:00","size":165548,"digest":"aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8","integrity":"sha256-qljzPyOaD7AvXHpsRcBD16msmgkzNYBmlOzW1O3A1qg="},"font-awesome/fontawesome-webfont-ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4.svg":{"logical_path":"font-awesome/fontawesome-webfont.svg","mtime":"2019-08-14T17:22:43+08:00","size":444379,"digest":"ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4","integrity":"sha256-rWFXkmwWIrpOHQPUePFUE2hSS/xG9R5C/g2UX37zI+Q="},"college-18f5e8400331634e898a35acc2187815c096c25e0ab74aba341ae916166cd287.js":{"logical_path":"college.js","mtime":"2019-10-24T15:25:17+08:00","size":3352744,"digest":"18f5e8400331634e898a35acc2187815c096c25e0ab74aba341ae916166cd287","integrity":"sha256-GPXoQAMxY06JijWswhh4FcCWwl4Kt0q6NBrpFhZs0oc="},"college-944d4273f62c7538368b9017fdd3387b5e3bea31a87873770eb231324546d4d9.css":{"logical_path":"college.css","mtime":"2019-09-11T16:20:07+08:00","size":546841,"digest":"944d4273f62c7538368b9017fdd3387b5e3bea31a87873770eb231324546d4d9","integrity":"sha256-lE1Cc/YsdTg2i5AX/dM4e1476jGoeHN3DrIxMkVG1Nk="},"logo-7ff112568709bf97f9898fe87249b7a8f200ff1f48d537d85af87215f1870423.png":{"logical_path":"logo.png","mtime":"2019-09-03T08:55:53+08:00","size":2816,"digest":"7ff112568709bf97f9898fe87249b7a8f200ff1f48d537d85af87215f1870423","integrity":"sha256-f/ESVocJv5f5iY/ockm3qPIA/x9I1TfYWvhyFfGHBCM="},"application-9cfbc3d792599a1d0de5c7b84209e1c2b2e60336f0f01e19f0581663918708fb.js":{"logical_path":"application.js","mtime":"2019-10-24T15:25:17+08:00","size":600706,"digest":"9cfbc3d792599a1d0de5c7b84209e1c2b2e60336f0f01e19f0581663918708fb","integrity":"sha256-nPvD15JZmh0N5ce4QgnhwrLmAzbw8B4Z8FgWY5GHCPs="},"application-5eb87c6e13676d0183317debce17fade27e68c4acee28c419438da15d53c94f2.css":{"logical_path":"application.css","mtime":"2019-09-11T16:20:07+08:00","size":1844002,"digest":"5eb87c6e13676d0183317debce17fade27e68c4acee28c419438da15d53c94f2","integrity":"sha256-Xrh8bhNnbQGDMX3rzhf63ifmjErO4oxBlDjaFdU8lPI="},"admin-c9e5ebe6191548550e27514196ea125cfbb402820ec125a0c9acf99d2d378fe4.js":{"logical_path":"admin.js","mtime":"2019-09-21T15:28:08+08:00","size":4382031,"digest":"c9e5ebe6191548550e27514196ea125cfbb402820ec125a0c9acf99d2d378fe4","integrity":"sha256-yeXr5hkVSFUOJ1FBluoSXPu0AoIOwSWgyaz5nS03j+Q="},"admin-59c59f8cae8bef4a8359286c985458110c9d03ea121516595c988943f4717c38.css":{"logical_path":"admin.css","mtime":"2019-09-21T14:49:04+08:00","size":840093,"digest":"59c59f8cae8bef4a8359286c985458110c9d03ea121516595c988943f4717c38","integrity":"sha256-WcWfjK6L70qDWShsmFRYEQydA+oSFRZZXJiJQ/RxfDg="},"college-38f953d6ba5b85d3fab63cb3c2bbf0d057ccc6454d07cfaafac3b06da37b8437.css":{"logical_path":"college.css","mtime":"2019-09-16T13:56:09+08:00","size":579109,"digest":"38f953d6ba5b85d3fab63cb3c2bbf0d057ccc6454d07cfaafac3b06da37b8437","integrity":"sha256-OPlT1rpbhdP6tjyzwrvw0FfMxkVNB8+q+sOwbaN7hDc="},"application-646b1158a4e8c1f13e684d6fe9025abc75f8d3ba5256e440802c0398223374f3.css":{"logical_path":"application.css","mtime":"2019-09-21T14:49:04+08:00","size":1988767,"digest":"646b1158a4e8c1f13e684d6fe9025abc75f8d3ba5256e440802c0398223374f3","integrity":"sha256-ZGsRWKTowfE+aE1v6QJavHX407pSVuRAgCwDmCIzdPM="},"admin-a47e37c0ec7cf5f22380249776d1e82d65b6b6aa272ed7389185aa200fa40751.js":{"logical_path":"admin.js","mtime":"2019-09-25T15:33:05+08:00","size":4383107,"digest":"a47e37c0ec7cf5f22380249776d1e82d65b6b6aa272ed7389185aa200fa40751","integrity":"sha256-pH43wOx89fIjgCSXdtHoLWW2tqonLtc4kYWqIA+kB1E="},"admin-432c4eac09b036c57ff1e88d902b8aa7df81164e4b419bac557cf1366c1d3ad9.js":{"logical_path":"admin.js","mtime":"2019-09-25T15:35:20+08:00","size":4383103,"digest":"432c4eac09b036c57ff1e88d902b8aa7df81164e4b419bac557cf1366c1d3ad9","integrity":"sha256-QyxOrAmwNsV/8eiNkCuKp9+BFk5LQZusVXzxNmwdOtk="},"admin-978e5ce607f77c26814a174f480da79ac246c2201868ef84654aa03bb6727b5a.js":{"logical_path":"admin.js","mtime":"2019-09-30T14:43:41+08:00","size":4387200,"digest":"978e5ce607f77c26814a174f480da79ac246c2201868ef84654aa03bb6727b5a","integrity":"sha256-l45c5gf3fCaBShdPSA2nmsJGwiAYaO+EZUqgO7Zye1o="},"admin-896281f4731722b0c084dbb1af21d0f34a5bc142d58aff57b391864ab71ddca7.css":{"logical_path":"admin.css","mtime":"2019-09-30T14:43:41+08:00","size":842269,"digest":"896281f4731722b0c084dbb1af21d0f34a5bc142d58aff57b391864ab71ddca7","integrity":"sha256-iWKB9HMXIrDAhNuxryHQ80pbwULViv9Xs5GGSrcd3Kc="},"application-97f313e9bb7d25476649f7d7215959cf421480fd0a3785d1956953bf94a1e8bd.css":{"logical_path":"application.css","mtime":"2019-09-30T14:43:41+08:00","size":1993118,"digest":"97f313e9bb7d25476649f7d7215959cf421480fd0a3785d1956953bf94a1e8bd","integrity":"sha256-l/MT6bt9JUdmSffXIVlZz0IUgP0KN4XRlWlTv5Sh6L0="},"admin-2cdb23442fa735025385b88f2900df04fef38b61530041a6dbe375ef0f0ae888.js":{"logical_path":"admin.js","mtime":"2019-10-11T14:38:33+08:00","size":4394616,"digest":"2cdb23442fa735025385b88f2900df04fef38b61530041a6dbe375ef0f0ae888","integrity":"sha256-LNsjRC+nNQJThbiPKQDfBP7zi2FTAEGm2+N17w8K6Ig="},"admin-2c2854b9a02158ded5a809aaf7144a8630b10354ab4e56fecc4dffcc713796cc.css":{"logical_path":"admin.css","mtime":"2019-10-10T17:12:05+08:00","size":846514,"digest":"2c2854b9a02158ded5a809aaf7144a8630b10354ab4e56fecc4dffcc713796cc","integrity":"sha256-LChUuaAhWN7VqAmq9xRKhjCxA1SrTlb+zE3/zHE3lsw="},"application-50059ae929866043b47015128702fcfba53d32a2df148e64e1d961c10651c6af.css":{"logical_path":"application.css","mtime":"2019-10-10T17:12:05+08:00","size":2001607,"digest":"50059ae929866043b47015128702fcfba53d32a2df148e64e1d961c10651c6af","integrity":"sha256-UAWa6SmGYEO0cBUShwL8+6U9MqLfFI5k4dlhwQZRxq8="},"admin-992cde09b6d17f00a49576ae2d9f1ced127244ba401ef5b7d677cab9741688d2.js":{"logical_path":"admin.js","mtime":"2019-10-16T16:11:32+08:00","size":4394790,"digest":"992cde09b6d17f00a49576ae2d9f1ced127244ba401ef5b7d677cab9741688d2","integrity":"sha256-mSzeCbbRfwCklXauLZ8c7RJyRLpAHvW31nfKuXQWiNI="},"admin-84f2a7791e275d6f820514370b3f968176b994b9dd7b8c3ba8bf48336b03f257.css":{"logical_path":"admin.css","mtime":"2019-10-16T19:25:40+08:00","size":846676,"digest":"84f2a7791e275d6f820514370b3f968176b994b9dd7b8c3ba8bf48336b03f257","integrity":"sha256-hPKneR4nXW+CBRQ3Cz+WgXa5lLnde4w7qL9IM2sD8lc="},"application-ef6bab84852baaf69a91fe6af875b6e1b118c55b4c7d165665c488fac80c4997.css":{"logical_path":"application.css","mtime":"2019-10-16T19:25:40+08:00","size":2001931,"digest":"ef6bab84852baaf69a91fe6af875b6e1b118c55b4c7d165665c488fac80c4997","integrity":"sha256-72urhIUrqvaakf5q+HW24bEYxVtMfRZWZcSI+sgMSZc="},"admin-c99030d305662f740aa84b6c925a1adbbaadaa07fd74e2655e64d44b4b97fc4a.js":{"logical_path":"admin.js","mtime":"2019-10-17T09:44:58+08:00","size":4394897,"digest":"c99030d305662f740aa84b6c925a1adbbaadaa07fd74e2655e64d44b4b97fc4a","integrity":"sha256-yZAw0wVmL3QKqEtskloa27qtqgf9dOJlXmTUS0uX/Eo="},"admin-534bde871d67f4d6fc8da611917d78be4066fc7593ba53ee92aa17068a199d6d.css":{"logical_path":"admin.css","mtime":"2019-10-17T10:22:41+08:00","size":846699,"digest":"534bde871d67f4d6fc8da611917d78be4066fc7593ba53ee92aa17068a199d6d","integrity":"sha256-U0vehx1n9Nb8jaYRkX14vkBm/HWTulPukqoXBooZnW0="},"cooperative-04cd6a60d41220d38ee45ce40b1d004e1d0bcd87c132fb1a7bab6144c1deb8d7.js":{"logical_path":"cooperative.js","mtime":"2019-10-17T10:17:56+08:00","size":4330072,"digest":"04cd6a60d41220d38ee45ce40b1d004e1d0bcd87c132fb1a7bab6144c1deb8d7","integrity":"sha256-BM1qYNQSINOO5FzkCx0ATh0LzYfBMvsae6thRMHeuNc="},"cooperative-a345bbfd8e38b70c9285ecc1747012ffcde429187983e2aea5657abb56b9b4f3.css":{"logical_path":"cooperative.css","mtime":"2019-10-17T10:21:41+08:00","size":830628,"digest":"a345bbfd8e38b70c9285ecc1747012ffcde429187983e2aea5657abb56b9b4f3","integrity":"sha256-o0W7/Y44twyShezBdHAS/83kKRh5g+KupWV6u1a5tPM="},"application-0e417478d56f42467e857cd186b29cbbc0d6c7c6e85c8a6f42f39ac618943de8.css":{"logical_path":"application.css","mtime":"2019-09-03T08:55:53+08:00","size":442932,"digest":"0e417478d56f42467e857cd186b29cbbc0d6c7c6e85c8a6f42f39ac618943de8","integrity":"sha256-DkF0eNVvQkZ+hXzRhrKcu8DWx8boXIpvQvOaxhiUPeg="},"cooperative-149f47b8675d60a8014ccff50f00f932ff69e2be286ffb74343bc4a3effb135b.js":{"logical_path":"cooperative.js","mtime":"2019-10-17T14:03:03+08:00","size":4338033,"digest":"149f47b8675d60a8014ccff50f00f932ff69e2be286ffb74343bc4a3effb135b","integrity":"sha256-FJ9HuGddYKgBTM/1DwD5Mv9p4r4ob/t0NDvEo+/7E1s="},"cooperative-6273b766d6ef11dd56174d868bab55e7f17af17546c888d2ba0dd0a6bcda76c8.css":{"logical_path":"cooperative.css","mtime":"2019-10-17T11:13:07+08:00","size":832914,"digest":"6273b766d6ef11dd56174d868bab55e7f17af17546c888d2ba0dd0a6bcda76c8","integrity":"sha256-YnO3ZtbvEd1WF02Gi6tV5/F68XVGyIjSug3Qprzadsg="},"admin-82f66cc80b5649c6530a562567f28fe8d05f7bc3b8221e0695b2216255c52ba6.js":{"logical_path":"admin.js","mtime":"2019-10-21T13:51:43+08:00","size":4397012,"digest":"82f66cc80b5649c6530a562567f28fe8d05f7bc3b8221e0695b2216255c52ba6","integrity":"sha256-gvZsyAtWScZTClYlZ/KP6NBfe8O4Ih4GlbIhYlXFK6Y="},"admin-1b5728d94f6bccfbcef452a760d94c3b6f31966bc65d7f89be077fc2ea512bec.js":{"logical_path":"admin.js","mtime":"2019-10-21T16:41:06+08:00","size":4397437,"digest":"1b5728d94f6bccfbcef452a760d94c3b6f31966bc65d7f89be077fc2ea512bec","integrity":"sha256-G1co2U9rzPvO9FKnYNlMO28xlmvGXX+Jvgd/wupRK+w="},"admin-c8c127fefa5eca98bca19832c246619318164e8f242635c07033e2423cc18a6f.js":{"logical_path":"admin.js","mtime":"2019-10-22T09:53:29+08:00","size":4408150,"digest":"c8c127fefa5eca98bca19832c246619318164e8f242635c07033e2423cc18a6f","integrity":"sha256-yMEn/vpeypi8oZgywkZhkxgWTo8kJjXAcDPiQjzBim8="},"admin-60d200c1fcdf61a60537d29ccf4479c6b1e5e904208870a63b8ee677c96b347e.css":{"logical_path":"admin.css","mtime":"2019-10-22T09:43:20+08:00","size":851150,"digest":"60d200c1fcdf61a60537d29ccf4479c6b1e5e904208870a63b8ee677c96b347e","integrity":"sha256-YNIAwfzfYaYFN9Kcz0R5xrHl6QQgiHCmO47md8lrNH4="},"cooperative-9fb7ac4ad44081fafd5ad2a3a1bfb7f4329ac96f28bc6446d1ff52b1e2e71286.js":{"logical_path":"cooperative.js","mtime":"2019-10-22T09:55:26+08:00","size":4338142,"digest":"9fb7ac4ad44081fafd5ad2a3a1bfb7f4329ac96f28bc6446d1ff52b1e2e71286","integrity":"sha256-n7esStRAgfr9WtKjob+39DKayW8ovGRG0f9SseLnEoY="},"admin-a11066081d60365ddf25d5867560d1ccdd3197dbe82a5b6e969cc940e3429ff1.js":{"logical_path":"admin.js","mtime":"2019-10-24T14:16:30+08:00","size":4524252,"digest":"a11066081d60365ddf25d5867560d1ccdd3197dbe82a5b6e969cc940e3429ff1","integrity":"sha256-oRBmCB1gNl3fJdWGdWDRzN0xl9voKltulpzJQONCn/E="},"admin-7ce3dd717f7d12fcbc64caf14200230a1e68db439be0ba1879077599ff2c32c6.css":{"logical_path":"admin.css","mtime":"2019-10-24T10:10:08+08:00","size":852772,"digest":"7ce3dd717f7d12fcbc64caf14200230a1e68db439be0ba1879077599ff2c32c6","integrity":"sha256-fOPdcX99Evy8ZMrxQgAjCh5o20Ob4LoYeQd1mf8sMsY="},"college-93904c65d52c125aec0a463b9fd98bedda0018b78707f806be22685cca5d3747.css":{"logical_path":"college.css","mtime":"2019-10-24T10:10:08+08:00","size":579546,"digest":"93904c65d52c125aec0a463b9fd98bedda0018b78707f806be22685cca5d3747","integrity":"sha256-k5BMZdUsElrsCkY7n9mL7doAGLeHB/gGviJoXMpdN0c="},"cooperative-84c79d26a36aff5b496551b6d21b1bfb726b1bbc4153435a366115e96c204e06.js":{"logical_path":"cooperative.js","mtime":"2019-10-24T14:17:15+08:00","size":4338225,"digest":"84c79d26a36aff5b496551b6d21b1bfb726b1bbc4153435a366115e96c204e06","integrity":"sha256-hMedJqNq/1tJZVG20hsb+3JrG7xBU0NaNmEV6WwgTgY="},"cooperative-10a9ee5177e196572573ccea460e133c748072e223fdb473d05ee72c991fbbe3.css":{"logical_path":"cooperative.css","mtime":"2019-10-24T10:10:08+08:00","size":833351,"digest":"10a9ee5177e196572573ccea460e133c748072e223fdb473d05ee72c991fbbe3","integrity":"sha256-EKnuUXfhllclc8zqRg4TPHSAcuIj/bRz0F7nLJkfu+M="},"admin-441d8f3722e5f73e5748aaeb6f517101474cb1eb48a99f119e561f08b9e9dc60.js":{"logical_path":"admin.js","mtime":"2019-10-24T16:08:56+08:00","size":4525031,"digest":"441d8f3722e5f73e5748aaeb6f517101474cb1eb48a99f119e561f08b9e9dc60","integrity":"sha256-RB2PNyLl9z5XSKrrb1FxAUdMsetIqZ8RnlYfCLnp3GA="},"admin-76c52986591f274f639ad48dfbb480a1aeeec7647b6fa28fa541e78a064b6316.css":{"logical_path":"admin.css","mtime":"2019-10-24T15:25:17+08:00","size":867945,"digest":"76c52986591f274f639ad48dfbb480a1aeeec7647b6fa28fa541e78a064b6316","integrity":"sha256-dsUphlkfJ09jmtSN+7SAoa7ux2R7b6KPpUHnigZLYxY="},"cooperative-6c4c663b6b5071535bab2b76cc5e05ab5682665857763a76bf4f01afef51be5a.js":{"logical_path":"cooperative.js","mtime":"2019-10-24T17:56:20+08:00","size":4339039,"digest":"6c4c663b6b5071535bab2b76cc5e05ab5682665857763a76bf4f01afef51be5a","integrity":"sha256-bExmO2tQcVNbqyt2zF4Fq1aCZlhXdjp2v08Br+9Rvlo="},"admin-c63acadd431434979db50540a0bf7e65c75e1de0d1b449919f2cce89a0548d43.js":{"logical_path":"admin.js","mtime":"2019-10-24T18:12:33+08:00","size":4533182,"digest":"c63acadd431434979db50540a0bf7e65c75e1de0d1b449919f2cce89a0548d43","integrity":"sha256-xjrK3UMUNJedtQVAoL9+ZcdeHeDRtEmRnyzOiaBUjUM="},"admin-bd832b9a35eb3743dde9218beab61f9bcde1508767ad68dbedb1c89a4bb65c3a.css":{"logical_path":"admin.css","mtime":"2019-10-24T17:56:20+08:00","size":861450,"digest":"bd832b9a35eb3743dde9218beab61f9bcde1508767ad68dbedb1c89a4bb65c3a","integrity":"sha256-vYMrmjXrN0Pd6SGL6rYfm83hUIdnrWjb7bHImku2XDo="},"college-fa202780f3e7f96cb9b5916c6f0d7dd9e03cb746864bbd2dd491ed001c30ad8f.css":{"logical_path":"college.css","mtime":"2019-10-24T17:56:20+08:00","size":571936,"digest":"fa202780f3e7f96cb9b5916c6f0d7dd9e03cb746864bbd2dd491ed001c30ad8f","integrity":"sha256-+iAngPPn+Wy5tZFsbw192eA8t0aGS70t1JHtABwwrY8="},"cooperative-4f233e8963b0bd80bc56b71c209d31464d314240ac8d686806baf99511c53ad0.css":{"logical_path":"cooperative.css","mtime":"2019-10-24T17:56:20+08:00","size":825741,"digest":"4f233e8963b0bd80bc56b71c209d31464d314240ac8d686806baf99511c53ad0","integrity":"sha256-TyM+iWOwvYC8VrccIJ0xRk0xQkCsjWhoBrr5lRHFOtA="},"application-8c9d6bb61c50908f584b3070c79aeb95f25c1166d39e07da5e95438b39ca0de9.css":{"logical_path":"application.css","mtime":"2019-10-21T22:52:15+08:00","size":436995,"digest":"8c9d6bb61c50908f584b3070c79aeb95f25c1166d39e07da5e95438b39ca0de9","integrity":"sha256-jJ1rthxQkI9YSzBwx5rrlfJcEWbTngfaXpVDiznKDek="},"admin-bf2bd889f02d15c4913aa260497d72afeb26d701aac49a4ef6a75619af030152.js":{"logical_path":"admin.js","mtime":"2019-10-25T10:12:17+08:00","size":4533673,"digest":"bf2bd889f02d15c4913aa260497d72afeb26d701aac49a4ef6a75619af030152","integrity":"sha256-vyvYifAtFcSROqJgSX1yr+sm1wGqxJpO9qdWGa8DAVI="},"admin-46e564d29ffae5c71ae9b5e36dc0bd5de57b10f396eb2005bfb9cf51e7744cdd.css":{"logical_path":"admin.css","mtime":"2019-10-25T10:12:17+08:00","size":870355,"digest":"46e564d29ffae5c71ae9b5e36dc0bd5de57b10f396eb2005bfb9cf51e7744cdd","integrity":"sha256-RuVk0p/65cca6bXjbcC9XeV7EPOW6yAFv7nPUed0TN0="},"college-2299e05f5e9b640e333ece624d4ab18a678fdabff0bc18b69a9c2e3de49cba8e.css":{"logical_path":"college.css","mtime":"2019-10-25T10:12:17+08:00","size":580077,"digest":"2299e05f5e9b640e333ece624d4ab18a678fdabff0bc18b69a9c2e3de49cba8e","integrity":"sha256-IpngX16bZA4zPs5iTUqximeP2r/wvBi2mpwuPeScuo4="},"cooperative-f1ac8f14ad6ade8d1f79ca49ea9c79be77d49aae9d2705ca672e78444481700d.js":{"logical_path":"cooperative.js","mtime":"2019-10-25T11:01:38+08:00","size":4409145,"digest":"f1ac8f14ad6ade8d1f79ca49ea9c79be77d49aae9d2705ca672e78444481700d","integrity":"sha256-8ayPFK1q3o0fecpJ6px5vnfUmq6dJwXKZy54RESBcA0="},"cooperative-8057adee2454dbc9d648305faf9ede9824f40d3bd0184e816e8035bb7f1e730b.css":{"logical_path":"cooperative.css","mtime":"2019-10-25T10:12:17+08:00","size":833882,"digest":"8057adee2454dbc9d648305faf9ede9824f40d3bd0184e816e8035bb7f1e730b","integrity":"sha256-gFet7iRU28nWSDBfr57emCT0DTvQGE6BboA1u38ecws="},"admin-6f9bb9720e7e5040ae559a8fae11553313f77552a76416b3a9fe77198471964d.js":{"logical_path":"admin.js","mtime":"2019-10-25T17:00:09+08:00","size":4554537,"digest":"6f9bb9720e7e5040ae559a8fae11553313f77552a76416b3a9fe77198471964d","integrity":"sha256-b5u5cg5+UECuVZqPrhFVMxP3dVKnZBazqf53GYRxlk0="},"admin-ab3e0f7240ae4df8d1585c8d5e99df41edd3305ecc2abadcf8820796e1d9fc65.css":{"logical_path":"admin.css","mtime":"2019-10-25T09:55:22+08:00","size":862288,"digest":"ab3e0f7240ae4df8d1585c8d5e99df41edd3305ecc2abadcf8820796e1d9fc65","integrity":"sha256-qz4PckCuTfjRWFyNXpnfQe3TMF7MKrrc+IIHluHZ/GU="},"college-2fdfc5431b46ad4a454a25386dbcbc390466886f76b85fdb7e3f75018196a870.css":{"logical_path":"college.css","mtime":"2019-10-25T09:55:22+08:00","size":572010,"digest":"2fdfc5431b46ad4a454a25386dbcbc390466886f76b85fdb7e3f75018196a870","integrity":"sha256-L9/FQxtGrUpFSiU4bby8OQRmiG92uF/bfj91AYGWqHA="},"cooperative-47d516a0904d0633e82c1de39a6ec4c9e6de0a37813843e01d4bacf97e8b2ebf.css":{"logical_path":"cooperative.css","mtime":"2019-10-25T09:55:22+08:00","size":825815,"digest":"47d516a0904d0633e82c1de39a6ec4c9e6de0a37813843e01d4bacf97e8b2ebf","integrity":"sha256-R9UWoJBNBjPoLB3jmm7EyebeCjeBOEPgHUus+X6LLr8="},"admin-839af7c0d2917a8f8019d0376ea17cec050ef4d19d98c6c10de91f5d2bc81adf.js":{"logical_path":"admin.js","mtime":"2019-10-26T11:25:08+08:00","size":4554543,"digest":"839af7c0d2917a8f8019d0376ea17cec050ef4d19d98c6c10de91f5d2bc81adf","integrity":"sha256-g5r3wNKReo+AGdA3bqF87AUO9NGdmMbBDekfXSvIGt8="},"admin-52d692608c620ae47717a2ac88377e55b9b58af0acdf3f777814a1fd47b6594b.js":{"logical_path":"admin.js","mtime":"2019-10-26T17:16:18+08:00","size":4553202,"digest":"52d692608c620ae47717a2ac88377e55b9b58af0acdf3f777814a1fd47b6594b","integrity":"sha256-UtaSYIxiCuR3F6KsiDd+Vbm1ivCs3z93eBSh/Ue2WUs="},"admin-b58555ae641bbaa61e3af0ddd2756acc3c5de9023c737815c72132cc67c9a403.js":{"logical_path":"admin.js","mtime":"2019-10-27T13:06:02+08:00","size":4553607,"digest":"b58555ae641bbaa61e3af0ddd2756acc3c5de9023c737815c72132cc67c9a403","integrity":"sha256-tYVVrmQbuqYeOvDd0nVqzDxd6QI8c3gVxyEyzGfJpAM="},"admin-b95c48ea51f392ce7c4024d0d8b2c42dfe48528a1898ec3f7818e0cda2a4f224.js":{"logical_path":"admin.js","mtime":"2019-10-28T10:46:29+08:00","size":4554008,"digest":"b95c48ea51f392ce7c4024d0d8b2c42dfe48528a1898ec3f7818e0cda2a4f224","integrity":"sha256-uVxI6lHzks58QCTQ2LLELf5IUooYmOw/eBjgzaKk8iQ="},"admin-1f2e5a2a28462df8bcddfbdbfbebdc36a761ca7a94962ae71d37fb8c06fc5f94.js":{"logical_path":"admin.js","mtime":"2019-10-29T08:57:11+08:00","size":4554938,"digest":"1f2e5a2a28462df8bcddfbdbfbebdc36a761ca7a94962ae71d37fb8c06fc5f94","integrity":"sha256-Hy5aKihGLfi83fvb++vcNqdhynqUlirnHTf7jAb8X5Q="},"admin-cb3d4541758ef2bcbfe16f518d48f85097d0547a587de222d2fc13dbdd474b4b.js":{"logical_path":"admin.js","mtime":"2019-10-29T14:06:13+08:00","size":4556541,"digest":"cb3d4541758ef2bcbfe16f518d48f85097d0547a587de222d2fc13dbdd474b4b","integrity":"sha256-yz1FQXWO8ry/4W9RjUj4UJfQVHpYfeIi0vwT291HS0s="},"admin-6a76c25b6691b4f436608be28606d90c907ba8f033f5f47c6c20d7bf11251cb6.css":{"logical_path":"admin.css","mtime":"2019-10-29T14:22:47+08:00","size":871031,"digest":"6a76c25b6691b4f436608be28606d90c907ba8f033f5f47c6c20d7bf11251cb6","integrity":"sha256-anbCW2aRtPQ2YIvihgbZDJB7qPAz9fR8bCDXvxElHLY="},"admin-ba909dfe0de4d216bedb3c743144321e4023837568abab1d3ee9a28b2faa5925.js":{"logical_path":"admin.js","mtime":"2019-10-29T14:43:01+08:00","size":4556622,"digest":"ba909dfe0de4d216bedb3c743144321e4023837568abab1d3ee9a28b2faa5925","integrity":"sha256-upCd/g3k0ha+2zx0MUQyHkAjg3Voq6sdPumiiy+qWSU="},"admin-e975e2039206e9ae2b6a072fee083cf39b8e04f2318f67bfbf1923fe208456b3.js":{"logical_path":"admin.js","mtime":"2019-10-29T15:50:27+08:00","size":4559454,"digest":"e975e2039206e9ae2b6a072fee083cf39b8e04f2318f67bfbf1923fe208456b3","integrity":"sha256-6XXiA5IG6a4ragcv7gg885uOBPIxj2e/vxkj/iCEVrM="},"cooperative-a309d245cd0b0b9c653db471c53ec090e49ba7ad885879ffa02a11b6efd79d74.js":{"logical_path":"cooperative.js","mtime":"2019-10-29T15:50:27+08:00","size":4409163,"digest":"a309d245cd0b0b9c653db471c53ec090e49ba7ad885879ffa02a11b6efd79d74","integrity":"sha256-ownSRc0LC5xlPbRxxT7AkOSbp62IWHn/oCoRtu/XnXQ="}},"assets":{"admin.js":"admin-e975e2039206e9ae2b6a072fee083cf39b8e04f2318f67bfbf1923fe208456b3.js","admin.css":"admin-6a76c25b6691b4f436608be28606d90c907ba8f033f5f47c6c20d7bf11251cb6.css","font-awesome/fontawesome-webfont.eot":"font-awesome/fontawesome-webfont-7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979.eot","font-awesome/fontawesome-webfont.woff2":"font-awesome/fontawesome-webfont-2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe.woff2","font-awesome/fontawesome-webfont.woff":"font-awesome/fontawesome-webfont-ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07.woff","font-awesome/fontawesome-webfont.ttf":"font-awesome/fontawesome-webfont-aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8.ttf","font-awesome/fontawesome-webfont.svg":"font-awesome/fontawesome-webfont-ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4.svg","college.js":"college-18f5e8400331634e898a35acc2187815c096c25e0ab74aba341ae916166cd287.js","college.css":"college-2299e05f5e9b640e333ece624d4ab18a678fdabff0bc18b69a9c2e3de49cba8e.css","logo.png":"logo-7ff112568709bf97f9898fe87249b7a8f200ff1f48d537d85af87215f1870423.png","application.js":"application-9cfbc3d792599a1d0de5c7b84209e1c2b2e60336f0f01e19f0581663918708fb.js","application.css":"application-0e417478d56f42467e857cd186b29cbbc0d6c7c6e85c8a6f42f39ac618943de8.css","cooperative.js":"cooperative-a309d245cd0b0b9c653db471c53ec090e49ba7ad885879ffa02a11b6efd79d74.js","cooperative.css":"cooperative-8057adee2454dbc9d648305faf9ede9824f40d3bd0184e816e8035bb7f1e730b.css"}} \ No newline at end of file diff --git a/public/assets/admin-ba909dfe0de4d216bedb3c743144321e4023837568abab1d3ee9a28b2faa5925.js.gz b/public/assets/admin-ba909dfe0de4d216bedb3c743144321e4023837568abab1d3ee9a28b2faa5925.js.gz deleted file mode 100644 index 850f3ec3fff5dc419145fdbd3ec28e89cbc592cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 995576 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�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	{d`0b_12|RJnUhUE<s^ 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≠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	WGI4I`%ZE=k&YS@^Er*4h59ufN6z>OJ4) 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�B4>i<p=A9%5_MN7Y}&PFVHc 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%0AT?Cw^32XNyCnfQQV9&Kxtk)l!ULk8%qKTz?Ig9 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 diff --git a/public/assets/admin-ba909dfe0de4d216bedb3c743144321e4023837568abab1d3ee9a28b2faa5925.js b/public/assets/admin-e975e2039206e9ae2b6a072fee083cf39b8e04f2318f67bfbf1923fe208456b3.js similarity index 99% rename from public/assets/admin-ba909dfe0de4d216bedb3c743144321e4023837568abab1d3ee9a28b2faa5925.js rename to public/assets/admin-e975e2039206e9ae2b6a072fee083cf39b8e04f2318f67bfbf1923fe208456b3.js index 7790687b4..6ed7c146d 100644 --- a/public/assets/admin-ba909dfe0de4d216bedb3c743144321e4023837568abab1d3ee9a28b2faa5925.js +++ b/public/assets/admin-e975e2039206e9ae2b6a072fee083cf39b8e04f2318f67bfbf1923fe208456b3.js @@ -29898,9 +29898,9 @@ function customConfirm(opts){ return $.confirm($.extend({}, defaultOpts, opts)) } -function show_success_flash(){ +function show_success_flash(message){ $.notify({ - message: '操作成功' + message: message || '操作成功' },{ type: 'success' }); @@ -137789,6 +137789,24 @@ $(document).on('turbolinks:load', function() { }); }) }); +$(document).on('turbolinks:load', function() { + $('.admin-modal-container').on('show.bs.modal', '.modal.admin-edit-subject-modal', function(){ + var $modal = $('.modal.admin-edit-subject-modal'); + var $form = $modal.find('form.admin-edit-subject-form'); + + $modal.on('click', '.submit-btn', function(){ + $form.find('.error').html(''); + var url = $form.attr('action'); + + $.ajax({ + method: 'PATCH', + dataType: 'script', + url: url, + data: $form.serialize() + }); + }); + }) +}); $(document).on('turbolinks:load', function() { var $modal = $('.modal.admin-import-course-member-modal'); if ($modal.length > 0) { @@ -138526,6 +138544,63 @@ $(document).on('turbolinks:load', function() { $imageElement.show(); $imageElement.next().html('重新上传'); }) + + // 定义状态切换监听事件 + var defineStatusChangeFunc = function(doElement, undoElement, url, callback){ + $('.subject-list-container').on('click', doElement, function(){ + var $doAction = $(this); + var $undoAction = $doAction.siblings(undoElement); + + var subjectId = $doAction.data('id'); + customConfirm({ + content: '确认进行该操作吗?', + ok: function(){ + $.ajax({ + url: '/admins/subjects/' + subjectId + url, + method: 'POST', + dataType: 'json', + success: function() { + show_success_flash(); + $doAction.hide(); + $undoAction.show(); + if(callback && typeof callback === "function"){ + callback(subjectId, url); + } + } + }); + } + }); + }); + } + // 隐藏与取消隐藏 + defineStatusChangeFunc('.hide-action', '.active-action', '/hide'); + defineStatusChangeFunc('.active-action', '.hide-action', '/cancel_hide'); + + // 首页展示与取消首页展示 + var homepageShowCallback = function(subjectId, url){ + var $subjectItem = $('.subject-list-container').find('.subject-item-' + subjectId); + + if(url === '/homepage_show'){ + $subjectItem.find('.homepage-show-badge').show(); + } else { + $subjectItem.find('.homepage-show-badge').hide(); + } + } + defineStatusChangeFunc('.homepage-show-action', '.homepage-hide-action', '/homepage_show', homepageShowCallback); + defineStatusChangeFunc('.homepage-hide-action', '.homepage-show-action', '/cancel_homepage_show', homepageShowCallback); + + // 设为金课与取消金课 + var excellentCallback = function(subjectId, url){ + var $subjectItem = $('.subject-list-container').find('.subject-item-' + subjectId); + + if(url === '/excellent'){ + $subjectItem.find('.excellent-badge').show(); + } else { + $subjectItem.find('.excellent-badge').hide(); + } + } + defineStatusChangeFunc('.excellent-action', '.cancel-excellent-action', '/excellent', excellentCallback); + defineStatusChangeFunc('.cancel-excellent-action', '.excellent-action', '/cancel_excellent', excellentCallback); } }); $(document).on('turbolinks:load', function() { diff --git a/public/assets/admin-e975e2039206e9ae2b6a072fee083cf39b8e04f2318f67bfbf1923fe208456b3.js.gz b/public/assets/admin-e975e2039206e9ae2b6a072fee083cf39b8e04f2318f67bfbf1923fe208456b3.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..73ad7510e60490ed68d282da9299fdb8b34f2c11 GIT binary patch literal 996102 zcmV(pK=8jGiwFQi@3&n71LVE=e%r{gDEzne6c97V0xXaswTm*WpVy3YydB$fl6xiE z1Cfw~F$FLHXju`J_xWDqd$L<qy*C;pWzXd1{>~&8$wn{L)z!6ibz$Sd$}d@dS{2hW z{hD}xiND4lhDAE5RxYY)Qua4C&eQ5*dfFN0mm5W#j!XXcbex}VT*hUU6dUodO7rY% znp|zflgUP0mPu7^{04oM)K|IkJ{c!*nT)(?HcASwx=6g&FF$(YbeLpivf@41SXo)| z&!!pm<Okl(isyZe3vZZbRr0O!B50GAhbvHQS96tkRK4>aL4~%W(1Q`PFHd3EFCPG+ zVU-tsZ!JC^#Z}yfq0Z9cau9mF;4-N$@{#&oB$s)W4EkAK`NyNQj8DhOXb{Nfyr_Kz z7#rB7gSAisaXPK4JhQ-1FnV68fMazX0G#CjD-5nz5L3`=XybZb@@+VtjuPk>AM&<q zvcj#Zn`V<~_4Fdn&Jzt)3@`(lkX5zHaM9u-F)^osg2R89o?fPv);ktjbzTw})`Ai2 zY}D#{l0+qS1f$vy(#!Zf5#=0Fjuz|*LmECtwAQ<4_zdg)iwBMYtVi@qAIF;QGe#@g zR5jch<ke3yB0qEe8>*O#(NL*A()>Xd^)H`Wb9|mHJ4La@=FL&nnKwyQ%Qefn<18FP zRnRAzjuRr?+B~!P5-5gf1S{3JiPj17syan{AG4|V<6tb#o)^^{2=;MH+!;QD&M+R2 zedNHw;fgBYygZ<K$lL{c<_{RVz5|aZ0Z~rg<k>LcgL|?7`lbFlT7jbv)(f!u_)wPM zFQ`4rhtta>t2%$5CdIWtoxg^UX&oczx}9O)gS9|4FOq6nWUQC__vy1kQ_QNvMYw97 zX!30mXQMpyF6C4&0m$d$gkYQ$d6gqsbuQy-c#)LeY}WixOs1hy{*Tv7)hm~(mM>N7 zDmnd<R#sIxRkoC3YT8OBtfNrMOnqt7GtU?09WML4)yT`H<8fd}T(M?sIclADRPV5& ztBuw87#cC$ddav<?lP9%*diBCPyt|I?ep}v@)>NzH491SNrlBuBz;M)ZPG82vl{98 zPzddLvtvH!AP~6oj<DG=^fvJN-q$=GdELVrtPGrTJ~$x&F`g#&s@X$(k!#iJwY;0# zI{M_i?D}j55d)!V0zc`XyQqwJ{<tXOYmJ~w)Na`tyE(~Ycq01?et<Rn6av>P&fdjE ze969k%)ca=oX1a+7yhKNNnT6ild9zRXOzWRyTZ=Dms5IbiU!1@<PU*(f}MXq#0<)( zAKt%s2UL*|d^)J#E(#mkiY=Tds`z@ywedAraG$UW^H>@Tf_w0N0#hxkpOY92Fn{fD zZ3L@LeXfOUoVkpL%>{OSk(3wMmYSCHFh61Rc$X<n_-e|PwdZS37}mgNjYN?X2|xL| z(Lf8_TJzTVc<bI;3s$)URi4Mg3$@Lty4j)ZlAd*lbD(u<P7=3oGdAzAwVzJQD!+XG zmDnZNb_vLTCImxoQY2XZEIEs(<4S1-Qb-y?Q$E+aggRF#Fv6>jRwyeHeE}!S&x|&! zz>3!dxNACg%$^myXV4R_OB0)<*nF*Y#KBK}gAPI8t`h3gU(*KAHzhUdq*+>N70h8f zr_)nVR!jMN7=zk2Mg>+DjbJmUW20XoH*^p+0izA47{5ZQ^*|$YW96WMv!jl^z;lP~ z)H-!;Od<43qeqXIKr6GG8lh^WfgToxMpBHZY{Z(rV;v<Udjq{a{S9~_R!g%4IO8NK zs%z>l^w#Xgz?{t1o(Bp}ziD#DvQ@=2IkX<$8ozIiS>4uG-bR#M{9Cb0a8t^?#(zlQ z^3&f!57|xVq0MA-$mFXgH$3(enrF$CzQ#W5K%XY3<~~hPckrn7s6S)$-6u#^To?do zJ7CpKkYQ+hs4o6isl2w(jVfT3PoTfz8rC>FH&}y?5k#J!bil-h6$VlO{kEUTW*?xF z3DAQEjZO2u@eD^r>Wa@}MkuvuusSa<FOyLUOvYK+p34Yy1*ntEwLwC*lpkSRhTa9J zn&ZT!G4ghucr+q(ze-C`BtSfCt=*{N$^v0Zr(jlss(YvY@aiIkZR)SW|9HJLD=Q=z z;PBia3(z>@62liOp_Ej6v&r$;mkw}J=;Td4N}Bc+agL_Zk%w?}amK?TfXPQ7cFtn3 zrED1HQ9*678wf&&@%Bel@yEkqGT~YlurpKl1KpgY+24MCA4)%k5bH1r#NOKp)+Fhk z50kQdpOh2$y@Y?m9!*xTfv9mT*|!0`;WuA<u-1n^8xJ(k68dbQ5I;61<2cQ<XBXAw zSUkh;+M{puB%VybKB9%#fD-0h!*5#6-^x6*s$vnZtIij+Cage=tg3{b(Mv;lGQ4z_ ze`~8JYYmJc{w@Ayuzt3XHp>TfTw}Pb4wJgt>dVHeDzrnrSkRBC5zd$LXCX>3PC$mR zr!pGYATytv{%AFbT9(-l7Qg=VBOp4Yl5?~&SfMa8o-)&@jl66vsHqUI<LaVwHqOEH zA~U6mt7++Nc)f0yZTL-lvuipj$3Ul?4sixlza_BIs;dQ7eP2v~0nf&kld*V+&cPfW z9Vc8#QRKzaP*LsghpDc)SkMgf%gH!Fxn%$ZOKR7^rLe~jYHl7=b0E`9baa}4A(ebc zvXNn@t=6Bjp#-rzEjMEME|(4t$>=a1U4N)zKDEESe)V%zO}M$+dHe49o9EBw7{&mE zfQvM=c{Z@QNf&H((d)DrLrwh`NZ4`CI7{ckaKDLK+>FqFcB=dr(0_`jF>F!`^JX(N z&;I=U;~L`Jn3{nEy&V7r*3&5Y_V&zQI|7sLq1Ux3RiD5*jBteJv)=vTqAg<gaDQ$O z4J&R)sAIh~vX}-pp<NBVrw`U#L?vp*Gz`>RFrIrI<Tzw1KUi}^!^c2WgdRxNL+|fV zx6|#d&2eDzwhrf*5DX5g1luFelDUG2Nf)#`%>Cn=5~u^VT4s=2s4r_sCWqCe?t5Z5 zT?;Kt*q$wue~rk8jQA|80?YvmsqT>s@e^7~NBipPs*PTuHh`XFLr_{rhu-iaE}*06 zmya*n`)ffH=aI~8Smb5-EWZTxXBmk8*5(DtsQuTpx<IH*l)J|?bvWOY1~?R+);%qf z5llCY=~Qi1!e~9SmNX*{io8A<(s_Tg>tH#a`|RzT=M7FXBt+j9Ww$QZiel1-4nAz? zEIPbOfFk`kJd$Ms5{GGWPI^<Skw$CCO8IleW1Vy;dSYHTf8*p7HP(~Ujk@VnT-THV zO)vY)hqrG!1h1TvE&svThcP^#R0rtZp`_Ho@sIkb{mxLK4HzC=(6J{DM;tTM{57r& zTQIRwr2EGepyzZ7>ckqIkgh3<#}C}Cc%Y9<Vf7Ro7eIR**vKHcpMpU<@>%OZvpqX_ zPW?489v?1+9I!uTXs*o4ujhdaFN}gXuYC6Q^*j1)o19#JQ|F*FjANMe#$jiD19rQO zvITU&24s}*qR1~l5Y^dqeizDUmM%8tZ4>8$*#@@XV~%G-S8wdz((<X|oqD&xj%$uG z5Eeyxo@S4;;RX6vpbq=0DNkC3IfNVQ3!t|V(`(Sp<cQ1mZ7;0sKnw&04qx-C@B6E& zF8OzdIcbfKQsPAYHKt%|BjhD><@m-7WwUi}ZDWJ<F9QM4ih6VmBwJX67)RX}+35~? z^hsf{W5%YN_6H72<jF{t(_!q=M<Tp_qi1sQ32zcKpMMu1bklzbDsegv<IyO^l6Xv~ zUN-sDS(7}wI5dOwa9YQ_Crcp}jyyRI3$e4fn(T$6K~(SX&(f)pFj#Qxfep}72Wg~5 zu|qWUZzHj?Um_ODtwPN6D~jn-KcR?LTnieM5iwmhtT5r~z_TZH(_N|jJUpZhvo;z( zWSUIN3%_2;qf>&urw|f4>d<LppX<cz?6FqsHn`J~hZ2QsXh7ibOESXcI9@B_QJSNQ zN~NdyH~h{*8`lQXWMmDQzJ=VQ-D^PjJQOUNKA*aF>blfHj_stFv(Y>QKD*)^ql`DZ zj3<g_CiUKNcq(S}?mV+s5je~s`Q`n~r}-raWfU)}F;Min*NR&3x49yVs|gm`<@zj| zkl6VxPct7(_C_{Gp`Dyx=qwJ)n}f5&j%Br++{xOkSVb|W&RIIHK>yM>Y6C(QD|AL$ zSqJuwL0bkGOGNYhkUWEG`PF01YY(6sM`?$Rhmdwn`LLk_uHezx%TpFb-Y5-;b8E1% zsW?~79L-PWy4SQW7igJ;oUFV;TMm(V8V|pO-X++C@p+;L`%r<3WJ4FVW|-(P^J^BP zSmlk~#OTymJPwl=*<MTRkezNyK`e(g2dG;EvQOT^7l4@?dyd90FobY9f#?g@FR=Gx zHr`+!!{Z=<$|<`3ffF+>?q4YW5jx6BS@<f=zQ~F!#N23GD=I~q(eliwz+)!0;F?mD zG;Ej#l~Q&kAIPpt>p{Z^4Lj9@SnYMK(7Bm;;P=R-eb%fjR!2KTmyOu%8%Km@gSz%T z`=5c$*6IhrO^m~33adDhXX0MpOBU$K3=~HIzMIX}=u0xKnoOB9oHJ72IFPp*)UQ*_ z15eu$-vwU%%FdFbm9F8M!YkP9|KD2vI%oRVt^ZvB{8v$cgMBYW0(Cqtp$BmPnn?;; z;e6?@Uv{xo0KF5Zw$3@YCQvD4DN{X$a_ltAlH%u&uV0yQi}q9Ue>x^~Yg2hWXlQMS z*W}i0c~TF1a)YgIF`1`0+TDZf?yJN6OYs;Fk!`mdD}_$Z7vj-A@YLI{&bb+2Al41b za?3~~%v%oTa{i-M#2CJ|VP4F!y&P^VU1#8yS2I76?vVOeO9Axny@TCOGJY+#ekk(8 z`~40(zQJ0*3k=Ky;2vKDt~ZT6htvgKqFQJeLca@t`8|o*QjR1o*G5_fntx+%cQ-P= z3vYDNpiM)Kjel<@t5Ke1VgC>#y@R#dU=4o1v*k4<8JMf+y6$!{bCCVzQ4XPZK>>fL zwxTlx`#m%+6W8pxOEEY;bum{~!QmUhVwdjcT0MT;rOpt298T+V&RsO$s@8A;Os_^4 zeVWhcn2*t{&M^qBS`W#?Oz!At?K7W0^FBvw=y2sYTlZRPboLspU8JK?lC60gk6Knl zoPyZ6u%zZ|#K$>~MSVn<wSjej*KLRqLNzJ@sll!WUIhN_O2cq#d^l>`VrKy@XuD=& zv?EDtZIYLj{WKO{KJ$!~p2?VUB1$`qovP@ZOM}m<RaV#Igf29U>1+=J5fTj&Ng=2C z=-LP=AX#JeX5AD#HV}Zf$4J?8+%jnNfqaig__z3*a0N@pl0h-}^F3YDH=J4K8Dyh- zOADmNvrRhPW5=9-gyZXbz1E?}gRNEMwS@)w%)*W1FxGuat1iKDY%U@Fja$V0#A?3o z%JL~V?w9(kvCbYu30}TK*|*jhr9pDV0ksV;(+}9qB=(nGIg!GX?O_VG2))K2vUyIz zRe?T<vpf0IsSC?zjjP>fA;h+7<EmNKuMI7ZEv^UC%~?dO+#agh`cPWL>6{)aijGG| zj|i(;%0IQx9m5v5QRQU3t1Z+-9YK<NFVT`>D21YclMpktRS*h+xkI0^xM8aGX<|>W z(Ga%7F-V}8G1Mwj+E$Pmm>3l;gSSqOIuCxThi};t2r_a4_M8k9yqu1!bP^ZU21T3V zlGlc0;jI)^h9-xOAIpHlVfex}93ivbxIp7|*_k@02&ZAV@QMQm(dLwD8CmDS-7El; z2x~ULQq6P<{DB@gHP!8qB|W!BnyPtzTSsm!Yv;=SH-~G~b#p<va~eSfv&F(yozoc$ zd{_(SpPc{LTr{h}wI4Y6O91ISuLTKVM55rP?F)#JA0vARO`!TD4=otjty;VEBXuVw ztInF`9hkn64?^9Baa=HJmW0?59^UFb41&NBSjq&SOHisV2DNxn2RpcfxNR1>HO8ak zh+ov2bJv?x;^MqCJH!&8iJtc`!tbQxmz{BvomUs$k*7uN$)_P+c<CFVY>UvvfCG%- za3<3;GVbAl{J-ZE2(*P05U~OOo^#M57ZyxInE`#%R-kxey{e`C^*!I#2X(!?{!D7< z&M35HtwOJ+<vmeSW+}ZMTOO{|ltEKV=iU;o7?@3%`fd4L=XrXRZo<OUoTp_x*2^XQ zO|oJkfx7;(;)n>;Rhk9)SDY~5*DQzTDe&n;!J=X0P5$5fvDWFL>6j`7@6D7?x{}*` zC^UBfsr57tAVh00-(Gy3RPkccVy2?>FtQeRbvF8oyp2-w22Hmfx!7;&s4nv_wdo~j znZ*B@T$5qZ8CJy@epn`#tk1GM5#;*K%GLUn$~$D0_@S`CpXzx9L{<tJC1r&}sjw&V zvN(B)=20@@0L4!$l1LQ4R%D=iw8bysi>hUgnispMCD|~uZp`sAX-Uo;qsfQ0CrhVI zumh7E;Yv3875vt!G{t7kiQKYQ#j0$rmGu79T|y13Z$y+iXrs<0oZQ1Cf_g1t6DxW? zFLtf&xBo)-DhbaP=7`4BK%*9JH0_D<ptC}jbHVVT^9PipTHl>|xq#}>eu~|_0|K#P zisdz0an2=kbXW=8mc1G(S;gF2oeeoj?9@7O(U|KAq2Z~hKGV!UkMnqBhw4=qMSew| zhv$@oV2!G_LEgYxmR>xj+n!*tB$>zBuez-%K2$w01^6Fqx%_IaF<Zq?{^CR1IWgWi zQRP*#PyL$hAY=1lzjG`Tmjh9N?TQrpH-uaNE;y>pO*tp(&7o`?5d2`b!e;!AUY#Lx zzX!N;JN^NHYx(Cf3Y$j>Ioba2(<v7ZzfWh9+5c#Frd0fWfMY`Lcbh04b1zLUzx%>2 z)9oFWc7AtvUyWtJTYfzpUQxPvh6O)@#HISZ0~VL+Z~1B0PjS>8yC0bKGTq)`(#v%B zd(F8i<(;yNKc<&SKCOJe(IsU@B1=hW-S`T<-qu~^qZ4-BgL?OU)ZFEdh%oo-Gky=Y zv}DhBB(J$WI<1nx5zA56KA*jP&ErE}k@mXgFc0hA7nj~_1w7swmJDye-)RtW8v~6J z@>{AIGyS?BR~2Z7PoPzrotLJvr|I^-t@$^;UV#^^80kzd^U-w7lYZrtca@APR@_Ox zP4c3WhLTyTn@Lv24Ct7dXm&O+=$bv~#Fx^{U?ogdW)QDfFt5seT!l$+BOr|;J{X7S z{{7k$2J(>!d6f7;UqK}+GeGX&S0Em7*p3G<Zog^VBmUXJ%ZXo;4?vn=(a<PWz3i5y zvQ@0<M)<GgB!e6A-Anu|xJl3a;y4=wA`b_A7jrqJ`~MLZMK@_b3&;J{UdSKzZ*Ff7 zMGOTtBBZ9GZJ37YdlJBpakSc1Ww#W49o@)2lFnrWE6^E61^gXF+OiZOz?pP%{2I(= z4LN+F+6`SQJf9Yngcf1VfbjXRZivZyv)kYn`p+UABMg@6{{5=+`EydfW(!-#qD(t` z+jl(FrZV!2uobre+_1pm^2nqzUXjm4Wpx0f_w7|C=EUg~8ekujsMQKFNo^Tz!a^VG zJ;FdYttsphObi56bST$Y&M%2#-$-N=Y8mHSYwOiIB_clrdPo8}5yQdR;@Rd~!L95+ z)hE<qd5IJe14{h_mbHq+&_M{xSiilT1X`c*o%^(t=_gumQ`Q?>WBV}Z(dPa8EV<xn zq#hn`4vzF6K<i-^sTkl8HigXU9Y=+p(R&I%S+?UakDRH*TlCQi4s*&I&a)kd>1+lx z8slF;67M6L&StPjs^a=a4IcqzS5~&<9A=FEp|MdhyA{dX6h3mK2qUXVTC$7fRd7`G zS<zXMUmmHi@Tf1M@i<imx426)+OaA8J&j`c8%I<4n?(6-xHNs@>HyWP`bJt_pa|t1 z!Xs?vA!<F1vn;RZ_OBOv!*N`e9=eJ=mFTiYozOc_je{#!$H@Q~BJ}Gf4_I}En&Q#s zQPJM)!_uVD=3)A<I84{qgX}nMZw@rVNe7B2CIgIv86#`Tg4<gl3s`033U%Hw1oe+j zGNZ!Z4UmTXeINq(I0(Wr(i+IARcvYs_U>WvFyU|?762TPd=@3g#o#dOC{`HhKY-kN zVb;+ZC-UhQooTgFSRmMLS?8)qEB-79n;3A`!I!GgTrH`SFdi;s3@}<hQEU&{WJYCB zDNJr}{UAJxy5X>4;@Ddn+_204A#Q(6{hp4Z_4PCM9ba!1CG7jO7=uXR+2NTE7^MQj z62Lyb0kHcmwnbYZJKM9x18^KXQHnb;-^;!nNUbML5(TPYpu}1#_{~=rX?fa-Ve-@v zcMqNbAEr<u&ly@HP}+voFB8=K{+f=*Piep><NOrU_WkYW_pLDQpu;wlz$g$n05m8n zPMivG<Qzth7Y&BmMDhZllVfFUtgJQ`kY93ymQBC%(G3pZR5>P(^MRWK70{mnEDtQ` z^86sU;p(iR-Q2&=s17uYIDqclGzjxi0=yO8u(e$6^6dp|+usV1WBa|}kZ(v*bzPeh zMglX9*LtR*$yGU~%9?$cg}pmXdNiB)Biwq;=7fm&2I8MrON-3`LJ3TE7~D*eck8ki zpnCE4{cGfkJmeid&fkDuaR0tpd8+LO5gm{E0_rVFO&A9z`PXx#GlqpEImFEXv;{(w z<!=H`#aI}yoq9{yFGha9aoB1hWeR_HiR;B|7kvYZtb96*VRfY1odx|Il?EMIxtc5| zy^GFi01Mfwzn`(i^(L-mBs3u*g%1-$a>L$-wJT{dJZ?WsbdgQwP7*a-B4MMqu#IsI z08yh~I*3|$<)8(Mf_}Ro(MPR}WQDrURN~xqg`=yUo!QTNw<z~BT2;{A{p}#UfDaH9 z<EX{&N#f>dPigm*ZJt9DwYren|KHRV=85G};~P7SZ*);Q{|}VMd8Cs)y*~1|zP1?S zS$nNyt5JhVYC;@+EkbZJh9EW{h`Im(%IkTTD$PDaz=ZM!(ubE%m6Ye)ex8sIi-^5n zhW4G#_|cbB<l}Kt!1g_4Dh1cVecp2r8eE-IPp7;{&ye$_N2$%9fZU5CALTV;1H3!f zvaKNKLnpUE->-bvQ<ST>p{~9(KwFzIgRF{<mA<M_?l?XSZsal~0assK`Ra;5(>GFN z?m$e370YXup+bP_fPh)dr+GbU_FB(rul00$t%vs7p<!YJ*q}8?3KLq7;7I+}dKKRA zchn@`rM3KvIa982rr!T_&eUin)NKT$Z^2*4ND!8Rwr?cuDh*#467(eqt(}inJd0p& zeLu@tAnrk1W#XP)nQVccL!KKoEf%Jz{RT1wbUz;b77w8(*&)*mPm}XBBL`Ij8>^wE zrv7JSgdO=sQ~G0rqcOtIfTa~IU@`(un4V|J=yN)%^R}>J>_V^#wo`eU?`P=<i0Qll zC1MU<JIr&w0jg?V#p4IPZubyWT5G-&+0l*o%2>d^jz=+e8Yyy1(3q_+0N|;{&RD)t zlb_YunKc($3)h4!+$5~t4GSc%ZiCuuw`Q{#<V%HCf*NF@^}29iMx*UhXw)v)ngbYM zh9VG+Bh^jUxwgD}%#zug^<hC>X6SX8T#ASsT1nDrB3?wBM&iY|MLueWZ&~eX(<AFv z!CL<hNHATu-XjUt$^7(xtPDf4wbMJ#W>)EC{*MpN2kZsb^z1Imw&o=pUQDwuA3%gf zo85!G-p;00{4}3tRYWgL8Ybyj$wgq`|425>_JP*$C1&Z3y1GmxKhb=T8x!0>Z3wfF zIt3%?=^g!b{6�QzRZ5;P1=P&XeicS;AZp=+Yx6FDp~1c~9@npgJ$)Py4Zh8CWhN zoe`*Zzy<I~m^i=^eR58`xKp+}Rj(L8`6l^RJ;n9V%!L{xE<~c=+(4MP*eM-F>>ZUs zxat~AUkR-b>;N}b5uH{!x_``7Vy;A7ZzrttWtZ%vMfE&{2ru)4M3h8J*F$9I2FwmS zN#H;c^h0ZB%x2vvvg+KwZ<J9zVRKnkADH_mOxRAlOkq~*)-!YGAqsPKn9WsH;FE?; zr_mM8^>L{YyI<6{>-u`QDt7E@Z;l*U)vd!yKmWcpY;(7~N%T{>>bN_=12#~L!W2F> z2Otls<1H{w*CRi>pU(c7-H(Iy1nRYS_q+Rhy9Zmlvo6fvFCISJn-z~9J=)v})-x!J zp-FK+oBgx6pJJ2VpuM$!u(P|pvyV;U$d4aB>}}3sY|{<a3n)yXO?<zY{WHFwVVljt z`fhi(*WKCg9pK~0Pod4;EQK~b7$=6p4BDjk<Jmvc`vtby8nk=e?d_e-ovp1dJ_pDj zKHS`#W!MM?N)cddKHJb}Z+E-5zkjf|<a~Ap>%Glxx4Yln-duV@yD-l7-qz+;Z)>}^ z?2PsX?d_et?#{vf*0S^22jKShy4|gv?cTBrbO5j&?Cfv%wzqqG%TA~Vl(4<o-Q8Mt zGQA!SbI{%H0%V)Z&Zh^I&;v~GcDHu-H<zV2AcgHNAiCG>Ej=Hkgq<!d?B?b{cj-wH zF>LMbZ0&4q9?YLqJWKEYGv+&@x4W}<u)EXi$|>!zDedV~N@v;qf2M+dy1NHE-QMoj zrkv9Oo6?p(rEFH*|7XTAzP`J?wFd;z)0SzQ&1herQ8A0}|Fhs5d}|N(>)uvZTcj?V z&!&4mJA?LKx3>fP`=Gbve1Lq`xAtK+U83!!rUS$5?sm8L_P4fnmYvQvQo_#8*53a1 z{<70K7_9H??r(1c?)I0R4pL9Icd!p+O4PH=gpgtF?``dF9qjg&oe%DBAc37Npw-^8 z6T<xfn|phAzqh@+x8#&I2ko66>>|M2lJnU^-h&%qA2{8z6M_v6Y+(}?c5iQMd+v-r zrJn@30aQS4awgksCi~h<K0$Scu=XZw>76~8zM`~VkIkf~&Eylb5!<G>zje^v>h2Ju z;`7*L^Vrqq@d+A<<%fxP4|aBT)fBd93I~oEAOpba2f#qP%gkaM+05SN{sEBwa<kaO zA$GP8_87ldVh&v-;R9H@?(TMXsab3Rf7u7P4tjgr%gh3K%g#P*#?8&mr6vJ%3w3uk zdk1?5OHE>Tu)eq3-8|^+A1pHikbE%Lt=;YI{k>%-fW*4J+1u~!>=O%Gf|x)+z)J6J z!z{W>O#y~DH~<x9AEd*aIi#O_5O{IG@d~VGcdH9bOHN~#O=DM0Bm3loyh{VIS9_bg z`v<-4o;H&%o5`k{N%6@CahC;>%WWh3**@rMEO>{_W>3u~{^WxUF9N<@VfSqz8&>n_ zvF+V+Pl%*GXffNc%lCRqPKns*!8RZQRL7;KL{z^6_V(7Y^XVZ+0Ss&c;U6qJBjnq_ z>p}h7+BsNqLMZTHGxlJ2Z7(|?)Dw1gQ4)c4U3x~ak$b?7dON+{?WLzg#IOU1>+W@z zoe?rVP@Xq?AXg5Sof8nl9w2XjZ*%8h*(t%!-U6Bf`q6ihIU%%qqGBCC=vQwLW$XAs zzcvR^x{e?8Yikh2>-aI#PT~vc?10%H4-U~gmPFmd<l*l2VX_`=2gPv$^BP3>Zl$<* znvasl=u}zv&4Tq_@bKY&y?8S~UQsXKg7VF6X=WC;j&Re3ARQ+I==c~0AMnB9`{qE5 z2tT$4O~a&Om@G`gIGl!gScYfl@@HXt!{``PflV|j4z|MfCg`BR(e@6)wk+NbMd>~R zGm8Mk>|u0v2#dM99VGrR1Pph|=_w0A^)uksA<#rX^}&$0o?&dD1R;)&yW!mbp~>5Y z5mOwn7sSUIB4%bTRtBi{v;WwB_;8D2Ok}Oz=DvCoW{-Au0zx)G9S6MU-mdI=fF4us zhKu$eoQ2b9+NpB>N=HDscoU`Hd2kf?ottjBe;fR?fxbz40p!c9@~3E-L*1~{%X(Bc z!|jADI?C~LXAqSk2WDu68<Elf`z>673s>O66>{M+ws0{E-o$k))VksChi6Atji8U7 zzF*R;+GjDJ-8-)*b4#ZP2O_=T>v>!NA^U~Ch=sn0{7G0?i^#fzMHK!0n=Il~-{h^9 zw#jLa_X2=-a$G%nwErMk-@cDJi1>*=9Q#?tT4|jL)U!U3Uqn-%B6g*Ji@h7H)v`mE z*z=9!lPUU1+9%T&@ZVsgQ{j81s{mumqG^_t!+4Uo-eOh(v4oWo^CZ1h6ba6WA|>yz z?oi9{D8nM8G~jfK%b97bY3%euPAfTz`>7gysCj$YQd3O!Q{I#Z8I#x48o1Kq*)D|R zP6cS_RXeBGRq~3awVr4{BvkmOLEuNV5klt!JO|Kw35%nwpLI?NOA4s5DK9kKYJ`xr zdq@MDLBZlkB-siE>?h%7fb=VYZN?LOg8pR*#K`B~<08SC1avoL5*@d?t+3UDf1B`c z3;u1xza99u3;*`u-#+|1Xwd;z>lFSC;ok`UCGhX8B?!H>Guj4Ab~8R5Zl7+(d%LFx zd%c6v0lJ6whC2tFt<@;X{nT$=B;#@33V=S%>mtlc>hJFCZ0+2yKsvH-($VWzOqur+ z{#no`Df+BxaT{v6EoA(=M!B<@_M?6h<vLSJjLR%l)SaO(JggpekC+QP{^nQfN!Shg z%B79BS>}usnZeX_LMQ|U^PDT90>P0$wGx<9R7x@hWa1T(Aw0|ASrDE*8Xno(6hQLR zXxKjEyH$TihmaOI$H+o$+NY~l7>qlm9gxG;59l~=q|J(*m_)8<HJlB5{3Old;@U51 zKVkW;qYqXos-1a!#!a;@4!1tD?X#{n64#R=RaxI+LhVVV+QaHy#N`F*KdO;S5z?nZ zwW7ubu8G;0;hX^3fb0gD>>Y%##y3(XIbx=9&Y&AZ3kJ!XaG7jO1NKOYZ{ft1Ens6R ze83cdvWjR7%vzqW5zD}9Ui!qSIBGb^XNYRGj0KCjp&ICJT95;==SlUU!kZ2?5N>er zzJ^{ld|!tpL>T%CoLjT=vetR!nqWoT-khYAoZ4Kg4$)eD5+jh-MSiW%0q-qTiKmgM zQ9=V6B|H?==$EgsamCOuC!zwiwCZ@OYiU!irA?KVrh!o*)94;fQC*udePxR3S_XQW zfm)Ef%c*RsQqMA>vc-CtQrRj}*;4!jl`Re}$Z+<AY3C(G_DthIbl*@fja<?QO)!{D zZs;vz(0}?Fw$>P`zJ7+7HLK0%ncQZGE_9A`%1`V=JWh_IROf3pGt|U}Fc@NKFlgw? z{M2PR)XAHyi1^6X^*B&WnlZz|WmyPncO&3m%ojnY{{5MuduB^8MmMs4Pd@1e&BZg> ziM@-n>X*o+IYRIcef9+{h{nO@@=(^#8SjUv+r@ts2z-;fhZ1bm!CD*J2o~vJn^qeK zW8rrxowh;~!?^wTjZ~Xzk!r+e{s#uAP3K(2jM>ztEaGZTj9Dz=7R%@c%PGk!i^mE1 z)$-4j1)E)M3Xx@h#z2=oi+2g>Rq*BXvJVV~di-|5;<Ntt`qj@>HQ^DK@>vIPk@>B6 zZ$Er&fm~k|tOOqcBLZW;Og>Un^=~DRfqDo#jQ903Ma}>bG5Fe89W6evB~zC4e}mcv z^BO-M4wFfB=VpIv^MYj5#*kL%z?|r!=9pxpO<6`-p}amh3j7wnjHg}EgFx%!4zX<0 zP9eittw1(+Pt6f*dRHoZO%QFoOvIlv%#UFu8~J!8wZklt^z7Qd!LZ`KMUi;*Plbf( zGn*F}2fU}6mXD&%ZkGp^vyz8f-L4V+Ca4W$Xu^ZKKeKq<L$0n`#kC!i)FbjScb~Yx zU`EeTk-CdZHwrl%HB8rMy<~{p8Vj+bRlyiL4DrTfIUZ({Frw|&*IFI#17W7`@rMji zYIp{1<3**L+e5)y@eRA4g&yV}v<jg}ie@<u8+UG?H4zR~(~!f~uhvcr>B9v0c<n&v zEO?hp76^Y3?ffW8j*32!Ch7Dd!u8)eXgijo@PD8TjGF_ic^IQZ{voe1E*!CVU5>@1 zwx7w2!J9@?_`D!a&ZC%@ly$!>5_MJbt!l~5l;dWa2F+q552wfZAUOOUAyNE(LZX-} zB+?%j5?W|2S#Ecd2O6hGE`Us)F%VFA6K(%<Nl~DDICAi9P=@~~HjVdMC=z-Z=BzlN z#*_vDCaK$au<~(QoaUIqvh;R3o1N~;(|mGWq~{lv_y7NY-e$MA?>&jjWEfvgLhse9 zrz_rrjg=MO$u$r4V&C=@sF9+Zayr2X<7DJu+lai?i06%fhA`J_Ix8SM>HdA=Imh7R zEWIR6>_tJT4vacBY2yC>nwF`?`^jk}gYbv)vTcXz(c{~2I8Nf?X$*?118Sp{s)_s` zwxPHr^dv5xCFA(I?+pIedT_KM!Z8w_$sdf7qr6f`Zd?pnFJzcu9?7@z;oy^N#(CY| zio-(4Z6>pWjE?=o0)=&^&H*VWL0-b5MCL6JX%G|438A#A+2>&*#k{&kDZYpl=4^Q} zbCeh>IC5-a?j|A9Ob$u5!ZyiAjCn>8U2=T>>iO&EZ$5s0^Y+<u*v$gEN+!Ml<iNgH z*CKC8fS}oJ_`}pfYKcQCN*n?v5D4(98YgwsO7l4)reUF@ka&%H4{Mhbk8=CHCtXbK z#L<%gN|MOAL9~0H^{jG=AQ?!NIFzJ&9E|dig{f<vE|)==hiO=%16E8Sjuc!sw;&T^ ze(?lYY^-P9%Hb!yAR?WYbE|A&B080H3mu2hQ$#96N*(Y4^P?OGOtmrY-(N+=qXfBZ zrX>mOf+qJ?{qkgk+JXv1%dXuDZ=5>oYWEg1&lr0=^w~6~N7KH{l4fNLOJT~G*38~b zj=ki@WTj!URnc8ZKqqM)^~5bzZT4(OTsnwBihM2qUE$dEjKwU!^ZA!Te8IzJ{+cwI zI{hf?SNuBNYx_|Fk1oqvae~G9Kdf>#z3DU^IU(l}0eA=$B~kBiYxhx<99Gf#dV=8- z2SAk7Y}VW6pZxbG{XS~7Tm9Y+`?}rgZ+7XcPlv2$;~aY4en3Bp7^K-H=rZg3fpO~4 z*Xs6mtjb1B#ib27qH~?3^NPO!vB@luGT{(W&kks-2y^!|Uwn`8DZPCSlMM-oxcV5M zmiZWLykFkGidZEuy_hpn_{29KB}ck4g;njgeSc96t_^m>wz$~{4B;X##9-`kFJM6f z36qh^A$(QD6Q_$;x7M)Rqlyj*@GA=KurgiFZ|U_9O^n5WcQOX;qqWfrw*np>v(c(| z_zqTljv(bbq>7Z-G!Z3^txn*7$Dd9%1`mAva&$O&5NrgnDe#Iry9JL~1px*p2r}fR zY?>Rd=m%<Mfy8>P&sTA2_Pd~4HNG!;ZTEuX?x5E5^KYOCmKKdKhcy>mzC8Fl=^TIR z3?BT%u+}xOW+5#t@x{|~rX+z>-GB0r`m>V`{Jp3yXYg-4`-Xo5JY=-Hr#Fy%OGZzw z=V={ikMKkj<@3K!<MBs~-<r+%>5xW^#JbHPc!TDE2yJIa5tn1tQDtmfjv}+~Dkt^% zKa=Yw3@P%pTcRIkiQQ#4V@&DJ4asDCd$v?Nr@EN<mEsD1uwJQcg1V!t3CdR7J3v;| zI&H^>q_mY}dBSxQz(OR3s^F^MwyKlO*dQ^O{pak?m35aXlSwF*R?sEE{LtJWPQg?7 z#EnIE36cD<2z6q3N(x>wiYnh#tY>`Tk5Ew`y`5H83sLN7@gh#^Bd|h8ZI&wBs?7== zwS~!7YoQ+KtuPy=lGh}kK%v)mhUgp&l_Du>b@Ra3-&&%qzy18)mkybt^XB=-zrKC{ zpPyeme);N`_s=6xv^yVPzJC7pmyfcn-Gjo4**(!N*3b_*vr)5d%AFLTlQU;B5XBLj zeU?}0+4W;}(DH=xdT=`V!19`hyp=?f-wiB(kgNkT1ig>7<gq??`wF^}NTe~6(NSd; z_<`VC{PWhBFtaqGW}mb;VZga6AKGb-6LR)grx531GuyQ&nWp4WJ*pwcPNg$<I8MF| z^8nQHrEn#1v({V6oXu|cA+y~z&(!_<Tiq@yd2$Kl=H;(07~!eed+vSnE7KX8e1ok@ zMd#@AWToQlO!-9Gg8nfZ8}xC;_A-z}eO$JsaZu(@!%#C{hdHdn5NHOn3!R*I{3tqA zhP=DOKLl8-Vv1Icy{#7jFInZk3-}fXS^&P34U56II#_}WMJ|V+N=H;l3hZ-e+B}ii z4ZZaF244p)^O8}HBF+;q@$P(J9-mc7!C`rxjqVN!rs%pm98ylqVRB0xas2uD$Ck>- zW}I{gS<*|kcv=l@?fJu{4(jocWCPXY(9_TCNpoKRb~&DZ@~&}@_gs*+Ou4Ex&ohxd zDw-p{c~#0!*Ps{hDs+YtHE0^Vj=)o+{=(~#bctMgk-4&JBQ)yu&|#B=w#X4gFW36< zg$$Yk$;B;2E`g%!6hfNVYBpi0BZYOBa8DY9yIPhbhk*5sp4|{SqFU>^jV^tA!CkbE z7ZjwGj1YHLksnxT&{eDe?L7Dep#I@%yLLzsxvv#)jUA7>zhGiKU;n9Vvy|}|rj`h2 zpPsq(gZ)s<U#yR#%{%iEzYC(d)IsH7eth(0KK<|^YIPKUY>S@Tr_k!=B=fvUUZyy! zzDI`jA(rtB&3*55oDaWHQI${nUYEX(le0>Ezew;@t?zA3zR_<y&^s^kX*TM6f9iJk zcF)eJ{2%QUbNBSU1Ne`1Sj3qa`6?Y%7hY?<SZ`gHUJ{o{8~LD@PvT)(UE`CDO?sxj zQLQvnePQ0zKKnWbL~V`0K=knc0o1w0^wZiVyvVPbcs!ntp_0kA26w>mLK5pN)g8z> zOz79Jg8X@HwFFgwocu`CLM}u0`V{q&m2{LWfKJ#IP!)RMe2e{%FrES9wE<XCiJ4~2 z6QDOZYrsQ^#16jpLqO4!s*7SXiOC56o6>AHF=Up6vyyTN-%90MsA^gV2l|Y6%kbQz zOzH96TQxLWoTUXw7t9;#hQUHr(*jz1o99HQ9Uvly-BtKzh<ahuL4spaR#&R&X+F9R z=Aza?K8;H?AL4Fko*s5~9u(GKO$4_r7S&1SQ6qNr%&)Fa8pzbxt5MU@zAgY>W}q$r z^&Ytj`>w(W5G1~vvcyJ|vH2X(&?&vMD^bW--G+b(SA8fU-5Qoa>|bAP)^+2UW~0~b zTF`S+b9A}jNOwNFnzyHV-Sva+gNg&#`j3`oQ6)9qe=Z|gaQZ0Dg=lm-eyn6X)5Z{U zuR;kX@?(*@QBD6>LK_3~>%h&~8%u&VO1~0d6j=9$UaZxi9JC08KU~#%Qsh^_vmTG) zNtF~$PErvuBtuDrixlO!uB~xJ%qrFuvWZq3EjdHmyJc6b@-P*s#0WUu(#xXM_ArDw zlv!rGp-)q|4W6Cnpn!kOg}Vmb0FQ^}p`_uqHmA%O(SKuKu0F&mv^_3&?YSLmX<1Ga z=^zN{ws&@({LJE$sD$$L<Eh2yLl#c}u{BQu4fEb`BrcQ_fNRA+=sf-+F707vGmL7* zl*xGi7)Xe^JaVlt8E7n^hzF=y73KlG!2Q?=x8gf<I+vcl2G=H~UFQD3Io-HCM;6(X zS1Ec!;M)*XV=wE|N8UHjmvBHoIOMFR-vr1UNVu)mh%3}y7h!$@R?dLp^Q-p>i#@e_ zn8fEGwt%0fqqu7JeTlhR=64g}EYdWfGFM?DU7KlQH~P+<SV3>|L0SS3YGTjK!uvAa zU=!Hoq%#;Zs!zJ+e<VjweGDF+I2LCz+A93<$8C&nHAs=fK4#-V&w2I^2<jF2t$eFQ zmmE-<PuP_>Rgagjdg^S+QXd;tD1HzlOif4L_I!el`J`pT5U%1|H5wwF?O9-5eLxH+ zvuF_1%0*E6Oo6@=gw7_*0@-u>r!Z_baz?pUwbMWm2QZx=uK;MFEeuU+wMoyDaXd`E zw_D!a)w4!6_3Ofht|55IbUgZ*-VrSt`j`(U)q}za<H1p;xprh!hF?DuwKioyDhrdX zRPb^H>yw_PiS-&n5vdG-Ol;NVy{oxjgn5JCQ`=_FIAMxBU0UJiU9mTRxsOO(m~3Q< zC{jw+qf^|J^A8ObJfO6Q_ma1wNGal&+4`DbFnebd6xr8lND-A$JJF4{&Nt45>lYxi z`Engs>n$3pHSjZ*&^}qffPr}efY0cS9Oc3wIiOn>1uO5dC(ObqBYF`n=B<<2J>o~% zVYa>=Oe1^?b2wcPtn8Q3v;zVsDKL~MEUZu^F;H+^4vrG|)5kx6AiS2D`cv4LMLhhH zjQTnL5Y_v~1H`-d$<p*p&7e4KCsJM>#E8rBVR-6gOq><Oi2*@FbT!}<)#gk95GyJO zG+#anZYv`=$PCBx3<T8Tzdo{g^S(Z$=NTx9MKUKE%#O>Zcz9zFSWBKGj{qowBr1-p zL5Jfw#9Ijrmz7Gxq|=zne`SOFVOXRSVP%(Z^6F()BfqL1KgR1*ENhybBOU2&!TP3t zTcIOHv1Z)=p2Nz%okK6`z!`0xiFotF+*+1WEK7#Vk_Ty&<KDunS?qEce36yoRSL~@ zP@12Ck;OMdaokmT%j(nxnk8!Pc@~ewTp9wN8PJC!Tb2&Dx@nOGIc0T#ndA)Q6u)q? zs^GgKLE2B{Y?dBX+6#<Wsx7Vx7Gb3VUHkSUEkxL!)@wk2-3x8*aD)GxfhfgB90^aZ z(Tjqa1CAQsMJ~mmKDM);W(^@?eTXDU214nETpDCidYlgw-V#5<w-!(`IpCuD@&X=G z7rA5H<dN7x{fzxmge@oH3XW_sO&^7x^Bq8%pNW>a71*JJRuHFr$!n(q#p5a|p2ldJ zh628N%-<clAQv6>0P-4vqVM<b>$7!C1g6-s!WZRkRVQ$bqvGrAv0Dt3vU<jQZmlKa z5|fVbkIcK^%It7Wpz}i%bovX4mfU_<40!!*_sk(f0uux_kAknb8%7ih4<uuaX61P+ z*yPB>Fb8_YY?@_EQxJ2sM@)<no8-Br006)3{C%1f*W$7SroM|ubRB^6gS1`+(c1z} zkoKFvW;N)}rKWG$+6E?SQ+frvQ>HtE$9d+`WJMF*r|jFLP$LA^9cn4~&YQaAdY|W& z>-Ge{ai_>$#+D1A`5~$B+C6L==mPOVQT8G8x{5CSqCO-!0{P29E#_R4%yN(+HfnRP zORG@=zsQTn?0$rCA+@+RI@a-HE%I?Xiq=}|pkl8LLN7k1mmG=$7<U+RFWhZih9<>j zoT(G3#w!Jl!#@U|fDrIk+v>i1(f7c0m%<wO$@R--|J|Iq|B0sgV`F0oKSqeY%<7!X zurP2tl6aE@RqM*fBxJ{w))o`@2#X_oRM2Jq1hk?8Bw!N?e0+@|h{u#^K<c$bX<b&o zz|-Hy(<-NTV`CKRf)mPlBovE&Y6!#kl-J3#e$wb5=-RCux-IcFO|B>jK@H4SmbWLY z0{Pc@x3$gZ*Se)D&7IOtyknPiuF=pXS1hy+<)$ZR@|;c2D>nP8H72ZUgL+J18;Cww z=C*)#@A!R^jglg14j(e3cF_NX4Q&2u-PX#qmvvGyXZ>}Zpp|SnZqruwZQ4z`O`F#| z4w_RU(y(}_lJOQHibZj6R_zv^xF<*T1+S%M%pU{YYSXz5!d#2%f*)+k_=2z8J|xBm z{|$86xNg!xh1830)?^6h;d{x|6BgZI$CFWYzBVJXvK`VPju%WY=0KsHNcirfW!>Oy z)OlKG@wiNu(V`O=k8aEO&1w=?l~GYLPM-B&@GLH`vmr+B6m&`4zR&71NxAa}&qq~0 z8%*;jxN&N8;}YzX0x7R#3ALsXj~WPL?n1z$H8tTpoT{{j@e+s8lzz|zT66!aGi0F~ zMb)iHGD2o_66E5dd`20#F)4ilf0W&%?GZf}i?(0*PN_PdKbKPwjGsT7HPLvwxkWzz z_9_z>st=V~U*{b9G;*<9*<7XtM!iTm$~9nsKo*JjEelZ~voW!zy3^0qWnFWG&TEad z0qYHTkGRR)Lui6B)VE~4Z>{F7yfl`>Is-Sc*+(PmU~XZ~F9IGpcbOFDbhW~lF;RjC z8Sj{HPAecz5D;>@SS?YGo);4KjVgpstV#=);~|7P4?>=z&r(9%#GEko#T&L*b-$OG zre4YL$0<Be%#@-Qhabq%nX}fdwM-IUa{^i9NiL|>0t{^8QU%%7MCj-%)P2K<$UUpL z#20(>Dr%|(&^!Edk&j{dMKko4Jw+>NR3Emorlpft)6(cPt*JhE%)>*obWd*ixJa0v zADEMk#W__Q38S|4=Xj5O6zYzRKeveq;#@*(^da)p-$LV?N6DD+1+*Vbl#$6?UXMTx z1EEtfFJsOmj2Y0$lKAp?KqYGOX7CMSx+~~5CH^j8Yr*7t|MY%{h6ydRrI(%CLdNjD zlQd#Amsy)1n8ZAu^#>EzGMue$6xd2wY_CTXhn$MZfF+^SGd7ttikUy260hWS>Dy#P zr)Wfj<_Hi8=QIAy*?R{FH7Wz~)F}k+#&aG10vjVV(LCyE@5ebzALWNROcY<-n-2&D z99)<*sG!y`fTz;*jfvS5Wc@TvX|4crk)${<Vd}I-lur3oiY3gIhMn^z#1jBmLi3J^ z!4@*i!y_l5(Pe2(LKl$pV(CwHMGY&P{mj>U8s)y}O4NyPt}DhzA0r!6yKtPFE`g;) zktMAy!8iXL(QlBlK_e)QB(eaE#uL=#L0Dc4ELI_wQ2OR_+vR7z+(^qZRmaTcF}=D2 z)3?dgIqUh{z?v{tcDR0pJrDig`pV4|gw^*PqR@F1+A3xJEGlfd9K7v`;?$0o;>Z&- zZ-Gp>;rz9qgf@5WW4_yB&N-To=V<CyM{raKVZmf7`YFT~ze`l1mYR01M<8b&0hu~4 zXC8qZJp%bad*{@09)WD0N1$+e1Sl)!e0P9)zvAKd9F_5n1>m^Px(sVPai4a{Q$)W& zL%dkt5dUry8)1H&jijY5B(B@u^P8{G+r7;RmC?|P$O*M87Kn#X&!uP*s*dT9UOKj@ zCV~>$0k_SQoD+s&DY`Y}q;r&89-lEsnaD9EAt@7i^PDgqP&-yB<^=)GQ#9<$T=RHi zVerQ0qjcN1YsR{n!NPpY;ARrqOA~Cj`n{yZ2dVafro8`PH}dazs5!Ueg{Mba3upQT zrIOi4{1%?9ersI8a4zcy@FgFCQj}BD0DAkLbgZ!zxr~c1k3|tGxFSEM#$@Ew^AJ_{ zzV?WvFD`0%z>IF4Xg#tgY6-*IDJef|3tKG?f!>xGyh}89qSJAdYGe<u`<KP>i$Udp zojSFI+FFa?=fVjE;WBE-KWvCI_vl5q+(Fxq-V*?>laI%*<19X3c<0Pc%9UrVwYmeq zew#N1cpa4^*R1?U+!QFO=avb93aS?+{vUS}U;zY+!unbBkNLd2#=O$YtjdK`+||W9 zp3}e;S)fOUeIwR#9rE~i(VXXTHlx@1k~T3|7RN0H_HVxRd8Zf}{<pVhXTTi7YrXJ) zu|hisjoHzn6d|ITo<7>hx^X11B6@sESNy~cXkMtT$Wp;)bfUjNbm9wfgxLI&T$AI1 zJ>Z>Su(){+Zbd>YO!25*v?2Sf2{A_};^inXgs-K<7KaV=8UXQzlIie*Ml$=IOshGU zHu1#|?A4?5dnuB5v|JiXIXzIx%syx=hcwkL54gI)lTABU<kZM>EM03>M;uMKq8-ZV z@%9X*Zt|$z<Hr~D2y>wh6WB>&`%~#OD=z>|K(fEmGx9@;OX!!jT7zXvxo-7wB*k%$ zZDlL9)nP>uLD_MoJhs|<7<CNm-dcBd%i47yEw`utFOgw%YP3XB$@-mXc8xa5`F-f5 zz{Dx0P%{d3$(G9dCJ{>=EyRhqTI5LG$VcTjyzRS@yj+S1Am$ck?M~w{tfsgoR;8C| zcK$lSlmwD(WQWU3QKL_Bq(#FWiJX+fycm7d#^KRLbfvi!7yxon)-tAM+_&Zy=aP98 zb?2w-+=9~diSl#_0ZTxI{mD~U`X$b{4X}qiHCC$uE`D$6u8_^g-}7u_VNZ;MFQRTt z8^w_tSoei-zGjJ@ddq&tg;mKtZA{qrT~p@MVF~}1p9{OneN^ec7<}`yZ|Ya`=e=Qq z-NB}6T-K{pMv<{u_3X$-?zba(p|P*A3}F446eSAPz%YHITluQZ`Ykoy*aWYxgX(z+ z8g)@RXn$#BFktUUiHt3BWZq~NId=F{o&!Ql@xb4X<eHF?8IO0sbFsSDOvFBpT$Z#> zXRCfy<BYY&V5>`4fB|0+%w}3_s9au_2p&^Kskl<#RmD!Vpw^rk8-b*LAjqk*?w{Kk z9OmcBsZGyT=Ifa!nyFq(WNvqgAwE$f#puyKe$#tOIA4W+HLKWOF5btDP$c?EDDj4< zstZ<U*1W>SGDOHC-g+_$1oM+i!hm924-ncwmwK{?`Ku%n!5+=Qlg)gbm=fECaZA1_ z9q1!JPv01OY1~!waaXx<$5N%GW1rIJE?U*^gDja3S<(!dT1;3?xBN1aWi)5QV9)hy z+#-n_>meD5K8{Q#5jA$;*aXa{&iFf?;ftz|F#)IR#`uEH=ZO&;ZWJW*5<l0n)3_2_ zx)d3`ed{iyXQkVAlp2!%F4?iaGhe6^LL+CW`@v#3ojI)=5-RAMNct`cJYj31hMHj^ z-|20r-*(m={=T8+yw!74>Nvqonum4gcNVX|cEM0frgKM<WZLx|2~vz|QKZbm+Pu`J zwb-PY(Nj(Bl)6P^=oUv>?T<O*4#`Nm&_F3MDtyc*GPx5k;wp`^W@y0T@N+hdJNM;n z_RD4@Z^AcY)_rXphay{WUFz8mOH{9$n3y@~`C{AB@0tgmrxY%P<YTj^c-|auzV*A| zb-#OC+Y>gKFMBE5a1R8>6=sI0Ff&9oi0CEn&nN-$Im_E*E1IlW^Dnqxgecx5=sSkA z?;-PCToud3rK~A=qv@_<vUNxu#iOri!?*gpTehu4x9HTmOP{x{gefoQ+Fngtc~v-6 zZS}jqTJwHr+F>IL(f!OLGZnA?N=lceX|}Cz`~_hNF8|3HCZk;R*1`F)3#<$N?m-q) z(iE7WL(qgE>h6fuv;b1im-FiXKK{t3%FpO_N(z7EI30d@GCe)j-Z!I{>E1>ve+mL@ zT3D4up^@29<pdILOj)AW<IV?R`SV<dS_L}sWl!mlNl)i(oE)+`#%ZE&y#K}!511N< z&p^FMwf3GD`C`-^OrCm&V?uZ$-aji}IwOwj>ZgT-#g+rj^tyt2{bz4q^Xp;^p)DKd z+Bu(&4+evA=%{6vG!G&}{>qB@lnZQkcKWn*-xKxB=DpwRSaUwAoK1cJTbk+u-<xpN zaD=KTt5Gh~Lr%Clqx5@SSE5Esf9Ls8btz2gEPM=M!zje2L}}VPDjuWJ#%{fU1XUib z;K<NIUTPO(;F+HZ<tvX0E_H&Vye~zfLo1(`a}{5`4hFxK87->Z3eVistF@pDiXS|z z@5>|YF8h0vIlRaV%_h$D_5N@1w&w80;wb(6)-{F3_e}`ivP_y&R<Uy6!Qq0|`)E7~ zswJUow(qUOCGoy&gO`Xxu1hWNg0Az01v65^<L0dABD{mjHQyX|)GrnsuT>T{*hSj! zL&e>-(m#AUKe)JeO<(BZc85#Pii@5jE#h+SE??;1GPb|eyu*eBfX&^7Hs8oX^8^N! z^kCuAaN}FBSSt;$!>VdLzF5|-BWZ;_@dR6R9jD=4a?E;px{P&!3Z4}asU@}WgTs|2 zO%^K$j&{oM)U-_Izxod=gDBJt8GZ^-2UNu4j^k3gi>1S~mPB*DNy4x@p?5MA0=I$V ztsTpFA*_WID=22*2saH(|BuSoWcqj(x($|z8*^w{*09xGLdh0)t2uOB{aV3Tb90!P zSNklELgATapSI9;2He)Rg9ylUWRW*=TQt5Bb~&zK=IdxgYUA7K7?6%m#b#(!OB@@< z$VWhY){-$zF9Kt}fqI(Q`AK4%L0D!~kv-QQ*EEt{FV<MbrV-Y+JFE1(>JDgxdGE~Y zbm*|wc;FZ{rlDV!c%2-C*D$8NNfw6K3DPcjm1bXnqr72nQ3PQL4+E^5IqGs0qZEQ> zcznP|t(hh-=vWDD6R4=P1`Ml0M&7|lY=H3@OQG+}kT^`&GBn2s<vW`yKMQY|+0sv% z&SjScWkLSIW+Hlu7_QHZLKRo#3rOCv3EJ<_TWG^AWMd86+F=WZtH}ar?lQrqm~`hW zBssC)Fna1&p?ZsCVZQmAx!;hwNP$}F1)FnmHXpE4>Yz>3WWL<;N5CSq{Qy*pz*!P6 zmJYQ18$UT#Skkd&Uvk<ceCChAWTc!czp8~-8JB#YX@f_%@m;1g+){nd%dO61qVRN; zyfh8Nv8?>|J5$x6kp5C_I{a`<Tv;p&GMdX&_O=AZ7%n@aQG2Z4MiZ71c3-b)dJC2# z`<iB<4dnLn$gBhMeL-w$*-_TNxut~6Zj-DupP(*BSNcuEESyS5G|iQcl5x7z22+%c z9v{Vh=|Y*-9MQ&UR*5yNfV`X<@fWO{8p`y}Z*y5frKxIXaDL!YEb6*}W5iXzs)>%- zOy~z_=`q*r^AXbw@Y&TxI=pz)!>{qU`p@JVzYVKm%)jDIY5tW0*x`HK+;!<Cb1*VW zEEgx)w<U!jhOPMc0#;zq2h91$4D><3evR@gdd==2Xf=i%Ht9X}#J5@kS2HoIoqrDD zX$6*>K%YVp92HIQ7>dy{=Kq4^cTAJQq_T-}0o#nyz;NTt>3ta*=I!*R1002?<y(!S zVm@T8`iZ9lS52?u0)nNtus*r=4fEN&21-%iX^EFEU0xTbp*ZKp>GwLRY9r6<Xjzw! z9aCW*=3`Rbd1slcj^K^-%m=}z-;d`x9_YR>;Bu9vU2P^dbl}r_@vh<`!{paNfY(qC zD<eh0VSx9F^ml&HJ2u688S@O}XVSqg{MP@<ryex)a2rF1o_Zg*hu3Mn*n7yXGe7cp z4h2lbosRIbO5#1lj^&e%_Yu(G!T(_~PJz0vJzx{w)kR!+*D%gy0({b|a&MHco@6H( za$I~+=r0aGnQnG_2c`Fy_-o7%<DE|N%_+vXc=g?YsKQi7HCRi$mc@a@Sz@NjDS89E ztF*fC5>VAVG?zUV)80X-fLOdsP_m#YMi?<+<CRI$_b#exQua4C&Y|)26eA)x)Z%Dg z|8$iXsQb5Zls1E@EkMFCXp-CfZ}x$&D(wT0FRgca?ScJ^-(v6AMTGFHCv#r{g8SZo zl=zxq`SOxrnT(Z(%}2VFpO9&9i5B(%ik$v4!XW1`sl6)D2ug1V7m6Z&Dx(Mxdasp5 zU>>sT=W|l^G4Y||0K!UM`eBdEcRiA?--w&B-yx=r&r<zkfPW$;rz7?@(6QXgNwZNY z>M!%r6knOlK0C=bJdP`m%%2eml3Ey@2Z}_RK~whGi7!XuJH~J5!yc||JXl@v9(cd~ z7p5lAchal$w1}bT>sDvG)5AJ~q<^C{21L?Oj89%>!|`;Kl-`H*AO8U8ek=9*B^CZw z>MfpvE?3}NxV^u8@Lu4nw`ucuaW?XD*tUg7lz~*57u4H(*c5RI+i{8p25s%vFF$&C zkuEC}2Yh*PzM-CC1q`U_d&o1|-JN!~_i?k=?{5EZc(k#y;wyKvcRmK5G!DJ97!x&I zdx3YevU0CAEfWvlBmm2F2*1-a&-aYg@?gz9v69~X`{q-zXl5<e_q~k`54j0wrI&dI zI6*{+AMJ7a1sGEHH7)Xt@v198Q3AVtLaA50Um5lN$~q#hO6h(=FZq@XX{Q6e#B{K4 zkbHd6J8E=ehzfb}C?~#r5r4(e#4wB{BCp|6gAeSNQ{a+u=}}IN-+-(=oO6k7<=~}- z4n97~gLnw*RUz9g3F0h)1qaqjKgh13gtBMQAN&|gfOsDu&^sRPa8Aw<y`eWPKs+*{ zXa$^40OeDQ4+)?KlytzxpL*Ln+Xpn7<muS2y?C5DWC9KE2rAv<(^Irl71IP3w@(ix zWnIyFLlL8%)hpGFcyJG|-(S&-5m=rFuf?asCj)5W+(xW}=mV(fkovf#zv380fOf?n z-@@NpkbAH$IHUzSRk~eS0qnesg`@#!`H=7fDT476kjY84a_a?hBk)?QNaDCtsaDH7 z5)b;+U#M+1_8^2_|IEk79RZ_1AAz)e7<s)-ukH1=)<f?F%>FF@28F$SDBIqFvX{@j zUKcC$LhnO-78j|v)9FFM0X$6Ke(-kjJ8&@QkzqFZHcTcsHf<x2DS6gr+Zvb-XbnD+ zQRqGX@DAUa>uq;-0wT;3lx@EMk%SZMQKc?NrkW(|qwsvpaoX-}ZEfuY9q-AsLb?a^ z@Ri)^bUhy!(Jt%|tw)cY!+EDb?6miBh$PFW=ND`{LgyaaV^x)0PJkRyRXLx=#R%2{ z6qp$3?%F#A?fpw<#bQ{vG2)^C3O*k2pOW|@A-_ZkufXz_fgTp|jOiUwg6sYEj8~%+ z@=yo5=jr5GIWTch)%XMUgFnGDe_oDXc`3h}%^&bzqAz^?^Ck`pk8f^yX_d40u|S!s z&=IA)5=&EMR<Tl7v5IHeN7WyzVfV$*@Pd=CtgKox@yhGrW?~p(@iaQ<X(@Wa_TsB5 z^*xXgY&UrHAMz{KP2YP8q<o3nV`op_7dxA(?#s+8vCb(|VPMnoJ<9k(=_%ELxE^YM z-a{srlv=F%^V3cO`{GxjWw=v!>5`2EogC!XprbnbYXTi)YoPLTMW2=?J-hZE#Mw2- z>bI{wG=_2C#1cEA1EIe$NDxitP@3$8hw|lpj4fr;%To+ahQ4qq_*(px@h4*?SeaS} z$x^XkH6m>khY|qbSZp653&p-cv=g<XI4-^>JZ+*h+fbZfxAY=F5*Z=<DvP1|0o-Yr z=s#bRJYpqm6e(X2YtO-M@rjXzguoCNibIdzBKkd>dD>3DM?j__$j&hia*x>|tZr?6 zdCn>#ZBdnS^Wz3Xn{tIqH(Ea~){ww_FGU{Jj0~;|G07|_T@d%~HZXLO3BCPwSxYBy zPElg3q0Z1E^tHI2R9$<3BnC0*9n{C$jH)uV6O6l2=>0Y=D{orj*8WxZoct=pA7{#O zDLTO(ex<>5`wD8~WQoAz%tMxa?Xj0pk?cvn!jNetIyp^%?E@ZYLTD6HZo+RUm$HoR z7D=E{adFs~Xh2_`Z(x$94Z4tAZftJt9=KXzolZGPh8@<36y`tC6x!<T2%_ajHouYi z!nj|-8cv2^U=x>UfojTH8H382pNZzba$S?D7)YbP0&`+QErt2TsHS{DJ&^%`6OU6e zZgEi2&DS(WJTeZ$Z~<Kb-C?C;Ag=*Zb`4D2qqRb$My@UqwSMKQ2kBs(s!Owe$SP?% z7XG<qJFA{TnNyk<n3?8Ol4x0hX<RERAx)0#N@F|(A!9R)>(toMy4Py4Zj9aYI2#pc zPd|({J6k~g<7-cb+N2<Y-zVqKzfFRbdkrjAFmpg_Gq*(zSc%qSDU`V=WV4{9k^S{K z*JB+XuH1qpDiqKU*Oy>Jqg4hod4?(^(gEqAyasTQP6CPsn21BLGXP^(q&P8Fg&HyX zXbRN0*e*trWNop}X{M`88Qb|3v=<^ZmPv96nqGW{c4p31T`@GFkWqOmOqmrXMS#}> z7h>|fMP_p=WXti4brE~$RvmkIlA*N0m3z`$QCe}yvjm2o-~q}|#J$LyFm!rkI)U9Z z2H1#q;e0WBh^HkA_12Q?0)5V-HP+9YgfIZLQmL6jPo%<*JfAv>@zC6(3(km((}XF} z88$&im@?CU6ewy$%Y|?Ev#f*tJEw!h8a7hvHfYF*YI^<}SwlGmRrd<UFVaiz38)8X z#=d#-;T_N}l||mhr{k0IWcuRyix(%~9(M=pGwb(H8>q%f;GhZrE?vSTkXHnjx!2Vb z>#8*P(*(&16zmZ!AK8|DQ41%fp}o(WgsNM9(&Mp2Kg^!3EogV;9(&&Ry4beL9~VUo z!zkaA&I3s8<{OSkQ%CTh6Gjqm(32@Wp;UB<XR5H=q8O#s+xJGRtBZW>u1Lxm2JmO7 zu*a}k7=56TG3Z(v;lAhZ#R2|>{py}qs~fIBKx>oX&7CbVKW!Yj6Y@+B#$44Tp^{3Y zSs3Y|*9AKjdpoAz>pTLAEz*FSuI$-BL+(csTpV;<OgS&4P%?C2ivii^Y}_gyexZgw z8(i=w+&2y+!_LA!K43E)wOFOpko#l`A_WDg+<va!xUL5yE8?fuviSAaFrxd04RXlG zcsv?0gu+OiQq6gJK9K~S!zRFLI9s6bBW@8zG|-{BRDAy9>oz*lYaq+8uu8-GbMD%T ziDRAO=*X8*r@C&Ua_A1!26X1@sFdxE9mTPOm3{8DP!$Cnm+@qAPwbw8SVUjqJ)ZbA zcL)L=qH1E$yXcpbJg>yohtoc^kWkU~XyOz$G;A-iD{>qh>DJIYJ;N0Cb30A`?!z9E z4KQ|aVf}VbHAw!h<5J)N=@m91Cmg;X$xH!7#9L2cqhe*YeX(Mn1JQ_n?@<I*Kq>qU zT49SL@0f4y-(aKTRzDtSU}dBExKzZAYEo?*X*7#oR?u3KA_Fx5-7_fTI`rsCf?n3r zBWEwL6XN!3pkgG|MLr5i+OlVId()E+;}3n}G=P?pBq@1f;2Rc97&TB4eP6j%QV?V@ z%ug``5ZSWGoHNCaFvl4{gKtCgz)}rKn_+)nmIO5Xz_@H&A{GQd{v7evKfpYxf;YEV zA%$l>{KDC+R#RK)QIbp$9z4%JWSIOprjtHU_3#;KRAq{;V}Q@}%?lV%XFbhx6f-Sh z5VL++4Z)H=d`Tz7G<aoV<M^9ZYnW9kW<}=j`nuA^Iiz^|nK>MJb5z=dF$iRVzM2Zd z$vl6Omt}fN=a_1Gfpb=?)``Qa?myyn0zO*_HUW7nxF{{QQ2#2>)Xq@3BRv-dr<fxh zE5s#fJOoHeDCO&BjlftuAfnyoLoo-yA#GHi;Lrm!X#(smjyOWMKDo8gEsK(WL%NYY zdh=c>v;$vIV|^h4>75ZS1vOJzSzHT-HRYT@lBPG)^InB9NVFA+;$v2Ca40<$JYYvS zNR=u%$;aa<qertQ+5K$*23LEW=M!axQs+dfpFdMipFcC>OA#@_BP~_br_*ej2%}Vt z^&W&{0kcHUeX<6sGfH_J5A2*&n9wB>9_cNm0)Z$FNQuUQPbsg`@*TG2F<1hQ*^B|= z>ns59MW4`yK4tAdQsX^xbjjUk;guFFBb}e0aS=+Tdm*0|!-Nq8t52Zo5a4F8V8HRT z;qMWf;{I?d;HM(&Y{u@)jfJK@86!}A+Rve#s2~<n$DU+$92alMRfMhsSh5rr5=~LI zhMe6ZUM~3wl7Ugh+ZkhLD=e5aUl>Ks&&Y{(N^A)T#j*QLJW+dOL#n1a%CZ5$%60b% zXGNMW2zE6_;Ed!Z74nvI>Y4!ah1vE?mV!CPG(n8nFl}x0|6%_a$pM1>+XQ%X-WMlq zEm9?fv9}I(XLZpju*xNfz(C&Y^EOVNZJdW*3*-nF?2pS57?5T~W1ie=;$-=hSs|>1 zdkpTS<$L@sJi7o4B@xr~pUd)GuvPm+kRA!OA_E3u>L*le(5c?9@@6yFG%%UadkUJ0 z5P;8;iZuJvuW3FlVcc_&s$Xg85y54mPF;97jY4pTwki7aQRDV5^0E?iD){y)0)Q;d z<s~9{cFb)H2K%68DZ_kkaBer@=TqWfiuWWY^OiF@E>k?kp7}Z7ubgi)-;vM7#;*Y# ztr4@7fU}`YU~u_#+tV0N4JJE-O>>6i0JMQe_)<{>TE{RR;b!9cq*yiR8&^o3N->=A z#cOHmCL#;C6+O|_P+cEp8U*XGc5YHT$)bAfFvoTHCCD%>pQC$w5xpTRptZ4tuB_x( zWgFSj0^~7Tq)0JWD!CFk4!Nso<(~378@3vqj+oNkIzYMc`0<OVg@--tYlohAx0;z? zS(PxQ&^8FUErV(;>Q7#mP{GtG#`|A^iZ5`+5h7J%JYV9vlTusUDwPt6rsW7-kcvds zqxivBmoToF_bF_MFE+E*gqe1vqpjW_GU|%q>t5D#h+aW`L8Kd1(G#6oaaEDxI9kj# zeUH~(CmydDKY1D%<JX`ll5#q(D4g-kH1IHBkO6ZUe@Scy9;#lUY^^ASd1pj9u*&0s zq7yvAUp1X#b@~z730BrsF4N-!<AhvLGnPQ%0mu=US;9Q~@ZT{#LAw|}sfb6C=(-Ks zpM1TsV>b4oYYjC&PMXz_!kim~n$%n_1|DB6^c?g>!~h?c8c7eza&!`U?=Ir3$}j)& z!RslXGtGuMMLvg2M@H*AVE*sYqhPgRit7AdlhgmiLp;K&J`?hoU_dBvqEXG8vChhE zhensaA#<SSa>K8v4bR;c@I~!*s(eiQ9~CXuH~BN9bkh5SD(RuNB=k%m>>TL5=4w>D z43L|Fl2mCk5|3WugOW`Dd(7unl721c#AYX9pq_OMh>o6rn=ohLDjQ3P^FQab04yRV zVe1kyW3`OG3Rh}cLANXXU^cGEZlwqOjxXR*ldKE)s5Li)NfdF^2;RoY-Qa+t6)HB? z<iw`rh+=s#v>qFF53jCKHz>smc+dRh#P)Uh#NKmnE*#@boE<eTM+G`_Igas`5>vwS zGqo%p^B1QDDYT|ZZ}2eT;I^fpPBTl%K^ntT=(kpl&!1aB;w*TY*j$!-vT2c61@k1h zh7sn8{*p+mgQ>M)vm8}E{eL0c3icOcj4MONb`6VDqE0HE1L{fuX!gQe3>%w-mCkA( z3-#;Izr1_~^`}UYM4QqMIG?7YKDzy=0hdW4Y=cKw;L#eQ<SE8to`MO*Pic#s>DK@$ zQWjAXW7sUjBTb0H@EDi=VhAafB;V2!o&Ti}1^mkjsc<X0Z;c;7Te>l!Q+i2{d94l* zbwM0uz{1uX5Ab-K;wkgVbR6?&TrHjr_UDRm+R%E!U5{@lR>|YmmW&r;UIL6~<_Gw~ zULgCB1JELGFGlQmWT$GLb>_ciGtv+4rR9Z|FjWBs2<$JM8vg85`Kui4mZx#aQjQSn zw1}yi3VUP8UkcmBu+06=CJ#rz)dqo6fMGloUe7YUL`>yHK+S(mGZAV+bWx!l$9!pj zdHInaPy6Q=?akiy4r{_={?Zb?8PteErbkn<PMOlFS+=CboyP^a<S<ZU4Adf=n*h+u z=PMd>L>WM4EZ74rR@4%DFpCG%WEwwKHexzt{CGXw57a$7^2|_zgk6N2Rx{`rwbFJa zhoJy8!lMrI(Q)F|9*9slgqasVVh1C>_}vDbDBx2=GDaM*D1R>!mk0Roryo9e;^l_k z^XwcW9=>jNwmRGYS8oGg%5Bl(hT|r{cDuVzR{(rFCYg~h3yqU}1HQq2D?&Qz{s=Zg zh^Ft~UcU<Qi2h5GrT;*oi7C+2F@9sA5AcPq*j(nA=$Y(Nepd4`n@sUL5bU!lyW5m- z&iIO=MP!gJKvH6V)iYiKtwzRI4ARpIU($6uC@4;+=jYe|_2IGn{+cNf;fl~c2xbbp zD*5Oyv$Dc)kv0a2;nh_SuNFzK83wtq#YAS&1FVXqwLUPLdlP;acl3;c4z2KF1Trm( zDLL=E1TuL=@hdST%0+~-kGwJ>@gzra(?gE*qUkx9>=|u%L8eU=ab4aPNLhMJP8@ot zd@nLfj5d)dG8Pc`yL1f6t=rYaq`)pe#Vd&bSd_AVa~oLk$pDiG-A3Hz6A?R|PeOM7 z_nFO1i>c-h%#vE9cDN#(dh9R?vyQb#6yd{zv12f7t2IzB<FcZ?26BlF#u%;KXqaf5 z-E_Oii#9dS&)Q#0Jk#IUL0eBmcPpGCn-#~{QUf&%1^AAYG=<O7_Y7r^76$7drvq9Z zt!uds>7gFG#|zs%u{!+R4@t8{LMIu`*e-@Iae18$XR&ybJAIps<Leo}%2v)OpVf?~ z{2a|L($Of%W@!mheujrVGZ1Z6IvFQ3SleudZebLJGk(1T#u~zdk%%1w0S}_Ez?(F9 zjSqcKD-!X5_p7U`&eax0Z+?8gF)YiiwurVWH~w^W0cuD&iHERQ>O0Qt_~hi<X7}Wz zIyos$PO_7evw;}W*)y>B&E5vg9=QO$2J}y)O}1gaZS{^VSZ4Vhhw+d4C-7fq2IF0| z2eac(C*3v-9d`%8x)@MJYD&=iZYZ>=$skoVU)UvjXm#u4<QSQgHgV8r9{5<MK?!96 zfN9s{{@e-I;`|}YSLAJCPz&^O{NU41v(<kNj-tTbw56uS%pC6$Ba%*;s8j%y-m&O= zXFx~6r0!|OTUaW7Y!6xtfTRAJuh9DmKi3AqgJ5lT(y||%wD8GEYv!7KFmuhI_2A@$ zk;J4-rlXuN+HXMK$%&6ocz|LK$`ojGOwnaZ2HJpfok%MuW1UM(5vKzr{vsXYyVX1< zK-9@@pY`4Acz>VfXqw0c**a9X(Gj&n3+3M(Nx@7`WwV32C~Q_W+%D_ZYU>9;;DZ6S z^fV$w^gPh|+v=co#m@Q31hmMi^MF-t1t%xCEJ71V*qv+Ci11)MDWMrE!bO~pSv0v= zyO7TxOX>ax*4LJHco7#du(E<~2@d%>0Pe~7gZ*0=d;*0!voU;YAHnYRTIXb1$Oufm zcI#7p@2$@eZ=X2M27y2#;K)(=Cp7{Lfmfp9CB}FVI?6bh(8p<-#YBTk^yD8uTK^|o zQ}apCJj4jrhK0{Gqi*&{Op0wStFqW{)Stml>kyk;@h9FdDRro)@(U)dm(N;#tM#8; zTbWJbUhC<r#~(h_n!rlUYxME)pKDDV^=HQq2C~iLk00OH8d;l&)qMBi`7h7jI_v5P z1K59l`KmtMzE4t?9Gx=^O`B!a1^#Q}kD%=jF(!Wo8VedqoToY1B640dJ!ko71k`-I z4ni&PPfkV;f^6oZ3+Rd0YUmBxuESn;wdG8}Yo!8TsGQW1%%qo8TyRl-(wp(nGmJO` zPCKT%-RLPH)`sjAnLsBk{eV^eYeID?v=-H^cVMv-P4TFJUl}XMd%rF6uyC8kxjNRI z*q-VuBqo2Kox_r_1ySpxmH_c&BNZNk8Ziov2=h&-^N*tAPk{QLBoeufSD*reA>(Kv z{j`zNPD4wqq&RZuoqln>Z-#S=K~tLnK~{Md@D_OGgZAadr;C#j6+)@h#5X=2f4Uj0 zpWK|34^EDG@yXSOIKGU_bbQ^OfLTXLTsI2LBb0o_@7~L2D9T_*;Ro$TPg8RWP!-9K zTnKRg<R7Dc1%%|ET)|)1sk{JyC9p80j9pgTIEEDvP@pct#7TK4<&TS?wvs0>#x!Ha zHmf2D2?BByx6cMQy>R!ozG6o+-@#~S9kz5_(41)_C@bP~$fq!pU;e7PQHI4udXDx` ztNRT{5<;}?b-(qx@E^Yv{w97y2}nv3op=&F$<wS_ao$UNxVg=@OkRA63v@M*KPpQo zb^>&l0xV~8%Y(SB<PG+91VULK1R0(Y(3jcFF%3G46EM>uCDo<4R}sAP<n=pG2l(DS zew2@4?@wW+=<QBykaaO_aZO!Jk8y-}?7bVuS)%&G`~5I8d_}i6iBt5=%^l#;BfOeD zgJGWSce^1gybnLOUc6w%PrF^icZ{^il-~_aWR!qHd<!m*?bK|}Q4ycv-RrXC_t)SX z*q?u5x2M~pAzr0RM`?~{Ld6j8adQgV0Gb4A<Xi9T<lElaVD_nf1S|zUe&Titf6_jg zzJUL5KW&^N73!U65d{|^Sj&ikcZ4t9S6~(Mn8aV!X#w8+^6Hhm{rAf{4E4-=|NPyn z$4{TXe*Wg8_w?t-?;k(?`24*(Ug93SlWxnlZd(NGv(}+JmLSwJ^Hf*=P?_{$Z82pZ zfHj=}Wy+VUbG5ysOc8?W;*wpFCvqtD`1A|rP4K~Pr;u*kyP!|Q2Rs^bx_FFHgBKm$ zwJ5Jw`(AICHS=0VJPmXE=a~I0#S2c%9R<|+_`}neFZKB#q<BtJg7ml$D)Nek7Y>g` zaKDuN&SFY0pJ5yjZ%JxiHb3BY_+>5+7^TY_(~M(u;xL|;6o=A!mlT&N+3DUhux-GQ zr{>H@%{|Fe%7w-PgNs_A^*v*7byEI}yA)oe$#_(<0OZl=sZ?qG6+P92?)VTn8=*+N zi)2LfLs=^B-)B$oisYM`m!BVl@G;riph|J$jnbm;wbb24;L{n%$v(Qo&w;2~-t7to z3apSBjrkY<!2<KNvvp+M*cS8lf^f#{1vkuZ#Vf!_K68EPcYbv5Vuutr>;x1*(sml2 z5-_f4fQQ?i?ur)q24Weeg!lZob*11TKiqNC`0}!lymF3bBrFsTR)j4Fcgo#RDywT2 zm(SZBaiV{PM~8TR%iMLa<3&igvBWGI65VI=&`@&)$}1hbmWDrQ5Qu9d{S`~Fy?p-g zK-+s)Df$NKTC2xiafn!$4+Z65k)gf%`Tji~^~9M{jHfd|gs}L63V3a<^P%DG`8<yF zxApY_9RQcdDSV}a5jw;)#=&@3WG>wKdP}Eoa>KI23dfB^8Hhs}ym+_<PDI_b0s2ls z!yrXC^v*%pPw*;4awYu9bVEP6;>s|^yRvT-PEB7s`Bjz_%7f1^Ei)AGtATW4c>s{4 z=pq)q=nsV_opJ*3#%jDHIh=gh_YMx}$cRN1IpT{{2yPM=Nd0(K4(WwQGo~y>x<noM zT11SUets$|tm?5uFwUxcLMKv2UWT5yr7cSiY9+m%5S}uUh~}WKGkgRF0@x`pfRu;R z$~#N(42gVr6u^h~)A9+uVTaBE$=OuW2^ZzR5NIv=j8-KrsA~sxBpYjr6BSkZ2B+Zh zt#-;Eo!uMvW63=|tPzu)yn#jS8)rVcj`8x0-*@Dw2a~Rxo}Hx>yo7NxWCVtkIfmVq z1}O&H>A{oh2Q5m(!Hy_+cRtUb1N8*dFMwCkgydFY`Kc(9n;mcP+zfOGA4o06UR*qR zq}_$&DNURXCb3dG7MQ$|DFQ4d@km8N_~?zIu8w;Htv-uz=lGYzd#?siMD(Y^`dOzW zQ{_Tv?}&JE{c_}cmj-C}Y_=LQXL5)EV_$gI2cBKw?X$Oi;U&2i5$L5>!yJkdCNM<F z%ciH-BA8Z&WWRhSdLZyg$fr#3Uutu^Czyg3fh1x?G`&*owR`%#1^a?SL-kwjUI)LM zX`o;Bva&qt7Gmy)5yyx^adae5P6VpdO$Yby3xtSsRbTB7uAHel^|e`9W^I~qeb2lM zL?mr&68#1T+a{X>MH0G#CZ%GX>dPnBALDaW8TH*M!LxxA&^*Nh-ez#Lt-Cd#V0M1= zZjMa7;Mfw2P5@Okh1BJzCtK5^HqOk90#ld5F~@I3ad>AQB?%CU!sGE+GC?uBzn8I? z%BuUM`dDF^>?Cg>8u+X7h@a%F{MD&2L$JX+p~*^phk5%vSWsM+qr48{mbc6XMT1## zTgkg76GFeGsBuV5bE1${_VrLatEo|ng#P}2n0xp3wv8-L_;2x3Kuo4XS|la;lGu`E zuVXts-py@er!&thD=|ny5@Hfy6QpHztoiJ3ook&c0F<1#=h>c2A_9fF*Qs;;9XC!0 zZg2<R34VH%%k>I@Um+ZzT)-8zED=^VD+JIL9wNh@@YZv+vC2M0nxqB-xW#fuDA*wl zv1u<d1gugR9>CZFJT?gKgb&>7a``r4JrIT(LRfF^2I$Dl0+Eu@^n<Q}{z^vcmsE<b zM+EIx*xOCR>O~4gL$S`ihw4cIlh<)KAl`sa21xcR4_e}6oO6tl8g-g4KD>y<kWt$~ z;bqEMT*#%37wp9|;GtJI*ZGQkixDs+0~Eb<d1-FkUIA3ko<4)P)6Ja_*|*_!RNDR9 z_~ffHW{?=gOur@mjvK0K4Gp9(?BL>$yScjv?7DgVaN(#V$p+~4MFvhgfm|y{LR8K= zvwEo~9}dmHsU&(eB;C)@KhJfR$iNQ7QgQXY#Fy-c5r*M$<EDQvb0@=f2VM0frQ;7% zpbH9HN7Tng3tc;>qGPV_831I<)b&YkLW7KCLP@vuyqno))j%8lmi^&x<(T01tfZEZ z@^Wh<MOVq)k!JF&)b(g4&{nJ@08pvv6e2cfIs!U#eBX;hRll}L2`s91AcAFW2&8m_ zCBL~!T?DCLzJK+Qme2P=!`><llMm}H^4BAnrMKDTkQ|CJkqH7^&hmK<#`((ac_{k7 z1Z+^#D)&ep9PriBzha@29Q4_b70e7t3i%cifL3Qh0xqT$pbpg0RllXUZpgtw1wB-j z4^hH-pH2G`VUNnroJ1k)F3|NE=ndGV2_+4D^DUmnKGZ*T)3p+ETh1Iw1nf7r713i* zl?s9XnCK1M^i=9B?~BqtaW4nrjg8CBPFOu~7spfGN6<I~!=98gM_N$bh*6AWNHT%u z-u1cXRx81D=*egM_rB_jcnF<g7E)VqEkCLaTXvxY<iCYza0<z-z)u$ddT|PJiUr0Q z;we3*W-!}?n}?Ig{jKK<DgSarlRyY)9__@Hvm5Ta6fRY-bwzr_YGANay1SM1I=JN= zO-bj;AL3Z+4qt(=O9o!e@t4cD;Tpmd?~Cg`!HEDzZ#kbQ-m6c1aSPkamjXQKb_t<F z(Z&=0q_uNDBCLW3IX3t=ux;fCrHV*FXEW?S)UjOoo@2g(S#s0{)ag~aNce@k^2oNg zPf>?V<{2S`S+gf{K;1-Do{|2@9oU43JggFHusSM{h8F<tyx?Jom&g6VO@$uY=mnh2 zT^WeFCgu7Tjv68$a8vp9c`}_=3{L2X#W`!=VJ`t9700Nsvnv=o9NDexnvtR6ie4l? z<_qvVgLklC$h1KSorg|rTyAOhmFh+)MCl@TeHdqy-yoYtYdd9QL5~_AXf?Xjq$9_- z?DyaO(CrJviq|p2TGu%Yqyq3UHG}bfz(Jf~#4$D%P3BW@jI6vat3-EMn8b@xc!gjJ zc;C6{YkWEmZwm^1@OQ(Ek{-CdzXzOT%DzhgmI<0z*x1Y9{V8UltFT@(liV}xz4hqD zAhtD3;TU+86j5g&RQm`Y!=q81M;_Oo!46JGgirAT9A1;5D`tKls^tl!E?W@#{VvTh z3mV*Y;}S#G(Q-jLKIl+z1mTHSe&VR0nz0T)<xgP{^rb4*X}Ip+Be2@Mq>1SVj<i_B z`Zx#9vH{y6A)3kK1mZHGfZr@XDFw4Mn7vWNd56N+7J!y;xyTw%9=vF}dC`adN34gG z(A3{Jk8JE`OkgXUj9(^d-XpVMC%bAk)98y8+I!gG@UbH&$C8g4_1E~xzj@fb+PDE> zRi9C}yZui*8wZ?ZbN4{Zm3Cq{I_fG>TP8Bw_@O*H<QN}YThk<pQB|f<tJK(~|5JcB zyjINhlA-)vRvjdAkseEt6USGP3G@K`%h;u?SM1#GCkK<X7;?c)OJy*TChlHO^TMk+ zyb@DJme`@wryFs8$pt+<%XSGj0c1Ax>Jj;1C{y++>M|WeveE^Rzpey4T3ZECFroxb zenC+}zAoSjC=0yxL9d41Il3w`IR{+RExeJ*x<4N}=BRYsqT#F<b<(dYFCu@Q+;q%P zeMRGiz>hP>hzzOazfu!mODtBy)6C8t4U6z6+J@oYqG10C8mETh4m^<*1lj>k4#JBn z64|H|m>mq8CzK*^MDQpO3d<dh6T>P{CK7&9#)|fFN_gTGT3vUIX0vdUZMD5^;6fv> z3B!>F{Z?|*sBCKWyNExFz`Lwo_Df7|A#V_U2ZdK5T;A5H!Z5(^=s~LOaKJ6Vgk@DH z?xU&I_7W5`sv7!5Onb|WRHLRZ18#So76?YnAKglRcQT<{vEeU!`}cte8=Hr3612qI z+NRn@>W(i;CTmkkQ+R`E=RgIr7GLCrqw%0U_S+4a@(KDUIIdi4p{%OpvLJc^eQEc; zfYZOr9c7=BbJ8STLy#jxQ?4QWeU<cZ9}f7o7&wWbSY!PB<ZXX|Vb2iAj9EckPdLlX zJJ4poM|lJFj&t}Ppqe3uj!&aViYQ%=I-!N7<!sz&w|b1-IRmtNxZ5R!)aK~0r595X z-Au9U_@~$d@ltb@v<cNscm0q0ncVgwEGx8v(E(VPmNRRx*Plnpj{JRS@fjK`0X5n{ zz#9TbnSn=vKtTXwmq7f6@Ot=69B52Oyfcmc&Vq#yaCTtn#6ValBSwO5P9Jw#bkAg@ za@{yidcQ{vIvKH_7{ehJ`yHgl?H&)6e)5YN@&KwALggX}mMNu=fYnB?lYDhaaMK)Z zEXL!yEct<Sh(}jJ8I>%<QXiC;e1(wdAbw!OAdF4m9)yiMAayFaLgC)MWbDCUmo;g) zgZ*XPf!I}MlTo#nMag>+38KJrO0Ol@2@oNSQ|5}j1Ls3W={r9445w#{a?$X-lkZ!V z{MUEive4N&wO2$op6Kn2Fp}OSDVT3R!N8+~1dAW%w8X^_-BqMfoKFm=_T81AP4bM0 zGZL*tGL1a=`KK2HO3v_{Z1!louY2pj)4s+g^H>if<N|jUKRmi`!Tzx4Xj_avb-y#j z9k|Tc<z<jaYBWwwDM>V~->I-_<MmlJGFkR0LD}xz`*-f>PTIx*2DY>K86ejn9Ie|d z{HF?en1KO$jWz_c_Aj%QSLF;HgN>ZBo7^0BKXBa>0!^I?l!+kY2W#H4S&m(ylW4bi zy%8z=na+dj7NgEL?<T3!+6)@{vfD9ERc7Z04-HJcGJc#c3bI4H>kO7{Ojry9&7XsX zA5%h++E&7sq1RWFYh8}{li(1DQypp{2_jNrjXUbuMYphN2J($WzH(sphsW_=4E06o zHzqoxpBGcG<uGQ8F1ZI0APw?i#~dToDA$fm1U-QGO>lgB#_6r$U_BT@`Zh@JL+1;# zt@-2Oz4F*5ME=tP#noMSm+L9HT$8(X<t{7&<os;^&VxH&3WRdtlNWg8A=BB@MGwYG zs_TE`*#$eLaG}wvTwpE!GcUl~QTj28<A>CcPN$eA9Q<FiB2znKdx;)g3@{1ZK@xbA z4@8tYZ0NxQkR=2jFJK8xO9-rkjWu+`zl2O*MROliNsoK%mJjcC+iLhp{)Z_$W3Oc* z&i}}k;0cEOdyoVOpl4>6-kRd$3n{90W$b93$kXw~^ZOcI*H<i%Q4np;1{ixy@dReG z(L~*lK#|rp?Bce28)oO$vR&bha27p_(5w1iU*7uUbE)d%Mh~y<t!`f@50QJkQ&6LW zmT)oG%uJ9mDY8{T22`|Fb^8ILKhIfnC%retRRgU7-}Y<#$&L~Z;p6L7JJse`*3ioS zUfYzS8=}l(?1ZQ(V#Z5w9Em>*ooN?2;2|ww+nzZx3Hhfd6d~iTP~-^++@qqqHBHbf zDIJ5H8w>?U0b>oO23y>;c*0%;D+q5#){Vw4Tk}i`YqH^W&pSypEbohF?8uEL8C<?Q zp=+It#u&TkgJTGcJ_&e%d}@U=IN>-Afya>qA!6c=z~5+-?md*S!!w^xyQI#b1~pGB z{fm2COdI<f=7<uBtyRFlnP?C#8a&9icoweld(NlglVS#lNj2~f%BSHCMq&Edrq%c# zS`L&RfMGk5*{ZD!ss!tkWfWL(X<Ex*Ito^MBFo6Ae$7kWX;lAxB{z26pP8K#9m|e< z8>h>Jpa)S4{y(sNC=VqE(TJ<ojrLS0a9$5R5A~wYps-%W;-58Dd2rJTnM{@S1<I#& zZLsX=x@+J!;6;E~&t*}kuYS-~<EWL;`NL#lrHt8@=Z&BsH4IAJ-)=hWn~%F?;NHpH zOoJ4S4!h*ZI_uc22xt+g8rsA>JdQ%m&OUOtZqTMgM0vA&yK7nYqlqBVz!y}Q@U@H@ z*t6$fzxuwj6*Jl1)4Qehy3-=JtN`2?ueW(hgk;l6Tg?|9gV$iWV!ZgJ>+WK4>1xP} z34~DqfJ~b7i2vx*I57MVR7()k+C21CS$0gcLfaN^nNPy}K?S_#zL^m3SNSz|pP<e8 zmS4O0RB-e0x$t(V$X~;6b2m#(Ar?*B+ZEOIXmA|8Vy*-k#9+r0s7mXew-F6Cs$3q& z>wN9b_Z8llUT-=KCKzI3nO_OBL@DL}zI?LFn%|ci;qi$D6^L>GPA_Ul5nZuR^s;x5 zPJpKe83qbfEGJV&CQwcGUOa!Wi(y7iQXc_$Q~;HzuACTtkoFD`|7}BcoTB^oKE;p! zl5sLk^uZrz7%@({A6+x#ymo*00ST_G*#O@`P-I{QnlSi{^2szLUZFRX1{4$3PYIu# z^(Q2qlo+2teW1=Gjw(T86Jjw=EN5q2<@3zDpu!W!jriW!RKhI^%l$idzPfL~Cv^tN z@!wLzR*@^FhdvrWQyxOi%j_(BFNP`iCwTpWHU2V5r{x0O0KggXS)QGh$&Ze4C~`35 zw2C$~!WpOH<P6S1`ewjNST8~QE)hSltU1A3gPZV+=U=!VAjXoOlk%lHF=m!ea*Clw z;f&)XyvYvF9=LwW<voz17z~UKm1ymDKgcu)7D~!U%_Xl}nA>;mVNU1`5?oPaOIG1^ zAEu5aIQjxHQ&<e!NxEM=dbpcDVtAgd?!$`bt6p*l2!mfF^9nZ~1D+jy@rC)Ay&6RI z2`?Y+(nI$LJ$}^H3&U{8_c=Du9opgk?a}_1T;%(bP}ckuN#z_5WLC3cf4St>BT&SC zj{m-O)bY8maY=n*ZvpaK7jFx~%H&Rf$+iorgS%*l`6VxYdKE3oyqXrHc|KW|Re8F? zb;*k1y4odJrpw(t+dV(O`{lhm_wSF=YVqD99sX8j0$Q&Qv^9>QdmK*muWm9=R4w8e z4-FBcYp)A<h9^hO09IcBT;6L$`U+u1>_YG(!LE)JY+d9pyJRIUS9CNoaBg2Jr~t=Y zH;+n|?<Qku0e*aZfSveI1Iub37g6ztw;v1)TEyK!@-jV5m-)l5MteI00JP@6G?&D~ z{n3LFC8}>9l$-Q?`rk+Kae<6S*9@`izKXg`p|N~}4U+?gE|mii1cH#KkoB)Io3w`h zbbD`qfA^>7PlqA8=n$UoJ-Gc~_cLxwBF>-Rmm7>=PtaKeHUWA$!|Fqr!i=1D-N~x1 zS$i4FwJUE*wyY<uTXLUPEuj^PN#+GkB@W-s-o<b3;b?M}KX$Zj|IU~9@9oP#iy?SV z2^?Cv{0!g`$dh*HLkTtN<_#i>RM%~a^s{J3?A*G+ju?G5+5up%u8|gq#olnwxemmn z{(PC8I+CGYA4gxvUo8~Bu^?@)-HpVXj0#n9Klz?QTAnNxl_k2EISZ8Yz-d}~vIKQL z&~DtyQ$o8mBXJ|n&kDxJAWUI2?YBomkaH_1@PNPL2tnu!AdwNCuMmt_flbZy<Bwqg z@bR;*k$M_v=kvnd8WTzu>JD0gKBnOM0PI6B3D;Z!Q26LZq!PQ<fYPVvwl&)L%{R%N z(LEqBH7{LUEt(;(+wR2=VEL*QkOHot|JMmeGu`0&{WO3ebh~{r^aHn6I;c&T9#}4S zwD*qV^HZVGkKheJ_9a%>qtP1n%Q8bOxSESzwV65d&RL2wzG)J49G`X;nCseeGvJ3v zsR{{5Y&9gvRxxq22NxfkdPi>!4&L(#jA`3obnAd#k;hO?h=@hOSfJ?nY(z4z@&uz! z<sni2@1oj*BJ=WJ8{e0kzpkR!eFGY@Ss)=}61qsBLJ3jXRbPUbKuJyX#xG0u5q6?Q zLAO6@{(4{%?vsU=rqP!9j)7PtJ&~jyACLw{$ruVg%w)jzrlIR>J|%V)QscPpmwv0@ z2_L8_jO1qq;V}85Y`e$RHZZepn<RFhd>158>TVyojjNEb!KSgYsNZ9JDnJoxKr8)w zjFE<LDy%Km3WR;wRF{+q>O-x`Q-%onl&X>~@5j<4U*m3^(0ftpiG!q?G%ZvM^v^9T zdcxt$A4&c_U4vO2!g7Zhphi@Z8Q=+cw+u`Gq+ffkkHdL=>Iq74DZT#ip|#swydNou zO^ODx7hxuYqd0i$LGsu=ialixDC}!%YrI}aAlTS=ep`zY=YDVn!Em|V!#|<?deIOk z*28MCGrsSfTQ7V{6$v2cR@%Bk7?IZUQY!gdLeg+wq2Ai&3W@2su2vnxJeVnnb*f`B zWYx_idN0+&)a&^@`3$^t1jw;*pIlq`EDTYsq#2v!!)&_8ou)a`1X*X~RIiCXFg`V% zeOyiun-D}js$u*<sW~bX{RUCVW3#ane|e5ToQ-QQ3HkKkZ@2HEVX{4LdwJN=oZ3`V ztRTjxw*ODl*@V(tiF-DNB9@38hses~Y*r%ZzmLK-Fm}GnZW`;Jbt(J%yG>VrIc7?* zwdqXYu@dG*{dq641avr*lNZ{zcOaDB*SyH_1zN>(^fyGq!Th1ya;3sHdzOLQ6b3aU z<MtlP5V=4<jEpKvj{P7!6``r9FUEw^<hAK$7orQ)$IVW$-J{l>FrIFBA2`Xe=P^<! z`@&K8{)X64OC)T2<3HctxYpi&$d-QRKEk`j=Shb{ZuYKbU1Ad4lT<f7|7w7XF>HJ@ zMhqOH(EbF62g7ZJyON_66U#vPM%s&B-1*8ohGNbPG^#;81Z_6?>lB6~oTG$}DPDD{ zA@TT_Z@~C*ik3vz1u`a%>E}4ne2_n4c?{O}L*S4Q@5D(_N%oMDHYDZily0v-YS*o9 zA(~jatK&EF0xGlR@TdIx#9N?affoJ1B@7-7FA%gjh3GZJHKahP$O#h{gV~C3{7qr& zHI!r_X8_2b09S?~kQE~v<Vzp;#W4b~Q}YV%3<?HM51RwT8yJ9eF<KXd^g+SpidRWd z^f#|*+*}i*s;9HJ2{LhLlUjoGUzTq{-E&Go2W}%RvxOVlrD-u;NdBiW{v~YA&Q5$@ zbJ_vOCjf33qa01danG+PM^+KGxXvX?PvPo7ivw-A;mV=<I1Eg;E^IHN?KHnKf`Bmk z9X)O<!0-1C*(h6c{f4LP5bvd8BXdG}JFl#<@hbwJOGN-;L;mfHH`Q;%@;J{kR7Gu| z$!!&;yCc-FY^u)iY{qX4;b?|e4bWB9wyzq5HU&c6LXKWvt;l>hjsTUfCop{9siGlz z!cq-SK|lHoq*VA{6P}-b!W@EvWBK&qvH0vKTP1f8|G%heX7o@Z2dDZb#)qa4+HxIi z*B=O`7s-Pc8Elq%eMBzP9NCv~#zD=7alr~s#peW#<;er%g=akYli<Oq2|zeN{8}03 znh@uv73GWezeo5AF)+eYqA3sgq^MJ*YU3WkEo}~s5r&NyNCX{v^8<4&Nb&W@#)1-G z1<`DcxTe8qKx5r-?tKE<|M7DVXXF&L0yWf|dX8J-bntcn-!6#aJq5$z6g;*m7-`fD z#N{JT?(ZQEmy;4Pt`oK>Wq0JW8FgdO)D0GIPJ{Uyc$aDQ;z8Q4o<4^DL-R0A`VMP^ zr|?NbM1%Fn08K!$zvk*G1xd|&Sr!x9?$J1#T@axlLXbjtMm_}fu_U}^FGS+32*b(j zrG}gvm8eJsuLK@AI^6Bw1R>JajRpr>^}OP==%myJeIB9!_LA<)OSkpkiwbjHEVD^@ z1~`vXlc(_jp&7B3AlmMkz3~N`ZYk*{RJ9NUU}|FJD{(c$C^zo=8sR)&Qc$NKfH>nB zJTP(!^lhkT;O`<5u+u38hZV@mJD&0u$jG;pkEJ{bz8c7Tf-#ZAXo`PICl*gsDyACr z6*$g$p4^m!hc7V(7cog03t4iFkUmx(mH>a|wK_h@a?ptg1!<Gxpm#h5HcN^?`gOfU zVA}jNum(D}4x6U2-+ffIc6vcW@pT+0ze9TW{V<3M+zB%^V=^)#Z=Y4ENNAd3J@U{x zb0XLpH4nSw4#atwcNgx6?cTn9FPwflc%7PaquIniukslfCId`9PGBX#2zY1Efd)Uf zg0jiO-+(G#3o^z%{y`DJVB&F;bE0J*#_1ol#sss(N~}<~s~dX|=1T~CLUq4vYY7$6 zUx53TqT~+9iO>DxPCKzN#J9*8?G7_O+2QsgnS*>`Qa~<Or&rHp!2ouS5+1Qcs>;qV zvSXxl=1^3l@s6J;D<r5QuKuU&dIoE0979|QG_B*LuPg9)AXvVs1e;f+t0X(Mqmxb? z3hu!D{d;%%k;^K<MVVHQY_^C7ObS!>uoGgfAeINuAvnm1brtVSOc!k2=0_-Gp+WT! z9~=g64H}wd7K3FlKEhYmti_$$%-;=Ta&-^>15OHYSbl5d1p#r(&H(g_WvTJ8g`2N6 z9YESMoq(~01It<BGz405upSA()l;`?Ved|VUn64Dn1U+S6==;2H0VKcZx0fdFqj4! z*bV}?3r#(FkZ1-<c;=a#gX9m)W&{q=@;7QO9g}@PsVX0J-5*WKg>cypi0#G{L{8Xh zEXr?p?AxUyOXa%ag>9_uzc-YJR7TiY%}~p|<@}X~Yd{f#H;!bWFv%#ck6RK&CSYj7 zLY(D*_(F7aRVp+-xG|z)jq~9`e#e6T_D$b8L4CUZaC?#dzH9!zhktj$$LL0#3$q5` zu>~hKIV`4SLZ{XTn%ye|>cRIWf!JN9aF`uO(|NW`@$M}JRY4zL-FV0R<q39bpS+1E z2`D6*9F0bV0ezdG-J|@U`09>FT=D5DUr%qr{}-6l6H<3R_I2G&-b2Q~`Jyb?>GyrH zb7^XUZyv+fALxU72{<ZILH{AX`Z9Un`1~vV<T845Ke=ppOmIt0J2Arii<Z_E@Jn)s zO%q)=b$+EGbJ6O2cq`%D<&}=q2X1Za>Z_5^a@^9|p2C%T7%a)2_#Qdr%LMs^40F8! zQ8$r;BV20v&RtF!=A1^`2&yr5@tjXm#4rZA0|?Fx(VzBq_szDw3p2FS^QYvoKO{Ts zMsoZm9+-V6@g%n$17pq?&Jk>tu0LM#*lnJ!Pa>hUVslc(S0{R2?w=qedSfL@B+wd9 zfSGVFoaf_w<#T3t8Z&*ErP#O<^)qTtrDo%8IhH7HyoY;=Z0bUqfVtO6bS%A)k$C$B zCz!QfzJIY6htYnG8R!Xu_Xus&8F6yTFt4JWZYIQ2wGDLAd+<4CWx>O=nFx^(>4;mG zLrZ{YLk=rEQhlR2V$gqPC2e5?nmoPd#LxAz!W~UyrN`xL0s^U16j!!t%v3VT#54;m zP%@d7$YapO>ga1;MRiM!BQ=q9`-la>k2TRFe*xB%=w+D7iOUf-P<BR6p;)<DoISrd zdzM5=BZu)qYLhKxb<Z$F3mV(mdA?#blrTk{ubaco*;L<CM^#zs{)XG_j_2Qr6B2I1 zr_c_OX&}zZ=PmHZOJRMEYQ?U*$LnyfHdZ-kP(toVMPoBnCf3&@xniYFORRN`+m%4K z>rzk3E4~~oW57Ae8$#vmG%YZ%J?Q)JHS6nrQC8X?T52cXu=cv=>j=^s_kL~54IfnB zkk=S8Qkx^_dltm|T{D;5E2bG%tTJ#TR;ZHc_OBg1YYTmE3L0!cF2K6Fec>Q^nJfcW zW06UBNm=<Y10x#SLWyrf$UdnfyhsDmMW|M`f#Xt|v>LTJlwQz8Z69?FLLD<OS|t9~ zJ2`29D7Lk8q?bf<Gmcq)>^pYE6Tm)SwI2Dh+ndY&ie;&QYRf!vmT88vd(Ac6x>*g6 zyj?x2;Pb``nD`Cxx%WuFX6XNob@f<?;Ho@f^9O3c*(^A##mDsbL-SIA=V8$GJ>I3# z`5g=%_8&mlPFI>x*S3&c)#R8Js**tZ@X(Gdm=2N|@T!K4QJO}Es)#uAZQ;y`*K*A9 zMY^0uWrugABvj2s%Tv~bp$tSECP_fufFP33kvcSD=V%{2_NcX*bQ3T?Q84Hg{hM40 z+uISyuB6Q&<M~!>JW_kp`?)#M=-~o16j%^Yh(DztrK3|z{+pmE;NOT~IY_Eix?D;2 zASe4na5l{}OqI;!V>i8CE#wxuL8HKRFgWp1j2o;Ois;7XiQjwy$~WtZ#sbVU4B36P zO%?c_W3B?;dB#JNyVDOcD<1T4JwL!QegJl-KWq|z1*eSW!$3laZWHFq=8-h2PM<z9 zR)oTTj`7m~x<XpxiFxcFW3?Mu1enr;rVpY}e^Vs(LXDDI+P{!9B;6t<Ko)iP0Zg5f zej%^W1wro$>f;ogHLJ3(mEb-DV*ze4Mal0%6?nC7QwjH1u+?hmHXA%_6@^4wIW{|& zc7RcO0zM%<gY~CJCx>Qx04yhLGd#n%FM6Qiz*J0G#p#nUMU$I|H&oXfyJMtrHyGWz zabDCcdz-w0o$`jH8BFPcC(6y~gxn>G^*3L+ZlG(x*}w9|@N}7H#nkcY7wKgu+=0|5 zojXqfbpQFJK91J+;%5Mjs`=1rm^=?3_*{vs$Inh7KX!Ts_HY!P3eF%?GYFrZ5BI;? zd!ReRkSZVx+S6k~WuezEo?%CIH}y7^i#k8ys!c=3v;j{f_p_NiN=0%c37z(m6NZ3Z zI!U5J$4q*&@1bCX`uOjCvD-;le_V`rqR*jzY~K4_S)(F5J3%!T$%cuGM=kgGJP6N2 z5j5ySW;Y=EB*Xdfvs@dOyYP_H#d4!Xx#&e1e;FaYAgtwqq#9#bXLDRoTpTa6^lc{~ ze@&#zjcaEI`ywO7v~j^r8f_(AVW0)Pc)`7g)twm1hkZG$lRu>`ah_kc8`V#(cqZqy ztTsV9;(#)2eZ(1WzGnXF8NcR`|HV`O=Z^VDo%4@4=zspC*N*yOZJ)qQHQXNNt+0o1 z{n-13pZD-Z|FI@cv7h@yNMYKDt#DUrfWfRR7l?{BMso@s{cFzspQANfe}!y_m(#zG z`|-J^-T#=JL_87N0$~rWgl2&`Axi;6zL+?I=JujL-{!;i^ZY3e=JjXuuOH7peL_F> zklut$*J!gjTmf`j^EFVT<(8Rk;&88GHWHx?CgsviIJnGU^2^iHDqDf$gS*^F=GBS5 zoXj%H_-Saw@Cc>E!!Rz)pIj6uVfpFVe;5&S54~^U=`KHgbi~d+CZKGyF@hAegE)5s z42@n5QE^2$spx)+G52mj9Ce><Lc~xj`tE18woK3qeq83|($(@W%uNY3CpMZtFX-81 z?O5u$#;QUu(kW=0F@)A__-u*gW*I2@DpgZk^Ojo`GDugFGl|UuCfu451fH=e#``{U zkz-M7<9Wn4zE*h|`$g(02yIARw}a`VW)ksDesJ7`jT<H(gJhmwB0#P6D*#IEC=j`9 z!8rLNW5`)%qML_&H<Xf=!lO_(FI#~>1m6a@2RMBMM53w{C`|GhnU+q21R$Zo;Oq4& znM=Hpq*VaPu$)cNN}Hk$!8GK3e!V9$tPBzW*|YNBZrAMJlK@gQTBH#<l>W#GXnM_S z)|Y$bV^Wj|e#Z2@=o&aOd&*f#=&Lw2iOo);)*c}S%_*+8TpIxGs_{0aJ5!s_n)8f6 zpAyP7BAxcnnm!ZAN)4}VQ%l*kCymn{j<E7HsBR%WEv#9GkJf>>Sp8Un-%^ec<Y1nk zxy#j`&~8z#x(Ds4V?yH(dOPLJxyZW(Cy_0&`g|tz%R{)q5dooRmQn5rkU&;T$C_g} zEJ2KcIu(qhiAS%gVh9z1lJr=Q@`NTGV|}O(*Cw16dSGp3+0q`z$DNz**iCvt4~Gf& zuiwDjpwvVz`tIw28<XG4IcKm5^6NBZ*zr|6vj2uFf3qpCJMn$&f2N;fULA8XaKGna zULE|2sY{w6S^JF!xwc8d#U<OSk*joia*BI1^P|qihdLSLBd-~wMGoxcl#lxM17WyK zV`{ng%3$%0MLyY@{rYs<J6d=1vvMOqZi(3N+1sg95TOxwL&6{0`(iO!SLCqDY27~& zka(}|MCmT@$V<^0M7T$fG)UJB$Sq*^7j`K#m<<?O%<1)LU#H2zEG^F5g;IH#5%3YM zI7duX&N7Twx7*+gNVi^`t-*Vgawp+O;|z0%{d1kp#QT6kUQct^kEa}c0SQvGv%J8B zW5^uE1(SR}&!&*#(X~uye$?CUu*><_Fy%6AXvA+kb>9dFyQ!NnEO)6wc0)j`i<rdO zrKvpVk78Y5+#tILQ!Xpt0!DgtJ2zr9;iDm48L<7}XT0^yc7fOCzQCU}9>Fe@&iGz? zT(YHqNY-Wi9!<Rc7U!XW@q^;T_EA54L^%FF!pDE!NnwL=7#@7<Dkr+(ZV(Gs(UZ3Z z2+W4INOTK!^1wa`ZQhOm;t?RTcS8Ys8OZpiY5B8ZfT5!Vl|Q2ClBV!WJ<<4vtdDHj z4W*={2{=3m!?h+Tt1$@p&Df-=B;&ihnq)KAi>zEDC$n;VQnm_YF}p~dU<rVQE-0tW ztaMC1Lz+a7fUP~Z3y)t?{FJ)Xh#{8JNluMexGc-|j@VQM976t_FFyVpF>*iV`vy>6 zM1S##EnL69LF8S^;S@gXQDoHicF$*0mhA<geDLGH=~X&L#gg%|Fu<EOjm=h9u)Gdh z5+1V(4LzV0>#MCWd5-b@$4HB96NE~H<mt<ocLr@>ln4$YuYes@bjnW-OBp##U6cIU zXTR1@!pz@nvE~N)s>kwW2>{U+mcd!y7<sm77JWJ_j5^UYuk-Y6R_T-t$CpFSQ6;{i z*aHkSXVlA!a`~3OH+ZXU8F1sox6+c=`_|K~>H=a4a5hou4rL~V_9fu&ZW{J=_aRo` zFGRF!6R0mF#Q^U?VgQs4-A4_xz$;VSaSu46gXGR(G693;L2~ynftzmyiK0#ql6(Du zrcxebZpanXiEg*<YmUk|NbVoDgk>BgU%47rlaXK?Dw%zle2EL<!N5)MW$$($&?2BY z0^diO>=Q?|G{E9Rr(*96V<WGjIE72hK^WK3%<Vw=#5>`{M%Cz!VKTZ)vM2gEqX^(c z*lc-SJ4-4iG4p}vp*@6jtgow#K#Z=f%&p(bo%>DqU-3~isAwQR{(`_4+$KgEX=#3F zx(0iFW5-|v9(G!sH5*J1zDJ&5_+DXi@U9`P^~3w}@cZlnGily4@Y=|zx<inS&PId8 z5y^BpId{w!9|aTuni^v)mmbHQH!x=C+0^f=J0O4`xwlPYqwa^>QLvhv2r!&DAw%J~ zyLkHa-mGOBwtll6n^a|w6ni36qHEUmwFF6cA^o$(c-6Yq|9U@cB>U%|ZKAGE*T(e4 zLvRZ7KX;@X2azsQdjruDe{smDp3-bNL>mv?lZRXm{@$^er$N@_dem;9kK$ss&k%+2 ziMqW1Kh)*f>eDT{^gUd2QD(>M9zK60&spLMN^RME+Bzx2VU8A{!%sCAXaDxO*tq|L z!R_qWHUG;4gz!;``t(;U_=cXuRv(}P;9&zS=5(6SePM1|)lXAbb6_O@NS5g|FDY)4 zePYMud-;8uLx?B+4GL+;-%RCqK2Ogw3Am(zhDN9y75B6(7>O=Y2afzI>_)X7&-0bk z4eF`YP3!&|2O3q5*|gK@GI{dj3yNwMbvbzadrOPY_U)emQNQXKYm7$(IkHh|RkQ+! zoyd&C@ddVKw>}!@qaN?(NnP^^Grz2|A0UcF1L9e)%)0Ucg$21?y<#8Is{AH(U!E<? z^};>YC|5KYvR@Ae6S3i16|E+Ig1``|bP(h0d-NDw&$	{d`0b_12|RJnUhUE<s^ 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≠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�^f+oX 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%0A7$L5Q{iNgb! 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%0Dbor!Q9ch{jB8A2q9}J?6URN79bCQB?p^5m zqgv^(p}-$;KbkMz*KYKiLR)5*3F(J{^n2#zp7WCCiz+mp<{tj~>8FgeY5EbV7q&uY zsQo7Of+{@W<#r<qsB}Air3&EsDx>)6D6dfRqeR`gQmYM&UG5Ruf6$wv6AXiS1UY*k z@|WM_vv!WzQ-!X|<Q>Ep7#{e|xH`+nHszq+8+u<&zXE*nie0>7_67~%dDfrZ;PGOH zhAirUdTiFlQV26RHpS?oaK6c9K0ZgdKa?Y?{i&y7p0zvKPPT{l)V`NBVJ`Fa0YhZd z39^UDw&-EsvGOmw?~WX_1c=)WEuF8-U8HkCB2_PCe%l$s@1h1;xpSa@?LGM^+LTV; z&P)97$L0do8HJskcCrDv<o3Q$|1i#d`Q@#Vw4@J05OrAxDS@4FBw@H0N%<GgD|>tr zWC5J{p>$qdiCyAkbPm5E+~kPJ%2!~Feg{ECiJ1s9{h-W?otP$Bi(B$g4uOqb6yMCt z(SfcE(l*G@#r$I?B~KR@#zmOi0z~5Y-aOUkH+tF)<eqxnrqBqhgkEmkf9dou>u;?; z<ipHqZ&N(?WV5ymv%Jy9Ip8SUYB8kZ*T0RTpJpptFGcHRto5}bC#JY{0zS}{8{6x$ zAjV2`OAG|vmNuym*Cjq5S2;>{cy6+}k};J?M=5u>lw-wV?nnqJ<r=2EW&+YPp|5c9 z|NK{f+W(9$@Ke~;#g5M2vQ0%CFBcPCw;Yd@!4-+uH%P!7?*QJE2j0_V&`xcGY#5Cq z(21lp?GEz)Q?7B!EKWnWDDr4;UtS<jZ)UhiQNhyOAarNo9+K}A-6xzi6uHh~RMXx$ zlPL%o*0_(&2H|1OQut8UFqKDQ?s&rt>{qARcGW(3^<*SE`y2snrJaN;y4YP6)4VUY zqtO}XrU|zBvdy3cA;ry5<+icJ%`3PYL`C#KTSqe(WH+unw;W{4Za9$v|I>{uf1v*L zCnob7OFAfbSWme}vpaUk&!eoxD2DD(JVfin)l;EujcdYbKz>cQ=&GAn)vz*8ClRY7 z=Uy3lTCq!mSO9x#5MQwQjRDfaSSQ&h5JcMbLz#}BGsgQ(Uzw*4A?L>CHnDwW0&6!- zk?g|8Kj#T>Uw{0^&ZFME;37(5lC&H%tXW(nZ8o-k_4vu*<L8>VzdVFP-~W@{-w_p0 zQe}VPKJE3l!6m|}<9k$Kx#(2~cnBw$mh_80V^D8+)6M!`>X6|wXtfMm&3A1pZ%vWL ziMIVnTXKCQoCFSDd|}+I`|2aQJ&Nfl*1n%=KO9%Xx7TG29W2h2Q$nwgr%OFO9r!e< z`F|3kw0haU8&V{ASHlc%LWuk<*eLR{oJ-i&GV^>Cr+piaYQPQR{P$+i+zr8nu=sO0 zT~tSlVrGmJ7A~q(UPHsjiw`V~f=zXfC0V9Kdg_JGZOsqma3}IJ7PFUWIV#~zLK1jP z<ziCnX+1t_XMN2}!sEnFh2^iAV`(vyU5JTNH<eT{+*&ue6_zpx(_1mfW3#O$TZw$O zpX#R5yqm5w|5?<VYE+!(=qG@Y0Z8HE;Kf$(aGRv^nv|o_xQHxxo#An>830AfINS3e z+#XWO#9fJb;(OjFYubF(!+pq;`J|sgj}!D&%Ui4eI-e-saBsbjsXo<ucsu(roLzIl zp9F7j-AW<Wdz@uALluzY3+RC{4La2WZL_c-OIcs#<8P4q6-s?$iLp~8gBm_77P-p! ztE)aRgm%j|kR^uhdHpa}-+iR%CBBhbC{J_xgU-pS-{ThVcC!mLb>IZ27nlx@z1A^v zma4;{%i4#E^DP@aAum@-m0;8}dv19bZ2soWlc&FV^Clpo)wHfqc+cn4c8m7~OGP2~ zOX4^=e{n&S@lu-%*f=7F>$Rc*Cy}WWXRAs_?MJ>;EXi(s^ZBx(pl0~jwU8?xb$z9} z007r)0W4qRJb8|3+!d<WGFitO+R1)62;~*lxMj+vP-0;PQ0$IgJUN4NXNsMspFMYL z6doN=Cf+gSR^y<^EjNxvL$u6-`z&<mw>uKsp8eI~Rss{n;rO&zCs8g8mR=j>I9LQ_ zIV^*R%BM5Td5mT<Oj1{8XXV8Onap6Hsfo(1fJVme;72~!#Kz=W;WU=hcX>^gI&?*@ zhx77`%(5U|(t9jjs_mcb9a1l<8EO3R(OBnY26*(sjVJ77UtwJe=zd+%dyXp1DTN>m zQLz`*F2yhw=a>arLpz&S*TB-&%9QI(r7mFqM?55K2JZwfyt-P{<)|=(+*y1tJHoOU zM6c-6l<dt6G+>gC;cxa6bGJ}=$Ogc~$fq!BF+ad5)~7v7Ci0MXCcarzo->KnDe)#M z@ez$?st|^zs$&|N1BoZ-v2$i3^2=dQkfkx!ImM0Ua(Nc7d$j+uRvtcx*fV@QhnWu8 z;I*jO^hTBjHn-VXj|g5*)ll+eS)A5@K39)^TdcQ<4J~I@%{Ua=uEufIqQvNSzn#<H z6ECbTN0hx|*g&o<aFBVKXk}l@r@AfrAn|)goVIiGbUye$IScQ#xI`A^)LJ+Ca0Q@# zXMR>LRE90sNsx(lXE$4x_np#SJDX$Yzb!!8y_)1Vkxt?AfP;>8XXKsbQ_dcCphnVD z+4t{rZ23jjFSb96AXf|4Hmxyx{dCcCHUtY#V|0d@VH2tnCRMt|R$C#KJ27Pb&5T?$ z6CaO@SJ)4yD<P}hd6e8THTnP*U)?Pa)5Z5kRR`Q=&caiZxti9O<@usb6&B%e1Nw%C zfNOkH2_Th>w71^$cQ=^yZo{NC#d<&geo>C8VtC@SnWtWAD|9=|-vSxGg4+Q5>ze?J z8<7qU$gVWglds2RKA&0ByaHv05a>XvQv%ZtUf;)R?1&~Rc=>_;VV>-`Eo@FKsirmj zFKag4i=hn{n)&~7XVB3?0n`AF^;N*qq&`#8CNSC79vKYuIdm(i=njFnai}WVe+|#t zLQ$mc!!gMNZu0BL<1wq3VumWGLCdkYKE7I1<T~qsKsF95Ft#K?cA9WDA?%%YyRmc$ zWQ>byzI+_JV~hH$<q?K`wObW>q~$O}Q<#xBKG}W6Xz=l$SBrw#BHfP*nPZ8oVh*Gl zgGcbq5<Vgt(9WooRb630rJ@AF<gzzd*b3j(!(y7x%W8mp4%}sU<zH9CQ(RvzxsB#| zXpeMWhJ`K2QqRWu5}7ULZE#B|X|d^0V;RW0L@zV=&FoK4)INNy%VKKFE_rvIFPX)w zF3MpS%ZX7{v0{OqThl@<A04{J!1Z1NBWlSIUa$G|NPgR|tNDT2xwhPTMnTqpuKo;E zXBm~^AYF~IKo~Qj@ee`ro%&eBtOTg@gma2V%Nxr{q7)?%oJ-i7+F{Q1C3}&WUR+b< z`nuhbl#xJCGHbDB4foi*?ZFlBmI}C>P)aYC2J1Xm1}d(CGku3Q?>!B@2SoP8^%V8_ z#eA_e1vJ~<uJD&(aGH1VH0_&xV|xc2Vj`=Wv*^QHPHR$Yh8Am=_}{K8L=ODgb@|?0 z1DN{`eQMdEldluR6T|FNIzW4bs58M6$4djV;Nc8m1c31pb>@RtQ&BHa5l=Ps$Uo8^ zI#YHDc%d^sl2d{NcdR}$Jx59~e4vj(uAdt<f0vhI<vw7-#w`qT3KK9XRB^|J%Y}Qj z;}Mer%7kWMQzn779BQ{i4C?OAt|}_iGsp5MM}nd0oi;AOC6#?{SBW_AUFh}XDEy^U zOTU|mi(L2K$v)TEXcR04PuVD7|NKG^Djz;zRjx1RGYTJ!-~XbI+s=RD(nC*m>pFI5 zGQP{$AQUWda>8rs8VO`}D!l<tLD($oMcs2f$&Z~6<+>&5q*N#VkWVMGa!&c**e2|} zzn}GcpMz{;KIWFpotI9W7uA;dE~5wN(iab}lA)m}WXph{PQ*dy8~D;Q#Zb}jc3@_q zk3u<-lttM*kkS`=e)ldA0#)d<z4)PoN=@H5aP1!+#5Z!1=J&o6GR67;xl)JSDu(Ju zJ}dn#&<u>nYtdt1U={_ugDb&R-d(8a*d=?)J+3J1F>h3!&I>^@UQpC3>_b0<vsBCL zk1CTj`kQ7g|Kl2`$&pjhZWNR@@jI5aE}B6$Sjh|eR$I^B2cr3b-F5!Rx^ENe`B>vu zLgTP#(@;MMn_W~>r`1I@^~RMr=V77OQd)*%{JJT<)(SW9F?<y|$<Xnh`z3({0d)aB z!SCgiWcNNlk66)5A5k1%)l@Y*--GpCSi~+J9=NgJuMZKf>t?yf3O(LNS~*L}KaOPM z;OUl^^>h<C&8@Ac+}jr>IlJQgow=!UG6szhqEJ|=w=fS~hzA)dJaiz{&MwR0)3GRF zf>VlAD55I%<KCM$IF(qK91~?#U(|SY$p7ilYd-OI@Di(+QgZcVT8;R&n0k2ZSTQnk z5zJP6A*D+}#?D5<8fnos3@X&v+eNLb6HT0E?;~@7JCPEJsn{0Zc8v$sCwyp{46qg2 z$`eT3ceyC@arvG}g)PZgsY{4%8(0`#H%`GDy&cX5+-n<x2NRGq)skPAAS)9py-}nT z8L}i>;+`Y1;anq^ZZke0kvL9uqz2C64BaD#+Sg{#;6Ox(!D^g@`%Zv|R`Xm$PXrcK zc=6-~ns;;%IRiEYGNEJ8%iNV~`}Rcb|32Z2Knnsg8^L;cpMskZcs8A0Br;FObuCQz zBCe^}PWtz$8Veq^)77l%Fyu6zyC^!z&9aM{bC1OBK>4n<)7Zvnrf^PT+a{S2<=u{# zklLjLDjuHOiyRS<EOr0*cG^^9&@)wv#U}KLte)w4xPJQ~6~)(^y1#O(?B95mH69*J zmPYi=_&I(QHYq%cqmw`I<MDM4JTcQ(s#j2wbItX<0x7=~H4u?xP~F{WHZCqe`td=X z6`YvX$tt@Du9g1~=sapd$Oz7Buoo-onwG#5k}`=XqL&%OVF9opGDcNThsC2UU-7Vl zFN>iz@B(NMGKZ-x><~?hk+m*KkbIAYnHO{NH9*IMd2v23>PxC$fnm+X)GsNlYiMdy zHh*?Jo3smP@5wzaEo$w`h4v)iO(dMbakf%98aUKfa}$2L4EI4;O%c7IB7ijEnnk*$ zl18NbujT(3I%Bo{D#`SVjPngQaXu^gI(7u5RL#hbO<VdL?Ev(RfDrH^7_svtwO+*q zeH=IRNx7omA$PPQJErEAkf1X~`f<fl2Qe}tPjqS+btkHyn-ADsciRU3gSDr6yE=KI zb-N?0HB0_0Tr1(E`!1AZp><?=^CjToB5t6q98Bx>RwSP(yC#)Wt3zX7so=hL6(ry3 zCvDGNCj1JVu1?kJi7@h<w@&OuH_Ej9M-`?IY@HSFig7EkznwrE!ZG|YO$fb_(xquD z5(uPviEgVfUuVXOWu@_RTqVZS4O)R~lFWe>Mq`TCtxjCkAQ;V9;vSo8hAEl#vpi6) zvf9(K<uz^j>Cqi%daL~s75Y%Gz+L=bsI+^mpR^;Tn&Z@gakCNkNU<}^hvj04t|z~W zw`j)DkS28Ea<;RDvCAghLV>Mr_aw$9gxwXyv<Z)++1@tHQ?xPmfA|UT$@Z;pQ&E-& zSItPa!gt!C(^oZ7>KODmDm}&2we~^}#0FPqFI4}&?Iw~$&QBlbb}-DuEc#mM;P4;+ zm8%#Rf4Qb2blj*gyw9<U>9?2V#pReIcGs{a0gIY1$5lQGJjmC!|41V$aPsU1Ko8U% zsz>lB-#zPf09PPvDo8EWIhW4knp)=dJ(haihhIJni#Aw;i=dXS%wv5MLPgQNI;yGF zuIME8f!N{e%dszuxyWg<aW-DFVBt-R?NZ4(nR(3?4MigGgsFTek^lK=eA3Lj**I$; zC98JZGh4?rg4DVPXjv*N(rl4z1$6GWahWBcA@9dT&pX{Uo3}daWdBz4C`sDK4BA{Q zcHtF|U4*H)MQ^rMAa_5%io|h^qP7ULhg}7x6E73R+5q&mXpoKcc0ybJT7jIt6_p=- z19ziFObueFN_$-$BCO(D-3jP$H7?Zma$2z$fXxVM#_3@##&&c8j%Fo6&QeMCZe2=R zT~E;m?jInjl*j+~PYBa=(7tW3)~$5_A||;Ankq$U6jL|WL8yuA&))8QNYc$Xu9E`J zf2gC|^njd3uvir1WiQZn={9Sh6%F<Ga#Seu7dr)c$+_OM>&gzMjLd-(pYM=%`IZfr zey3GwxOD4z`3^2y_4f|_D~&+%#406QkRN!ZGev``S2qr1HGJr!yyspamHX5@%Iu2y z;eBh9=eO5PkkFvXx%DL7a$MLX&+^UtJ&Y5HOQ-&-@WK#F3b<ag9J|rJE2;YleqX2+ zRU~~<j0EW|M95Hk9Kq12AJ3ZjDKjWHs1h2m(=|PL$f>MN3O6Y!`iG%rca;ITS=ZNq z%$p%DuQr0WywYI%1=5=5QJjrnhB3*!zOGbSFO$y8*WV93N9+&K*na@=TMGk;jj%U} z<|Qtxn%(j|jh`w9jRTq0Vd3L;1R<?Z(T%)aWr>OPv72OmMOukniyJ+BHRkYYK4%YW zTwYK8nMlKa;5PQ3?+2+xbW8l5fcacBa~`@}V$4Lcxmm=nHe$7q8?eG;5!sOxK)>k< z$ZFS8(D3!Tb9>$l%4ydC^Hx&qQ@Kf}lvv{G3<Joj^X$|-ZgUB48}(dFF{TZ}t|hQ= zW*r#4(gv$?nw`E;3a3*YGr-h^OR`E>qK}yd8r78{ZgfR~M@HQ2MU?E60P2m^aK#UV z*WR=?4NXfPniE9nUTY_a(w7W=@O4u`t#e<lp^nu<>!Yy21*dR)tI3MxZ_5Q{Z2B=? z0A-L6b>!|Ov?s|qKKFMtA{fPzY(=bW3K?0>C9mD%AdAHL`OzX@T-Acc!C&HI#gaGK zZmY_H4JRW7ncHIu40sj_z0?q0z8|(y#bApDaoQQ69NqL2%DlL%h5hbkv-}X_P|zK~ z|D`ReGpunsfZftg8K^7(Dm44#_Eaex^_YTSe7!OhyH6wO(H){;8e-Tn6Qy=M{G$my z{H<)jk>LA!eerV^<NZX<%wE1&%-b!k`D}Gl<nlNIcE-hcSMGUIDra6^GLTBd_Zh-f z;U3LS-f<D)@pv2r&%6n}nmwPPnA^FQYKk$}mteb%(FIEPo&Vtc&3*AXC7&cMR|)ge zDl=Bx>Smn_?@Ef?l@z%vDUvKHvSodUOvI0GM0mZN0jel33U0-Z*x}U;3&CK_>98V< zWw?yr7#gfZw&`$uHNvQ26df3$7L>;c8!}9)l%(lpkeA0!Yao8R1?s*wu!ID_ex<Ll z2ov@S>czpQC>9$BFRo`mN!T@BQ;0~!Z$U*^k;9h1_4^56shsNeZOo<SZBfh~BW5kq zegDj~Y58l>782!77G6RUO$N?iRK46HRKhekSfdTDZ6JQ9+Szps#JX2{0#iscpflx= zP<V{KyA*6s-yI}Yh3*BSzvtOa7xhrb6EgOFt<b*h_@YNH@tEoRHpC~G&jB2>Gq@m; z|KSof5-(6D(5T(=)@V>37xNS|+Stk&3G>;i5t<lOINg-hAw;-W>J9QA3A0+%Oy%eU zQ6pZ*kK#*u*8p7_{1i$PD<lt5SFF0N*V0wv#;c}Bw~)1vd5vSem^FD!lUx9;9Q~yd z-Z-*2y&~QBND>?ajDr0ybIc}UsE(7Vrx~0gIZfbr%aZcl+C%-Bpi@a`O%oABtebKz zu%R$`z7d*CX%YK~-qtGHc9WO)3KWCwcVQ;os8>&kKF=Ccf+fFv3cSkmZ?f0ufrj^_ zJlc;wbTR6@xHI~Q1qmeh_??yrk%XbK${&C2Mcg(~Zq3{n!aInO1-vK)eaA!?x_!oF zZFMF=Azbfo-QGz)caqPY<P(*AY|0JxUQ7r+UOj{jgpe7`R0r9;A_st%@C5L;-C0xQ z*j&g6l*XIpR52`6IV(_+a{y<atxK}M_crWa!luqI)Uwei?RMym@omI={hptR?*sVY zQ904sUrpG(%>pfxkd54Wb{<I%Q=-`{XjWEGNmh5e*<NJ-p@&NO1d}pJT;o9vuc&0a zNXM3pkT5NIUae@XxOuHofoS(vm<VRK+_|rQ_fPKcM8yu>@}W1qCO6B~L-)ndyNyHl zR}UQ*VP^B{0!d4o`EfV<TCnxS#Q|pGLL{Z;Jx+e9{-7L~@d^sYAm}3dAOA5qn|zHG ziay)p96n}{`wAmsoTsDzm&126liCx|Y%!S~PRRg8zh7LbvKw3r#4KT@jew?~V1P+B zQK$<tUB8LN(lr828a?%Cf#++8E~L>phX*<--*h-7u|BSpRhdgWDlN2L>_)6(gAb*g zI&CSV`ev)p6%QFeKLpTU0f0iy>&kd<DYvcLE;Aleor2pWf-TQ`y&f(L{=vhsAm(ec zZB~CQ(|b<qS##ghJi9y=O&FvMON`_X9-Qcy6JT=bU;HuyOt`oI;UM~rAU+6tq->!A zAj+=tnq!+G{LneLNso676X@bBPBxGoB9Z<cxzQ6*lTfk^8%SCvczb^hDMX!lfcc{) zq60%t?*xoH0pm`<*wD06V`k8TlJqkr$pIz+mmL539LtM%mhSp$;ugkacAhyE@i^u+ zKmeP31yte)yalK&mhOp0iozrwJj`^P{YdO2Oz6Rb{gu%MWG*Kf1B2rDyc8^^<2$OV zMFQWk3*;M{4`?Dg{Kh!2stInslOMEYs1xKsE11z%!zLl2-%Xb_!RF2qCi%_EC157m zhuQWa7wcGl<WkH`za+qz=avUBxRCG(#BXt3j>j2iw1HnhLC0ZPO|jat{+jBG;0UO- z!hys^toNXtuHFNRCjHb~@CCu8Eg<;6(=9*;=SMVPxCP3^RsVigjDYZOv7;yu(t6Rj zK{|0Q&3@MuWXJ27wg!Esj+hiVdJgKK{D(bFhsZrFw-YPMb@mNp<UJVhy84s#6)2Nx zRGu$^_nciVo=!)<S8Ht`Ch82&F$<}B*ZNcn7;SJA)wxVIM2wa)vk86w!o;t#q8O!> zQhieb@tP$s{ceOpk$#l1o;qs42>^vo0B(w82FbtuKxW>=+6K_0$%YDp0BV%)Bbm$S zQ?kXX5Xr&|ohUp$HO!~4GjrQ)+@>Pj4uMR#NmAc0(;~EB684j#ls2^*B*YJkd=nyF zgNRa_Bd__8V-4eEV@W7Ek(CzT$W);7rZyl2VTBdzg)BJ6T}1INth<WUrO?@AUQI+u zOD{chac*lxA-J?097U#m?MCBKs7N%2g$gTlvp(R^oHEU+MRpyMorK=`U>nq(BzGst z-AQt5N^%q>cRxGOH))u<1z-P~qdkFI4l%;H-l0}IrWdr?!nitHKLidx5`kw(kmk}F zp^FTVOKW~pQ0>YSsyCqK^6MPX2`h$BfN6Tf?AKVR5f~?|JWs>pg=1GDnYO85D(%p+ z$cyr^EhnlND+WOXafHNr{K&V{trJa1-KSiflm5XHTP>zNW=b|PoMdKIBFwB|U?<;o zsx25krxnIFep4)L+@g({&3<Hk>rZO3_(4n)&9F9a@qdgT&|RgfaX3gDno^%P5t+%e zhc7WMbxt)gKczWdW13$^=2_IKsuT)7n$euk-gVKoOUvl2H+dvI7v(!(&^Rdwe!AG4 zRP8E<x5o!kprET+KSZ`d|L!fS@2cx!evrF03AKzwZg-JTPBpfl_{&Zq_bO$1fOA_| z#&F+eQYj5ddgC6CMlqaSfsefqAK}*Y@zGz2GF4(31I3gCp8W<*RimJRLJyAiv6j-v z$_}b2kmChQU~u7Z;X=4}FiR}lXGJ2kT^UDydU5ub#c<L4f=_KX(?%2I=2FLFRbOYv zL{U$<YXClZicLKQwK#0t%~}FdYxRZ%8-crHGa?DP_50otn%V0LdEbxR5dq2Hk)Vql zs+`WQfc8v^#bq^$;I6un99;AwpexcOpurYl1<AUyM{u8I1AE)0WA-MZh;=exZ=?%E zM=LUm>bSu@;56h}%cFP9n{dK=LT}=ci|TtY1gR6cWAyJB{X0fKVzM#x#$2d-PYhp7 z2gu&El&*-g6HU23{H<VP_nxfJ$nHH!u(Erj2s5h~Y(>VIY#VZoWIi9E62!gHjQ`Uh zJ8s>yx>!*DB!rDxJ|;_~<W^<O@hg)f4veJqB=^_jlg&zYkOkR$5^$het+;{<l?+<6 zu&F~bL9B>&Siml<XkFHA*q-!NeR!U!EIw>kZ)R0)y+(Sk&Z=r$<Wv8SCAeg_57O}X zHy(bYKR1D}!OUf|zX+NwTOnIa0DEc<ZT<@x>7g!nu3a%Y9lvlB4dQhDi&)qGNoTEn zjW9gHwmNOr*;Su&@m<0KJX71*6aA?Z?ts4m!S05=ObW(^Y*CGiOtgW!eFcLTV{HQ* zV+TDnsLbCLqb`E=G4AHE;8xNYw~RJ(FpiyV@xSO3bK<;UFDx1haOj(Hb*7Psp9zNA zd=3{hyJ0OO5SDQWeFuW&nf^h1ui-eK%wotJ|3*aUVjqbGQ}0v7TQB3SY5z@?RvsyC zqA_S-S}#|$zOfKt-#~2FpVk9vL5XHgcGK0k#r0K7uiS*Gx@umF^^zZ;{2PXZ2cDw9 zfLPIUE0Uzp;O)AzTY6(G{n;&3vs=+Knm_6z4#irx<ff;BfQI5IJ^lwmyo8+F*5oXD zn<j~ugs@CO*qC^sKCa?w&Fd<c0wzv&HJqF=^foD)V%MxzIk7SErUi01Y&i(xf)U#y zv9+AS5apt7OU~J{(RX<s?j+kg$+ppiMRcC^%Gut?w-04&9e?V@1+VM1D8}uUpfHZ9 z#Xi1&%ewNdhFgMQ^Gy|lh>Lnn28HmQ&TC{WV7wH^`~@@W@+7))sICFrHDEMJV>)g1 z00|I^ib>@@egI+p$g*t|`?(BQOFkr50p|%xvGT#Vx@fIyeN*ZPy(F^0@erXUk0xn% zPRyX1ITJXm7K>`)&Z#(GI1h-TwZaL>T>JVbPD;UK;~;;nl?oMZ77;FW$}n7Z*CZIk z8zQf>w}q=KA<v6Jwi|(i-WW*!3)0emu>$wMnU|w4dm9<-{Ih2DI{JSgC?l1IU3y>4 zD_oSl&Aa-3#lVdn6Ft(4!XT@h=>c0(V3q4Er`g4faxbR8g%MwzbG&gkjxG~)llcIy zg4}Cdd?irMU}gPnH80<zY&}jXj5xH(;FN=7k({`?A+jEb)`)xVQ-g>JhKgdaDNg{d ztEguc(naDtTpzYBXS~t<CPfYe{DS0D!;aGpdO;zhNW|f*I1TzIUETePZ^YBQ9#VEr zvIPXnIrRawW+Xd?<|iAm+OU9c#1tInt{(b3KQ9)7eGY{^c+X5S6C+1F=XYM?enVqN z@Po;qDn<?PrS8m+dh-Hq&!{;V{&7ETij|d1Rq5x-k?Y~upyI*X8`>8eh%qGkr<i9c z9H{LHWCMEcGS<7mR+D(hz?1W}IUpGSlxY&MdW@s+p9UAp9x#CT`Nw7o+LY`}>rZy| z{sW&3Xa9mcXn>bngOK*T8}4hhUEUohhD*_@4_w=Y#lGm`e))S?oHzlzI!`WA7htB` zZ11F@J89@n8cO7TP)XHPeia>_g(a9}g$b_QMBE_#X?{^ATDnvSymcWi`RPCvQQp$6 zi9I5(H!OTM&X<}o!)Jr6)iQ8f6!i_PNY<K^qtUpapCE3vOnam|oO7R^o339iVO{v) zd;IhKDjzSh9FA=Uyt5)m5`dk;D|)YqrhfW*4y1^l+k0q|-~3RHusok_%U<H+a#rK5 z+3NLrBBKthc350iWB3;MuI0tOU<px0iYeDbO%+7XmiiOfIlhM1RGo1^h2nJF4DA0! zJ_DY9agEOZ_${8}M(0Y@#X_SN$T#^6F2T?3mwCd&WT*7SPVvZS2l53lP79zoTe4(> z`mpKV9IB0xLBl0d5J32Ms0c?FxB`e6Kq$uyQx%hb`c6Vt)SiZx8_&o|jhu@c*GMKE z+}|JN)9<Lpj1R#rpi&WEAAgESd&u&T`>jniS3hw#)q;hu{PWK~`^-zKbj?W9_sSWt z&AYC~<*2n4sg|L>FbF2qHIU5g3~N@B@&ON?d-!D1z++V|R+WuC>2AeR1|Ii!yMPTR z5+_MIE{AVd?HtVPhs(l<U)Y6N@ftWini=wlNad=lh4akLmK!@rB^Iq>u9WDC1K6JY zZjgPx##hl>ALd^+n3A6%o!e-^)aO&Jc&_Nrt}`5t57dv^!oRLy3nB<mwvIF9XXR8a z#YNZ;f|cJyVNLS+1x76Xi36Vb7dnG(^K;;x7}@%JPVg$+e2aBX=&HkZ-1_-&IFuN^ z@o@|0g@tevw8sK8^>dRGn_rye?Y+-;yZZljd!Kb$UG;nyo~i$%=O_MzOq?O2o2InN zAzeJ`Y1Nss-%N`6g)Vp?E(nKsC|-<c2W5+uFuIu%nHg=*h((?+>FTiG1}hwbz{>~) zbpJfBQEu0Oa2LkK&|b4TJPEFZb4=M*PPq^)I^B#*tYB@rD*FobIBxCj_V>1T`|$sf zn3=!!;4ipmPf)K=%=x5|7C`qT|5_6grz>+%A-5~y78iU)!j@4!CJt26y(y_2D=B`4 zN8@J${iZxuZo&wEHm}~naUONEQN^$e4IS2P_K70MpoR06$8sLYvjg3tsEE(Kn-CtY zK2*-dnWFQY`*ER2c|Ha?j`{mB5j)E0F3<rRIVGH^#}Cj!Q4a6K&?Ws2)mJUt)YeKe z9PhAo+jSY(j&~qrIOYeP1{)dI&5pl${IZ+De>ARXP^a+B6l{V2=4U`xKwijZ<qd2W zE0nS};&yiW+2^O7E?y15vJa6RQqNnT?fy~gv=bh*W4M`jPb{A%<D)0#bcZ76k3ZYx z1Wywzg!E5#PjH0eJ^PR!$QA}5+!bn_&hmLZ2HhWk^u{Z(Psp(wy0->OLM$k(n}I1G zrk-u?UNr+|$VVX5jAXwyDzi%zSU@^jESA~0s@~EG72DG3i7jwd9I&AL=A#yr-^c|S zU>h#T^xJen`HjDzS4BRmkYoaxnRT@w2=YFONbXwaSQ(oS=v9rPA<?JzRW&gqP?IC< zs?{f}#zAY@2aQ4j>&_T_P(jFHc)>?e0t9U4_&Q(OJn7tgSM2^NQXFWA^HE{biujrh z_dC@po+gw@iEA~I5)rwa;tv!ZrQ%A%oYK&tt|8YBq1fO#p;6CLUVZ>f>6Vp}nShB+ z#d+5=Sijm+q_$MbYm%cTs+yO&uqfU(h5$Odc|_2bbbNFZ{w#!xLzOtMP^4V7kca1R z1>pSVg8=6@KHycf8V!1iRI7HiqSorGS&oCwydgd!frvT3I9l`~@JAh27i$g*EzwPv zN^CYkztc9}X&djfjS=4qT}0DZ-RTS8z(OCfGs2%A9=&<}7cXHw4}srjdwf?o1ay_v zzstt{lYQgR@eS&eC=U7RjNLlOY>M`sx=wjXka7$SLg;7Jn&+ePs)ir1T+}tTum=b( z<JMN%hD)RD8~|Rz$(=54GwsMvhTH>xbYsvkd!Q%?@*uVu$D-Y4$8f97^CyyMo*37S z+>C;D(#lO}qnFo>OsE?U-p#_1OsEGIclbrWZNE;}8%T$v8fHBlv&W7y?H|38651T4 z{}%*qm=`+{@!fnxVBE+DrG-qLc2jYOBJN);@bPp6v~1!8)>gD=lP@Qg7G_Mz1+j@X z$l53ItSKamzErmKm%1c_?G?>j@d)j&oXAjBYN*sl@dESYNDEw(u8g3|YyccuYb<#T zOGJ9*wmaqXF{e~*ZmY8f1U7g(c+~F1vb=H^-w($iq(I=xFblD4D0UxH2~lW@Vk^yT zBOj(KzRT)5Zr#<$?Ap5%$jlS^o(syQZ0+ucE^A}3p-pEH@zguEwUZ7>(bUwoaWv)| z6<qYJpe#`@>|Z_3=>65w9Q3w`fd8mnJK{2`$O)Vw&kaNvi>jU@ON0fK;6iU<&5tSE zIpvr_XfsTQR$msQo)7G+f>V^K1tZ^0oILBK0I;f*in+<kd|bZQ!c4F6n^96~4N-ox zd4Bz*A<uHP)@MtWc7YebM$jFM$pb%TYZP`=8)F8ib4sq#cfw})ZUw^CnU0(oYKetC z`yn?)HFQ$3fL0x}<P7#32XRE40aG6=tr);Rj;{O1+js>IA#EH7l=&pyC%n^xW|5wb z8jm6%oJxoKUycIRj1ONMAV8pLZ+>)j=2G)5xeR$@3)2`@-(9vNtcmW!^XS~=Xu1=! z?u4u+mkx6y!!_fbP?rr4<E+)0OvGA$Kx}hP?t^g;w754QUc@QdY*yB*uV8x~18OXl z&v^^`fn=D^FRtk1`n7B+P39}qNp9?*NJLyy^v!1`y8n(Qh>1~wmiZo(>rPN~|Kt-) zM#lT1v+r(upt5H^WB=#Xaq(K>`Kzm9zBF)auM*<~h!!VXZJ|Bh^UY9B?}9la|5oz- z@LG-{%|_y?6!~Yl_O4lhiul4=(0%s=!zC)G?wxR`QE3Pks=y-rVXUJj{><gI7Am5l zEqE`CCNrEJ29>dPg|juV6lXES1Q>LMmZ6$Vs_C=xrX*QRr7E50p5quy+-#V1665V* z|1M(*;Bp>#1>t3Ug?>I`m3N_Hn{bW1f)jhewG9CDmNtG%B}ki+I+&Go<z9E?gkcR~ z-{snU@A!{9{^O4Sh%0%~lRNv{fAN3(&A<9z|Mp+~^S}FV|F6IQU;fL#`Pcu&-~RXi z?C<{1fAe?$&42p0|Mma#H~;is{>{Jp&;I@Y@NfS9fBsMY=70Ye&=Q_w-@pCm|Mai_ z&HwcG|L$M@`+xSI|Mma--@)s@{~!N1nIR_o>wo*N|Nj5}ueP?<VQdtESMC)vtQ0aG zlDvN0x?xr)Yb~`1#YP^Z{~2J+%gqNfL%0i(<Y6M&wZj&9V&e*jBhMYzb;)I?xO1S9 zt^V#Gi3@H~%?8;&5v}O-2hBLr$8E{(Amr3Wd82ib67mMIA{;-ByL_PPf?ctGgv%u# zlke<pwoP+|e`qpJ^UH$g$L+tRzpw+W1OCg?6w}U!Z!ah<^?~xeB<HH#F8#lbv%opv z?hk=q7(ds&$(KyKncR{5JCc7#@*88SiR`1V7~&fu1Q)hfG@(X6t4UQavR~SK{wiy5 z%_)J&vB|K#Ly^6g@0BM+!HG4*u@sXg_%$9-RkyFv*#;QdA#6?0q%OWJ&{@Gc1>uA# z09N@RYUhj*(K@opl~}8iCSe%(vc^%rhkl1sI6OF;b}slvJ3G&sB$7-SLyIHlfN+CK zSObCBb2Bat6he1uJA@aNpV@N7#U(CVkxp$kFW<q<6$UQ9q5hZ!S7t~~=4o4Z@C}Au zorHPA9q?n08)ksP!=GsB8;<I)n%|%j#Oz@bRb-cmQWUu;N0EN;<Rwai@Rp+Uj93W$ z%}Z^<V`j^FBjPchPLY~o#2~7domN=vo@$v#M0`gFKZjPV{I#90$Y|#D^$*3CO#-LC zmGkYK{bP8XC(i(~`=obHnZy-@-i@?~6JsfL6jLCU1X0BSa~d3#9)bVRz@?Ji8)GTQ zSgsmlDaTl@J4W+5&P#g4@$b41Wl&Vh_?QKxfTK9S^nhD$MdC&C3uFq)bBFyz!d@`a zZApt-cDNu`f{lWJdw7$>jb6cjEqkjxJu`KGV3T?QSLK$}g+ar%MGbwjZl$Itv8qak zN|WYCCkHb6(w>)TAbK=}Gw?t~DIrHBv?xU#)L=3LW0GI<2WI=#DV%QY_9~$0ps7r; zYD3j!iOk$}1sk@wViv(TarS!{AA?NJQlw>I=D<;28F#@w)r0aeaMR(u0;XnH)sHl% zSk0Oe@~aI!miwvcp=etwOQGX6ql1?xO!G_^Ui3rvj&8S1{2VvX8JTPs6C$><uW8xR zxJ-5E_+_ZvG)hF_mXBcy3$s&(Y3Uhg{+#YTBw<rRr#eabl#%Q;wQZZtJ@x>Eb@41J zJ<QVG(gooBWqn-&ziBJf<nQuwOdPmHAYPtLMLj~#R6Dr8IP;=+nb$9_r*LBcZ@5^t zp(EFPO|BkVth-`t>RN=)=0*N?KMdg!bip54<_8lzqRuMHckDgKIv;sQzH#`xJV&Sp zcz_h)A^K^{W+=+3gVMIvPf}ty?_0|;G<2uy2<3^#FAr~#LJ}iw?{6lf4uKO)3$*WM zC6yaI5VYO7)v>waAB@Ws{%vi}1|Ze%s%{*&s!lf^A_zlcb5aucr4Y1ULbYMVMB6o! z3!Y-GW~U~)?{Xwg!gl>YwaG_+c~z@w4Er)%<EmD1IJkS3goIm#*x;<c-IBLt%RzE+ zVRMCx=9&*Qq@|&P)*<K~$2Yb*X-_(6_5BpUtIt=|fWUy>-#ITd^2VLNWXq<~Vxp>p z%%0Q6LWC{;o@5oFuix5F!r_od=kD;=%}rW~l2jTCIFbGKLvI`S@dGtZx)K@<AExbT z^2gC5_m)_u(;c?QTd-o_6-Ch^bE5QDoot<1-9%<ZUt{A*C2M?1A42zNiL1!qylnB| zhlDOFfpKvx3~M5oGJsC!M-&WZ_Kfz2xHtKfzh$J(0$!MUc$Kr^QPzj<yKY;q;9~L? zsj7f@(REF^z-&9COVaJh;u9Iobat6G$If}n5TAV@FjLlV=(v>{?ysBcjzhXI$CKeg zyh}&f^#X_K*T&*W-Snpvvg3>C6Cxyz0BQWO)RyyE5bYDpS8h4Ruz}=?6h~x|jruh? zD4PcAMa7^oO5jh-=Zh$Pe~N?{w#4>7#ttX@8y4A10n0t6(f#o2WR26sox+b@)T`AC z`b6te_4{)C?`tepy`_`K>6}+q)pBEaUL~(G3hl4erLh?qiPnYr<BdpF(d+eOM|wcV z>V9}$eljr!7Q#vNSS=qnoU3?6wZ!JAuYhQI6NoCvxhxw67)1TI1t!DB7>);-fboDr zIvxlB`|;{LMtOM*kWQS70H+0_J8cUPeDSs9B$iU{vu%2@k#7=hZ@jj*TQ<oA$Tt{| zDY{m3IVhD8>!Ob@h~<k~(F((_`yvxo?@>899mdmYQn|K|X_2b#W2)?`sy=R(^-_^F zxlF&<M7;OX>Aehl`}E0FOSjPWqv;dkc)A8*uzM3F4ZkjRI!p@nsf*Ayd{9-=@avPP zA(wf2UA?4m@u)HrKQKDOIwh(p7JzjD`a@znRW|B1z41Y4CP*)l8uf&=#YCX^uX>_r z0+(*JBF{j#c5bOh@~M}(P`;712pF)0jOYG$v*TaStI0p`Jr}tVKV;9H{D{uC5GniC z+HzwBv%45BylEfh28vq3*oEHr#6zoGyOGYUs-b<hCFqGPdrk$u-TLIOigWZ!oL&ge zK;;C|vH3Pl_Iq#0<tH0*85`1w=ypV5k8z5q*D1Pfn`z{6wVp!PDCQ~2=}=tW>s4td zO8w%zZKu(-P&#mr?BcexC1AS6<vnNQNAaok-QPGx9c|`uRC>;8%O%?pd$npVa`Zf2 zJ)xW3YzBR~KJ;a4-MIt5fb~8BIcD<`WUYnD9biT^809ljWcLsjz@`tb;Lz<%@m_w$ zBmV;l6m<&A-%4IfbN8nAzyj(jA9DQf?Wey7Osy%0b~(kS%-L&NlVOM=?#cAr8B7fj zk#r7q99kjvGAOjHqKdVJ*d@!35jdq=jrk5}QlWz)(Zj)b_FA_xKVundL%pZuZ00@F zo@F8f(SFQ6YX`g;I1y1x{8M+7{SK-t`hrf+U8m!&XW!b%$nUqXg0*%aM-`7D*=^$~ z$N`V6SvStc9jEYb0>Uy4VJRSN39YJHQtt-u8S(ehv;V!Sus&Tre9O5x7L)>OT4~=P z78hLILCkX@d?)-18Vol+EZ3$kHd(}&tY>-d3eh2<e~Vj{V<P59ij2X{iuYJ??Nmnu zuzrlP<>C~D#ogLZG>Q0OgteJHc@>&_mwl|YEk`_*C1T>!P*sxK(x9Jiwe(uudS$R3 z%(m9A;26j(0)CxpM@6S-7FqBj)`-m=v(k~DeyQqc+1i&j#lC0s)rxT65TG@GuT8-1 zO;l}9%D)@0?nDHRnZZ4iyI)xb-8U+Ke@eY40#3LkIurbPG89#;+pP?+YMS_Mj^%@s zCYwcMi(iJd3Lcp`pa};beXOa#@J*lUyO1Fy{$aQx$Qs{;{G{Ql{KZ;dg+}~?d=p;l zBfT>GCJmF>?4vYK+q#z}N=zfsW<R?y9@|;~m_Cs^)mKY)%QT0(69!D{{CqKhf*_!s zzSW60dl|!~PGlWGGPVEALt*}R1NS4=oND?N`tv@N02DTgDT;J-KG|}tMgg%?FIxVT zDeoC7P?fLBbWz!^Tk*|OpGt_VacC?l8j#^^C&JAqcB5KwbUmZbd;*eleTOjCs;cAe zBkO?S8jIfY#uP!fwlaWwU_8?kndi*5`Avy;w2dD;5Lb3Y2H{jBg58<1i3pQtoX_EI zVC{e~4<w>HIh^HI1tvDhEW+_Ju0#r?S9Sm_7P?@T<qh3UY_ibi#!FJzI}fLrF=GLo z<+lFmdo~I-|A@AtZO2F`SJ<2&IY!wq#;DRa#<#W73OzOtWM9k6gbb^rJ+tr}K|HGV z5^eh@9_}SMt((V<tX4qzP_l`^S#AL5Blx#wT~Yw`LzGKCJrCSca!RY?=?zI+oBEoP z=TDUI^vifg+AjlAjbD}0-q;HT^Ylj<lPmPlP^X29@G6l_qV)b6-IlAm-3F<-<03@} zIu9U+LL{wslFy##vhbz|XO|d>PS>rA=kJ9eA7TP%RiIB8<sB>Z?Z{Da)s=}$RWMV9 zjxPDw7OIcIfRB2-+v@|@(fj-)2IZ8h)B|+{w$ZHZGzIEc-Rw^lm~$Fj0jq5qCY^)T z4jU#D;%x^EJHo+>k=;~&gZq~{4{JGlux}I!?y!d_tm8kF3>tsAsdycq0d3m;@r?4) zQT*pg*ZOecpAol#*Iaob@E#C|fTv6Y70MFdPuT=%$P3D`Lbe@L6Do99Q+uWo>j6xh zhP0LQpAXfJxI6tQLIP+N1NVi_+vnG%mY%Op2V3(?&#V&~2lNJY&Ge0BK)+%}rvZl9 zP2oImpjby=0%IF^Ap;s8EE?FU31l!oZ&M~POLmg}PNaIl{q%LKrWm;P^mnVnxy_EQ zwA-RBjrTzQZ7yddEqT2FvZdx>qX`_ls~%X?LldS$fr7p&+gE49Jj@znUfzQ>fw_y_ zZUnwB7xi6GWbNbEwEc%z)2%M;P!M-c1S1Gf-)}<0b(llfvjHx>wiz&$&(jy6HFLOz znbUwFR?}gE-@JM9^fzzbB)y4~={FabSosD;_^0!^P#U7@Hv1XsZeejSvv);1s%h}1 z?etgi7~Rb~j#9mLgQp$r@H4tl&r#BDtzdRy5u=u*-8NFDw5Z`Cg1@$wZ~JR?w06NL z@LM!Eg#@yyq%r<ZS{dafnXr{`&W5<n%2WFa+a+Q}V|47k6AsWLmq``0_y$pjL~+3w zA<uGzY#PRXso3zEwHSq}hg??~hc9>)Ign{OD|8$(hfAq_q9C%KI~5g4=7&8H|0#}6 z+B&O@23}ir8RE}K=$uk~P}vm^oKn*W#P}$g_ul$KuP?U=ne8Lx;dN!<wdG*nX+sEy zVMzA|1Tbo&PZ7W<*=bQ6{u<=alWFPjo77DyqL%D5YU;5YeG`zwkYMgNsDfQLjaVf8 zJ?%l5YO&5H^G!_I5Llj`T-6Ix9E9>y5y@(x<(oQNY{f2~#HnvkT6~nkBEdToWl?M~ z3$s-1gkoqZ`+^Z%srEB&6WOJS{$VTBDG+hx`$IJMgUsD`f`&w!>|;hCcZZ(kQ=qnU zla;jX++kfB?k=y(U0#>Fye{cfqAw4Bu?MH`S-!aJy*!km?UVd13BFXa6V+WP*R%r$ zo?@AF6URZv5T4g2mp@Y^ouN_s`4|w#VLQvepE#B&m$L0kGG@R@Hu|wrf9bGl5~aD? z5AGQkW*o5rB+q^Zyc`<KxM0xFdI;gDLQ98@fx~Y2fVwhQZt$_E!Z03Z4xmikHT0W? zV)G)RDE@L}e>6JYClpXB#X;7_)}3ry{O?P8`1x)}jflMOlXA`#`4GFXf{*in!tm@9 zm`Puiz{92pLpQ>A@DJRWbQ{W*s2XWGEooZ=$j<;N5kk<u#}HLgNN&x^9!*8tu_?<$ z10Wc_bvTR9`IV|r)KWqEx+I`iq|+AY1W*V>EoEw|b*f68oRz4Y)dQ+as47y?xcrUZ z6`A?Am~E)2k<bHJ*r#zde0yCYCB+F(fmS>15s2twniC=+<sR8Da&FuWq$glmTNWhe z-=+_Jqw}nWd$*9C^rD_{ovf)Mex_a)p`9`3cJ203(I=G-gNP|Y5#mtKiz-s)!1r@Z zx;NiZzK`(hn|XCL!{BlFCsy-Bn1{ocaG0_q=eSUV0&e%ZCp)MxF%DY#^42|;$H)Oi zgPWYg3Ks^}gvqDTFeq&5oTP{S6F4StFaX!dagtC`7MaF<G^MOjd5z`&ig~M-9Kbo5 zVt`}^_vEhKgAd(9AT!^qnw-}hdW6TQ7gfe%UvsXGF01Pkox>1q0E$W)THFW%le@3o z+nK!X{a9y<pm_b0=EZV_?-Q=9jrV`|gT{tsRBv^#{p(9O$XMF@#JcM!q9RMDsdR}A z=%fpcKU2lUZM`47Y`?lHv3htAxvB(T0Ag|@$TU=LNgbI=3J=sn?6<#3FF%Qj^sW#N zOB7ckvs>0yK!G8xyy!|{0wWzCUdnSMPh42kS00z(t$Q|t*Sf5^Q~%(0OM2q0w>w1I zj7|!E%j6B5gy^|qnsX5GW?Z<6O1@LqM}~140d{;7K(o80DcZoHZ#qiNt0`^T*&E1H z3fbACgJ;`}u4F;o;*Fe^`K`d1zg223YZp;a7=$rXNDw{q)XATb07yW$zZec>P;n-# zR7hN=%D6g(Q+hRAU_wvPR^?p1%=H7Q*rzDy&=2+Ay)$lG%dlrtWPUVig5h@UVcnLt z<0!kOv!2u9*2#8$!MmUnjH{H~dLX+85@%x><#ckQ)R?Mhji^|&pEL}(#KBX0-AiRf z!VI^qO_hNrKY}}EFSM#{x%oTb^0_f_90K8FtJ$KDit0k!+>inHTkMGzeXj*Bmq!Xb z1~BcuJrgicH>3Zk=KIa9_ptR|q_wv@rcyelRpHFY4&YGjg*^_i+Hh+g>f*ebG|q=) zRhs>pX6RN2Uw^0n6!~%FNAYM5QaS9>uCLB0G7~+>CguBr9tP<V4o9pZnU<40@SlXI zm~b8^)bfh-)R*}zDArCov;F|T$8pS`bE)3-BkykZ@ZDa#pL*9nY1-79>&Khz^WVmp z4W{Sucj#U9dHRNP-@Jz@_Jub_$3Hjud|qAG4XMrQ<>agyw>+IYbvxn=Pt85CQ7byC z5(rlT;AX83u6x%#ig+oYf2M?nCM{;Z0uLv5)MN2ySH3%mo<8!e=FPen&+6gNsOHHq zSDXq3_+ILpsT(0amw!h25(_j_Oj+n(tUn#Eq*jZlPgW_{<s|tVih0JI`QjbaF0b_3 z^H)iU!ElkB1qc_(nQh`LR9JRw{^;80Co6pc8Hb4DMoiNkqmGi?ma~32jRQ|f<?eGF zaZw~0#O24b2U^dT?PPl)9nqC91P(^&&3xb)TyDGBnlsqmd<Oma3<ysBSMx=?&GZyt zGlA>?ClWl18i*cnyS{GMw|(U^xAW~u*N@}uvKvt{B@P{jV`_84K2+0c%9-^1chM6a zA_w|OaS#FhnKr;V@Y4pgZHb@JPvf;z*xA@rz+Bac!KGW7TT5L=>6Srtxm2`+APWbk z);Lo>qsSqX0wZPegP^d?DMaUhQ2dL#q_e!i07y!bi%{760D#|TOdnQMq1BwE24ko} zU(>lRr*7wH-;=}!@fYgli^aU%P>s=ufNC@7_&3bbh?elH0X<?uvvV91dGI{Gj~B5< z@zBgGGJ2b=LzNPCUYEnSx<W-#;%Sm<nj|CVC8{HylD7hhWslY1s_K@fw{hW;uEOg} zlTLM(iIks}(`WgOQOrpVk%rsVlWQpCmD)g5xcx4qMcGdI=NJzLsqE|eoFF!Cb$mCA zd%h69hE(ZjYahnO(QkcD*EOn;O3hUdyUkJCLj*HWqY0Uc^ntpeKj4Lmw+?1V!CQ(8 z{y>r08|SFJm{R6KBM@g_nnZvn*(20=gZ$u0$PpUqZZC6_z`%yg<RdZEwwS_w{2jC& zL;x2tf09RH)(_SI+b)FHt?AmKYZWght<3ku(pLp4_k<qP^_FKe*7H3eBS2d&0ke{N zx_Ov@i()kAOtN~ue-icPWVibvn!nOKUlfU0M=o&=kCf9d!3=q@oj>ohJ$WbV|H<w? zWiPLkiKUlz`ig1zy`#Q*Lpw1YGw%(?;i3N|o-}^aj#Vo+w{v(I#<m5%p!3*ev<Z72 zk8+@tDtxgQh5E$W^Adp*TMgmL?jqqttXN{#IY(W00Z34E`p?EN)%X`vBr)|lW8ujW zAPo$7a#&)q^0T^~44aO0+p(OP*u@48EyB9oE9<W@day{WhH{X%lk*mdl2$sE;dSzL z#l+pYS@1;Ti$D>&P<EylvqhW&XhT#>xuPNh$V?%0qm0Mptmdpm7G6(3-uG0mH+pGt z$HbHgtm^=un5Xfb+lqXVpqx6IG8D{gjuvj*wMXdGuk7H;c^6%mI?;WjvxH$dW)DOx z&i}{W+qb!O9CxDs<5L{oD+hph2+oY8WEUffOOces4Mp;DD96rREOiDrGjl`?4uXRr z2c+hCWXF!*BX8D;lQ_wG^LTCFO)S|@auZpW>@TAsrN8_YZdX;mRKFcyhLq#ng`Y$m zoPO`FuCA`G`jsB4qF2WoM^yrKJhj>iZv8YdBUQ_r>KXT$(1X2Vba6KmS8q@f53_y_ zT0nT(;IqdP4kJOn&57!g4EaL^DMqF>eY<5^dTFV1E@0+kQwiC(3I0v^?3Tq)z-mZU z;=dBo5bW<yi54*UA4-fp*Re!GW%Bknk85P)ZOh9;`FID5eKHL;_SVs0-@Xmc^iXGL zpto;ZblSDa)~TxIs%LJEAubr!E*I4X{uRYcKxMP@a7*MPBrZl|Vk4Pf_)64{NpyqA z%@@p0uv7jNc?%x9(uBQ><pv2}dFM1ll+|@V_*dVQjlUg|dIbf9(anXxs4osJqQVY7 zFr?1;;A#e^A!>0m04wSmrsSs=!(lgY5J7DiU9lDP1&`_XjdH0Eg<V5)Xy?LE2=X?O z>d$`e&jOS|KO06$S;^t~RU!)KfRkcpC!e4>r2m>J*MM6>&NHA~udSd%Xr7X*Hq}|! zoKs5Pt8L<C!i0BHI#2MZtf5+YbZ}}W@ZukP=hIcVbqsRksFiOxAYZw)bMXGwu;}BT z6|kdz#9l09Z3DBV1>0g&W99|DS}dn!dgr?yBWAZH{%8GuN!HsM!Q^R1&8hzB(Bsp| zp|%NfE-qqaxkZGZYFiE6)ZO93OwCZZ5wGg|rDA&<MYz42I2SEziq2Sb%Y0h(xa?2X z*w#7lHr0LsU!yUI4etQ#F9f_)MxC%2!=d;aRl;Z)2yCO%i0*qZCefGa7m^hKEJ8G? zZUE6r_a63|wAu?Id(P>%m>;+Sd)-&SI!|U8Q8289hVh`bF{Scwn4vYu7sxH!`u02x zJir#C!-&F1)n0mQt0ZWuuBv+u8fn0OijOI61dgD<u@g9Q!pF>^6FttpvEv0D3M#ND zwrz8DGe6#r%>_ML4-d!PuNsz0149K>ggjQ-RX{Nl_a;6Pt_uXpIVJ0BTVTspiBon7 zRbX)zBDW&w@~qQ3MD()PkG-{y(XFSG)y{Lr=-A`2u0{8Jbjv@_dhPA~7tBo8Y*sUt zIlFX$jc@9j!$f`yc6@_7ZF^TIjyk`<{ky#$jWgV8(hZGagTULW(s=BZptJ7pPpWc~ zf<2=Q@i@uB;sg7~l#~G7)N0hB-C5!=?cc?&c5Qo3j{BZv(7~>3Cwm3@v+QLD2{?0! z5d!wS;G_3)<NE+Hp?Pq{-5e_eZ!S^3B?`B(G<Z`DvoU-Zd5VdsK@itgxj&I^F}#Wy zFEY*tR+GEnV*>5y`msT29j+`1#86*VVcf#jPZ)2E=i^~1@w=S1x#eZPrfaFJe!P<1 z&Cz2-Yse&`;0$LIy=-s{;GGRlvfvIm-OZHGj`-Z6n%T>y{!>tgLIp5yrs^-5sK<p7 zPSmJW71~e-pEvN(bTaT$XqW|RP=CmXCxQ|4BI8MZcYz{nUQgl0*Nn#Nr<3gV(n*&8 z#=AH#zwRG~0k9}c9H@xPZ8`8`K*7tymYH<^BxI#R)9uKSck5n>g|F-Vz-mm*g0)@r z0NzE<kWMvkim%5ru<p%0O6rGQJ9O`8(WB5?v38<0X@=%mQN%H(S<`K5s6IT)vVYN8 z)-}bZLebx`XE`+Hx^eS4wvJDg-;9D{NwgpwB_>LQ*tUD_24+qig%ia20P0D(mWZ7( zGLv-iJD7q`fiYoJvO~va2{PWLDhrWl=}!t!D#XHKw1crP+nxTf9OWDw3R;mBV1uGG z{99Ml;L4lk;Q&`v&5t>ZfvE7H1bqeiG*wUwxN6@kwQDTSQH4hx2orls5Ab4Ujz>^- z+${?bFEYTIHeIHW-9yl8k+;-72Ht+1=jqrc@vobiwHiZgRWYH(bk^EbfmW!OEh}T1 zI6u#*rC@g=f*Mp)=X9a9w?70M&z@HmTU5lVVj8Ws?2=l6h3iyH9jcH^ex|p2v08e$ zUE-f>jbI@L`L-6yrBTq7pQx`KyiMC4Dr25GiSN$lU^v@`D|XZbPsD-xrGtr5F-yQk z(c~~2-LXMH0@SYzx#|pcR7+ZXvV1VKy_2eim1N!$>sE7D^O0Lb<i=y%Y6Wssh<s5o zOu1X;Ym4WWjxAhhAV(JVMZ3tbWwAVE8oqs-7SQZSa}-OCbukuAPSvL1+*lEa4u}5B zOyeZ&FVC4W>kY@e@*H;pAS2^g{x!<)`P+h%I<17G?D|c+_OR<3%6C9CsrDfxcSGY) z2loq**0*waTf)rAV3OSnm?p}X$tUb^19c;&ma~fR^RwU*`tQaW$9G%x44(DwWR6aO z$N8}3F4{_W7k~JgV;viKXI)#w$F<F<jc<DPT!ZAoUwq`n0x`y{R9mAW^F_EnS+qVL z`{&o)kj1E08>IDDU}HdvX9-q!@)H9kp?OD!cV(wiD#W;{gZgU+7T5VX-~Vip-@{t1 zfbkoE43iDzRh-12j$H|}*lY2znYm=H^QqUhi8L1^yHoO+wyph~sfn82*;aB^-_pcK zIAD_@Sey!NAYWLmd6#K`TgOdQ9Aj&K5YlGBm<gU*jvdxa(G}3kS!ysF1z1VT=1~s6 zT$$#30gn~MwUL7=>VUk4uZAsY2A0|aOV~+vF)@vP0rk<bZz)9DRZi)KE*xF4vo@e1 zwm)s^QS|ClJKC<myQ#XpfwPUaoA05tK>eJ|IrEV4f^m~f&jtvM9)OUn9@d#e9LF3Y z;B{cb;<D(fdYtX~*4nzF)HBnw4U_$CsW5ejmqjg<pOAeNHl-yFDPnwz7EbhUz^G~E z*w#2UMTD(!?A;nQe({NGV>cTP%X@-$AcwNe3z^=W%y6cr#k)LbUCT9f05~@}Z!g|) ztA|m`B=S>bI}<LdiVcU{26Wa|%tx)Y+D@*F5*34oq!oO{#~2Uy%W{w2C_u{rigZHz zFA(lOR%yXQ%iuol0LB<r!_fJ+0CNv)W(E>-aT2f4?qMf7oV9iWpuA!i09qan1oV4F zxnCuB2^mnKLlG(#-bFO2DyXh1-jlIdvgE~m1PatBIVfpSC<3P{G=;d6C(X6BXVPb% zeNKT>#To$fssX+DO!9Fy?2Dpl6X)+<p6r!_VtXd24`xits%kX=w?@dQQ+P4Yicxd~ zQ$XEP{?JCRl>=-j+6v`hZ7UKxQOomC^rooc;dy;FN3(R@S`mV$u1X_PoKBj}nu;T= zRUf`yxD(&1SXQL=QkYqanY{rTJlr<hrFxh|6E@qcpNUrg7Up&&z0WCjS4wL}fLg@p z&eFU*zU`fUrlQ-LTSMf^cRUNdAX=<ySfVU0VOEzgt4o;G5X>sx2!9vMr|@dHjvwLu zVD{9id?}g{<T7ql88Z-1O({6;<)}4~RuvtVA)z>Uh!UFhcjdVc2B^a!AgEt~xOWD& zo*0QlFBFn1g>W-y_8p_g5%-TFJS@Zz|0fuL$a3M({>9{Dd?%lEku(2(K5LnveQllx zS*WEReA@7>)ce|(5Z`Gqzcp!I4tb==z(0O^F}hn0@8$%5?<ZHIEKrDncvrDhI4dwl zA5Uk>J?VW-qo5_T17lM)SEzpjFYtEVw5th=PdynicQJBuV6jq_FT=>m+hwrds+kMH z{;Ski0fNee_?9ScNM@>Fi^$50@1V3@7vY)GnGmFY=F^puBn<qtEX9~cGg$z>SLL2K zV<3!SM;>O-UdO2sUTvvk8#2M~nsXdds;vuMXmC7=28QyH6si;*DmDWm-0Mghj!l>; zeZkoX(Hhu}X&MkfaVNV|VVuiyG@Jp?05yOZ3)SA?FJN~n$v@6T+LjMnA}4n=<Z3ub zL;1&gXhPF9oI2bQcw~2scI|gtV%{|3KaXzVMB0*c=R{TCKoT%eyA?t14+u54+8>Y0 z2{oM3tz;)JJ2v`&-d1c9FOT3*92^srK-Kj77`QyLZP&d}89+`~Mk?X~s>YFy-Ho`( z>hC$>;GH56an#AJe%ccJMm|+XQPQGoTYpkkRkMv)!XUxjEpi~TMBE)gE<k-dn<`!# zY+ks?smoiA(+E^Y-V@Z00!N0y?n&s@z$_|?x94x&3$x~IF{?P!;~U3Ee`j*xSyH8L z6~nOQNR9HGZ&lgdT*sUvPMS(aPF|$WHR%fJ1@r_!$XQX_Zdnpv!;gd`uFihlJg?_k zDeiVsvIL&kHS;LGybf5{uj73fX#aH+L*dfv3E2JFbk7IK0_a)vE?B2OS)Sr=TMIKl z8yCrw4|)XLM%=vR%&39hD~3bpp<53U7WAHrM3|XK4zw}iP#AXHF1kb@ZD{eSs1XA) zL$(xAn+(gHqE9LhI!iigfKu-0(#6t)lK`MMDgc+_%~3B_5N%E^4kZpYxH5G-5Hnd) z2K5V%RpwC<ps)!a4h=VUv<^1w9g2W0)g8zV{Mx2g(8UNfwdS{loo%;$WC1>KanfKv zLhhb&!?ON#Ote6?Wy8<9p?yrVbY2ZSktmFO9enM{-1s-g={*afSj%x_4<+kqF9JaT zJbF^@-BMn>Ftp@NszCfJYqY)ZxuortusmD!X&vZpi?y4&@_XWjd*)BcjsRrjS?7^f z$v<gCfN4jf&C5I+^emkP#U5fN>)|+fyaF(vj|7fqt?1~VURLm_VKWs>FRE9>opqSs zqDgGIU3P-Eo-pt-+k&z)qTf+a4>xCI9_?&?D5gea+SKCLP0e|&Ipl@nU?Qo<2xF9E zg#56-c$~5q(zCkb4A3cDSmVSw%EqCn(swK|l-&dUtk!)QO>eE`6jY5pP-YeZWw_I6 zk_)6%s)XFlJ0ObY2N>%ebTJcfuPCP4;{=UzcZ(g+_KYV*If01oo#3uTWyra33+Dm^ ziZ^NTpES5TyRMGHx$SmC+KLF7cI)&P!R^wG>obyoKBF5|ZzM*&(RGy^@_$11B<=zD z4|DiPpk}5bfndz`_H_*BysM2`9kqVz&gCj}dw=tsJ=(zLKvg)Rdcfrs4ZP?cir-r7 zaw`uSpO3RDYLJVpOD-5u=nL<rsi22vKqN^}CRYoEFc)=6kEp}bW|!FmllY13n;bRo zfy}TTq++PN6CB{2SnrOZa-0vJl<(H^*nsO@Kyeb1L<7<T)4>R;6W4=bt`#E>4!K>> z@0z2<Hpgh9_$=fzWXx&8Y=`0FZZ;_I>7V%W(zJJ4QyWo04*lcO{sjMh4Hdsu(&Y>+ z@J+&fBUv!hN~2BLF7lzL-LS{IiFr_SfbI#AnZ+ZBs`E@?nXb=%ZkOsA3{`||ib8oq zR3%dC;lnxl9Z*(P4V(}3QU_Ws`J}!JM+rOzV9MEPv6r6}S2)>}3~_?zSFzo&#ab05 zOkcuB1C^vNwGDr6I_x~A!|;@K7^0YV$|h5;4x@XgLJ!dQ&aHem6Ms!oTPdKFSs*&n z6FUaP!Etp|r4ZpnI)aWT<ru6ha?<^6<@&63Ml0bg)J;s=RMstZ)4v;9#&7mK$tWKL z?azIov^AgJTuw<ED6rCC0&GU3=zOUhs>o)bumXP)gvanE4&O@5+HcMDT)0!pI@ckK zRf8JV@)PA9j2Wgfjuo3M<*%bJa$6;WNr;6reXcr<;I&(?jkcQwxvg&HhRlR^-F|bn z$5PjZK~1d7Mfb#YM+xTM`cRRDYDQqrIu;$6s_17fG>unps&qF;i!5Gsi+#r@$gJ9> z)s;)ywl%(XKSK9TtWd?}a0!rw?5Le@Q;92`v+4yoY2$Ua6e-KY3@Piq;zL*ChB;LD z9a(=irkD0G=bp*!M!*Mr{zHrL$h!g7KJcQf>_<pPN^5iMNY?dwQu>oCOD*lF)|sLT zHLQ*nt6dl6*Vao@PDx-=zIH0$XaGt*Xi)j0mC21BtqHfcSB>@1;o7f;JFC(47tW3> zaPi8)ps>Djtt_djIigkM(-5fQ7!NyA){DK#L|%EU*ak|rj%m1<Y|nfpV#<2hk#w6M z6niwdkowFL>iNBmjEng8S)W%>zj|AzU_4W@a-2F(d*lph;1>(Yt+-xOTQg~}c@rb{ zB^GNHeiN>jeO>RGuj&>Bw_58Xx+#$oQ{10K>ROsSOW|BCZzYzcnGJ_co`J%8gz6js z#%1;#%JRS0^sB{O1moU3I5@Ct?Wtdf25U?c-6Hp3$7jdau$sG&AT@2JUPxvaav@}m z)VUBsHZA$_t7_46;cJon!BXIc5NofDU{Ebnd=ol$I%(2uiWy|q_{G38)nBk8f)7oj z=%FX97jgfrY7zN<4p&NwdT07j+whZYK#AVfPsc;p$|}{;NV^Qosi-hSt6goIpq#{1 zT;HD4;0wSFc#VFeRtXPO2ET@Zc9<eiGDeg+Tw77Csdt%h#3wBB>Y(|vt*q6@G+IPE zS;-@f!D@{el)EJ|QVOeXnoaksxY8GsEp>&oU=8Od`(kz@zmWkB7{Ff3lCYi4H61R( z#a_;g&tVoRXFx@!8Yc(5G1N_&+urPI4J0~j%~3(FGq9f5cQNnl^8NgEmicvhD3%89 zTWF>@9%eJhSCuTjDOl5qp~=ZL#&j?bMK&z%W4v#Lwjr0mA8sk{OKOeGn9e8kSOh>; zfF9KJ#;>D0&|I;24k{j~jHDin;UM;%jN?4X5lPL$jevCp)k!87q#Q~A2DoPGF<O@H za^=q1PkA)scpuf%4ion}Nb7%CmV2)&oTh=aDnr9n&^7E&l_P}gY07IQ1fqMnn)^w9 zX3Tp$Et5NWJ~pk&l>`G4djB8JEOaX>#-^y@veL7F5q~F7s76B?5+4d9vPm0Td$QDJ zbXb;mDtQ<6Ce8)VJ9IY7^JXDK8%8HubRy|XWx7j@QP-@=t&S!Ge8_ml0-Yjx0-Ykk zt_O~mFjHj=*cFGtE7kMAtFu+3)4uJ=)fPIM*9w~S+24$|oIiL`hkNUxQCZsQ$2nfu z?OXM(=D4sCJ?5}K`?x-JD$Lu7u(f9AkYVpyG2U~um8{O9Y<CtbI3x=!3kp|-{oWrH ze<aB7PCm0mOEtlJfi9BvVJdOh-+U8%{r03ZwsbC7Iu|UR3nI=1a>s(NQ_>%1(35S% zhz6v9jul%TzUXklnz6#ymehkyG2{Z-fh`y>?6!3;23a6ju$<<7G5Pun?sUa5yZ~gf zzKbxPXr=0L!YVz<M^3bFhBv`YuG3_k&4y(*a87(LjL0q6GGYLISY;`Eh@a#uk!0JT zXZ8$<E9GTjshd$sAaP$Nw^I@;wLGc4Fvy$}MQO_0vCWs0F*sIE69Q(;#bQpfNim#> z3Wrls-OetgN>@~|rNlL9QeYVRl2-(^WW;ID$el%l9qdm)x=micE9ir%Hg#w*zD96# z1#VpI&0SMuwJ(Nv0kCmopt~k5SrekU?(8EE<^^f+?A-O^;{})1Qe_5$-(4W`pd(O8 zXAE^-{R|$2xZY>AD){UL)tN)nuQ^rFS^6^S$`2C@aUfa-<$d4}7j9fRgweYB6&Sso z18Zk^6M39Xk^&3sTVmtM7e+mKMOG%ZvG>Gx-sg}5Mc^i`L&39ewrixyDCIAu3Z@oY z<a@FZ9YcPHj*m4)xM7slLW7i91Jl1~cV!Ks{x%w@BGtX{mpYU6F0|Z0IX7{Wb0JwU zj{EmzJOk{aEnXvE(d~E~hihoCrnq{hMmtk4(XTf`W?BtnH)y)Yi3_z~;S|Eb!2SZF zpQW_x5Fg}Q(RTvGndKAOFy?>(l3>e(WWnzcwb^6NN%mlZgY;(2-B+^VmgC)}N(E<4 zNC4P-rw@vT&}m2$l90HCxJM?})+xoqV}JmXg2ZG<2Z-tR?Ms(Gd;7MFpX#=`3B`M! zQ~E9hFNP()3=jd<l{G>15_!KNTgIvxc$f7>Ak`XL)QDdcL!fTkcms7VTi6YIRaiUg zG78J`zO}q>E$>^A`_@I~9NCA6F43z1#feAnhN);Du4GB;BH35Tl3V#UZ4|dC9lTT! z?3tgAgg{Cj5Rw-nw;$HTCmQR>A`S$b26jq$R9hLMh+}4Q$TqPb?ym*j5QhlY^VDh! z%pzQLEerOKB1yx4+3OwI<`w{Nr7MWoO)LN#I8;D%yn5*>Q&iVS5TN7wHiOs$&7k_+ zYNLjgL(mbkRbfr2l$zFc=b+TN{PxZ#%@Y3xO{!C^UCkxu36*)@BS<vN5%iltq1UZs z1dN6Q5`J_J(uDqn!1nORJ&Hbwf6vsvDsdNrA558_ZZQBu=?4&IqYI&8k+(vmKfx)+ z_=RGV;3pbfH(5KhM<X%CJRH3ezuR%GC2pA-gq{p|Z#-x+L2Ofxb#tvJLsUr$Hq)^A z3<P;LNj)Yzu?kk=6|6cHFwMHRz+TLB{H|czyzHH6Nq0d)ar4tT#@h-vnN<_CDVAqb z(NwRe;^OXQ2QB)e7`0d@Qd4lX*Ji&~dTkdR99`)YjY}&>1mqeU3g5J@RC<|aO|d*y z7x~T*-RvfO>eFy72gj-98CqE8M~?kh43GDJVn8u*j&59m7&gG5{pMF70y=vKMW9|h zHqb(JU>M{<GDGV`s)Ct9OkPFn-v_u|&a7Jdg?1HuRNG1!jmy3|_<QHncN@`Ie|E#w zQ|p@!r;)pxH=#FZh-X=A;MN5jCq|83y{Q9{6*Z1`fd`l!Tro1tGokP9OPY^wN=IZ3 zQmpPmpby>>oCzkl+b4j|s_4*$XU*%PxJ;~o?Yv>DtQ~O+gGQZ)ewut;-lCyr2#g@a zrD1_U$E22oUl)Y<!kfGgaN?^j3>3wnU%t~U?+wd)Llgvx;jmqpPA3MCRb#)RL7(J? z1V5Lu(65ai;YL;Ya64R&-m&O0q&71a1VAY3DH{MZ|3FL*VRY{~Vmh!tQ9_GuR&H<) zWjxAC0}dq%BCB@_Y8PhK0G{`51F<tA+S;M|L%pk888MsGAYD|7d-f`(^(i{sG=CB6 z^AhT5%zvqBS~VM^`A_rhDina1RM8iP!<LI3ToNw3a?~@LamQWHNsyXL{JS>luU*WI zsO$#tkg)8>L(9>3LJt6(Be-}Y*Z08M+o@ZMZCN=7EdH(?rw#)LxqvXMEqBwW7969P zH0y&mw`MYNf-NY=d@2_t(5%ZNxLr9~kGj~}o>+#Fq)#W!PI#464>y|#%nZ4Ed_wf> z#_h1R`L+Ipl!UO8cu2Q6xu))fM3&9l-SqfzF%#Rtdvct&!R!|t{}IZH--+GREEpkB zE3Lhby##$~FN|&#FRKMPG;34;w67142v0Ig9C&_<1@hs<Ru^|+0ZyR%R~LuDoPv&f zj2FJguC6YI53fQmvmY^})${?}ts=}uT7CorJC>!JY?@y#xH?S#O``(}>&aZrkXGhY zuauMGzL2pqZM)CE`TP_6A>A|ri1hU_iXM2t^AhvGp7bzcFzSJLTqFH)jU&dX>lVm& zIhr-@758mSdBE4qru|)n6%!&F45|Wh#DzlBR2ADTOe?{4W|3h`|4tYvDGKs$D~Lkz zlU$%03K?jYG{nKj@i<E?3x-cp<kp!5@~q9TX3eceoErKEDI4q1kOJ`q`2ciH2k{Zq z_s*$?_YU=>@gYU(J@g?bkjxb1L`!ceAc4=YeXockNEIqRNG$l016UmpB90Rh%0yu> zZ5v-+WR10<pb}-j<w1hPf<o!QP~o^xIyO`|G?WexwH7Z;$xeW%K#-_Vps4ylPi6@> z%~FTjF<c~smJ$l$Bm+75PsaZaWeO0Few$?q=-*tK0<YOFET{P9%M`jgjvb<MhN{p4 zf?Z!srZ|x>@I()AJwlt9`@?K+>;)rpFNOZ8c#Jhe6o&~oYQUM!4IOpIOl+A{LOtMF zKN=uoYuHed(hjp<P9}LZE-@}CXtXrgMmfS@yyLQ}00OcTSv(5wXnuPvT?K&N@a_x2 zdxTw3aB#mIJ~ZdAWYzAg+1Qo$tdnQOc9RTr!(D;LkY;obRO^A}kg{V(NWdo;ojd2^ zE=g=@cH+u1rv<C9R_aW$3gOHOIEJm1^<br2BFmliIl=l4V=M+pX}(mq5|HXF787I- z7t|NN{uWD7caDs$^?9B}+&RoIE?ZkPu=;Ny(Lyx`zEm{xKLsQ<_#6^5^}%6Ze?kNW zGz6>XFa2zefQ<d&qM{(VfTT+O<8_64jIt*Y5zumAtP6?G2Xn;cS#-2&H1h;xJsdvl zS#&UPBM4sv78itJE60UlPlUzb+Ac5cRFWG>&t$_xT!M^A*LcVtOOS>wXGb_Yq2%06 z4kBW2H<^V~aP_+MPdEpyN>~2-<mBdU4A*7Y%{-}DGrVI;&Caqphl2Ta8qR^}5pdX; zuj})ON&81aCw$$cer{l|4T#>*#1e}Yn3)302iWBU?D7FNXt=rD7t4LI+!x-yIGcbL zCjmdd#(dvU5c!(=Im~^qW>2aPa9iCAwT-B&lovHG#Lla8jl?BorA1UCk0--8{ocy@ zcc6nXnUTousa*!bFw2|U9O1@Kh1j%bR(+wz1N}n@LHWl3kRJK9mJ<e$M|cnna1S9u zNx49F*$8wo%B6QJn!gf;1PU%7Q_J5o_4}0k0L25?6VlpSS!f?FC7C71UUKXjj(tT2 zHyh-4^C6)2LVG(HlSxcif4D!8TUFza>0STXqT0`ft-JWo#%yn^lrP+1GS)99eTgrP zFXmz!s&W*Axito(rb_-Wxu8>*1dYSfDZIXtGmIcRi1cI_j^Z}B&2QYia{cC&Tc7XT zxOx5J<&BN&H#-}*F5J4ZA@(5gI52wOzzS7UjU{7PGKM8%h})O~5Xg(!L`US<U<jE( z(?%J1>h^8GQWpQ2+`g^kJCI5U`wM_Ixtv!@ILLsIr?8h$Ubrge`lU&^M=EC$+w$o~ zxjzBCGHw6G-!b8dESuaB+(KHi^LFoYFv0-RF18Sd*yWI@fxuojE{g@e_A=Uoz{^!~ z-qSmxznVr>C8r#;^E6PaSQL>+skec!DFcdFt>%MZOZ{x6a>c;F@L*^n*{*Vy@{3f( z{X9?rJ~yK+C`}kgi+wR8-|$x3(Tgir7`w9Zbd%N918i2=`_t5?v&q_e2&8g6b;VSc zxOpwRmL}pqJ)1_PL{3PVToZbK2nQniqJ<*5fArp4kKX^$(a*kk^!E2nnQpR{Mxvra znfJfxmvKpqn+UHB7)<ss-w|8x71-ARvgr!&@a8xbR|Qh_TCbW~^XL18@@yPqcEzfA zW~cC^hkx_d(NEw0<RAX>==~o){Larmdhh)eoh&%OtHtOQsqnR{q;ens=+8tsDD>+O zzWLEFzI^oV&maEX7moh++Yi70l}G>di;v#>#-qRf(!>A$vqxY5m!t3f^5Nfn?ctw) z)v5l%Xa{aqcJ2NBiI5E}ydUyA5t5A;@D{(`+7<kEw;T?-$+Ii0GI6ch0Zv?ivF0=R zGr^RLyZa-2#1@OUSL#cx><siXJNN_AjN5v6k^0Fm{_^8@e(>>E{?{jOeevl1?>Gfx zrNo?k^4)*__+S6_(GPzirj9BR^C-R_efalB?|dkxRZQJ8E1wamM{mFT@jJgf`ri9T z@BH=ATOT-0ybO_gnj&Y@YT?n(e(~sg?}$dIO1~+c0h0duOKS@>bx~q_Qj=?Lljuy; zwLz5R)w{gcb?~#n2H%t})Ror`6`b#lce4tDD?K<|-UpXr-%{+W7yB%cuU5ztySb^4 z&@pK5Mtuwnwkh>`NpoBZ&I*X)4Kj4tuXZ<bh|K_;xd|SQ3;VMODdGla#9^y>yf|7h zO&O1d)h6^-bU5m`0)mpDAV`Tg4;(eyd6v#9b#h4_bxf=#dvNR^dXl3gYZ1Q{COcXq z(-}NNb?daWirY!ewrd(>6?`Gs9aof&blI+}M(hifx1p()N5S$aSRMubQD7qJ!rgC6 z#qlBLf}&PRVbA2>Ac4vE8nl8)c|?sAuaS6zkf<-}N`8HR3SRP71U<~4%wBc9+>1u} zYieUGycNwWrli4+F5jStk~BbiGBII^Vk0%(OWlTz<Y}`pEb>x56=W;UK0Yyiwo7WJ zx@^*{Z1T=}OPtSLI6W@WZ(5~b91}MG&Wlh{!IKqL<-Z7ldo8{?b!kx}(e<{A1GSzl zHf?f&c&eGlwijhVXR6pdJ9NSU)+!yD%0?<EDXSIdER;9c0K*_(o(#*AVR<ryb;GFE zo9KsT8RVG^h%vk?@lgZiv)P2lZG0HQS8V1`v)Lq{7f9SHC!)=ZeinGML1l=^ML&C% z3PA?8oZ?y{WvzwV$tEu@)|ATVwYJ$T1+^8^nKKp)uKMC|e-ipmkT{=<Cw)GYBs)o9 zMEGt6Yp`W6zyo!e;0t2`z#iahUgaviD_Mb4RC+k;Qnoa&q<)$l@b<ctRl6Z$?V(I# zR|UI}tFP7tAi@_hZdQl-vt1+gV<FASmqPxMl`mO&{F(2<&D$?tzj^8M&D(!)<<hNJ zZvS7eUB3Bw@P=+`t!ju9(n~#o+>1Z{^L{m@08TQtuwuY@f2|{}!CEAi0)~G{sJWbn z0bi3=W8fkfuoz=XC*NSqx^Be4uF2S%z%VaOvU`xr2}I~W2(s6iTNF*$3;gKjYr3v! z;fg3^vw7|Dg1SXZk#a2>w~fXLfM1gx9H?jLB{f>NX(BOS%@lgYyH@dQDD>Bq4>4=> zC5a#<)63YXDh2Zwn{?D_lIfV4D<pE91*Hdr*wQ5)iya#dIjrh4C^bq`SB&}-<m1^; zMuxrlI8@dj=GlZFZVM1!q&t2;(5bd^F4?jEoJ?gXX~^vbkxHO_r~A%8Ba`R~BaCF7 zeKsz}IXOj-;2zgO9biBxxouS;-D1RE;-CMEzd`2iAar=sze29@-h$h1)z)4)HcgRd zF2h>dv0;{&F+flSu<n94U1F94x1nT+^&KnZ@Roe&SMUG!<9{49<oe`hHYl=Th-J$7 z?JlGAFoy!wiEgMKd3Yo>+{kT~IPGy894N%k4Bn@kQ73WjP^{g&*>o4x1(kex1TxJ4 zjV4$Y>Dk3*4(&At#rAefuCWsv0IZx1=^3?9zzGaps<FP^tfGi4CV$LJ)^)Isc;0C` zP<lFMYH~$=W6iAxOKT)9ZJ@Ggmam7!E!CrLEm9wLBOfBay9j1S<;1EmIO2FK3d<`E zl1u6=zE^pmlQ=~cP0`DfY`k0aFSBV9>?1TZW8ZE|ICcOQNB?QNeWr^HGYn|Kxm$Q1 z!dq_Md>lHIO`~AMJ<9LNu8OS?rE<OQa=$1FG}Eg~2c|BtM^v-XEyDd4TEPW-;u}f# z=`r?^nNGfqf-{mwo#<(iAk=Qv0)luT-72UDhwh#*t+wYm$=A3iQ_=~xw%Oi+!5?pT zr@l97%{~t-a(L^Tegz2$Agc%BVx0Bwe41RLZg&1{nS$J93!ZrMc|qNYbX=i@k>>CG zjzk1R2O`E~T_Osu@^LqUZfygtF&?u$cgpjFyuUxqeQ?j)Qa&YNGawpYmG*g0<hCWv zhW(4Jk)GWfOZcuc=i0@)vOt@`XmUDS*QhMVQH02tADkS!N_GZ?iF2ws#^r+F7c7=f zwPJMWK1bVC1l7cd?N|%Aam~GeA-@9%QhNikaSUTZtBU`MJFr3;Z^q?Swh=@@E=%>F z*rsEf`{ZpL#xE{*t2K_1hv6;BfJLQU46#CfT;dx8=3z{Y6ISD-5;2R_;IN;fdJRt@ zFQPV!T4H=Qr7WTB)($n6u7wl@XQFDx#{9Ax54~kTiyP30Xci-zV2i#nJk^9^PCl8= zD9pS8$%M$)XcdjIuMsSx8Li}2hVEF#r_s=q?98UqT+ha3GV?0y3gxGX@>13vy24$! zsa6FB!UQ@T4MZ)cU%eLeFioPav{t7YE<T4t38916SM5QIHvdDh;W4OGiX+FTP(fzD z4`JjL3TQGccZxpg#J50T2gf_uM&Ne<&nplFUPqwEccya4YtwN-I?1(iTJ+(SAe)kl zN!h=1ub|foI9`(0)=Zg+v<a$=*dVX(UNIad+3;RAtC9gIxO6oT`*l<%Vw~W5cW*bR z$BNMajqRb49X#l)>fk{P-ZDg|FhJF0in(nQMAK6pUc_Wgo>$*gQ}zi&Ly$XOa%`Kp zBw-mhYu#SgG;P>I7)kCi_yhG&aR~Z#93CO{NMc(}a5JfSI01KHT?y@X*49eW_1EIJ zfql>rezOdO+T?G?nsY2Hpc{YpYoK!9E$=0uu_kACnSZp?pu@XkOp~m0*t;k<YC)SM z@Y0H>dydaT8Zj^iU3(@3@+r!4>W8PVICLzyj&Y;-x0oPt20&eq)S3L|r%4*kT-71u z>IA78y`>`pX~hj!`AAp25Wz#4?cyLGTvbLcQt6|9w!A~oVU41+Y88(%Z7pN7>SAZ~ zIm6=#<?RK*YR)IC2_Q_Yd)Ys4vP-bHaDEkzu;E~p$+8FNCJ3!R?T++pvSw=|X1df& zmiqhxrQ}w#hIS^>rd?8DpV`Aa6KUDd=p2dW(<7JQT=&gn_Z`dBzM0X!gAg}a(Mgk) z)ZLmY#ZEBCQQ(BKv#OJ_>xvNGEZR)nQ*te+>W*u$;MWaUBFm<kkYeqLm-q>+9fQcL zAL_`)Y<@{)jK<1p^Nl*AXk+8y+EXjTvRYGWR=ndHkhNKywo`Ia91dFLbcJa(A%=$C zVFiC9%}zjG*{@_+M?0{f$SVYBYE;X95mRi!*dY^jD?v_RSN+ilKoa^Lv<FO=fHn&{ zNuH>|sT2br4$FJ3CgoA{&r8tBBE;~C&Xw{Eyrqyevvcv}0mnnEwn<S0Q4oW8Z#*V= zE5OQ|5NZ%}qh(ri-h$h%1e^>O@F!?Q^~dvk3mjGPp*H(}MYq?|#{A4UouQ-9s7nR= zO5q*KGO6~&8g?2y8dmTq71t|bvzDI&JA*CCXoYRER76w8nRPr)T~|uqvaPD68>K~S z2a{+(Z5lC(DX5XVkzu#spRgYwnqRzV46>BaMW`;_WV5Hvt1XBf1Qqc!t3MU1g=Jhr z711@YXOr<XDl)swx3`Oa0m2quF9(!~m&=6oSPm%;2P~A#f*OI!@q@!I!UYYbLHg+k zByh|i8iQ7O-ZtOtym)87f)Q<HPW2^*cq~z`sbK?l3{VGa?zPgiy6Myo_b#epQxw(R za4ub9qB|gw-YQ$Hs+C^KYhLZO{ZcTKqLgZ)m-5!E5|(eZUgM}TT<XD@ww>JwZe720 z-IyuiIl8!ci??)}Ea)&>Cl}NLlfZ7n@XBUe%ARt=@!1k08()NIZ5vRg$(b}B!x%I} zZL*esZ&6#wtrxc(c0nA2{8Ta%*-cKJVn0nDPQG0>7@k9osjElV;A&^*y-+iB(J8}2 zJ;v<Z5*I1KSS0fYU=uCHAIn<+nWLM*6Q>GhFz?WjFAv#RdYiH~*GoYyFBd`zX47ij zVnO<_Zm~Lrd=tQg$W-oR;pc@*8wx9;*<Qv@T^hVE4c<Q$z&p9wgaAI7wbVrrt<u{R zJamJieh_4xG^*Xw_wJMeVUwbM3KP8rI%!%*FL%dn7TNz*t&?$3_#QNjTzre0%agPy z`0fH0xMB!YoftfB!fn**1MpBIAbOkQ7cO#&=~8~e0|ah~*rlL0ZMK)7oJ$_H<WX~Y zR09!1o=!Gjt3++RF8tkEZNonX3J*gQ&TP4QlO#_RNubQy0%aaR7L7x8sSrB`yW2Ij zr7Funr(&qNZt@(Ypm>NKjzs#x_|9huQ|6Gf4_@Z_)*FIDyou<3o#$a`M>}uQ#}^I( z+?W1;;`USZEun2kXo3|`mG~2c%RG5qbp&Llv%C3FtjbxM6;sdayfaoWMDv>vk``vL zhq;ti)EOsM54ps3NUS4jf1J4&f?LG6345!WQ7pMcj6fA;NBlw)ng`xeiIhVSf0^L} zWM=n{3ULyBp;zH2vaDv6uL!QEgF%`0T2z_W#!&QJ-EPF6ExV$Ss|b|nz>6OqBC1+F z3+oN8>VVAaOK;BQ!Ld9zqH!sZ4WnaEg-BaCb9=>sm@9P61V$zIVF$9_Dw8}LL8gHz zlu9lN>q>c(J#g;a&F%_jN_lcbn|~cExgh!nc6w9?Tz$#31c*#$e;xN}xr6p2QwS-Z zs3g!vO!q5fnhmm|P<?+DyRPld0)Z(dtJWvQ6m0>3eI%O?fRm)8%t&=}f;o0Not~;l z{_n~*FIvE?CmGZYnrIcxZ&-*MI#t_+N@U&mx2(1^w_ezk)%5?sdd<8lo-V|8I(7{o zMgo8~I~Hu1e7RD~0g#I3Y%y*6)}pLG=5XN!&a*CeD%h{BHpFu4c?P{Sr(}O2dVp4O zgME>owIR->&0gyDO=M4HJD%&E%0SVx@K=Y{QWgl}zv^P^JTANw%CH>;XS+<B7-QAL z4j!-=j^nI?qb38vV!SVwET8DrfF<54;dKDn;2ypW4D#(_ln+v<Ml8D63ImnjrC=%R zz@El3htvh?$2M*%x5#LJZ!4ehBBB}n3gVPH+c22KF9Rm=6|?nV6GQ(fbeOzBLK3GX znt40g0tQY~rbnW28GbB;naAjDvl#RmAunQwj_?fxnr*uVV6595d5$NzxN~+Pv<NQH zrYh|5>2?J;TgxThkTJ2OQ_a=RaWKGo6J9x!fOp~75-=D4--c@UM;pJT<S6#ji6|0a znt7R1j39vkYDobJiaV4qn)!b_!XZgR9ge?!<b&So)M6y+EL64Wt|}Nz$}NG<?v&8% znNii8jJlcy;(q`Cn>vc>x0f=kB{LksS-d5z(efg^ya?C98r>*z9l3<`Vk~}17}I)O z<QkFsY;s+60p>NAU@XPd4_m@ng>JA@?TcPt7=x~rFx1ehy$LaAclL2ZIX1Nf?jRpp zq<ny&m|}|Tn>8=>8jzUjQZcHgc{V_Xhn^xy)`u8Lf@SwJpmVHbl5Y!kE$AA_x4$c9 zJRjJ%I_d^!5pGP%y9LbfxrhyP06+U?cFzSIIdt!h-qlqix6oZ}Ltp<<jo1$Okutzj zFt<{x;RrkK8t&zSld4D`7EHkPd8>Ib8xGZCvTB;>`g~or{+Oe5V%I!@fH_j*PaU_O z2P_ZKK!;-J<AInnffd*0HkSYfg^U&Uva!}7OB)#%Tinu2Y%)V8+j=S$J7uJ*?ZZ=q zXd5l6#P?v(c&5)7?^nBl@Qb9=QC1b##IIHn2%aeQJt|*I4N}Mrp-_uj$`C6fi0N)F z=IR1ibCQK|ktX`0;6TYA*5MnP;mo0U`96CCy_Q{*anB2Wfp|h_K8Lk|abSFpSPeJB z&Nm7@PMl#cf#Li4hEG2MTF`#MtvFewb%CDrIvRSQJnLb9FdA=1jIf`NBuK^$`tb+i zyt^TIZGo+aTSz^x<`ASaB8ZgLlvzH@26g?6LIT};O3YbBqfsTBzF0|_o&E2!)B1A` z&MQ1m$=DVO=r}742cr72{H~c+Q<rI`2ya^6GZs{qB{Sq9sI2Sw3MS)w>a_K65!Iqq z$OitlOLHeAOePCbaY1_>e|E?)qk|dbt@`zbh1hL%Rb`B%SgUTrn^IGdVcoBrjmfLs zO^eiT&j4%a7;&)dFjw>9Qt5QGs@4vbfv{B+QRwK)KR)`|TSq_p@<;Fe#Na6iDhAxU z&E|6uEGWT$7(ng>eF8+fI1`$`_uOY3G+?UvlmGGl!|(pfCx2!lM=`HZyEok7<Uhs( zR=I($_99`ZK6&eFVl<-hhhO{3(Kp{e`oi0fe)Nk^zVdd%Js=4Cx0|dw<^SO?KYIV2 zSYe!4UXm9T_i&K;goF<<mu7HJ$nKVf+_VW49g0f@H=@RLWCGVIHMCZ5eeK~l{-1|G z{vSslysd*l9ew$qKKbrXDEgDgK-w(vb59UdF&^eI<(C(UOQaut>$@Ml_l1Yw|KRAS z-+A<>|M2L){uBa#srH(*;LTru@YSPlef{W{U;6b2UrXLhn&Q5b!N*Vj_U|A4=w0!V zS2-!GoGhZ8a9}QjMY47#v6{kD7VbLoP87fJjJ%&u$_^tOk!?fd`a|(~V}H-v1$9Bm zoTyi(@ku!aH`xp=s1k~(YRlf3!J9`DGs}nc7c~PyevXE$;?4j_`QUhjJI#jI8SAi# zvV>a^UFmU$Lcq44{PN*neC6Ta{3ER12X7z!)sKNBzWvQxWeIf9(YYbk+k4-7_?>qj ze)9`QAAIrQPyXl8_x|qVpZ>91y$m(>;jbQj=f}hzRQ>--<nZykKm7PdU$}MobGJ5b zeg5iYw>(^M;R@ePjz0WvYA|Bs7Nb!<fnAC5<ghpI<0^dg;kO=r_|DN+e|q#ce{%Gz zKYsMrU!t&QAHDad@C7NZ_2^IErEqkj)X|@O`RE6KK?z5H_RTg#t9$o5AN}$hkN)Ww z5C8n9Ar~Tj-IKwutwTn260Ya&oDa?M{9w_QKKkI#kKX;@(fhyp=)E62eCPia%t-X` z(Les<NAJBQetz=jzY@&M#@<F>1i?<8TfDCKzgbt;nqOJ9SC;4v;!`c0y(*4d2+XQa z!6=Tt{Ut#-zQ8SAGgti-b<;10g#)vDSnKHJ_Jcvsi*|U?AbtS0oAk5M7HF5o8H%ZC zQuQ;oleO!ywA<7fc_2ZZ>2d}P7Q#gCZx#LP`_m>js>H|smX^#@_c48Gc)3&?F4cy$ z_A`%T#<(TUx;z^lCPLa~AR;0I9y(~_;`koJJy|J<TKmPo@rdCSS<q*TdqkPX5P7lJ zA50#6VL4|jK-^0^fAGAn0t$Oj=yne6{Umzc0hqIF+TXo^<7ZkJ$(_eVev3WavFM=N zlTyf3Fgp!fV}p-2j&1stLDz=S9W<;<z0n|;du}nXR3Y?!h|WK1Y5e=T2M!38q|toR zjNi{>L;mUpZDo`w<rU)-?H~<U<mdRmDi@&;wcjTszOxdm<t*WO93~-a-9zcA5ZnM} zAPw)a?$GJ`iFZ(7nQZhX^*MEC%c`Dlsl7s?9G%lH&kUjHv<olLrf}3|ufZlmH`{($ zwNzz%GtN{7ag6f}4KG%=={|x!TN_XNC6Ys{j%l?iI`FitB8A4(4`sX+qzv$%l~_6@ z8Shooax9LLyG6NQ8QFs@;D~Pti4&w0tDf`du1+<z99T$@c3W#JD<M1|bJI|N)gnyd zf`I#<po1JFAnvHH9p+V4%~aQFQN9q8`uM6W*pBr4fumzXq7LCrSpEZIH_{-)BoLA| zL1~HK^s-b%x6jMqGkItet!NjUR!U&vJU9Z(-svkvs%61l3x0K9h}mnFw<giWaE96} zDs@Bt<Y$9|)e*@M1WqO4F#)cg)U5keRqTF;+El068wegqdbAn=Q|YWxcZ8s4_#7ow z6dBhrQXn}sgF*;aibc+}Rj)e5&IqK_bLI=`O0M8%W<CR91aw~f<>fncTb7|N7HpU9 zbqh4?XFN2s2%2rB!4uSMhHvN|^H3$2gSzRY?}^Qv!wBmtp-lTzUX6w@8cW)}0U=!I z2>^eam@Z;jtxSvrtY<_<4%@|~B9O^k?*xnFaT5Bw#c*(8+FG%9g@M99=V;MwuirQ} zHf+H4#v%|oc1|1Y%?F)SF48&|DPOhwuZGHS#&09I8Hf~CldCbeZjb>l4}~;h<#P=s zol4L!4eqI)p(Mw(>r4!6)5HOt)L3rwk=!DvsRkHm9yF>8$TK(yKA_>_g}hzYA*fnI z)WC=5=HcXVOtKS>c|MTQ$!37@6lc8iJ1slR2(U4~*+b3WCEB039PgDfIGX`wK&R1* zadaf)5XO<8?J47K?>;+Kwy^F`H1OvCTo$0&+=Azgrmrv}oFLXcXSQuhuLoALfdtqy zUW19{a!@CRUh;95o(TSs?ACk?BEaq-|Bgxv{&Q|p_*mRn_^uSWC!sz)iDwPoN^7z* z#A-Xr?Hus~{J-hM0u_%)X8?^ra=&u3kTP+bfq;qQOkOI%Ax|8l0M4S6aKj9OsEK=! z^=5K?g1#c6Qjp5Wq<4Yr_a>#Nud+6z;#?x9mh)T8hMeWmB7Yb~)!#OZ9|K;VJ8|qm z%C%<T{Nfq712l6OE9o!Wi;G&nq0ybR^Rj7i<Kn_rn}2{J^jk}G^0$=UWQA}d+n`WQ z`z4j|)aQi@@+Z%}N-ZK5){2IHt~ruwjkIbV96VYYp@y0J(s~HOOWv3cJqeUo5|%+N zvD26}IFje8B_@hYx9IX@Wm@}f5l?9tD!Zg?{J8#jr!SWm^jyuwUsa$+tXl|ZLwH8$ zCFbqOO`chyyUCxkUiz5nR&zZc5jG&#gvSqLkh;OfyCH;9-Wwl@lyz>Q-so3B=m4G2 z%oebmN`nhtvHEISFDJzg2tsq_($X}nuGk7yO>T8SlbE6D5-9H9x?;BFidP<JZ*Hq- zZxkwd%+}p{PAI&RrIjPPnuU~Lh~|SO64C`z&2{R|Vj6+H#B49+)BY~J*4vyY^>bcQ zs{bxt(QTbJ3E9v!*J9FBZD;$_@*=(2vdOaZh%@C1+9AjX*HfoB?U9K>=#ADf@f6*; zFf4W)g4dr@FZXBji8#ZvVW8Aqo)m!zjV`xFVs$pLA^@|nS_Nc2aXpYoIAxYv%CTTE z=k0x_w$g<RP1q$HmN9|ThpVpAN>`^hTBILW9W|R(u(mG%`bZ>&@2coPepjIosf(9s z1N0%dbvVNX?6e4p9e2SFy;12F{fSUqMwu<pRqU$zX^hvMIa0ehGDCB#<uV3ZQ}DX@ zL}MbCDP?vL9c96D(#MpaV5-iQ&a+&;wdVx2Qf{HH{MS4+iM|#i!FCF9FIW1)lvLd? z4#3S4-^AkO_mt-b#C{g7V;tx({3!F)a9uOJ`1UCFzAVEVfu<Y(_9OG!8QCw}RPq?1 zr_*Gd&4y)W`INyb$j|7yDgW-k8z-#>YR-#6JM3x^jV1cH;a}%PgR(O4cO+1MMq)m> zQD0vIT_*+C0uCWNvVI(GW<ZT;4{k))@QcHue+Teu5Uwqtr{gd0sh;(D@9#k)?0_$D zR0W}2f=?K-)p@D5Ec4~=Qtv(fLsKw9pyIyT?#Qe_Fuaz%ih_jg1v?ej9P7(~dNzPp z_=|9JVgtmRRIDUws31eV4j|@AQ4?R$T0Su--AA~q_JNl0s>*096f`j$r4i2=Rbi-@ z!B%Ct>YhM@!A=J<)agPLQXB4c5Da#zr^I{Kqt<K7ppJv)F|Z&fn*C$XVtpJ<XOWH- zR<d}!IS=nmD^To$Jqtx&giRYY4}sbCb~Jab0<ibS30X!Rb1;lF6iG=ws|C~?D{Vg- z(nJ|m>}3ZnFf|fI2!y?jOdEc`f=K6}5;G<nc5pYCXF*$I34Xp+2(g2&fl8AQ*6sB` z)IC92Dx2l+r$2_DgCLZK`fHXZ6ZM0|yHLr>c_B^QURg$IJVt6b<k6g<oH{6_C0aRN zgR1dhgf$qG8Vwr<8$o}|@3kwx_05XR3;gA8KnPaiMk!H|O56}7Don{r8qy6<0{(r> zT_hHm#D3GO%N2@M7E?r9yIViA_BACeI6I+^C8xy^ti!aa_&e?7Y1&{nu86<Z;tFz0 zc<OKQjw<(5*~=(2$$tXtPc$L6P#eJ5I4edH!kooqMI7^3NY>*C#)W1x^LdZb(A$9> ztac9+ME~YWFFC_%7u(%uVrUvRmVo?D_E~`Ep)ZWKCi|nww1viB0|<eHmS2Ne7!O32 zeEuA70{Om7dBILu@uB{g5WY)G@}(tt9RP)dP1ScyGI|amz=B*PgcSS+NU4=#C2%=< zYPH2uxL>pR%vq25Dur~>pbWAIN);AJQZrl)r-Nz;`<n_*DS>&E-TO8ELLJUHva_6J zrvTxWOCxa8;na$=jhzXi9Ju%GK=4bYjlk=rf^qjHuLpZ#@7&@TAmWly?QhX1zB+%j zpHGCuAiH%KFc+Bzt?pi;S+-5KXnXl|w;c59uD|sqThVglEKa&6+iborr*;B}=8j#v zgI^avj-49^*~ghh-^<3qtP2?Thx!!qe+Xa7+#4%`L-(BVaPt(vcdDK0H{T3F1=g!C zY8D_Ew9j}<)RTaLtgx(joFIC<UrNWjlm(Wuz)}_nh8(#8ifD=eiAw%)Hq58fJb>@i zf$SH|{A$$Zih_O1Wxyqv5y?WWvO*{<765BQ*oLHq4jbbl$HR4mce34bGH7=iiW95n z>yTKYxTeQa1dAjTJMxF)*RjZnEnj(H+NdW;vWQDnZ08dUq+1EX&AoG84sHVy17|&n z0%B5#^%4xRgZk@ed$@Q&19));!?gsmg->+O_ix{Jddq)?w4S`*2zShDb6+FcKA3EX z^V_wqhu+TX0>ab^T|hAxFou<Ld<RgV^rd=mK&uj3x_V)tal)gW?#K7+Xm6s6D9J<) zcIxIP6~h?mgM&E}E@#8-6jc%Hm*DO~{LKf{IlI+>0$t)z5YUpg`BjJkwEq!TT(#dp zP9o#@z$OFV^HE<+?I746!t1!iSpn-|2=S6>cLR^=th6?Mv3-7AS@@LGg_y9W5u<M8 z6FkA;NQ_Bzu2mhZlVw;ZS1HgZt$CF5;n-oCMUa*~jT*_$A#5DqOX3i?L5!hZTxb18 ziBu7ms8{}-oKBj6cNJ$s=|U|?UH@@~e6b=|3AIphb2$H`^#+Jp`aIgow?VcO7exRi z43Hx4O=S@jjg-+6{u^63c%8uGv_hduQDgKX79jSz%L0EsswH^U$;IwQ{+EDPie+g& zrFjKF8Yx=%vARw$x9(P)clq#v>JFFpf#rQ*c^{~`56~f|Y)hrTE64tU)vrJ!fvYP+ z1KQbGOx0}g#y((u!p7Yw26+oYC8hlJZBU5+fPs|^5e<LRbEsl<7>cPXCsQWIWNES$ zfEUd=v*b*&)tRl^R=|J}^rzpjojAmn*`8h!yN7}gr|{w=x|0vVXh8IeSFb@n-vD_K zvagFjpNAsi4<FPMy1e;DPxR*WIjYieKNQUUjpPNYsu7S~-hep9)Icbi>c?2eqKy}L zd-`vRo^5Mmf*yZj8eSW>-jHL57w7<Ib?v*H$F)Yotq%^~Gs&u7t8u<N`rzk*C84si zTyzm==HWGHMf`i_One2-)ULove0urR!ch41((eVQcuU;)?!>2#O^OLnjqc{3liQ`J zfKIOlwvPLp2+lv3V6>kD(XyC$BRtP43!L3YZ~xOrzx<Img7e8WM91j7df{`oKYQWo zYnOG2kKX%+m%W>;BoX1@qxZh<z|YtB=U;#LWcssS)1Nq&FPN?Z_c3wMpHGHC7+;Ci zDPaN*NIQbSb;KM!;zK$rdInbwy_zM~U5JW6)F?*#d5n<streF4^Xlz2+p2U^z#IFs zz%7`DCkG2T0jxNZYt7EKwjS;P&|gb-<@p4B@~C(_u$JbLI4at<Obz;vHF)?BCq(Nx zqo(I+`A0BkJ3v9+Y#zXDx|embLDU2dw@{jm7tXQ0*$yMf!RCAK8-PqGs6If(dSclw z7kp@?jw0|58|=~Zi}vX2sz+a6s7I#*J@Q#IPT)B)fnX3o1wkyHtUC@LoSoqx>tW8R zm>&>6gP&oXUy`u1rFGK&*a39L;%eH=XPZaFvAyZoGkXO#A9m2T(x7b5Co3M3ffi2+ z1Qkz{GfXxK0SKt!n-)*&zv-mn_VUoUk+oFk+@7ct872--bINswi)ogN?1HnyIp7R7 zhu}-j1gN<u;AojSIPk!AlvcC8DE(KRv{WLM$dB$ZyKdzj=+hXXE&a@gTm%N}S_xa* zVxBzSab7C~6ZLLS14N3~z(uIkZrdDcfu*st(r$eo*qtk8$u7y6_KGdKUV01*S0wkn zcfrs#S#!G@o8I+sEoxj=C1+}CdE8m2D7D(>^js2H0+YV(Y$WwPs1_&6Fqt-2dt~#) zKCQtg|0r9S4is_)uP!_YVEE6}omdg&(xSDWsjuChhSi=uGi&OTU$bN7=1u20zlW!B z?tQ|QfJL?!bmYBb5x%e()S@#chl%tV;G(kVlfE?Q5_*&Ho^|BFMbQcua}00PX~$ze z=O=UTRlqNT$c$QJq!bzO>gfgy&~4l>Saz=OqXu+C1-PS>cM$GP-dJ#fV|fjGrLX3r zh|3-Ep1Oi-wI$cQE}smN&@)7hp%N~JOvnM_KDX|D`uuu?%lcW-sg~8+KQQ<N+$^>~ zW8Y^k{nCyh$6+;}H>_)(1UCm-38s$39dO-0k#8(=SHxKecUvWY-tK+SS2-~)EO>^) z*bi2L66_f`uSsKKC}OgLv_Lk&47&w>w?(#)5%TN=mCu~YXIS~nd7x2qCc1w*K}+Rl z!m~D8RR+w@I914t7VBH&PW6)DF$(uT_~?1CX7!|HZS2$HE`3IiD4?jriCVL|dV(4b zo`F8Bfx$gkZi`!inCUZMZ;$5o7R!ir0;-s;1)jq6Y(E3_o9dqv)jt=gO;7$a>osBl z9B7*dLPVRb0=~w<n)quC|9VFJ^-Ql<dnx5~?^2lB2cmn>+ZV96O%M?=(j`iq&7h=< zZ|db}>YW%bl^7W+!2k6@>mD%_P{Dc8J<sP)Gvm|RAEIl%whb^VXL-Kh@RAIMKmj+T zBf3HWYDC_WYpfGhOE)3#8-^%)5uVnBunk{Y-ZG>(WvN*b(fqU=HyeQmUr#)d2o3a` z2dps|GZ?hp!9PKg^l(p*@X|=&35z2;5XUH@b@iy_^*eQA5Ol4L<R!1!>1%030`0QD z(-`tZ1a0E3jWp2|)G`?64(OZ%*g})*z|7%h>DqfI7-mmuN~KT;Z%|a$(UZ>Sr|!*4 z-W<(B`*%hLHgL)z9S5+AoVnewGfm6y{V{L$%W$d77wP4Tbp4Aop>AARd+J$r0U#&8 zbxgQ<;nI~0*I3HgWc5FYGfv?FM=#f8Mp+Ao@nj4!kLTjIU|dSu1(hC|0-z4+eqgtu zUGu#BGJuuqoh_K~g~=qFwJ6<3{!kS{q%-=_3&}!OUDP+PE<Kn{`YV-RdQo5z467pw z*pAiqkm>X_nUuG+ovSMD=h{_U+%oSG!`|i0+GtDAes)sjGTP!(t8z%2D?;SNqHd8{ zv<S$n!Dc2aei@o!YzBL5Ki4aV^KhY6yO2G6b8SDDobeGtbaE3e0JQTwWxz;P;FVWt z@zR34ivbyT?W4rJ5(=zoqMFVLqbW%3T6RsPiPPP#|McldNKKrJ{XM38+SuRI&Du&N zk)o_vSF8&5N5%A}nDcC8F{c((EQDpdD{W$Ej$^s<at>{5mFO`8b*~I=Z<*#Y1UEih z5Ff_L({!RlZ?1GYfN#*VYDRP<uJ?l>V}Q<SXhJDF=~7qh`mYeEY(Imzf#qJV@YgdW zH*o@1;&L*?14K-@qBVPJ@=B989w-6UD@Jw|Tn8q%L^ZD(YF=?yXCIvcG_eODw@LF3 zThVt|cky-V30tFpx)<!s2l=MwXG8ZP6$G~uHA>htV$Ye855A}}Y^=+12BMjaFMl*k z2w@<SGXk4X2c4kc6DBKZ49z{Nl3_L{*|lh@sGzZkdtBI#su46LKl<_qNALU`h2M`p z{F8@&`L5aD@B<=CCJ@%|yZ>_Z)?YpR+PB2VkAL-755NDfzy9FAdt{-DBFqU!r3_I= zrnI@p14Y&qycs$BKdc5g&-q?gl5g@f``SLi!%xOHtze=y^Q@go3LOB&pVv&GZqO=E zXxS9^I1|gZ&|qrV%;|HKT00_Ss|NGmVnnBr;XEDU3ybf0x!<!e4hY}vyzM$%5%t$% zs3PeTfk~M}a8l~__<7W#WE1epl8l#5q%_%_fN0wbQ@y+MJx?6xv{3UAkv~AJU?-e7 z+bFP)xSY}j(mUNmiJO8vWr->oiQ6RHIs4hLzdyt%tyX^I2AZCqmmABIkOCHN7sOo- zE_HAg%cFN2w}v^0;VPbw%Ke?)B-;jA9-II$wMy8Vn(~~UGqgZ=&n2t*nP*}SOvhms zk8}Pymzw$$_jqrivC>krrAC;A8I_aUlIpFOIpP%sJ~1p-7vnpDnxOY!`_-<m?{MxZ zxey<<1Z+bcXKNU&-=77<xPOOq!nc7<Gw05QcbLx!^-Zpu_=ouMh>lP4aY$^@qb<6i zr_aqVbR23tbmC&m#c-`PLTZC04#85(yVUa5V-f+MdkMW2kL&PnvRJ@4kMB@U9*dY< zF&yFTVl>dmJypx+;|#ios%SRqSPY&GR$FhrnOGmB(O~GzsQ1e`KCBHMH{><Ckq@^Q zb7x;1p@uxhVF!+8a(;2|;#?wOh{I#LUujP>iS*L(QH_F@#@?I-oi(B}4~Bj&K2F_9 zEore1B4+`2T3HL&60a{ESeFOM@*p|sK@tYGYY`-WviZP)=?_Ho&hO>`;R&h4d&uU0 zAd?BntP2Jyrl?4594cjsslC2lze@TZtm?H<tg`)4th#+wrf~??^9==VC%x-6z7EX} z;P9#(QnDp*di{)=CSJxHgqR@eFsHYvZpo#VTx!Xs0$gf?iDAJAA`(%j>Vp~HL<JKW z<YNFqAN3K{YO}dBDa581yRsZ+0FTk!$xHZ$U@|ToV3@lm;F*gJHfi=`HK0oncljd2 zNJ?BTF2@u}A|Mhgd}QRWVBZ8dG4zyAVL0;XM!7%f=KyLhquohdrv|w|?^nCTk09Vu z6QP8grbmL4?7*57ck{Y<DPxmO1puK=cUX#TIBgXPW2gZB*JVL7*Io`mR`FJbpjArF zC(q^2B;7=fT(CUTNZ1fm*5&o`FgOLbcEumN<#4dzT<HAqNzqxNv%@NRQq#1WKO37S z-P)q_<qSY0!4um5^)cBenjZJd5?Ht(*NvGttM<CE6(-ZX5^QsAzziJkBOILtt$x3o zFk?%)AYc@vtHtO}mz@5LHpq^Bsgk*tTeZtNl~mX(p6vj(tc+~7VpTA+Q+U!1*!=bN zB7X>%emO7e%L<kfE?Ld?wn{N;6ycV641e#JM<4$Eqo4ia=<kdJGiBZ=?&lDoFST8a zvB1#}esuKHx53f)TVFqV=fhur@KyNZmtXqz2VXmS`->0%{HKug;eVsdAHDbf!@v0X z(YOEW!>|6u$8Y}(ihuR59=`PpQSj*fABt4do&^Z6yG<say7Rgh55N13k3am!hkyE` zqp$u8*Y*i&?n=kdhV>kh6+=Aq?(OCy$_FPG5P)5pZRoX?6?<_hUa{<qHOHuC?E1S9 zLX^q=xJhtmf>_W^o=e@dZE4pn+Isl?uRQw6FCYHJS04V&KR*2a2S*>gee_p9hAIB` zH*b~Ya4Mu6om+hV=)G?}{LZ@%zxjou55D;DC;#*4dw=)wPyg7h-dIL|@{7Ox_?;ho z{FVRp$y;AMdjC73f`>o-=cAwh)6si>eDt%o#QLB)H#GNmUwrhve>R`Vk{%M?e)p5N zz9v4ojhO!_ADTDG5dTeC_)V<)&E{4)otAq|w>)+2qYr=e=sQ0?`tpxOyJ`~tRZN0t z`Qvwg`0<avaO?8tZf)H9{ME~RIT%KvhFNo0M@Mv9>HG(`?LGw?Jo@&R#59J~$}oxi z9Ms@;OHBKvK)n>GYjLY?UB7fac`*~$b(lU1&WL*D7q4I6xOIEu${$|7ee0E*mp5Ly ze)W<Nlb)4U!uU?Ofv18D<U$g;iXcdFQQaUVDq^tNp^|gc`65KQgPFzAxAu$Szzs$- zrpP!@xhLEymnI6VGY<GGN_$lqi%0x$jTlW=lvv0<t;h0i$mmAwQwQ5{%vq;o0z2I$ z=*SWJ5}kLyw7~0VtRt%E(%I<6vP36js0b{K!~nqb@A=?@+4d2a%49GRy8<>M*ciMB zmy3=i*Qy4N5vDMtP^NiTs^ricfexcmZ5F3b_X19fZia}#9zkc)-?R2{0Dx@R5N9P3 zWd*$A)dX7(xWN+8<C!Y4x=0CSge}{clUti(%Ldk?Bk1UDqxOnZm&R^&wB&Nv8S3EM zPEec|hf@+g?Gm5bPqrN+6u&U3<MYG`D49l)Pj5}KQ3b~^4%xC?mKQmM@5Okpg7{11 z<)Xd2S*4y~r1tatZ+w?L=}qFw!o_fi{)iw7WT49=(_thyIEOMYpqe7<!gB~1PRFx{ z5(&jLsrJX?axxWX70~t0u-t-3zk4VU=hwxFhUb@ETC7M%b;5_eayD%0?#F;-9_3C| zu2>WXmrTHRMhJu<Qc=4I-aA>)ZL^UMM8EhNsAKs2`ST6O$g99}TQ$=74QxK!ON7VZ z(^K`V>nGynT9vt6=f%E1Bt8kCB_s6woPvcVStTio=My&-L^*<5g#5#9b7q&BI9+Ok zp=bM<WOW@A2>?<2<wGE<T}n1y0id>n6}IaD5ayoG>v41Pd<Z%z^6vV1VV`1;4$x>A zah+!P=K<L5iLa+c6PWTmrkqY{-n0W4=OHSVnZc@Fx>Le>X(DCv-6gSwwHD0;4|W4D zYjhSP7*0wdcAs<W0`=Oo1eL95(9PZ{svB@EsiX^pug8-eKSiMqi&1}qq>>HQ6YtXv zv23qVq$E1{Dw2DIfD1i_H<t#5N19}N$%DOeurF?;IR#}n3(03eRePv%p7ncaqNQ4W zgaZCd$xxFQhC_}kLtVQ(l=J8a)Ge+<?oUyR=Bmh)2BayKc}*L<RW%R_?5zZGWqKf= zu9{L%z*HxAx(cW*MAW^#a@11Qr&tNkWMa0eJgQ6HnkA$%rKO9^a=;sr&ok^EuU=mV zzwV;mY4%t@2i~|Aif@dvw2Wyis0xpO7!<hy*po%XHHr$HN!&WxVUDyl69?w@wpbjv z8My5}ojmIo)58bidudo^(`VM`VM21vt^Mt7@FX;KBc5JR?JS#AbVkn<@Qgx#IOcr* zo;M43W0H$)nZKq2ogHs)F(T^^bI{)Eiq+N==g0NYkbvzuAwp=>VKxKRK}C8=!eZY; zuR4Tu2Fq9ych-_UA%ke)gbRkeN>RaiO`}fy-L?F8U4l7POUBXtBi4_#dWps%h7qu^ zs)`}LfLof@u*FPZH~Zb=5QdJ$aeS*A@BKPL2vEQ@tM1$Yo?S_v!?3&*r&(W&C(L2K zY&N`VU@9&dVqtuc-Km08vM|T5<@!O+Zzr3*FAD2PBbH$2RIJ9z$HB8XVdw+JURB%v zDt-bm{`(s}n$qOdsSxP~DbUnnn^QV9!n2Y`SSSmNE2jm*rau@+brAN|-<mV*W|fKI z&@nGDs&c8sS9b*vp9V<=4EsD!_h+^V5;^c<<r+_1zTvzK1PvCgmjmm{5C{@OfH$V+ zO~Y{mQYu~)0Kx>{UCQkQyVXw4Qw!Z>6aJ-pS<kEJkbh{KhV*x~^#Z+?Jq~m>GJj(F zj@4n_BlVXGcgXaMLOjNsGu@Z1*kMj@ETtrw6A;<9Y@b+fa1cpmMgL!eU27$pAFsNS z(QKqOls6+Pnoy`;I(^;9Sowiq4uf1wq`0qH<@AlSPNQQrFAi*cI%-)eO_1v=s-6z* z60{IpO#yun8&w?n)v#o`2)!{GNT7b7YPJ<|Q=9fc&L^8XxJr{+e{s0ae&IYcdq5O2 zqjZ96v&o^5I%-PY)su0E)*0xq&K^3+^z>U9Ev_q_X|9BiL@}F}NBD9wrKil0-s{zD zmh6g4H@r8fa7|*8t9|*Fi*#&FI&#=hZ^2ZD<kNF(E!g+K!2>plLLjS9=4*0SBF{fn zm(kHqEdj)}@>V%?F-v>X$~z^Bz@JMK_2=gU=IEv-&@V)Q?8I)l3%E@tGd}S+lU_Rx z^Y>|UHgS>v%{P;kxJORARtO`BI(YZ47p?0>zL?A&K8D>kg55z)jV+7#N&&424U;{W z?66TIKv%6L*3|M9dHISw=M|YAelLRd4C0ZyHkr0D<^)VJC-c0D5L)VZcu;|NSriTw zPas_q(`b?)9}dN7$}>%0OX|6ttD!h3ifR{QmYbW9dIRt^8#h0#33w9Y4^2Q!IWvDc zn0rrPKKzN`_xpLiX7b7x?56Brq&hQa^=oO}htUZ*Scy{U*yE(x)~`dK;&Kat;?@0X zD)^%~21qeKC??Yx?%%!aju7zoC%MFnG)JX4;c`F$8x8@52@gINP%&V#%8qZWzvbbb zIa8>>O^wP6%v!-k&tE&H^KZ4oFSa3PcAVspHtQJ3%Yt?4R~o5mXm`-{u@w)~E3p-{ zp>X&$#-z6%kWL27K|$xzwWsFL(xJzYcHLRy+VPfC-hR*bHh<UAtJ-|PedPC<iTUI_ zITqs_&_I-3i%q>w>bi&iErdYXjFXitqg{ey9mCgcQvqQ0NKw#y4c`zjKN!-Oi6!yW z_3*5n28n(wTMEQ#auj~_rWOd71o?QD^^pG8nkx1ykU8=I6?)Qkm3BB6_>pgQ6_DDY zfJ1%0Lra0+;U0_grcf+`N8@rS9BY-p>@(G}vTzr2d|A0}5r<2Q(4{QDl;vwILPfh^ zl=C#$UfiF&HZ6w9_N3fPn)gX|KU+=uXZwQm&+dz~<~kO-G9r+{0r-TJqG{-)kXC4x z`@{W#=-Q-UPV25;C26gsPSe~Pl4ie{^oK!5OY6|qMaYHnY$D(DJHFFpoHt2@aumas z^(zWt%e2(<r8p-u`jl+UT$owcC&wy>PtCGiXR49vz^TpY4u1@{bm>knP*k~rPsyrY zoa$R8b{p_&S9*Tu1$EREvVmq(7gM$;SIx$O+=H1QB7~O<GtPm6_pSI!h_BHh2atgW z2&2ho!XMNG<5Hdz2Zxn}pEsd{n=3s4-rUsqw{rH-QVOR;{3XU~45UKoy;$w5k=j>v z>D6HER(j8#TZw81PK7t2r53hl#xAE}c~CA7%H=^BIVd&LxiT7vSrbGJzJ|b3#9az} zhZUwb;r1%Q7czB3@(|4vAnaizzj`eOYc}}b(^wRhYU)FB23#|z`A#{RHTg#ZJm+7g zg6CNuhUJd_{h#pAcmOLk+L8BVF+?qBPYD=VR?CfSG6(0E^;S;{g4`_Hlmx_S%Fs!y zK3USS)!T#P@hl#af!g-y*<IXoijkn1Vp_GV)k<+rmt1bi<(6Eo-a$;m%reGzGaF<R zK*-M~5oIQO6x@?0F($jW!?C`^2zJiSM{A4D^Taw{2<&!KQif=>-X!(5M|B^_lBO&8 z)UR?7pcP1{%p%50^Z+ZRteRj5I+^o!GdXQrV$)+KV?Ww<&pSZqv$$snmb(FmL#xfS zA66xbW!haN*Z@d!!Z%(Sy#Zzsv>ZSN*#SeBwQE*uW>+2P2Q`_|kgPf!m5o^<3OY2f zaO{=&x?jPe#>QxH2aMu=ZqXl*oqrNZ`Wa#1`$PS8l4k=j1oa6?h0uGfI%bbw$K>&= z;Lxn%7{o1R%<nC_mpdbBZy(r5^mgx73b%_}CEDp(^(nAdRfDu=<}dm7<_NU7X_r=; zoOcngh_d~bP0-Y{i;zL0$$H%h4~f@ljR_N;_?TQYT6+`>mQ}fkNwS3qjnE-M6FM+x z#-f5MhcQW^U|!C%Lx@nGUC!zzxGVL-6T@!!*1U}EIJ@YJGo|3k))vz-O2=?d)u}9w zu8xvJUHqfTw1sXt2%3yh8V57kU-9YeIaxq{nei`HohHJF==*4`b!IS26BAPxVhM<8 zr|22OveH=H4J*<>fyOp{Kqyh5;RASn6FgRKM;YIR5P&Zg+uNeqD<gO$o3c^LCJe`O zK3>5oRK7YPU%~)k)rHJnh%S3>SPtwxP1;t~lGAu5M4xRNE(eP~Z%>35!^jLbevCL7 zX<iCD-JNb|JQ4+6k+@xDnw)O&-u%w*@HT-P45U^|g?5T;4?3f)o#CEWY@6sHPPSy? z2Bad>K^Yh?62VF3d8IajlghQ>L~x1(&encwirv(Oa?*8h+psyYoczG>&LI|<8z;V! z8_>)grorG&R#hsFSE?sPbp!OkqCjAi1f@i}TRK9by-BKkDg*kgq_TsK35O0S;?BWo z>6pl(x{2Y&_rEOwUc-2#u;Ajtvw7yml{C3=#dy7{RvBk>&W6-ITcVO_0CC?4a-r?A z@4I}29uFP<l}GrOb%w}=);af#C@U9tv1P4UQIONwx+*50CTG;2%nhpkl>s|!y)oby z%H&hlwv{e<hVx_~b_YHSP}L153a#o20#L{Y8q*E0a{PeO3Iz6qdd(D@XtQ%2?*q>y zPE)S2%Zb-2wqE-qQI1v&komNkR~mROaD+*5cWJNtHnsLu1)o#I#eI4WW%dvQGpRZ{ zm>v*X>||B0E`y>E^oM(%=Lh4}6}4~2<-Hcbh2f9wp`ZlX#KUrjRdANluU=bSX}gz1 zYBf=r?YPW%I#YtE1Y5RG`)#zAT65<g3O*ON%t3eoP^YYcy5l*g=+o!81EU9cCo=G! zXg83TO2O?hmI}sRIY0%~0q8^E_g;3eVWz)xe0C621x&JgmsJEez;^^flT0B%f@$d1 z&DLX7^z#!|VV@@=<yH4aZ?Ze~gHWxP5x?3Q#boA#R|^oPbpz;6A<m0-C~J1$Wz7!U zteU*eQBUZiDz|`Zcc!}_-D^Qy(`}uKLNdNqiR}muvqIuYff7I&k9PUuV1$=zP{Mc{ z01bg0PJdeUK*)`%Vb^v@715*cOn+Ls&u8?k!X{<>A&yO9?WEA8gnW+0nAhuPMeHch z5y^OjB?S{CxDzW(HQu$#B!uV>%dI<e+N|u;d|*BVe9av1Wifz!Rrem)LvH2y2uDKU zlxPg0VtA8_cfe=84(<*eEt+8CEZec}OYZH0s=Nhr^t@pja1Ry~TvRWC%#cHJ+xozB zwils-tk&~fEcB;N1;`&5eV>#H_UiW7+*Ny`izbHj0$a2dXVGBqh8Jz6ZqfYZ0ro%G zup|i05^oj#J5{T#@J#^Q#IsWM%D=#;JY=_el4)54@7B8FqUbS!2ep<pH-bf2^o^h` zXA>i}Jgxus{kV3s;kG?htQjta*|C2^l;&IWLM8gT3OFuKW2R&6bY5w2+G0h$%J?wb zF|NNby&pQUln@`qeQg23Yb&eh1q(K~MoD4MFNX+*Lf1C`xrM%yZ|XvqI245eX+_rH zUWx)&k&q(Am%m_W^tdwTk%~P&sJ_t41paiB!^T)jrhg)ryOZ4O&Y62%K+cgbK5?{S zJv`Y=Y<w^|o3&R#^g8T?2#-nXx-KHei%x5=W}|FJ$l}Us&&=0Nxg^WS`sHK&^07V= z4Gf>P;Iej!fI;MCOaAKUWDfNuF+?heQw*^TQUuC&p8r%P2Gl`t+VEec`4EK-5ZFzw zb(21VilLLcz3nI{_c?tdKzwrKszvkP!hJrOy_}7eau4|u`|bs9w?qU}#L>ir?!zoI zd~vhER9`Jdc24y%lo=#AFEe}$)(o)be%0{R%?>aBx5S(yc!5>KwFw{~!SdcUG9$1v zb|58G_e%=o+%KZ>&qL+hRg&M_tYU-ih(qA=T~eZ${5+xQYB+3r1ZC!73hQ(_sWy8- zwa)eNbin`)<Wz2of&DF4LU?H}P*Ctwb^=@#LQ=S$hpg=8#C!F7WUEEIwC968$`0oD z2ru?4^Wx_f*BnB$2-Cf-*nLL;jM&W;3%HdV9wi~;{rUuxvbr$uB7*=aur-9JuwCrz z6C`OPHZMSP`D7=D=fhEM6ICc`IO9@X{v&`>YM4`(|474k;I1?(_2ZOFZq(I(h4TOt z>gvBD^-!Dz{bw3duK>@_r{eU&cn=^`tl^P{GKg3PuMDh@vviOz4Q9Mr_GR>tCd7*j zXTsT)e+2s|wt^KpgcsJN(sc;V&(671*ZO4>SxTPKp>URp70=y(j-_mvfDr~woUTGb zbGSBK8OW5b84FG+n!D!MmZ^r<7wVhUq!8%G!>ljvKMzm{Ic%o71;wGx>n~zCo9%_z zU3_?ow>KA^ORJ7nIPj%gEVVv)W!m!?<enuT`HjLImV_nVPAVg?;Mt~}<HLIt(+JS) zRe1PtwFxf6d#SXKUmJZHyW3H5S`&TmTo2^Zo?Z&HMw(~wuTJ|?)^r{uoF_Houj*NC z2JP2k=7m&*H8UqbQYi2dk9@>`lAZ_9pPpO!3^=jDKRuR#Yz+jN|K4+-X|nI;oxhv> zM_wawMaO{|1#r*%-40o!LoILsWy8}RFjyegoOLjf!x!%*Ka8GpdWl6=`B!-&$v{9( z6sFmZSS&$w<mSgN7a0X{q#S&X%n?Rstu;D-tAiVPFy@SbK1X4p`G0P0Z8hhFojpvQ zEo@)6I;wBx6+CSOj!f&y6|MviRC!R?b<oi~zY09Ky&7=sX!`1_&>1DLrBlU)NuDiK z1!UA!@Wp?C$GU!hJM;}J1nKoSI`vZXv()@7H9uj^5A66C0ZTHUT$oNL)l;jWRma_9 zR1j&RH4LOTkRL$kYBoTL?<i^lfKHa4#)osNa|q#*kHU~Q&=ck;jv+f6hYm!|1k()u z4zM1|w4vD8h0y?5kzYWgr07b!$9iX|c^im&f1uGC7W9npTLIONTv(;kIGO#EQ<;1r zxnRDu0(K#xTdRp!NACfh{(&?S>-1;6(CgP!UeW>vf_`=k-**X(sIkzQ)xcFtQ1F~A zAd9dpt5LjbCLFTqu}!;N3pBncd;!>Zcl!O3a-XKWS-@YhKD48tE`Zd+OA11g!5G>h z;n^p3cWeCCkUasFhHP1nWmBjEq<AKG@I9y%hRJx<b5&yiu{u|<I85UF;*iTNu7y-p z-0lvmLg(~U#G+ci3f(1Eh0f`zP~k?QsUp}5m_1)7tjj@j!KNeSRQ-rn3&dehgnIL2 zP`KWN>!S7qI7NN=SC=a)Ld14b5ZT$u3?R?;C-&Uw_sFW*r0AMiW>vHK)N|KHHC(ah za&I;)=SRzybVuR?6QC_j*7XUA_vUZR0FSetVWUAPQB}wYIiCp?SFR^kag%S;)Y6j+ z7f3)IeUMF?TtPG|U>|btgCa-)$OJ|M$4GTkxft2*FDpH5V}p;>l?%p&({Z2~TK^!B zJTu8NJ2~jYW4aS_-m%BXc56FwyY&{$rUOG&sY~sG1_D-7)*h<(f|2C}$P^cG##`YI z1p`9{@8t(w@&9Rko|(uqtIq=w6wJhK7CkzzqGb+)DTnRAWE|G73vxqvcL}a77;HVx zs^NA|T~0D*)v!=_)ozOW$8XJ=t%Mitcq@%Dw?3`aJ`6}5Ql&LxPef7J$!xe0vwb8< zJ;!@mbwdT}SzPiDa&L?05l8bZyz3brabT<8z~0<1=X{-`!9irLvuzN}+%+C);ZmvF zcCf#sQihjcQwg6r_>5m;dyyM1+3v-<Xh%5$4?<R{?q%c9)w?5f<|MzXm)bq|0*8e+ z@zJBg3U=kzY}Nh-)&7QHS7A@mH^MELur0(*9NOJ{qbD}-LhKVB48heh$X8`3y_Mb~ zebAXZ6)2usi?Q#(Zsk3=ef!eo&)&Y>uHk|Z;;<a%oqRGWC#~kiZ1jIOrxbq<^`qp3 zg6I$tK7API=fAJ>A9x@L@{fC(s8B%k?{DzHHk<KNIiT_6KiMHIUre6t%nJ535}Uon zhW+VGw#DRR+j4t$L=wdEY_%5%UTIyKgSW=3>PstjO%C1|FQ_jL#P)^3z${I&m2bl% zg5CzMc8IS&!--^H1Lw1&*}=Chj0@I?(?}Xw=8E3C0!Dj&&PjO()ViY*^uy775K*V= zlJX{90G+S$wCIHiB{j3&4mTGKQs>iDSko0;4$0%3<&a+=e>r4DkGmW+&GQyREt<oy z`Er=A^Oi&JolkW+mM?hA7rf;QUL0s`xi6OcV!1DZFWWbb&ykSXHW)6pw3>4Q4v}|~ z^-Mj;$M8@+>KE|1yD8tW!K6vY1Qy+dxzA;onqtad!^j<hiwLY!ooZi<?Sfd>nM8GM zLir|0Iy?Kg?YK~4;_MCc9SAK$NX*cV6#z0RxR;i+Mb0=jL^aK`0gx&oP9<3%0M3PU z+RtD&U?r1$JD=nbr4NX_zY9pu1N)tvx&hD^GBVv{5j#3%f_F2!=c05tmUQ^iC#X6b zLPmdDgYkWorXRft;Yncw=ub_s-6PTcd?K=;DyD0JFsAX07a{mcSA%f{kUSa+ZA);w zTNIwp4V+>DzByPXYKB4qni$Z#L9JW(1y#eK&$AsE*<KwoVv+a@3_jQZJP<}fF=9nt zx%KMR7S#a{DNWGdX_#Izsct8yljieVld~__rgNw3)s@*iEhRZ1tDu-IAB`nbAS`JT z8b^FQnMTbNJqJr;@o&JTx!rj~+)rCDwnPlBJ;ypUU>wS9L)XkNccqy{jW&S54T-^@ zg&2Rw4FGLiF0E#wc8>P|hRf;$=a%KL7&IFJ`^F)eDn4k0O+T8`avUrtIF-KPb?x|~ zb}k)k)v`jRs4ig7zc-%F=p~8GjfvRXO`heoQNm3yHOZOP>+;^Ql&_ZZ)qEKHk-~-B z&>O7f2O*acgr!x3N%jL0OH9Gd)8=QIupd1R)MUk!f>d-Ot&b}?#|&}dD0|~_h~`Z7 z@mA(pE}k$>V>ujLV#300C>gTd-~qp%dTLcdltoN5Xd0!1#+*3q<O-=wB-X>`9(C1t zwmDj-&UyjD1FE#baq?^%uCSwwMO7hU_3B+HLVX>$hG`b`e$lY&Hr>O3Q?N(G|6jxZ z!#S#j@zAYwvgvdZ&<|F14h*CYyjE_IpG8<v=PUQ_uXU5vm6fOm;ij1=KxR1$Lt&p* z@l$URvr03*puLVJa~`I!YKhH3Zv_a5uKuLD(9n@2Kimi6KNVau0<ODsaS&Z0CIMh@ zfysY49w#qmt)n}|0eI>jVWY%kZ|U{$8<j2`dy-;Qbo;iDjDz5~yh=U6@H$)bVC0f# zQ%Qm1ifh%e9<5?$l8twZ{wA%GxJTd>S==|r70TeW^7Omcs(rdLy-DXha@hi_UM|to z+G2-J^jWbc(fkWP;m&zno;S_B^T%qFQ@082h-7pe1DBvVp}f^o$K->1L|Xut!Li)I zA(-$$kxe|A(Y9RvHS4WMxsB;8@_oR3ZpqWtX7V@-%x)%r1=Tha{3Mal=HmPG)VTKD zICR>DS5FEj=pRR>`s(dB(6Y)rB)eVf5k8WAnqh#xb1`l*?-_Z4$N7LI!+OA*07uoq z20MDvWAqiS00w&U8Z<9z$<Cy5c6?4SxAc%a=HkV}&enpoUY2qtES@yvU#~ew7Rs*c zMY31@TPUNLhPnAzPeLQJ&+~}MPGIrUWIX4z56U>9F34DSxOZQsL+G*;1ocon)sM|E zXcUZRh#5zec)?$;#MuX5Qpt%F6EPi;Rm|PcX4?C^;G{Hdt<)4Emf@FKU5KFka%-P5 z3kfh-n&bA#*$Rau#|~Pw_4thW<WwE#PLRYEfuZm2LS)Y5r+O|FSV^~RjQ=gZy;T1f z-C;7y^W0OJ`vtb5dkPBAX)r&?`}@<}axBE5!0U@$8|#!BP4wmsIh6Mer)i1c;BE9{ zZ}Q`A@RMxr<6Zk3{`$bdz*oKz+!_0ow9oQsN}0)oFD`06!#+`t?N`{O<w@D!_!s*) z*QixB=vmnXb)GU$3k@~j8}DWnyxK*_9562Se8WOjTW(=)4cM^@i&Ud~SX-Z@;ww8N zP^x>Tctv#?)c-9+(RI?s;<tp5Gx;JtzTq?z7>3<eC_|({tHpS0_D3)-<sW=H09m+D zH8^>LnNPZtYONnnwsCMn#P>}(&ici4)=gGAzxSlJ4a|VGYeFmNT6P9Gcipzr>9pIf zsGqG($qIV`3WP$hEWDwkO$2Jjx4F7aICN0~t&-TOh4yf;9<EbBoL)Fd*g;vZs$yym zAvn+w_1Ht0-X_1b&JtqHn&Xg&A{s%ggUB9nyM)kQ;YL$7@2NYJ$K5bk{H1)_--U+@ zJZN{zYFbm5E_F%0cX#nJG$(VhC-VmMgYmMGbpYB~*Lj9F$j_UBDtjay#cR&?r{zV0 z+?m5Jit1+Gmt6>6_#!N0j<<~_)N*uL(s`>LggGGYLdrN|$;~vt)IE#!SaTG7={Svz z7jMT%cIEbVtGQQ-a{;<4*a`cvKUKf!5k>t{JKlTBF}03Zu9Qule@Vl<rUMIPmYqrU zB-K{BKjk@{<rVwgFoag<3UcV<iO45AdVk}F9(37=A<!}-@!->eRXNxsI94P@H7+Z+ z_NB?f(qv(2vJf>{XqeCes45DD8c=)mI4JyF(-Ai4Ti`)I=x6B|{4Hi_fch&{YCi6X z|3E`sxmb?GYy+U>-E0_CTu4Vrk<!ynS@bIaz`&9>iyk*cWMO}0Q|%ZoOLhz^#?ZrS zRukOR(&Plq1~Ia!v>bHis2!Y9Q(disO1ZA8GdntO6f1^(u^d)qmWbCX*SDFcsFc?h z3QDJAe=Lub<&m;HQataQv&oBD|Bjf30j^{=#nuSvst*QeFllRe@@&bB7cn2A?8W>9 zw0YU}@$|w3^r@8I!H??=<JYe9xba`Ku^rFjb8z0qCi~fov0%(|t(@MJU|yWhORq^* zjrC?PKL^heKAMg;{*K|-=$sg02yp227kna#yZQ56q$M*IE%JmT*Fiy<Sw91(p0^sj zKs(k=r;$zmyLa4PsxyKHIv*Q5c*8VHzF>9S!h+MTnsZehH|CV&BePdBX00n{Ibjyi z!bv3nDd-<W94y9>or>M?yfEk<sPY(tc`bd}MdPuumgnX2yj-4_-W5z7n6E;RO;}!e zN-D(IhKk%J-wQ!vMRlLLbAd?f<hhIgNW)rvHPgUttbmkx+4YYl-k6l&04JJ)Mqet1 zEPhzq%9oFIR`)z#s$Q1+e!1^sUg{V-5-qCp<ZhAQ3&j<DI(b!0D>SlG+|5UcxSq~% z6HT&F1=KpAqVOF9N>b#qHT0mpr81#pomrpOk?~yG-`ks+$^^L$a^uIMGh;Tbtks`k zsXP5_IBZFDio?bp#KmaY1yj33o5xE-XOs~O(t^_h|I^VjDYS}|qr?ccE|`THkveF< z@bxW-*cd2$zbyBz!aB*K@j;m~w<l$`XJwQogYHDxg|d6cE<-Ud*4Y>6FM9I8jCBOd zot7lbsc0I2l{KC0_YvwJGNqP_4^WBn@Zr-m&L-KO3`yE~p62?6L!CUyv%&SzaAr-Q zd9(um?*lkqW;!AVt9&D$Qt%6)U+}7STOA?T+F^1KOPIwH&<`_~xSIpB)?HR^=`!w^ zj7fe|^{2|GFUn5BH~xSCyDFu&Qdz6_VsRVY#c54>J;B1BZ?LJte$C)ZB(px)D+l|- zynCN~FV6PGnRu4BXj6H7z&r5)2fW4?>EUm5IpvxGiJxS>G_$)^&RHTF`CZx0@s>C+ zOM1i8i6{m+E&BUIR3MOV0v;Y!aX<gJn^-nG$Cy|G;q3GHg4R4aiha%zwY#3nCf9j@ zACqL(58*QVQ{dGwjniD`u?-UzTD3;VAk=DikfT^$v1a_IPcr|sazv;Bc%zJ9EhI7^ zvItA2#d_f|*`(}<x6pHU!$lb+$t)Sm?J2?{Y2nupdxSdbIIANv4b-O#qro4Fv#Vw* zT(X3t&K)0A!AA#qc-P^#=oJ3*=9>__-J&>s+ADHn$3LGL{W+wJ(}_GdWk_KqJEIX- zt%4~gx95eLV`WU-$+?YX2X?_Zjk$}<X7MrC^kqTb((FZ%Iowd-i4lY-YkA@MkFxqy z+_pgvkP%D7z-+`MSC_xsT$~$8*l{e<IY>_HzmY?LU#63P#`4cteqtq5z&%Ab!SzZz zT`@G5`XO6qu$)Ih-Wr31Pn)|MJN~YTR?YU!JSoItONZ`4-sBSUVv>a`Q=<iLDY*I~ zZ1g5tir6$oQ8@ziT0>Z*fx#k4whhya*D7<^P}(4Rj*0y@DGs8iS$t5sGCmKc9(Q)^ zLIX|!9GoUZ7@C0H+~I7J8K_KZ!#i>Lyo+TEVgXZH8kiy0h}-!<Jyw=Tb%w0?Ty@Gx zv4f$0`CZD-re!Y`;3?QUcxOH%Yua3K!t&TTS6R+g;~d+IbwGu~-h}xke%*Tvxq`xc zGs4}Th-HK(QM%mA#wyIKIesU_-E5j$TiI=~E^K({R=g1P25!d3k_B;NkwH1I<alE~ zkBLlZu!TTghCno)J+<1hZx+Bw-B0i=*iQY*twQ9-F6wLhqNO7=FUDZ(I*QR<kHc8s zoaed%O*vX#zSOx%c@2eS<tKZ;-3ea-qvwpe$JL4~$n**S4G#g_H;$0;Bzk-SYKOD3 zc3;)WFdZ`4wloSt261?(w@%K~)L!eQDNmA#J1ImLOIkzlW)oMfwgJ_Ht1RBA+GID= znRktWl5U=@vK;2w=r9?TH_b^NzX=I3vR5ydykJi~GpKS==Tg~dn!p2yvjlwqQZ@zK zX79(Yvm@9`FB;Xsf1S;xh|`l`;eY1?D%_T+L^(B@CAErmksq0i?FH7BFCH$Yy~y*{ z0?Qq1EwIF`(#0>t&+h!s<5=Ew^2GTw3L*x!n_30kN!`ReaPCuXajy5`><kt9_#~x1 zRe7#?MUEyg)md?I=C+FV6!mF!1jQByfE(A}pG;=0K`B=a!rV0(NjKY{YByf`|JZxi z?naL6K=3<%MV2iO096u2va0j|o097#iQ{^mD(X?DxuqnKB(n<y*hrvAs6-#1IqO+_ z#(UbwGvoHyJ-ePg9<P0N*6p!(J?*x(_rLUUsokIa7xum);znd70G6co%vrRpVj?r* z#_Pt78}|tu#Eg!p_521qf-0=a{;l9l5Kps0Zjo*>tY&ph&2Fhbp<<UFxI92h7%nIq zNzkAwNryrz@Mtd|qsC~E!Hz4xGeJezXgC~`YR+OiY{lcrxWI5bB>~rfDBZc)5CPRu zMSA2=PNISGJ8+WIQ?_3=kCCB$JvrXJirnh)?gsyYIcRx6WZ(eDzCI^w4%YLKnqh`^ zM<Gh{IEU*$Wu#Xz#10BPI8)B%p-sJ%T`wAiQL(mqxw$gi7#Op{%`gp4II7_$4hUGM zcFI9@+B$-o1H8o(4KU5ST{oJ&rgUCFqK;;%^Iqz_mpbpLZRmT&8MW~8fBxQ=|M!3W zhadd#<zM{~E3FUnAxV?*s<giGMw)C~$BVG@1W;L+cX!v)tL^K1>F%59`g(f<9@ekp z)7$WLbuE1p{#@Hg*V_1ST^{Tyv3vcE^iBTswv>6}ntH$w^e;CeHFtN{ucqs7wAZn* zx6}1&RDS)9bYq>L*3*rv{8h@iiW}+G4esT&^y*vGap<pkx@x~lIal$G^xB*4H~7=_ zt6b=+eR|7&m2$S?8|fR@+SlOATj`rPlDGNKTjsTVx8*mkrf+Q!s0}FkcKa=vM}FG4 zZof)7Tk-0f0GY;r?P~hQM*Av0T{BNt-!@-OIa~4CTj}+6ny%~X>9y-L6W6cWr#17{ zl(Q9~_|@xNZR0Io#jEPce7mX^4lrP2gT{Rwu;fi{;SKwA)qa(7uHswiIuHDf4MM6n zuJWHX^WK!ORSaUTrEfDf07ki|HHIO7-lk?9Uard<crZW+0V$if^WLD1fc_is@GZMJ zoEOJy>&}nE)_TTuo~atUP;$>!d*(ZTc!hSKk*md(tz><zeSNdO&^i@b#Zt)?bWOjm zWCJmfm$&T3ho7?{>$2-M=;=Arh=bznel|GD3eSif%IkQm@Dp8FB$w$Ca0Ff$P5g|8 zZ9v3SDo1+Z>l7QBd<DTRTzEEQkCi*s8E}0?+=AOMm{HqjvEUF_n3_-;271Rn%?s>v z-b(FsI`yYzf|oYCOFm}F$JA%ipsPUn;NYOl$M=w=$nNz?14<9BZluXuMri;n(97Ta zvzLGL|48A#{eS-eQ$Vc0{)gXhK&ds1a%)O8e)gyT{>vZ!0N<~}hwJ9`mp}gNpMCGo z@bxObUw2R&FMsEIfB&QZY(H5@FaPAvzx==c6TZKWfM{O}y~Jn$hUJQqOmRO@WKk0| zeie#rXkOkURah`ZyIg_n_V#?eyQvh-l6^v!9#l2d<&bdTM9vWdgahpQ2bC1$LuA#K zq`13Hby~HS?h8v&xFm%aBZY>G@W|k!34qF&f&o2x!xE$q2L(>UV@xhl61{r+?KHXi zR`ffr^NnNRXS$g#s;Suf?%w#d5ixZaRfC&Bz)Y!ECtx*vup?X%=66Y^mSk#4rY<OX z`q}UOo1gucFG%bJZz(An?M>RGG{4P8yM2XUVhA58_1WmdanaYMjNZ2#by@d2fdUlB zQL4-rX>B->mJ$POTy0;wzW&Dbjq4k4ymkHhwKuV5`^~G@H{M)-<Jz^gjg2?fJ-Go^ zc>B$(>({Pbzq-D04XNZSRk*(P=GAL!Z(Mt0ZSAeMu2pJ8`gHLcey6BB3pj+H-!8J@ zbh2IcadBV$F7F4sNRxg(U=nI?_*Pz$d<(yBCYLW4F}qJy2cuoM99}QK`<Gw-?T@30 zID$Ix^Ee+<f;*Bcd@UD!gF<j#RPXw8Y(AIw`{ik|JS}FN7Qj^^F|y>RG@LFRBk#ex z(h_bfcudVtd#|={43BDGXd*|%Puu}_vE5!?c1H#I{O_$O+Y9l8<4lBD5FcU%kSroI zjs!)27jHNm#y>C70<ijNmnJjoQ%ZDdUH<o&CV5JeWsD|a;W6-Oi5S+;55_5=(@Ef3 zQEkMynWc$wH%oSLB+%nngEZO<Hd9Fsj`lo&2_VnG6o>m7%35VuX`;uFCIY)<JmtuP z&U*Oq_g2+|&`scC?uc|2Nnbo?K7_CCM{MNxK~^5YZ{P2)Kg@dX^B|gY219ygC_C2` z5X$(TfB^WLaRlrS4$&2`pN(VAfZGSgj6+;mp?C^qS!^@M%xHEu1g@kkRW2~$jf}18 z=u|ew6Y_I*kgN*FP>qv?jDkAwjg<*^VTQ;bV{y)R&yd0t!`@mR)vRD;lgB@Y8=Xsi z<;@;zZ1#qaHmo<jT4}XGIzDGOXX7hVe>_Y}I8DC|g+~XlQpZ=uqv>il8+VUZ@fGqJ zaB#2U8FB>p=4@L>(_kSr3Nd$y{Yc(L@4hmZp0e-(pU_BTHyTHXT2GplFg@d=(eN~B zY!9BpWb|wU%nSY60Q0Tp?PEAA;na)4)f0jiGWzG|pC>PrPDo};JgV_2D6q)xQDthV z-B;Xau7UgP{vB}Un_(Qe9auEx(gdN9-;ogpo^J}O6lfo1<%81!=5xqL<7v~CX~7~( zp<VZO4;I+{+Kj+gR|v0UtSEM%%*U$LR6%J~hI*sd^LM?*QsAWx7g7UIgi~P*SWNpi z#N7xh3GCA|;FtSZ`7FbE{P6J&Vm1cAN|wk=?!!b|H`fpheD4p3&!Es4+Nma2aL5^; zs-EFUc0^Y)PH61_weN2{c(nu7W*Vp85WUkcg!buInhws0qa2HkXgsae?r}e={s7{W zOg3j>yfMY6YGLOAzYAwcUYmdiDtDWDV@+Md{O;eF%dltJZoPd&vv=sv-QnP{7{fgT zZzb%sppb9GetKKUsywaoEACU^DEhUyr2G@PC{x>W+>~jbiN{f;E`4w_OFvoiylS3j zH9gBu=Av#)u`5rV`-L$fCSL0bpuWiNs?Le@S|h2BJQ9g{V5u<1YnN+6;9|)zZ%+Ta zWIkP;Intu)0?Ap!;!W%}n&_V4jeCFUuhy)UtZ^#v%~E6m)d3bRp)+KuhUd_?FFH+w z3N!tI><BM1s70J00CVaFQ;Uz@NNO;$LY)^3_JJ7W&Xt<PlVK>3YA8(p_VYk_2l|mY z9h9`S*5NxiPLRcQP^yQEJwGM`v;lKPqw$zg$*}#&y*t1loo3V0OdC@7cf%!ZdZ)PQ zOXVOyOAh}3)}qAn^Z#x=t_TUIC;9L|qJ*Q6od?y3M2JQfiI`GirzyxyV9jPaqL>WJ z11tY1e-*J8^fA5({P;^cRJWEXRmZtGpQiqDF*wR$=iVN6FX9fgh%?Yk!1WG3p?lAY za{fTU63s^3<>P`5AFy_Tw}*MNc>$-8m{*8_v*KLA%&UrD$cl6NQgBtxW+W_Xjf)9V z15}RyvGyvVb8ry-{!xCAj}XmonaGc2ljL+Qv<#qYc&omzE!Asv9ay@tEY(9x_0TsM zy75ttvAPo8LmcSNY!cYJTJKSNQF&ho(dS_a{Bs3J#}zo_sKmLVW3_<qoQ+u?f8*iy zIV@`7YfMJeVbq%#SSc2=iV+IQF5CwllA3%H$Jy{dn*>LAWCj%@5sN5gT7CeB35quS z@}A8T@piarZw|*}3PKVTUJtCVit>JTzbUW*R10aQ|8iZwRKWex`U5&cM($ZppWeRn z(bK1~TNUbEfURl+EyobOMra$KvsvQ)NYruSUxHADYQ$;c2AU@R_>$E`7xc%dKCbUo znG}Z@iwJ8NfzCLX@B>m{>ND8{dht=JPo+6}ikTcb?QwI(3qOWW4c#clZTOhNHDMT; z0?X3Rrh<oMKHv~dwh;gJ`kx`WAb;L!>*`yBu!bF6{HjLiW5P!%VH50J1wu6n=Y)+^ z^q9vjx*of~WcDy%I~369XXn)qU_&a1hxrIUzqa0V!E4-X1)1gIHP)rZ2Z0z$?Lk?p zpgz7$T@*Ciss~OBi6kumZbaK#N+jyPT=!nmY=pZpGM~PpZRTEEaGS$1IA}KBXJw{B zVmy}|p7I3*Pt1bpL7RNQanoHH4^OTTnp_e5C<egUWxaM|uKA9K)-J9Ic0C+?NP|^G zORe6)s)E7qB<qp;7H=>(*-N}{5!d2^RT}sLTd;qNN^Hi99GT5X=yOH3#)4}Uhq5`p zGj<O~Wf-Q$)CP`X8W}d{M};#V&s?oFuT~IBPLezLqmtkNQN*x?0_qx2sGH{NLu3z1 zPXc>|9UPL84fRw7*R~YQOi^Ww)Z&;c5$z8^q`^ATC_0Yh_!Ngn*HHwanr}(jN2su` zO*iSOTDCNp^E6yJ&)&iY&TRU0zAJ}OYtt)BA<+Di7_N)Tom;kWCesJZ*ZCao@ED<A z5vK3ha(u;LfI2hH&y`M`QDVPRE*==ZAG_Wf0ZF5k`r30gPD(=YBU&+Py<uE*%A=1E zO^Q;Ho!lRe@0`J9puB^8k!R8wHW+YFDB(dBHwkzy!z13Qa)Q;SJ5o18iNomt?E**< zN%t&(ELS3#)AoK=^d_Y0H>FqcUVbz_wh4L9H;pGLjt{lg)YlhQu8NoW9^548UU_;{ zbdQw%3o`zA**iUg!+><&SgH>_b>cT|E#q14s4TD|yJ4+)r<#n<GVFo3!d+~MQx8?e zku;i|@F5vPQ*^c5&y%u0JasfyrT4R92$n(w$RZtyq%6YDh;G~8CNSBt1j?9Aj>U6_ z<RPXd+6x}W#4`w-y5vC>9E`P74a0g~=`RdQ!a(CCs#0Chl#<BNR#}Pkga!=ki#)ci z?MmdEXU-C{F;-J7#t4m>NxpGI>sYux2vYLVr$)6NVi+4QqaAiNPi#Pm4CJt6t>}$= zQ|<1ti2Iy4Fyu?N2WVs@w_CZ6uT+h(g-NxS;A+RDP;fi0$#q*zhuNH)|8h<OOFnyo zd1*xUgD2BtL16^-1!MhWP4~RhfWFC9CXy|DmUwf^AjPhMvo|aAm8MGD2gy-Z620ao zRsy0xO;V=en^T@!;Z<kMzDY)kq-KFsq?UFB)AGTv92==jvsE{((8vy(Tn5$e@rP!F zxJ1XbE0FfsbaYmMnp|qLYw?cNbFk1N8P*{NTTd<&FfXOW7`j);yea#0p!Bwfm<QCI zMGFxB=*b4Xm!tNW$5EXV4wiV&e43$t4@w4fyqbCag2$1}vR#^Q_&7SwM~9TNTg}sj z4x<ry$UM(Eh-DMShv_#q&Gl#9dFz6Q-#2jtX|y%Rke`^)?$B47ns83)PUFa#5T5j5 zYxQ`0-l_&hm&vWwZNFFa`(iL|ED17HI|mwTtBhug<9E&zj{nT&Iq<DgUinJguUd8} zJL%9;*;jv8%sQ~cd5_yIH3uJbC^aqD*(u+*`lDP1ll5bk6`ZLw1kcAs%cMSDz|1#1 zgkPgDLyltK_jzU^KxB?=+#ZBjz>}dPK@M(f2Yn%dTa>Ebud?vxF@1e7FVU>jCNKGY zJ2$mv%jBd8-zKA6S$wz6tA*@Zpd0g2Zc9&;`7hQow!>-Sy^E*Xj&;CvbDm|5T;fb| zZ1;q1ppjTq?W}2Wb-%57Qr$^jV_;od$KJ0j-tG>n=D_jXuWH(7cwZv8j<V#sfH!5; zq|Ra*J6f7-iMIkWYwp)h<giScxYWBZ_3rhtMl7EJgy6Bdd!bwOpx1oixw`Sar%hKv z{?N-$&}V<ph4<*QhTG3LtFg`o!9msi;aS8>4qeXxr$%rCaJN^)4^oMkTj444EWJ^7 zYF$jM_n@)6^SB1`p195BJFNJNn4{ty44cXTxN4mBFsk`QTI9L}5<QZnwPH|s#(FLT zyXH&Sa1l0EpC$fMEVZg(dk6Nd^y%}^s4a$CJB<Hxyl6QA?4VfPVocY-jsca-Mu!t3 zTouc5HY|Uf_km^0(LPqpEBP4b_qfZD)oiw^R@~dr0NiZCnB;y6dTmria1k2i?=&6V zZIBUFV=ridu0}jtp0#g&`k>N6Y=&*Y_#`hhhpG?X+*C$O&B}2QSZ6-UPH_!FhKpwP zc7eANtbiN(wh@^(WzK^tV;EsRR$}qlaUlq77midk25=D}BJ7a^T*pi>BhlmA^cXp! zX3<I`awO=sE7vrGOp{pYQWm6RugNf1H^$?UnA8?2k~=OF$biq|{Gm5Pjsa<hcbKLt z7(u^O@9VbnPOg}+TOhSpz3l@yyOX0~Np|<F%Sx>gHAw?l?Q#tCtb{Wj4-#wHO!_fA z>ih8FdG0{8!yB3w@y)_bB|Ft)G_N-!S6MDEwogI+0m+QQ=MNn-eVodnlb;4@2iOiX zpj0yPb5fo(%{uwwOp`mTWyW%hj%D5kc2uWI2<??MpjVHN;7l5xCS*RZKUiwdv2*Mp zeV)pvKrk%5>KS2SJx;2U>LOi_g;%cF`=A^=p&w6n`VntP-&mbird3tb({4>l=p3+F zz^ZXV6gJ;T_VaFrENC%ChRk|@^*9;R@uZJ&{qs=xZS{3<8+u;!aysd`9XR%bTFRp! zLPtX)YU21CT2oI&*>s&pJ<~OY^)k>gzVXz`R~GTy(kkz`(^h4(YERr3Utub?;TFcb zgWixA(}M#d+Nz2Ash}tkz+%DLh*!3CZLLjkX=m6QE7#s(Sc{+`BMZtm2F$t;C(Vcm zTy?TvU~q-O0TIfJOcBXAWGp?}6=)IC>)je2A7^D#9oF<wbua)T7k2L`)ad2AB|4te z^i93mjFd%q<;>%qk8%ZOp5SAM7ad<?M)gnvVuWzFLqv&alV5>r2`u1dHSV(uuFtKg z=tNBxvn=trQiCpRgAaD@-3^<j;k}Yavk}0n4t#r9z~F&dX`w;KxAsTLm3JB*q|3T1 z*7Bo6h9EvxwiZaj6Ot3zUk@dy#oT>nyn(!veTK-)-&0YnkE?O0Vkm~+tnqo1NM@Ei zHgyb}s6+}yvsguW3N^i$l(h~@3uNEb?2(s4Hh@!?rMM1OkZjn8CutWAv*MA)zyINH z{Paiv`^*3GFJ6B4k6n)7K5)%&h^(bv(I5Rzq-ZDENOhJ!e_8w}Is%C9<VV9vAJ2c3 zmGp~lF~;;gEC<OkxA&k6pSo9_N6;}|`5OT!;DkRlT;Zok%u%Lg!NBb;;B!gfu<x;6 zd=cxllLts0P7B~hj55LX2kUl?txt-_hX(N}^zBnRQ$7{Z!l!J<dN@F?r>)DH-qP&q z55|@*`8;W$X(K(5WRRZDehL5hiIq?k10_4QZdwO$JUpSl`(({N3m}xNfj9E34&em@ z({I>@(TgF&wu<`I4K|%bIjI<Xa-nvz%>ivWI)+i1?C%fH#L7}b*+HQtu?v_Z3ZYF< z28^c~yX})yGpMI*$~$D_=`Fz(jF3R0EtVC@rt)*mTf9Rl>S;D;P%gNW3Cp=i6napc z<y-~LMi~~1c*SaTgz~$}V8*8a$LbD9x@ttz&+|bs$i4AvJ8BGBzV=IL0{`q)%b;a* zCs|)xTk)3R%YXNmFMs2Um%sa4FaP#$zWn{aefh<A|M838`Ptw7!9V=PpS=86fBf?I zeg}TO{O%8a_8Y(b_dop6KYsCt9%_{nMxyL_KFSVrdOpt1_-`?21lyesp<BY;6A>Z^ z9(uj}{$IZQqaSmx{^2kF<4^zMdq4fVfAi)4^8J^8`CWMV)4%%h%OCw|4D7=ZY|@f| z;*Ro$_y<4!>7V=vp#J@j|Mk!Qx9|VMZ~xVofBZlF!w>%DKYsCBKmF^!d-+@6<DWnM z!~YQ)dHMZ+`O|;#xBvLXZ{xVB%F8c)<K^%E;LGp*&6nT*?Jxh`Z#g6Wqv7e@{17f^ zkEh4`Lm-rBGVcurX6?&={pVl)*?;t=^*8_eXW#oj?X<Ew7=D@yiw0mM6f9&FNvGC( zJ<0}$`3EQ_zFQ2QMY{0iAN=6u@BS%|;iq5x`IrCp$1lJ8ufF`^|M>EUKjeOSdz&+C zDuJqexSbyW<`J1$rKm21$g8~dC2l=#0Meff`(#AyvED-zHDt(Sq{(iwyZ+W%n!Jsw z`rTD}UWFgYp4amuXae@#2?p;h#u!^G8|cmG(%zF{w)PofSwLk7lwEyjf#4-k#Wd>5 zCJL&4MrZlDdgDwXDuw&mKAxC9w}XgMSv)=_`xtSq@r!F~YYi1f#>0S0W0uo`gZ1%v ziZsk`Zy%;0AAQV*<ZJEgY2@oI)AY4#*Mh*Q=pt@E=Xvh+%vn4gpB!anQHG62XTZ&Z zkDuX0j1Kpk82udnujMnj=YFNyv4;Zyh*@*v`t@{U{W^kezZC+mdWw+Q1^aB@bLJwY zmC@eAPfNYyQt!CbJJ#zRZ|v+mf{RGw*Vdlq-KPbT){O2jPmf{5XAK<#VVph7o1bC6 z`n()YM&0~Z@@a~=F@gs#%O#2r*~sQGK0+nAhS8T@RUZvR1p+xLD5u_jo|Rv<J#s>X z(kS()G_AZ4xy;s92)(w?N{H=syC`>HmIh(B4LrHKUb>{a8gxp7)5UxcpN)2L?Z|$% zX@8(OvFEjOl1<Sqgy`?<IvO`F=KKBOe%8M=8I?o2J#c|%`Lx5KH}HPUI<H2GSlZYh zP0AyFZnxX1ifSub4w=5xEMIa+O<?>DXrql4&dJ%wSdQGFakA*<MQzs-xZz^JmByiZ zO%n~@ShEKo`Jo|akf%sEUs)am%Y$Hf5X=nx@XH)WwBq0=f|M&qc^|-E!Pq~y_yW-< z*S+MIRb*!RO<b8(hnRd4^!Caf+{y<N)QH6V3Qb}8`|H2@i2j}f!SlTY{cZ?>tO!im zSmZsa6bWxlae#o)KFYh#P!v}K!S7uJ&eP9Eq!6ryAcnV*n!}T^_5(qo%kyE;BN4;M z8)dRzU@#68cA;1nZd$#*sAVWd0eofiR(x_N;PDWpEkH0n;0jXUHS(gAPhL<=Tj>}O ztELiuidUMP)Kr<A#4DU0<$1rR4t=XsJ1GX;qiPL$Z3|OrgKjR0RU{_5!9j~BiH{aR zG-rLo8JtYuV8Xzb^@WC$F_jXVr78-P`S_vNpyy5M_oX6KJ_&1vC@pTF;h^si$3O%+ zK+F2mBp(p5M3XI~l7O*rih1GyV3XJ_*jgsA{FbYv^3jNj@e7KJ32aZ4IVi3*wMERW z5CF;_WzP%Xgpy|2MT7_L<uGp<F)$Kfg4T}fA+1f==SD}nD{>B$@owRjcF&6dZloY% z=R^`)J>&6BHX7)e3td6>?+Q{=l(+Pda3lCDBs`c42|1~gY;Xm4P=kKa)LmicjYe%` zbD$G@vp$lJ;=$k^&gjQDqdexBRj?0I<sLjPPy>!C+)^T^32G)EqoXhku3bfPL9s0_ zn5bPJvT_J*@^15rC)g$+M#(mcKKct*M8dK%T@^$tn;Zp^S|Qhf(4{||y_ggvn66ln zn)%_Pai0<PeY8^n7m=ts&MQ(0{4oO>7p9v+_@Ti_2%jonU=<q`#p`FIHfnk8vC&8? zr%Rv;)HSHFv~sk}s4+P)<?X3b8{Kg6LGwn7j#?rg%osKiE7L1|bj623XA%_GM^;rS zslzu2MteI&cL)I=94x#DUh(-W;1!=e{a(>Uro~j4F(=_nV9aNuMwW@uB?>e!K0HL$ zcWbuo7}JEFl#Vo3ln=2x3xhh5(mKupiz9v3G_^bk?s><++9h-85y*pNIKG=7FyUw_ z0|i9nyv_E8sP#6_Z5k5J3zx0-cQcHwgGL}Zt_1KMpE#y!s$M^F%qSU$cafP$sMm&H zgqsi@^A?xdrUv!h9F?e`!;2nwoB~Nu4Wy+od+il3PH(`>z&InXn{Zkn$JMHaMaH2i z6GncC1Dl2~dk$|LDfNXpc4P~$&?TCuU&*I83(|8~D`o%OK#7K5&+n7|l(!G_65W*u zi-a`O{?Vn3+{xTUQX?yQh*bO=Kn$`f>i0gek>t-d_4_CG{Zv)x(efm#RMVC3(E{=7 zCti*rwVd8k`nRV#o`j-`jfW?&Z|J)hBnNoJ!$ZI&I_J^^gIn~bDfNv0eIhuvSw)G- ziH{JM0*t7lr9w8H?4}Bu2&aRNT6%nQJMWJ(l%T+dT3sWF%h6~^&JkU=gX*v^<ZKB2 z7`GI3#H_VBNCN%2#R~3x0Cxww;j=DD8$P<1d<;zwPfH{f@V1i(Cyx#pWI_Yvz|sjR zTP;)w|48{M;e~Y2@9#UwTJmnP-d;~S$vS4nZm)A+v4##>4AjB`NgaN>$0xxe)AsV0 zc=rCPpSAcXr~!_}_YU;^l}14@KCw^X7_e;9uY-@D@Si7oY!@TE9+bdz^J7Qd;dUsL zKM-MH+(1utYHou2@b~$!050FZL#mr!<sQip@S2#EeGXy7k~%3)>|HjRqTDY(Lvs$2 zg|)SCzd|0WB!Za2`ninl=5Q;H0-gYEM`#-=HAX%jGmY>I6OG%&3Stmy?GLHE?K7+y zT3J4(+iz38%08z7?wS@ZCk^Nt`SUE}Auq+^OR;!VEN<lDC<a55LacZ=%1(~jf#}-E zN4j>)qJPQ^;r1Oi;tgvENAJtIS*wNd0Ur$Duxa{L4CA8dh_KpQap+2jI;8X!e2XyY z@c1+Q!cdQww*b6*v(9gXl{VLp0v+5vrQ<)rgjJjof`V*?v`{gQ+kzRvI?#_|fL2AY zOV2vV#(DkHP!Pp%ZRQ-l7g;PFQKqib3oWfql_UkqAZ+g-KmAoUcaF4F^A=7SVO&h@ z*SFmGT@+W_+0efQKin$@Vq;B3FuraO!^@V;&is<_8%k~u4$!GqUH05qIAU*h=KBfQ zIKBckH8lcfMd{v3;3wd7cqY8EY4l2Lsy0`YFfW){skmu4<X_426CzB^REb3#U7~T( z%;_)Nb#;s9_Y=5E@v9b~eAD%8HCb<Y+u783A~n|QYjCP8XhqibvCFDuGiv#t>Z!z% z-&pb+OMaumZy*`je)Q<h-8&yax1Zkm<ksB}Z$sy|k{6BatSCiC*q{@sA?|tdi%oOj z`P^mQ7B%uwHtrY#0?R>Sye!H2NG<6*UDu%VbZq14ji)x*_n?#yuOnDO?n9)3)92uD zusuS9pXb?NEGISI6tj~emHmH9B0GBV3R(ZlVK60dy^YX%b7}!$e##w!(z0}M`#@@< z*8t3niQPJ;U0kwG6OJ49R4pisnc3{2*GoH=U5BA#+^1-mNbeqY>?PANb&^Y4Td~pW zf|nwzy~`~g!v>{Lhu-zh_7HxU=l0CzmLzvca+f5xj^t`X%lFU`Xxmt<HziI3@iv-b zS(|o4C5*c@S5rnR*1%ntY&Ps`o9crJ8rn{xkJ4C-6R;v;9y?fdkI;pr$GqPWjyhej zaaHoEb<rDQ*c`Y}xW;iZ7#c%D)v}WryK)gHP&?K(#!o;pZAyDmVWESzv@eO|TN0V* zqbaGV`!LoW#s;D=2M<Q?+t|d1=$|Wx2gVhkRBX~G`o=0mI?0Tmv3l>6qAg|L>$M?~ zGL_E`OK@F$cm@~fx#KE96K@oT(tb+CZ$t6-`q^PsN3R8pt_>cEhMz|x`o>$S4-h&l zh+u7xb$S+k=b}S8_im-iFa|b5^Ab$#Q<Gda)++|lZ^I27j*3~mqv2NL8rKi4(p|P; zr#SZ^1U51bFv6U+F7kBpuKevJ99kEJraQyK!+vf|qAQ^HG24BIV!P_eNGtIj>LLM} zI1(#$rb8TqM;x5vvDj_IfDt)2%MNN!ie9wnc_h+c5NF3P!Be|iGk-8i+r5T_eO3jE zUVv1{@S%Dir%a5%8FJ|E9gvT_*NhR2ARKE|9={+Mr+1?;6pFe~0s%nvo{EP~+6Z=4 zzvH2+gt7I$Uj!liibf9+OlfI{q7b5mh-<vQ2zv*}PW2nH8S)c+EN1?Dk4eV`)3sGI zwDN*bGzR}RAq_O?1W={Cd~SylPlKXF<8!k$&vth~gXVK*{WdC|+pIF4#jX?HNEZTQ zWVy}!>d3`0t2GEtUNBK**<k8qS{LgGN|BJ>F|dxFILr)6f7vzhd_g1UE0S*;o(Rmj z3U`zB&?=<bA+s!p9NVO(ogjAKtO4p_Z0SK&fs<SI0Ul$<y&U+R<Lp_Ul#@};*Ic?6 z!r~{{@z7|_UQa$f$p)XM$)`B=_?J%PPsxB~*hSYBrFT@}$V_!PY$W@Ly(BZMCa~Fh z6gxIxJ)|>ZRkM=!vzU##e@fGyl}+N3t+<>n${4?6Hj{}h0goL&&b=mqIvI;&zEa~v z<nc(v3YYIwjE{L|sUNWFo(uAb=@KZ0O!EGn2Xbwub+UL(cbZ5>1qxrlX2BUS{f7f{ zuf(zpk|IPXz}VPe$RA^2gDO0tiW6V`paTo>JfKZhG}+7xGb1*1Cvbb^WM5t(cX1xg zJ`iOCd#+b5@Ouys4QJl#b&TO~!*+1Ok<G}Z;6l9k^HUX-_*HZuBuyql-2_H;DV>bj ztA9T~#n8$X{_ezvzrot(m(L@W98ZG&tSBDGk5LY{rh<hKyp1_HD()Y;s}5w-2Vua8 zQRpI*aAVwDBh|awJ6=qDDw<)SLp`F_f@$KI5Mqt8DHkRUCb(3^10`}7Mr7cI`3=Iw zwb!{D-7ehGA7+$mZnt6IH-g-zbSvGisbyIbjC)!KfxOa#iu5kp)ZIvF-AuIRpgtCQ z$h~pif*BlJm@WZ0fU-b21K`K|5)dVbFK$kW-h{+7V>D7ZP;M3>NTgvTgRyb)B<>Lc z>m|SNAqQdk6||%}{sqL%UwChX(x_iZnk628gJ}p7WdQ@EF74#TpeG_y6f|Tf*x6Bm zNwx6k#K@}H0kp?TC?^7)Vj(=D!*tG4+43kG<<3Wm7J+0C`)HN|$K!B<!l`1wpF(K; zVVAdE*99PH*My5QY{5W9XV<K7h2+7098@CEOXzvUNwy*vVB#7lgPvd-mcFH4HDi$! zvXf}w1I|f0KEg=Nd-L+O1jJYk98=geb+=;O9=R}su_I1JA@na1FjHRP2xz;D4RqBO z#Zo1x5h@ai73PzUnE>mkOa!VH)l~(2e*cZ6Z(iS`pd#IO@G1Za?`MuNpo4Xtx;qz8 zj84Y7L~-1DXPe<}{7_<RxtX*vK@TkVR^d^4HK~lG6%#nH8kDkKlfcecp+7Im33`*0 zymENJssFHVmKj98znyH4jrBRl+#@d1#^H&9zd0FKpbL{~ZWA!_k|GEZ8=wvE9Gn>F zk2F}K_1J3%T*TWNcr-Z|ch3lvb)Zjfp()b~Cm*#1M<B`{Bh!g%q@dMFqbky0Rp)|v zrsPDGRfe<Vn4&$GK?+8EJFQEtVZOKNx^s!_;D`O`;c(EHEl*n{mxiXJZKB+5BGDXK z5~=+|ZmTBC#!O<*tZ6YAm&BOzC@^R+#!QM!<sw44RwQjvEG(#-DAE=~6D3LjDla8w zXwpg6TG7CvU)S6$G(XWfvVGkx_G)XM$7gVXTxj8p`UAz#8{Rn)0Q5`KK7o7p@L7I; zXzYM|`G2Jn@HhR?14R*zyA}S3?nfBUjF_q|b&`lq1HLutPK(E?VsL!;wX5f7d7E<J z+!wlo*H4b-x_IQ}-dU^Wgq9$F4zwn1{LzrM)@C(B8PU#zAx7#ZHF1VoVCFil<1moa zL0EGgBN*z86E?~)$EF6#3?mF{ZBQ*Qz+_nDT03F3%19gpeqRNlGXfzi!|3&rOf4;o zv8a1of#;!e(pE6M$+8IY2r`R?h64^XeDcwu73GtgYH4t}?XR{46$zeOlUMRPlYE4p zJD0e3?^;g4(`9T%>(Wxbmyf$gHatV!waY-o%gh1pvUWV%BCRrv(UgBDaD1r*N|WY8 z4mw6)qGK2XvA@%oYr_uwsG*cje&NNiHQCPM${rDD?4tLGG15yD_iKG`FJAGp4Gc6{ z1GMN<#2wFRxt4HB99+T*CYn*8JPk}MQ}c_FQCMsA%63F84e3<8ul0wDUc8R?E1g~E zwux)pVce}RF5WA+s0%9QfSKGTgq6s6Dri7B&leppPU($)aX5$tg^d;d2t^ZsC8pAG z(d+f|#)3Ra3=P5yDz9>DrpA^cXcD=9AMMVH?j5{7p;XhNMs`5)Brzrg^BQ90fs0j! zz)%1IZ97XR3^FdAy3l2%9d^s{*lL_J)AdD!cVF>t9=#qt%(~Ce9;Q1fG1Mnp`;pTR z@rd;YR)r~HPfC^z&)^3UkO;6jW^}Bi3!fayhy?<DO;^5xs+$XRj9BiTvD?$vVUzEO z!al6b(SS#+2}n{ZDLU*;n^D~Abm`2Df5AxpVeVB0k=baGDpnJayG_uXwb`n(;|nFK z-(N80B|`sTurr*X?ZTx?b4_K=S7y<GL%Z|iJLJ3?r-OyrN_{#*Ev0MM7#6X+<RVr@ z^{{4J8JGa8EIY5uS>rSuzL4D?ywl*CXa}>(7%lI4klrSo!UdIlk<>s7=yQCrsM3Uo zy{#)MqlgV|Q%9$-am|U)%DTkIaW4zWF+eUmVK$v%c1+4k3V6=UIhxZMCsm3mVhxME zbVzC?In+(e>I~s?VtP9EgTx|Eby}lSRh@Ny<Jq&EEog3Hz|2?@hq>lZNW;;Fp^>i4 zq4uUH3z-NlU=$QFf8y#<ot2tn4kUu!*BoXg^KJBew>W=4En@VxpxfPit0qYf6|Pbm zV>#fU>_v{l-W1+X>$7>E`ytO_6UAX|Xr{!O*-v{Raa%r-zfZoNiK}&rt2Fnu&LhVH zr*>AV!M8Bs%qJbwftmtOq`;Gv*+Mw$KmRnaREjZtG2M5poK=C-;Sngo{eyNq!l3>z z5z2bBUn|f(z^^PnCF2Za&TECI%)PRXS|TQ;GjEv@&a_UJS!-c16O$`p^7N=BTt_e% zm%|R}FJk2*INopIZ35|Cv(*+WrzX{|bQPU6X1TZ2>e*X5Px8|JV(EUdbib&&UocI- zg?5>^HG?$AD!(yXBnDh<)M_naZ$kz>V}aqAw`>55;_SH%lSH`;;l^{|+4cxnqzCe- z$S9@}(w5;X0R=HN2sA~eql~o5B0EmDqAbw7gJhOjkGMiue$+P`yFe#oO8Ly=Tsmr6 z$zO2hbY7Z0p@tickz-TZ<4Yy19~;-rs>MaNd&Wf0FrxmQwsu{-3Do(m>yCVJw6M1w z^BXNu@>Ac|xkg*-Zq&wW!`wwHMNI)zc+~C?z8{-?5`p6Pbjv_}1t}Mx$s<BUQo#WE z(urK+&6&VM=7nH#Gcqw@KV3}zx~w5JU7fK|n=!W;N;+4&Dv|A?_Z;ilbVefJz?AK% z_JVCTSZNewKDKkjB#ohzH4A=mnZ-rcV)h!$5`ox!cP#bzIrPX%OT1~Df2f2~5}mU$ zQB*{~-(1}2)k}eih7wKhO^s63b(&tKNzprtQ7hKdQkm9QaH#4VC2g3nQz>bS-dXH= zbV=%Bm_vT#sA8=+!N7ARKLeJh6b0z3c9|L>CAn*}s)6PRaIP5tju`+Jqpk_=k=&vm zF{8h_Y)8h<NKz=<goRmO5?m39Y}eKMnAF8|;y@d~SCwPn!y@^UNsCQp$^&wA0LZmK z(fm^zBf)KcNNu1lnyrzDrDh_;7ECp;>Y5M@GWJT$tB~cz1bo;zoP}O-aFC-%VAYn) zin@w^zvB^6mxfeqpTy*;dV!1R&}Q1Abk91BITZiMpvUXU+i~?ncWR2S*JxRRYrVQq zuaw3$jcttEL%Ine$KB63Dhyktmy-I5Y}FA>SSyyu<>CY|JCCTsQT=;K#`kWrzLs>7 zw`SYNpjRB*!6W4x4xE**PL{2=K7+4gjt+n{heQ;GhO_+<v?X_hAdxv?gcRvUO(ta1 zfmqt(XywAB)vlq0V)I(DREe5?T42szQ*732YFCXuV<3zPeA~i`0uwzd39L#z7l)zF z)6Q5ODE2T!6*y_f(6aA&z7e+p(7X6OllGX#gwvKfcg1?G;Jlp8)@NBJ;%n-dbuFmt znw^D(6y<dI4DJZf+K|(6Q!X)=fW3w7v33w`CqjFPIkp0wS%zRh6ucSi`05UyoFy-c z5+!SF2SGF}Zs>4cd(R<qO6RIr)3J2mJ-9$N-Kc9Sl3&>~<8ClHIU#WaI`E;OqeN;X zgtKhVYWe9?lIZcy{?!e16X6e^ZOrWPXB!wAZ+$bSU9MUB`-CqGExfnRdX9W+nR$!d zuUluefy4BbF-R`UxDWC1QHExC&4#gKVojIHWBip-C$^2uQB$*iHJQ!hE4WpI1)KBg zR<Wjf7o8yvj||JB&Mp)M;xOi4vvi{sZ9`R<Q0_KCwi%_B<J3aXg-k2hkx`g$&Dr)p z?k>&q8JD9kGq^1U=}STS><n)4fDB~9aRnvp=aTZd8j4lqfw51!*7Ra87XOs9n!{a^ zw7ndmLA#BskOnI{kdjI2BjGu*j<(9M_im1P=?ZXrx`>!{7#S}I*<1<b08}4uE;~cg zA~qSa4ijV`^v=w|p=HOtY3w+$m&H}r1MNv=Zin9YY2a(?50a|v4C(U2q7o%e!UCn8 z1v>_Jw3sNX(SS~M5m@z9&X2<Cm0mOwtI^EYhGND4*>J2LcD$})V?cWm20RSU%EJ3A z9+K5*GN=iR0aiT6<W+<lVkVFpbAVQ`06{R+&DiJl*k=yTTZlc5EVqu&YwxMW879}T zI4M2iK&@0>$9GkMS`~mNRRB*kfb|N1mCzJjFdKWbS^c<fK0eV1P4R|^HtdYDL5b&} z<^W*I-_JS98OqWag};IApuZDU`HXQ%<3uYK$m~TW*?dTQ(jf1=PrOt@pe4hyWLTCA z%PfXPu^k*LVVb;92^^J@cZ&s`dqH6n%6+$YR{v>Q`w2I2?METHbG|>>i{-R_u~KVa zY13JIZ-YeEmUcE)yznrVtr8uT=BWauc#X0g@8qH@7qT4>Tw{sci^PSn@j#{Q9@8-m zX~DKm^C(rKv1pv(v0rY6<*{-JR^Gtqhwv3tT(BQ(h^Yuq8~8OS_BQBt#T<F2y?jvF z9%V5jhPtv%=z81dX6wQKDrG`g1UQWyL4U>vWvC0dL2*B<|0L01(gu7AZ$C|}nhRgC z1BzMCq@)E60Y2vAQBHrPC3IpRPfAJzL=O0aE_z^g`;(qP=f?4*Fm4J+jag+?L6~}@ zk!Zw9_FAvZ3|3&L3x(wTx;EMpi}7rcy2V?dTDUA1u&!JY3|z`mmaNH=HK}1u#2QHZ zU3)@$b?hox#t_4+<h^^@i5$H)pSwO=S+jX_ie;K?;5aYvn{>yyg*fe~H0Fh(J5XRE zk>M~RS<u&AfxdS^BSbq#4@k*d>M<+o>3UN~I4Aq}>LT7b-awa{!x^ZUeqOD(eU6zm zujnh=Y1Mj?l3`EpD;o4f)Ze|T+PkiXL=Ln5PwanKtM4`u77jScy&OYrj{Z|7yX)&| zvayjSjn&2#KOcIUT)S3d4FLc#NrQM+p<#z1{`a%{9S0PC5fs|C7{map)IpR)ffVMU zja&o;O(V7e=CU9gRajyj*P&gjNV+7`L?IMr+fL03GgA{0pkjIy?xbB@l0A{R)mArh zO<YYa*7QOL)GcgHlUt@!mr<7)t*QN@o#9tHFZ7L=$<!+rx#5odt%>P!A#Nvd?Zbc< zq93NC786UGV0wT+7_38w=xExItuiHRt(vHz_2w#W=eyk<+1871XU`O`7dOFUH)p?I zKM37{u{h!=;Mc2LY=&3o)?0hR__>ym5nb}3OFneTht{Wqf}JDr<7!yYi*cAWmsA!V z^@pRo1$k!c8z-?sU6ZdQG=}ryH3rqh9?eC24I|9z1SvkSNT!rZUu!DG3_*b++Trc` z*J*MGA#=cAa%Chm+MeofFg7tjEv*5nPtjG^J8qc%;U_)q1a`GvaQ-EET$0Bnd5mii zBt=K^@;CqUPyg+o{o@z^YiI>=V>HU9?QaFf5XjP8!A<_oIk7jTu3{7q*2JE!-3|1y zhAuafMma${HmFbx1}LP}<`4+&v8h<nWv@(qP+C^sqws7d8nqJ_@U>ZLtAGYUoT9Jq zR*9nAUJuox2gMm8TSj>Ufm|E_K8|^7urY|sH_(oGQ2k1dQQjJPceMdGh&jBh8vicW z-4muZd<*1zcdvS5zclZD7J<dVcDTx{i-X70idvYKWOr>3=entXyvoGa&KLoW&l<%B zm>g56PahCjY*bAyxDm9^SdD*#b1pvTass;2u}Gs(CK@=DyJJl`;J-B1#%>XY4B)<6 z>yTqi$GcEPoR!O4HDzNl^+n+`>5qNcnZNPbySJzYnB}T?{VN8wA^Yp#WoI+sWoH+K zXNXfROq`r6v{;L|L+XmLDzY62cc24n$-5+>>39<=xrK~tr6!HDSXn}GCnqdbu%oYq z%RN%!&??933rqd2@{D$>SO49lF~n`FU$%jAc9KSc??ZmLDz0tnvF<)&5?Fml1hB=l zOAjufQ*w0Z`qgQ{qc6qLgi|8|jo=gu{a-yO3v0gwWui=UK!yY3F4vsUMOyBUkfz>p z83Gi)uP+%fqU8V@8W$sBs@Y<%9e8~DA0q?t?aP==c{mwkDv?qC?$_QuwcuXwHfPk) z&g*!SlC6yKPAbC-x5dn^@MO^0-|fQ%#5e_n;eY*l&h5*e-?a+$UfzqA_oC&!Xtw%t zKkGh&dFY{nDjUDH;hnf98m7&3_!u|{)FM#c=oPKrGaJ%y-zKdgL1-Jl)9@5{a54^U zj_n5|F!qNZLZuN&t16;(b?_nZ7$HG$$C;yl<~JOj-V2VR7e-G7+Klm^Qb70K_$W<| za@>|_a<&0)HxSEkp2x!z;Ch}1LD?lVVCg!T`c2-Ils2s;DO-}VB`I5+lo^9c(L4o4 z8L)Xw0g=I4VY&MBkabbRQS;%W?FWyxcb>E#K6-HL&f~`q9<?9u+}PQE3_BsMTv9v` z`H6)Rl2&AgIFlGvClfR=0F`^m?u#I(RV0hBF$jgPY{e$&zUA|AK0X@u;JXf3g&8Q% zjo#HkpAEMPvXq!r5l|lv>VQoKb>JqZ&dT}T(#mW}+m^I#rUCrjV(<(qV6+>o%86T( z<{<`Oz`l)P23sU%CdQ5!us1P}I&or~{Py;Z9hei~qJC}d>C-+yd`g1E#wLBecVqkh zQ!L_@zzY{rEVKZ}92(h#Ji1pnr^+!#XvS13cD}HWG+EHolCN|L-S0}|?sEF>UHDoE z3gf{6F?>$OyCQ)%<^g1>)0NyEIFCm;@N368Z1yR=pB$fX`c6zT2*|?mPpA!=7wisA zRGRFgeUeE$c+A;-xyu=)I1KyTUXh$%Xj44I047+M2MkReAx8{o`z+5-l3~Bcpql;S z8Fj<u2E}cNgKFVm5avlg&v3tDEP`%k(hlzrWp`Rw*e&A#MK6N1i8#J1G`M!fyVLk( z0vkTV>C@^ts9@WychtcX3oz>K0WEgfC}Di%7%2>rjrR>s?m*w#F|CP$b7MRn?E!0y zsd+Pr6+p^Y^>s_oeY3VtgvNWx3o>t_V+o(o$Kds9-VRutPV!<f?7<)Wmqk>0?+||D zzcd%^Sk=cz!%3eM9z-e4RJCXKiwB|lhLLjPee>pl2fb@y>>3DrI3<0S+i1NK?pN$Q z-n+D%)btarw$uu5dK#uuzS6UDb)_UYWvEahc`E|ySm?@<$Q!yV*}!*=bM1p_O9p+j zkr7sS$p+6bBAofk!hVcoM3+2sKYchHolPa?kO<<0-;h`yOcm#=%%q%M-yJwG9=~_z z(T$sT?>xPC2hNe(k3D-_YUDm8#C%b;i#ml3agU0ql4;VNj7HPun7nuL(e?oG2FVzW zDrPcuuEu&ZpAL~UNbOYfCkMb~PS8uGWPIIMSx!FHr1w*v7CTPW(S|P9FrC#es~t9d zqZEvGB_+>!!kj9QV2NzT=-sxVL8qpq0h0|VCJR?2c0m@?B*mf>xpX3A`)KLb%d;Nl zg?;9&wjJHA4{qFl|6)rRo0;ko^2p)~sMqYC%`wj?FLb2Tgal)nmt{U08`bWv{b;wp z#3bd{tUj>=sh|@Q1I$8Ww=f6$yC>BtD0wT0g1aL?q@Uv<9Y5G&O;&W=z7lu+g@oqb zC1ztUFmfz+DYT&)3U<wvF*|*P@*;1OJDL$_qHtn|z2acX8GLdI64%WWA<#?@U<hmm z3j?|B4FOwx3^>%!xlylwG8D@h?Nxgt8VeeQUWfoGD$C%GKooVkU$P;Z65f1f6S3V` zX$UhptAb|p(8eic=MZaiFv<>#elaFlour=z8tRfg8*nh0m@)MX!*TWiT``pJjfdOB zryU5NOqVU@eM;h+yTy2lEEDEi#n}877%dud27<uI2k8zYO97N%)e;n;YGTY?44x04 z<vjxqMuU7Jb9zH0M6L{(dwaA28Wubaj|0X&ZHi$~n0yG4y27$4<cTOU91L0z4|n2A zD-7J@$%)LMkUX4nQuV-BW;Q1KFr`u6%I&S~19o@gD+!w0OLIQsVw~A)`9hz|ILya* z8OeKAe-j$4s6#y1KHi{hU7%+iLxYk@o4OK|!p{A>iDOOWe~$T(Rdj>*cZ#BS`m9&> z8mf~-UVFqKX&5t^5CIr;M=PagupV(-3vf##lk0+yQDJu%svht9t|rkv%Pm%>D)G6= zo<69grpiZyXOAOw;m)dD3$_$p^tnsnjXg%w=Z{^V&+P$R*;j4XX%DSAdAIw$4AHQZ zP%R}?vn5n`+vfw4Hz)A9=CtCICGk!cEY9*OBeg(L4%MV>Qay{X#;@Z)_u<kWJNh{0 z=WIa-);}jh9NPgrvJ6;H0ZPdPZCT4tVR!L=&=Bb*P5bheLmU$uDZV=N2V*IiC<+S1 zZP)@w%;NMUU}*?mf=Jl6Be>?^6|34_kAQ7iZ!p!)2RUzh-ZSN7p9Ev0;SljL8}qir zKD1xCb=HN(n-^enmvxbLV0D2^%4#VofokrNy#>IIC9xTL0N9~Pgya*XT;<q=lxFLG z!$6v{`*}&%)naUTVo|wJ^Z@3`xFoP!4$SJhg<z)^$v}U2h<Q}uuG-IW>YG3c$I#ba z3n`0+7fhYVl@`GQ+lejcM(tY6uzL2E<ef#@>>d^U-iVAuclW-|CV|l{`rT@S7)a^X zLXBc;c|Sr07C~v*`(n_CkF1F|J#}`@lr(Qe5>XjC*0F>ot#l7hU4s>zouJoNU1FYm ze>m*t+2A}<h`Wg)QR#JEUIc*@V8*wMW$<~VW0)$e&uD81MYFJ>Gz6JjwzD6WaENrw zFA8uB6N3yd4!r4gD`~ge$f_bY2B+3=)H4xGA~hSPglDvQaVW5I^TC)xwQ$r23Ux!J zJBbG#CA;uSBWL404QfXEpi0EM<Msm|ZA~TzpYzevBGEma+CYT(9kBU;ILH+Mly+F3 z%WT<tZ7P<y8AonH4Q+0H9C^|(WPq!C(-1;<PiEmf>F%@dxLrzOJp^wlpl>*Xfiw2l z;VC(ci)7$=Q3BQPRmN^5^vH(iXBezfZ78$eor)zC+}pbQX(F{k%O#`%aJrgxAY&y1 zp<=NlFff$SzHej%ld)xh_+KpKAZD<#A$3K}Q{dvuvcJc)cxF@;j|d0F;JCawuMP3Q z%eEC@6S6!Op#sM|N4iNw;Gq%LvzW9O_yU%2heLMvBV66b6E%I(37mL`#{cY}VZ;W% z3Qc<(PT_u27DBQK&N2zURDlAZ(Gb`4be0*eDT5ZQmY_tjD!#62WOhqZET-r%YAO4N zENf>r5jWY9;tCzLZ^wy_3ui_Eyj{aWOJZhk40_CL>K#NiDmM0tVf3={7(SN%&UP*F zxQ|&&V6o1m*HLS-SzWAlY(zW^jCs(idKqyw8Phv5xR{N*9k#A9KOdFPW6Q&36G}d^ z+IHE@{m5i5n<Mj!GUU9>=xzirZ%(&8exvABs39dV%E#M1IOGs<{UQNl5_2B$7ds6p zhF!i?e3Pm;FvIc4g>ln6Q;iOXR9)gxHSkO*#GSQ@^=q`iI_L{xl|S@W$>^2z5)sQ5 zED~{_Ce2{o^4Ks8|K!VKhQ(v~d9IG*!kG(xoc9ml=FXYEi9@M!?u*}b5;<je@is0q ziFxFKK+7}mh<o8ayaBgcJPN#3R{aZ!ZDz_VGi{fbh3?XNbno(s&<U^HuHxwt3h^q4 zMH)=g78_(o)=OF>4m$?iEsldV$~l9v0%a0`n=<ogp^(DQX>qntSz<ggx5OiJ&#tSy zXp_bY*hxTgj5(B=EKO>y&ACY4M(uE==&g4cnnr6ptGugcyXQrrQYs5_axxFjwbVi< zKFa!;`WL{~+?g_5GDmQ!*%3H}$NA_m-=baMBWanB*#K9Mox$Pd1ZutZ+Il60pSz>J z1B4}-&d{5hAnJ?{!vvsF?bQ$5tY&oNb~UR*s=ICb-8`Jp&DMf=3$uNajgR)`9plI7 zfOUo3uqx*_z3q5mVtvlc9^am{V1CTE(0fwkCf-z3<AN9m%jjgWBUyB=oMZBHm*vWE z9e3@^W~F%cTpSDiThS#22=5FrzEWJ@U|YpMUoxI?^tCAOoSh((jkRcdv?^CE)g7<< z_HDB@!?8A!)C(6gg<a+b1HIL)z)w5X_`sf+K7iH&o8$r*=T>9Ru4($)#totr$JSkU zJJ|c0yJ%<VLOZ*HPO<)ok))Mj2*L6b5~dv8#VmKF*b7et5(^3Qx{7h;C@@#ogL;-v zQx0+Wwb5SbV@P{dOSQ9u0saw>CF^75?2LE6I2;T|`9oqHE<}E3_0$78gCdLRMVto+ z2k<C6r8Zvaz%Z3Ba9qSY7t>JD?d;XgvEITRDnzot`MwRGh5`p;-51k)1*4EN(7y`B z0L0|x2i!I{9Ei>h5B=a^)>VmOC=yo8;#h?pKB?fO%NfHUYVKRLcdlwKFxwe^n8QG8 zLF$6*)XU3mKImnG@y~swT+_i?-L@ZQua>~2hA+unBlV(%(@U-`?9Ro#vZ9El-&w!N z%378542`osauR#mMnVrU%L!LOI`bZ|U@&G?&Ib+`@XfNYD^1%*>Oo4qdi9FzuSGoo zS3s!0i?`SdDS*YsY$3g76|iV+4>&<F9VJES{39}c#ze=3DcJ=wU!DvHWD--=4*&AW zsCaJ79WSoDjMxD@MdT~%)RbX!!3@+)T`fCfX|`sqg++PQw&P=;-386QQTWrQMoH%A zv_g))-lo97vHhH%Cd{F#a%rLv-afWXsF=V4TY9BAZVlCK5Z0Q^1%A$I;DuDcLUF}q z5{2xIrQ&s|c>SkVyw(YQl7*F{b9JNkOjt<qHA4hql~0E2{MwWmw++NjV3^CyZNLhS zgef-{_6oBe6IEz_noomW17~kx;g8E{{WT049auVnv0L2@fR@jzX@bGeRy5LSoITHq zKG{-=!Ia&Wr$;%PJW)*T{T!3(<s-CQMH@-kSL93CU@Iw<Of!a~$9y}YfvmgFgwj=C zsA^>3rTNTDRI3d(N)0NtkVb=-yx6N4XGOHV@wV8%U^p3!o2^CKs-R`j@>?%9=PN*N z!Lc|>vVLELp{1{9!mljQEbAuTZ4oN%M4)9e#(UEm5%10h%pH9B!njHf2xozCn-|Yn zw65M5LfA=mwS(o0(A%;C%Hcu?GF0MMKKj0#>LaBCJ2zIa6q2tS<LYtLk6@1_^p99! zeuZ0wfr}hO<T4RnI#e;{+AdHUxhCyJGUJwXh1n$zf+5mjpWZ$q1(;&HR9jvel`+>w z_AR{kR0oqrx~!7IA^{Scf1?*8YEekWQe#26KY``{pvXtrsCzWE{WaXB9Z94d82~2k znjTUnPB<Z9DRK4bh4P#;eX$WQ`Av#43|t-wRGPfYpo~De<EQF0BW10eX)Fx3ZB%nI zw{&9Lj<HEJ1shOVKJCCfI`l4jBoG@ymvnCeyn>yiNoFT_%m`K0ouY3{kv)B4ok5Z9 zta;~4`pw&rY{slh7BMV|;D*v#r%6QnSy4U9?Z8Yz-1uazrIHm}Enm4kIG~((99zb| zZkpBB88;{&jw=I1(x^RCjcoGy7M?a8!9M>kWj2l=3VEITT~hm4Mo-4g7+aS7uuS(_ z%Ez0)RK0IInr%R_HeIbcG+*J{8+;L<8&+`r!`T(*${=9x*xL2VF|<8KAp(XzWTy`k zeS%~O$K-5rkTkGYaQA4~fi{?>p`{?VWZ6OEoKA>xDBds5Esbmy@zOmddo27l$T8?e zHkyi`C5zac=bzj|=JI`?GsT803ZbJfEwVdPEDW?1E!a+j>Q-{*PTCfKYb%Kh<2*Mk zyQOF=(=Wk~Dnx>}^u1d8UM+pE=A_4^MZHBwfcC*6K%8ugc_x$$G)j{U^H>;10Q6Wz z+%=y3p3F+JdTG%W-wBY|cgQ9=wT_l(GK2QA!x5+NwwcU{dgXAHD}j9G2Sh%{!;?nZ zpsfLa_lM*0@EG4yh(!q-1~40J^4Ksz7R!9hJRRIO2yYu?<I$i|0m{Q3?6*}v?~&XB z;GacAZ`*JzB^l3=@57cHjE2Yj4jSfLsmx!+&{755!BQN_hu-1#GbhPGacDyv;d(4| zrRM-WC>27i!BezAFCyy=t(1EFjStRPG*1;dftdzW`8+R1W6U0d?1wMzV5aN^UzjAK zC$oX>LL{$y90n$0aba!4h5t5&>0VLCriUp4-Iun7#}5$@@GZD#G}*Ea$)COqv?7&n z2QGA$bC@F>jhVq28%wcge#bQs;~{nHuGT_H%P8U(8JhsNcx%}2V-!C(<&{sHk(xWI z`DPUu$EZMPf_tt!+6uG+&cCi~#|<-_U|&YK_$(VsA~S6<Ejmf~po}a>L_lX^&h&b$ z4C>0jd&wnsxNw1M;6ET=Na9Q(zBAdFLzY0<Jc#XzfJT`IB~9u+x)VfOZdFj_-Q<#A zv{Is@P$>D<R=CDB`PdXYtR!S2M-NFRMYEwa%tX>ABj&ssFb%*-HEe8Q;xORbexJhT zBB4HlGM}L}FX~|KK0;y-r{I_zBVqI2Y=q{tr4xcO_>ky5ptrN6e_T&lSv5^hgRH2g zAbMN4j#gZFEW8E`U}h=?4bTj81~?f03^hKNs}~s~J25Jho_&t=oM(_Z)}7(7KQ2xd zl7f$wb)QRfHLlqB0S)dy;v>ZEa(h2siyI<S$*Oq1S!V=j<R^sl#^N?K{WH$kMvM`) zWG34`Ydc^%U$NWMu-t`({k<<IjW#BA@Y}eU(X%XeKIlS$4|eX|Z3<{V%|cTrw!tG+ zCPL^2=ACF@k_r0nGJkdX4+8PMgs0}Cv7-k38Hv$4$(p-sf7VGhQZILb$K}cG;PhzN z&lQV929F0A8Fqc+ml_TlFo2bJBlaK)-ZFD&Uxyu#jF-|pi3gJL=}@Lc?6^%p+7wCE z_-J^Dw>H))jIth_R*e-u8)nBV=(md3H`%)A{71#;3@~=bw$bsJ8Nde9JJ{v$@1wi; z@6DY?TLU#QA1f3TqccrIdb=nwwM3@FeNZXuC|EMQ&W}&V(_6);+s~`t9~Yki1Nf$T zU*QruWV)nEgy+AHHhs93P*%Q9#XYi*iu1-VcDvn%pXP%u1)XHQecgZGos6F61GtI- zp0=;ADABy@j7b7m*IXZQt{mrie;;LHegpf&joh+5+qioD>Uy-y$F_^nZct{~unU-Q z)y!UWCazz<-iU)EHaLVAZNzV=j<Hm*ZT!+ZSqX<PP0=9FMvYjR+k%mRBWr833VbM< zy7jfSHKPGqMu1+*c$PArIvLLjM~fhyOU}3;#-0s(NYNU5SKHr4fK6Pg64vSvMl#ul z`@->+-c|Vj)gz;;XtfD6VvdOoGn|YFQMz=gIZzmd)}j4!h{j1I)Q~+ohEef&NKS5s z169#A-)z9<&BwP_uion89SRd)<jJ>;grgjFtN7Eq`c5k%<l1rPeAYjN6K#BSY~tsv zq7p%bI0c|ob_|>S1I+P$ibKQ|c$CAx!+vjdr|83)^%M}CxKVZr-<>+w@DZ$!#ZJ$k zQZK5JNMqpaBsDtj#0jq%1*a|1go}{pV2D8jNo!zww4!B83wVf<sD{an7UyVw$kzhk z@%-8bNk?o*Jmk-DC?bJZ5!#qPGzPRr<QMwsbqGYNa(w52<sSEVjNv*9wBb@OIjWBL z3dkpNi|S3`{Td&k=7c-K2Z_>7S(8ibj?(K6EX%F+98yu=1dMsd$?&9!7XakUz71Uh zR*yXeI(Qhagw_FZjfp1?vR8lf;P*9*(TwjA_t|>Q<sey2)=_);4r?)2S7X8^?G0b+ z2=A0KQG|%(wy8som~&`HJYA!OB3R>P{E1<Z-|Y%E`CL$lS)SaklN9kU6^!$EsOsz~ zrM1>{)$4&>4A5IdDFB5tnGCpAjHbyM>u}-6nCS*#RB|&v7)lWNw4!80aCGG67*+*1 z<+6Ya-PDk8i@8EYQ#6`B&4F5p@w5RYaNw3hQulUp;{ZrM9C%q5=@yb?4<4NK7@Y#Y z<!8|DIDd@uUN*@cl?>-i0Hl+C)^$wZana*wy>f&AWH@3d)qvRt7p0AZAZDDif-G}< zRW+zTC`RS@<E;NotQTClS&CA-x8L>209?VfbxB$5_bL8vRfymd4i0%jw!j}-38(DF zb^)yzNW0;u)%CrkqhiHq+lL6X@mDA?THxHVy@#|YTMiDUTC`0vnkJVWK?xlsfihLf zw~{N#Mvz-o#v3zit2DP|rzg@Aw`OJ$4d~4okPUUI%(uW@wR5pxqSTs>*FjNXuIr}b z>z@j4G(<)VCm`_9mZJndymWCOm~+jb@7kWX#YpR4rG-G0P$-w2tvWJTBB3cK$Hz!$ zCMQfmWC=@6@LrW@D56m2z~c5SRnU|Ge}7VkGMDQo#dLMkEr9i$Z@xHVN&Y7oRefX~ zDQocc^422F;KZr{S+wZx2XT?J(cy$|%(8#q#qd-ebJ#z&RdwuYjvWuTW6=#9A7i9) zcV+>JXEB?4xe^O9bQXO(U5U8r`)kDDZ&~O~%-E+_$`w!nn$MC|v9Ei$?MRX<+D7}k zDd|0+Om|o|jTBmynd&ld-*9Cl2#GDKrwn~ymH2X&7<G<OC~NW0b^hGM><4%hT{OTg zvjOHQHhSz@uy@cD0Pm|e9&Vq*mM@Ss8$K_3eEWsBYz9VA+wn~gWyQl2Oxu78vaH{a z#Tfq#@DuL3SI`sd%1spMz}|htt_LOFm7t3wxnbg+O#Hd1&oU8yMDmZ|CDzyZg;VTr zfYLUA0~KEJQ$t!``kTWuF7*&6h4_^hF)1X#$KoXLYX<p<k0b_`lo1=gRzT`o8V_y& zbz@IS;!n%ea&5vFmB%ojxn&5@W`2B%X7i`3bp1ZP3{@!Xt}>+GpZW~p*FXg$yu!k^ zV>53w#O)wd7Zi*kA~)~e$u(_tb->E!KsQyn*bLOg#=p>5`n<*M)|S&Wwo;OMcX=zU z!yh*N`)s6~yias_eHGXtLOQY%8Y>`R;RdWZ8DSciu>v!T9Ph*B)QT|~B}V!4VmPtB zWhIJ!@IF%_(pU?XF?ykmO5WfF**y|+Nnl)rg!0uPoT{cnsMX=1jU@Xt9l^7h5%&n* z=g7YEaX<<s!o!b`@&ShRAvFzO*#)MwY@0%@N5ANfDeo4GQF7Zjg2HTHQumN7KcGE8 zSZ>ipKVmVEzSh9xomrj)cj)UZ%R*)YL#saK;WS$~8eS_MLmA7$)SlS1T(m2oD`fH+ z?AUhl9;$~(6;4@sWbOE3nKXglv-Y2@3-45E<)c@u_whyRIk$RMujXcTF^?tBR@E|^ zW_+62G<^s!Xe+aB6NX=V00)5t)HATF3hC{^{4xOOZhl~_*QG}6Ru@%yZx5uh>1!qC z<+19i?sy#=scO3J>#ohO=MPDKE!3Vj6Lqy>+ILqKb|m#vy>6w!YG5J!&{VH&Ap#_B z|K?ldR;H)bYtwv)Tol#B=pM-Hc!glnGk1-u;#7DL#^%vo>+FQD#@CliMx|M+8a*mE zL<Z|kdL-x`ck-QTfG8HzIqK;VSq<N9YBMV>{gN7JRYhyM>y;x}6|yTFFXczpaI<-N z9{$$%Wx;J0>EEI|+f~(lU0{ozSA@}Sr(CMp0JFA@YfBC=J!^|>1dpv!sH`SNk&0ON zdGbvEE4#6#_x?l$oqtpf$U1X=ZRfc!t7>gFqj3?V+y1<oRLqq3?$@CQNtAD6MogF| z3gV)I`;vc)F|4ztoqW{@f)mzh8s<davcgcygbgUl;Zz(jw}`2?iUTX)9S%H3uxHX< zsNmhNF4KKg&ces|#qTiEUMSvlQD&?Rc%~@SSZM}$c=6RH{yVnVXne@OP(4tNTd~#0 z+W$XYd`m9A(Y0S&WTm$c6zTlQZ~S`~w2IX3Mo{XMG<M?SwP->gpfusMC{=N~qL_?u ze(8%&Kezf7H8B^zXnd6gk8&WQ^fKIsFENU70e03R?r-ggH|)DJp#XBk2t7+zSc*Cs zQN*um+Md%<n`s1Ez~Bvde~Mvz0lDa!%gkT%^m2>#r8%(Z1q#ivi3>0NY5&4CMp0QV z^Nzb1@@rI(+3B9YVw!(E?ZcIMlrlT$?N*TuF|;d56Xry#!JxnDw{ViWj6hi3@&qut zgcaN<22y{o5f14hQ8|<DnU*4PFLXA)ipZT1c%5-~BZ9K)G2GnHFW*hp0rNJN?v+c^ zyQS&fBJP#KjNzl<!dN$994p!Ii@hgrAvHv;MBqkQ6Z(t%57~GE>do`!sL}qs-yiO0 z{qsaZl+CMD(e3yV7okVm6GVVorHV6HH=~G!lv^mgpt^%g<1TXEu;1gr(XZZ~Q#Mil z0C;+TG@P8wY84|7P$7wLK+jDtC<Qsb;OjOJr)E$saIN4D=-KqtRC;PLO2)K5%zEA& ztMEmEs)`+NLZ3_Pm>X1ZAA%Z(GT2}oQMlDkG#mV-p*w<CbW;IcpTxN$ypYQrj>jVk z7)NBjktVyYtL?MovKmsGly9h_P4(NUUr6$!K&idff>s)f^u%v+uT`HBsozs6klRmH z@JcJ+qe*-W1ixxm7jdnq%z33uBTzva_Z9I)iTImUpt2ubsLMp>iVU5hBfYRr9Bu1@ z5%z=qM;;BwWcFWypg+f}J~%ii^Kore{v1|4LgIPDI3GkR`vt=4K;kjb*<E&|sCs4` zWXRD6t`yp5nNuMb2M0~T1>cX8$cFN4%}=*`XE7lvNm*%}_u-r_Z^M!E+PdU)mRhYE zt4#F7XAf_Q!`n;p-eDds%aKuRv>yXI73Wvl9BJawErq}l0j)1tJr71Nfmp%`NO9xT zOa$#2nut5-*(9@SB746-%1(}o?wx*9AZ$iw^3p3#rEM54`kaW7Lm6@>Ot({8?p0<i zmRBJ@o3gk(iOHPRtzFqy?Q6J}JRfQ;zri(xQKQaS)`0kB<1RfAe+9WE!w3q>0885Q zI!9@MNA->}pk0kIM<Fb%(Z1Y9GU+rN8+4ILV{q^~(9ICY0p667VvLbCym}~28%_?7 zI2Lg`2BjP#o}T8(DTd!hYbhQn$!&aKr>JZmPWnAmmQ%XrDmZJH6V#Q^L%6xyGf2*z ze%*%nrZ&NBvLTiy&5+ShFx!zx2p9)^G^vCRAQFus2YlpHOfPgd>H_W9i1rXDe4`7O zs%MQ>8!qPZoYwfFd-{Nr0#1nXBpY{+Zg4o&c){QTai?<fr?u61W-!vfJ^+heeT|+A zhZ=Z`hf5V(z6z~~vPh08l7MZ2FEUKZunePlI(8aSZ)U_v$HEGAy3zM?sd()>8)@hv zxgt9A$ePolf)pNm97*`2UDvg&Mkg8KG#i)LshdBvp@GV~X-k)nq_<F+Erdk^wi_MV z8-w8>Z}_4msA?p2#K(y_uT3uFZ&(?w-fudMkA2>Z7NZ7qF_(CzVZS$8W;ooRRuvYp zZrgJJ=Eo;TS&5l=E&$oGvo%2NcZPM>{EWgv-mx+>8W<L6)Q#`%yy|v<7S2lC&&XyV zvTBNG>LR_1bZ;1iwg&_8f3_FEU}4(_h1*DxOV%8ijbA)CIB0mm;$)MkiazdESQ~}; ziyuO23l}9xVz!b?rn>JrW;XYt5h}toS0+M*m)xm(8NAq@bWp_YPXcbZo~oP-)EK#V zR(($hQ8WxzTo~<@D){;5fg>G*eC$}eUX-unV(r*8@u$01#K0x3!EUos^g+KDls3&P z#fyKQ!ja~eY@3Td`X6{jr}ahGgQ9RSd{Qa>^eGEGpqG!}d!@#cIW?X{gccodlH7cZ zvyq)Ag=B8xR$TID#BXn-yCp+O7x(5?|Fh~*SI4;-2ocdquuv#J313+uN}OaE*b)&H zrCkejOUOrAvlxgl;U|2*Ijh!_np#h4YDq(SZQ7&yMx=$X_!C(?Cu+2eIRnypxZFOA z&_OBB6Zvp7JSm%wM7kL_%hySEy}ke>@Aq_1I5tgJb$D0?{xGA6Vs^Ly;IaMSp{9Rw z&XgMlfrS*ss<*R55@>gbsaz#5E^HlV{BuQXU2w&vB*<-8viXmnR?(YK8lLMGyr>uv z)LmRi@d>mz*B&fZT1OwqU!_^;J$me^L6dB?T1flrd8GqyJ=NTFq2{I+YHk{7ZbXJ! z<X{6hKG<m5_E+^}PE$7z-iNbT=3s#Nt+)xJYVP57@_Mp?1JH|Iy|ePtqyK^Fz_+{( zRNLno_08kItELn4GlfTF+m%`K_i|<K0!;mR&!FL8>l1L+bFuMVBndcU@>R23!I)<) z+WduEXz?QQ4qppUUC3EIerJImU-|~S9H>Art;<8>%eG~D{jLOl#h7Fq^EKoo9+LAM zoD;<P`u)@}JKnFfQjRnVRBjapRQ>*d;x$4yc%KF`6ca=1M!z`3LdQj~*UuX(p<v@Y zxO6Ed*&w2Nb;)P2!$S?_w?3PJZ-Pv<_$pk#ctzpqZswmAaLq#XOfwb{Dnr2%AkrPE z@)&>Vv$(>sRbI5JqNI|;Y>CxM*?cj?7y)D8sn^ca_<g&zh}cLoFF3%o5=LvGv6zAA z{SzvlBv6>`___{}72|n)E{zsRxpF!0R3|t6dakUmdM%xOSNu6%UcdQkslG3XyUE<! zW*S^bO-w~~H!<Cn$}>AGg*%bL=mk$NJ%VxpK3#W|7`k=8^Tc(n$N2R+A@!k>oQ4;U zg)SX5S3&+gOPo-3`T*vbHH$Bv<@t$HvwAruW)Varh9NEdnhAvdRYM>uw9k>c+6a4# zEJ0-%6h-mRpFo&<amuHyDNoMUmEY~j)cbX|;eAuTZ1`GD+fA(6SH0q$t=r92xj&mS z(^#1&ewnk4`g^#AvoYiHT@4(t&RkLuX8`uybiK7%Q)i>T4n}r`9;{+@^cq$3WNj~M z;a-ix-AHjv2zMRfZd@GhwR*UbpwWS#ZM~yst9=#-*MiSe|MS^~{(P-cJNO*bMjX}! zHp2Rd)_#F11h0v!5ePwn=}Hg=Dk{#3WA)iQl%CGR=d*dpJPjlfIwtkqM-4oK^s7gA zD|T8qs{r+kaP<sv^{gIOH!Jgvfic!ME3=Fc2}{oqOV2hIhlo|D8+ER2dN4aTE91Ml zQ$N0%zAv&xYsOd8_eD16jNs7K4F|NOvdgCH)vX14xU!$78?jA<|Hk$X{u|pe_-|~d z;J?)kvNSwj8lEo=&!dLtfL<`ReB@b$EMNhWKj#47v&xuEsSSQ;tek5eRLqa9RkERz z@{`PEFdi4|zQMTp0_`kzbcUb?IdAW1Yxm?klY9gWv4HlP(--MTzE+d0RH{0~;btrw zLDV)nl9b>T(hP(-J1%)I<a9-zd>P7mN!FHRt%j_rAaTxnnKmzF+2ZsLv|olNoV#oY z^LCsACU8{di-$u-jHQr)kx<C7pfwow2NN#@5w8F_INGV?k}}2W;)2$OAI{IlL8e)j zSbf#_!wA?*k6IgcII2vX8@+ge5Taj4Ce>KfT#ilLx`-k|3DSZ&rD<9)q_eDXH2`cR zMpqo85sxvACnNTMYZxt2g9DUa2#u|j^{a%;*7N({4#q}8HO!5t{k5X)@?NxLAeIb7 zlz}kJzE#}RJE(@27LJX2bBb4!rn#BSy@+u9Kv4=+f{Qv0$GNr|pIxb9F)ogpGsBo_ z8{yEG6O&;o$Igp*Ynrm`Q|SfW6c0-8ojU?wdu`pboL^bc<<m5@VWQ+}0|VP6=eaKi z&5B27TJZ!8Y=puts;Fju9?39xLLgpiUMPwJc7iMPs`(Xb#ldDW!XZUwq%si;jo7zQ zsA_%dFU)}&coAzmivl)no*Js88qu~7ZUmOQwpCLXen0gGsMQs!C$Zq|tIpIch{NGG z&1{fr+eP`VcviFFjVT(aPGqg(Uxf#ZeU5fwe%8~oh^=qTybNubu;ZaAUzLsNyU306 z?6b(+h=RGzg*sC4Cl@mNGWl|O%J^ptu$|IbkSm#T0olpzhX;!`nAAVs$sVpX`xGB& z#L*)?GD8OuE&xMYjZCm#_}Q5wrS{#l`VOO_e-eNF#DBe@gFQ8DeCC^xB}*>LATGm* zswr`gZ2qL&TOMGGTWPXC;iR}@eJN>_65|Vak#)Z_IAZIY-)!m?CWxr1Sr0n#3fqH^ zZl1|zb&v2+;Rt#bF_SY>9S#<YPdB43tp^y?R|3jcRHoFAl)<**Ibwo{{}votT~GDz zX)4|Z0+byI2(+IeAZ|!C!>}--#jivK*i0(>HP9M{inhCt8nLAb(BOhdS;gwb@aQYx zQWY<1@M*ePTNiOLn44N3%y*;McUD`zBXhADueVuyVGS@(&}uppr=otIRm0U+)5Csc zlJ&}D=4(KYS0OhVwSwuoAbLz^podJx>Y`Nbo5K&0awJPJ$5PC(6m!g0|B65NbNa)6 zQ&x1*=yIZF%;Rm!%T9F?lBF_oxyhEBEWXK<Nj{7)f1dA<#T?35oE60LtY7pV@-LJe zmcH%3@B+x{NEP(@py)0S4w{k5#*hJRIa<-|HKPlNW_$-=$<S$=urD_wUWmp+g%Z9> zXuMK=Yt_ibULaS{Q7xX=#z1prwtLZjZTISW1{E%`coF;9^u{+5$4xfd*zS4NTCdh` zr+B%N+#llR?)E3WoWt)P7SHp61X(hfy2>#*G_*a_YxG>&86wkI2`YWUey~RGtF&fe zTED9QgKvd`6N1nx%3d#YJe3&bq?2s6{HO`pK5QHkHDgbo%L9u;b)WHz`0x6IGgbWL zW)|zEngK|PGnw1>P$^0nF6U4&IGK!jT+QJ3X#uOhpPRMlwbW#vj<OTfi()&pVU3Em zvNesyz?76ln6(N<!FgL5ATifmwLa3Ic}0SJ1KDvdek%BwuGB=@@!AVK(X#%e8aMAz zcKQ*1XnHkUD=`Lq7Fx-k^~Ry_MlY}~vkV)&<Sdq)MGa^1SZ!4f2OLBJ=Dkd(`Ehn) z;sLWT_a2>7js4-7c@LL$3?Mt`LY+>s+c+E*J-h&%4Ex!ru~&^IJSX1nuS;-z75et6 zA?YS__lnBu{osTh%^YO|N`AX22^~&G!$X{GI3p#_Eg81hJl^)Jmu_1E98L2Prl2d2 zhW%bA0lI=}BIS&M0W8Tm7l(a)?U!)W_-8K-BKTo!d`c6RV=%lV?_O<dAed7ULA=Ev z-U>ia8JOi!-pv3)O4|<>8OKMPFYj(Rcqr+Qc@2+;C(cjUy&iEMNIxMu3#7ugl2($t zxe{iQ3|^NoS_w>AC-%W%-O2`dh!QIW7|&s#5cPH3(nbCUu$sdW;ycg-jM;C{1M`J< zgEg4u<D?1On_}AM2M2j~+;V4Aw_lum4D7=26h<{9H|$1QZSJvT0>$DdMB%XtoZ7&R zeKs6ozTdX3k7H^az$nWup!mSa&dTphfE+!-Jqsw<z7G4NiQXKXqxCzZar1hsm128` zfQ1-Z5{s(U&JJ#)v`iMOW@_$p?!tj6J`OCOgQSp;8_d{HBE09Y^)EX0x8M{VGuY4a z(J*P!zazxi5|2pExq`cxnr*oTdL!VYZo}!e-NjAZ_{s18O(Tsp@gX3_(fGJeG03wn z8ao1q3k#Y7gef2qYkG>YWSFEAVH}C6IcF$vWMt@6&vaM9Y!=YDcJh<o|F6)!pZtg4 z`^kU!-Jksa7eD#_AG#X_uK3On=h?31RkR|&KdFO$)8HEtBtjL=_~@#)lgC8xr$o4c zLP>f-IX*8u9J*1+^<b1|NPiG8tp&btOEDT|#|vy(E<igK1Ne0_peKahI0mF&=nvXx zd+gmU3_982B0S7SNZ{@QCUZ9_LM1HdQHBXYM`1M#az_Cyu?H8%)a?VeXAo1$oO6Rx zqqq{8u=htr_b54nEn!Xh_EjXr1zQ8sMhQg^B&|?Nb8m+RydcI$-Oo9z1~yOEN0%Ar zq7C8}FyK+mc|dtq=}P6MDsy3{{m9Yw!|e%cnLiX~jJMa;BBkz78W&g};KT;wqPsnK zFd3^eU>~yxbw`uq{Z7Tv8HsB(Y_&N|HUdAbx<kz!Y<y$|pI}1hd<$Q4VP7Y7d@`P* z!}!O1%57XvE0KLk<pbN0%JO~1*EpI`gPo|pw?9N&9v$vy&9#*Nul;7LfwaBxi`U<L z`|82fNTAexI@E6I${W|Or{+HfQBzBXvYy7GYQS0LL0!MTmfHVfFuBgnKJLh?b)Pxd z`6nJX6)W*1S_0#q)J~wDM2f{Y&vG>l7ns6P#z5<KYt3IBxITviSPZ3+86CRY6to1q z=@{=$DKYtZANU987iSdz_N0`6$Z#FU16i1GCQ4YuN4cKBs!Znz-Y#)-UJu^ezzhw} zVN3{U_^{pU$if2qi3HtddN0St2uM@Ec$S-5JHr!<mjjjC?RGd`zRMC{>~oNnB@C8G zrlM12{{SkT%Hc~d4o+;XfajA~rLbUenn_>zFg7XSSPapQEHIyYHB-8~W^Vv-vbL6f zGjo+jCo2YWZr~tSyq26vw<-*$!y}I5%SraeE@yPR3g$*1wxtj2Rlqz(e`Gn+1l9$? zcqB7er^D<d{=uitk!4Z^!Y&FoVzb?)y08*2T7EGlM&%+rARTpdDWXY2%+66>hkP;K zllU#(VI+l{3Dtk`7J?zRV+d78g1tQ&IX2>ib+N5CXB*AiN{ein$~mD-Kv6S#yEx`d zMu<K$F2V3|J;l5+N;<$0?iH22EFZEnPb8v7yStZ0m+P`QQdkVsW*m@6{kT7%Ct{`A zYbOtZS;iYVUf;~yl?4%_pFhw0yMsMxqLMv+F({YqeTc#I;lv{*ECc?WnrKT)Yo;a3 zRUcBysYP2-@P$;^z1c<!e3+Mfd^GGOp8^AOo23h%USuFQCu6>EV8%>lBD2vbo8p}l z&Vl`+mmK6{7#8=0uG2gOIFS1Jc$_cVmbzKumR82~1iH~mlcBj{h!+(J2l5l1%Z1xP zDwXw5vuVk9CF;0z*50j9$bi#H5;+pdLes^VOE20K%?6*#5!QR=yzfL1zMBmUw#$<6 zDWNBZDevOwewgD$lGhH`5vQN<h6SobBHQ0C70T2dfdcXdVn;jJ02vlfSa#*@gOoY6 z-L*E*khS((dn@yf$XU&lw)o6et_Q8$%T7*U+&8DhVD|DezUV_M4bl{`sDQulW3S<n zI}~dYy<1;PBbRrQVUPk~3|D5>PK=F^Hfc^MFWgCSmiPaMjaI5ub+FiruH?Rv730Q# zfTRy~HYM*W6l~%_+Q`Z-j{v2OY79nR@R1senQt`)N`y?^TX-~!_Wux&qi4kyX7qHB zF1%|#KAQS)-sK#?;{f{pWNb&ga0k)F)T9h9sb5aYf&_!ULt6_2#2XVJUY?EcGDNy3 zJjQTh5gvBCJA^a19DC_;2%%AFu@{AU2az7R;JWK*q>hipsbiwkkQ+$(9=RysbFDEz zWl5m%(8}1|y|nVlOmO@w%G6-TiYo5x?5r*SHL7J<q=+(?el~c<d!Wqw>OyY2dmhpL z1X&|l!$X!Wl-B4r4NYZhBK1xs;D=$IIDuGZylq&17PDA+!Mbh+$J%Z+C-NHSRcA>f zIdVSE@dROg_J|D&0=FAPBQ%g@DDwOB&z&ycVOymb8q*kdqRH>vXoHrJbz^;(MAr5+ z{SN}T{GgLlUP<m{K)f*>lR36C3c^Z0;V3w#`Roa)%SE~7;XpAk2PztAr09InJ<7Y! zuny@rB`GF*q~)hO<ooRj*t<u=VTs$6&WaMZ?r4acEju1!5^<n?6beyxFZ7Rpw!<h> z2)oUF#z%1#M>3kK8ELhvIed5xSiaetnXCs@7-MUX66DUDf!M~`-6oU{(iOP^`@<oy z*@N?B_jocc0O6QZ*&<oPp0`g}T(AQbprGz{G!K+Y%*h!+T}Dn_gs6rpV~sarp=QXT zM1&T-kECW%5)aWNNPeu`chSz_*6{c^EBQ0<=`Bnu?!OIM!2PMxbYQN-YLX&_2>GB3 z`{je3dv}{u^>Wex0tJ8kuGX*Kjb4v80hvNkj1QXQgw{w(eTAhqc3uzmzYRR)c}V<l zSso&ca-l_~=5UK^T|Vrg@ep<EZ4Y1@ts|yQ-V{K(CuFn|QWg_*$U~F%MPd+fpW1;n zQ;jJUwi8)KhEc!8PA0%Jbi-MfIo1BkFHD&^|0AaXNxaJ`b<Y;8Ijz*3E?86a=s|6I zyC4K3PYgit>jhx==x2Q>aOO1nx%u=?-5|p;DtVAej-)vDkX^NCX{+ZY9=?I|QzwrQ zQ<b2U_PCxwn@!viwCNcfo+m}GvNO%zE!4i{?!q~>-P;+8Eu5R5q8D%@H{jk!ff4a2 zMcW=S5QFo@KR?lC4+_9p2OD-kCWJ7FbX&K^RAv61Nshei@W8K(28cz^n0k^Qaxw;< z(z7VxT;S3dyy_m?W1mtk(shnb2INoalr6@khJa^tZf>)fe$r_rcmVtP_!P5I5)=}e zXt|*;PLa;;=ZD1r?UqteuR<p$WqvT}lO_ZnM**Xd^++LtZLBgp;ThVml5u+$I#PI* z9xX9kVQpe$_bLccddYnWO?qd7!3ZwIuY8b|NASBDy0q%i)Q!j+mEdjg^@^_}4SK=$ z8lJyyU>#kEWvQz}@*_Zb-zZwjRpXEQGl7m;P&u`5qdmHOIUZPFoACO3{LryxbxfQw z52Xf;A=x}iF~>SB*)@QC_RQlIb%(4?vOdV=UBE6i{hm@x1F5{?d(Aaf8NX6^x{p*L zX7H*O`#yR{JBO)FY@3%PKM-Yr^zHO*H(ZZH)Tj*7cN?%a@9ZM<`by-u$2Gy#@FPc6 zuWY8A=>m|Jhr@Erijgr!#_Dsh#T6%JVwQM_5|2T?+PAhTl9(1&IW?ubS-(5!<1Mrp zqf(`upy^iv=P}vY7(iLS?_xK(kR_92-i9m2zf&@s-Pcj0w38>j!=cQ$q;i=62k50? z*y%@`I;ZxtaPh7rrT1)BYkp)HdDR9E<+A=B1lXthE3CQ!WJjrb!C7m#7q)CGypnyS z?klDzm2@Ynptx!P_Hv@q`H*2O+G_z;nZGDCiIdu`wIhuN>4r4$HNUSiTz@)RDoJ4Q z2?ndj-ctGZf|6dbO%)CfCEj8liKi^d36PmQC=NyD>+h)<0t)5Fz^V$8a^J;Mf6E3q z(wYYqiRDsIqe`{CnF{0@M!sSr0%a^=zfDF@n|ec;PAk?H-*CzBZgp((iR7mV=MvF{ zH>+h$hS1}>v6}I!0xm156s^!%1se9C`sFg^)>Bu1E)q`DR-vxmTKHAMNueoNvvZF) zh@Eu5P#mQuhs%quWh+FDc8S*gLHr++a#(~`O9zgn1IN;Vqc+Uk&Ye$oo<6*B`}X$z z_hEy*wMlQcckbMK`u>fF?hTIY$<w=c?!UkD0ldAg1Hs+2_L)szl3+O{%@^xSNa)1z z8SBfgSTI)zjxT3m?vo@HOkJsrb>s58KxwL64L-hHhn=tsDUSsJD?aIt(fq*`wQ1S0 zhn;v#J&IzND)-A2Q08&oN5_Dg;~{W(lcd+q<h2nT6*!jnW$<oXn|{*yNKSa4Emubf zs?8b{D&&&#i;cRM*52|4NVNKN5ScVu$MuQNH}&nD@*jyo&rATZMCY58RD2$Yuv-e6 zE!(JQVMq={GEc&Zz)q-B6Hu(9&uz;67g4l|my9aO$pIrp$sAb~gx|4Z#>GaJ6cgsw zEGyRi;aO}TB2ok-Mo?s{){Hc2<c3o21Nzx)%`uzx?4nhF{ZHW_VRvTzxYZnQMPvj} z8L2aG_|n0rKxWb6qpA0$TIMvs9EDa~pBuUbgardcdHdZ16XIJ4SWyGjM`L_;hsAtN zyMaCEn3&st0c%(<seH&omN~M5HJ(miNF0!4ag~!f(}Zr(=~IYhLk=6gfb-VpaCS9b zyRkrkV-6}F<mY1?LS;=O5P_LG7-|%o_Bx5xcI0CdKSe4R1}AN-&g`riHTp&<9Mlrc zg!Ga6da_a7KYA5??DvWWUDCDOuE4vp>*!^Bbl2B)+eTcuIc9(;RA4lmax^v6z(TJ^ zS&It3V%X&EAdOQhzUNopRV(2g2Hoob<;KouvmMa-avTXm=&y;5OB!1+zoHFfS_ww$ z4s?lZ8XjKR^Q`D2=Su#76pP@7e$`x%7Ff)87_wD^Ize1dixxoz_dyXYFP6B%s0E{m zo9*RQ-Yxdxn@~bxP$-IO5X^9^Qn4VyY(PV(2tKP33BG*LE7-k)Er^cL({mtU+O*|q zyAmW&&G<Y1a+(mn5swj9XI1ax)uay1v{k(s@w~Eza@sh?5jM`^zL8lx9QLP&HY-oy zfOAsoT5~ci;40i9O%ZnKA^mRFnkUf~OwnlBjwqFVRByIba75D>+NJVwEn2x%b@rK` z*S98YT$Q)nHk@g*#>lST{0mbC{PQ6tYTif5MWcT3ibT&W^Ip;KcWRD35}`C(a{vqn z;}`&Z-)ybS&<N`pueR|S8D&;eiVnK$-iclW)21QnsU-pR$&>wSA*UwxjGoxAp!@6& zW{x7Ah0D+@hlp(@sK#f++*9^~hH88_n`tm~SiQuFGDBa!gMEgfRK2Z)j~_@-@uM7r zJ;CkRlehAY#fUMs{aq}XyqlaQ9r$n6yZu80%J6R&!#=9!W`2{O+#OwTc5{9;swD@- zB^(Qd3ZgNz%M%g^ZV)~3n}_FFU@`8o$zpMdy5pb{m$Z8}tBSEZp$aAp&_h5t6w`Dk zB?fRl9-<hHa+j$XKZ|0eiS^%a=ccrGJ?)xoWkH^@YJtaI;xdlR;d5bPp`e)<TRRBd z!)5N1O{6aGhXLX*Gg|E*$VVmkNF@LVitHvudBg%n_UfiNKyjS*YxI4^ZwI!mK`0{2 zS70PFd3K?X(nxrtXbt=n^HI{~OMcagC6oE+2X<PKtL##Ky_8=s<=0X9b)e5ThF802 z#<X>PZEY{vDag(!IWBcUW4yJ?#!_1t2_nZBLs4k38MEoun)lJAo!T|&o$xyq$<H#> zqvJE#a#56n+)8=qy$yY^VhrrW`uO7!n)0}}%*g;#`$D-WqDRa6+TMAk9GrVE40A4* zcbEpu#4hf)2gDLK0NWbp@cP=?nu5^-TG90Q5poeg%QD?mi5Kc-qdVCzx(_73if1^X z2J-*0_pZHhWZ8k>cm9fyU4x7)B~wh6d*DeHOG{BwNw8iPRaIS0B&c9!kc?I`gPoD2 zm{R4y=mBQNhB52?vg=(p=J91PzyhAx`7p2z+ka+UW$!2dg}vvT`#9&`8<9y$)oox| zc8eJi_j&HQ=bn3>Mx>4=3X14tnCG5rTl4XQONF2nnKT(YJv2C09q(%3$_Q=mYmK&c zvvYz`2KN{+SVND)!yIT7;y<{{JI|~ZbkgE2oFb9Z9$m1ufYfLPr=9lDMqN{?RBc&x z))gbp<bH|)f?#8S-8p*CBTCcYD;=8%4de4mI^AHfM?k;XrP4D-v(`j8Q<G?k;UeMg zAEAK@3Eg5P!Y$KS%58<PP{XDYMxL~S)>Qo)ZS1cBRh<uqir(e*kg(g!y~AK4xB-mn zrGuu7odgH0=oJo$-xr!HU8VH0QsTR_rBj7C>%VN^zBwFPx9lOnQ!Lqz$riLJ=r%PL zN(Jz>6n;fy0?--Tr2B~PgJ=R2T3f{L=CJvGYibZZ@7ATM1@YcNSMR~a+d-`_px5Ux z>`PGg_1}drXpIF^^^6@lwPXi<`|`_ts18}$*_OaVRtv?u0u}kjIM8_|g~hYtEm{@m zddMA0{n{~2wG2I4LL_225hFMVq>m$^pBRysGjtg2wk%1GK}=D_l^}+&fY}iZ6!4l> zvoRO1u`%P>Q+H{$25Q<U)u52h#VMCqX7B7IW6ZJWRl%H|>UV7(PbS9HRRbBOk=1n- zs?#j<SH$yo4bsvB;w=8u7)!MfT|2l6?Z%BNmO#$cfD2FfcoG=}vi0@I$U#|*U+WS= zNRWl(B(m$-K_Ad0j%@0(#GlivCz-stKHXfOZmv%a=0AtUWQ6JT;0Iaypz8UPP4(_e zvMhm@py0%E@Pl5VP2}%__5qC}x2VDUFL%B?c=hPzgS|)3pWIhpKcmtwc3wR?c(QZv z!IOh$&v%~gJb`;a3q6-xgP_QRr!O7>Y_X6r{J@xfL4~hgym;`^H2l&u>_WlR6|U_f ztopM9wa^cMN!i#!l_FX19u~*P2v>E@fKbx&<XzX4|B_f5dQzD1>cO*DkPlKriR%g; z=)S?^C3};Ts2#j!rYQ+z_gipn!(13><2kS<<F8rFoY%PUuUYt^*BDCU5S(ku;qd$n zVgs#N&w1R`uN7{WZ}Qi)K}Hzqk{opKz1gZRUf6z%zQAbc*DfE^K63qJ$6-s*qb=d$ zzxnTU(6{*OZ~fQ0<24Y$`Y?Tl${CS3^^}_?U?@{8f;VFfk69V3Y#oW+S|#x^&f?x$ zA(5^&SWeyHmg#R--FK$c6h(`KyQ48_S`%@yx*Gc1>=mGZcwqr86nn<Q#T28It>p5y z3oa<&RN{qc_Tn=yRb3PqO@evW+k~&z@TFSG@Gs`_cOdQjwyy8U)%~3At{ok~<n!h+ zeep%psGO98<RE+WEG+P@44uGxsA&Y+ZT@5Qhkx#9{J7&xA)C5)0{o9M0;6`gbCQo0 zNxbv2%ud0KWLm1L&~zDoP^tQXv|zAvAXWMTGC6K78EClRKr^>ZQ(IS612$Td@@&sG ztBTlZ)|9kjeiG`=2~P0@xysYvpDJATbVNxNs)UkXoU0?PZ#s=;T(FLN&yR@Q`FUeJ z@0BH%qzF(}U)s@lMtKS%>bv^ad#_>Opy7wUfDAQw=<BKeOaukiFTt5izZ}Gp&}diV zrkpynFptib=X`Hd=D55ul=sAC&)JIDrs~e)X|iR7qJnTJs_-q3IQS;TdzNkqI_3xc zP*;|T4!*6$7lgKjjWFsU=Y>znwS!(N<_%6LA<O{^4AAi8#^}d|h)AMTOVAF|>priG z=0o^;-?iU0CWSAvw-lG49f|%oDu4|_>9ScM`>H|O)z_!9m*-YE+#8@n3Z7l@DHUGn z5qqtdc?I5AriD@Y5?_0U_?}Xk)`Fp<l(5~>SOY$L0T^zv<qJN3_gzxAx@?<Wr5Zzu zwYVXVj}8V9R&Ex+f<rD28E*x71#J%Z5R%o7=i*#9#=?rbb4OH4dF`VX#msS{&WT`I zJc5|9Wr#-0qcJpKrO#-2vZ0v62csDeAOG~}1OMgsfAk;!?l1n}`~T;cvic8y`d|O< zFaGN9{_0;tE`)#l>p%Xxzxmhd)!+ZS|MvZ_{tLYN{*V5{Km4n|`Tj5e#}EJgKmG8l zKm7jB|GoP5KmXvDUL4mIX2Cs2KG{rTrbGw8=b~js<-4^s8Xnb_U9822*v)3MY1%Rh zK6MK1yETH`$n0r8h(tSyEzruyVkm|X1+PFnJlp{wP_(9ooNn^ivGJYi8CP>{!c1hS z*@U~Oy5d%$9dGrpoZ3Af<G<^VyvCwxSha^EF9-4Q9#3@4wg<?M?R&g~fwi`0B|Eo> zOG97{(g_ew52?e3XO^ZDn6C-Ybb^tt#q=PQBCddt;CRs61qLyLS-Nb>;(1`$BaBlC z-Ui*_Sh1gbCyGjzZ`&gB7t}B<D8@mt5a&QklW|#LUYe@JU|>43CNQ(;^{#~x5Y_8= znw_1P06x@cPP)*F0(_z$ezI4Zl<p|KgiI~R`SF~LQ%wyc!R{nrXt(Bv3dJB|di`f5 z1rak9hKQW31PdoJQgeERK>^ZW@m`r|3F^4o7cT~hjH`!-vw@X5kM&P1+lJcwMXa*7 zm7_z!1J`r{eqj2yEWJ^OCNHMt5F;e2H9~8}z|0;H?tTuj1!!L&+{|`!2pk@hl0-<( z)xU4ET@jMV_sx5vAK4~r(lLt7pf4X|PDz?Q=*!2bi;~mMIE+De`yzk4YXdhZNXQrD zD`N<>+JCrWlpZ8<41WWAxJ9FB5xb7!OD#AbhEs-6t1ylh?)a7(K+6Qg6k9&1rMKKv zGt-nQCYz}Z?dMqm4#EsQreE?VZQ>BHSMl8DpZsnFf?ntg9YUr~t#ykcTNKqxw7(st z7{cO=P#x$qU3^U|S4|y{mW@Y8$w`q<v#IK9h!ij#!ArDRf&5+&T}fTd5y}`Lb%NKf za-6q=WC=QPQO5-+9iplQ6ZB9Rsd75Y{A>i6!#)H-3Um%mZWyIvVgvLG;j51N-^=Ib zZ#!-ujvNw$Voj-YjHkFlL9&ic=_F;vI}}H#rj}N~r_Bmgp7T`AC`h2m0}7ASUWAy( zYA<2jz;X)sPsq`&vy?E`&c~xwN5b(>tq_^2!Zvwahs%c9(JY6lWb@A64OVjBlo{B& zYphY#sczGB&)W3RW#1GTgx6u-rg7@#d{Syg-!WZ!w2vrWq(y2Cl*lzlF+WL+b*}l{ zz2JlgLxjYgB@7(saK2L2<M2qfT6IIv<63geI(0kgh29ohwF>d@z!Ar=K1gE*6~Xac z$1XE_0Dy-k#g<)SLQeGxI9&Py*5h@!tC(NvR19LD)g08G0lF7%XH`e;bIQO>y^+z8 zD%=6<zJr6=={L4>(Ce*2?b}iN7%_>h#>Mf(4Boi)3?&~TW?IEf!mwKI7p@13_Q}QN zG!KUA3W?^bkYFR{caY`d0aGzkA&5l79X|6J+Elv2V7LJJNzP`)Y4Hv<Jr$%<Qq+)a z12B$JG37ZqS%Vll@DxO!S>;;o#s-Luqzw>QT=jC!Sk(Ia`Er34gC~k@0{>KNfYoYW zG4{jAg!hklz1Adx^L<~frDA;plp`*1nl+!n+}KhkvOSK(s~*u7wzZfPL8GOR^wsXJ z<>afL0(C5797A%lwseSIw=w-SsbL(PssT6gw%fyK$gtxwZqQpw4WvtBj5;kX@5UJm z6j4TwUYLd!_$$Ieznrw31iUt5XRB_KI_KoJ9X|SeVp~GOU+ctZBA6DG;eJT&=l0@n zxMLaXJ<<r;cfQuuUsEOoOd&{eg+s^|aMCd>cvDNS!H^Bk{mDohY*-M#b{Q594XTdn zhjn*JE`dfTUH;!?G=-l3-+ZM~+UY<a6L50EB9Z&w(#j^Ph*$ej9;9Ae!G|~E&$}EH z<ykf?W-!&}?$)mU1+WOLz8Z4k_Q8mrM(PH#SS&MoY`DeAefraS<4jlRTNXw#Y7EL& z$8kmN2H;{&R+|!xoMF_Ni{^~$6stz<%&9uf;O<(U<x|wdlRe>4Hp<KM21jR1Qlw)5 zWB7k{jzSM65HK0PL2|>95KBecxnEoqBa(+~Vtq})K#!v%aZ)Cq`c@pEV_N_mMz@yK z{Wh%YyiK=ie6E|RCp)Hy@>-J9YN9U8;Yd%*=%l_KIFBNZsZE%@60N#4hWx6lx%vIA z4Meihu{2_1#VyZ<SHEdjIz}}()o~`6j;`+&V%VXWABoQl#(0#H++i$>vKA3+S+VD@ zhbb`{78|TX^GAWqR9wsUO_PJI2Ij%fKO$%ibnp>4AQUs!Z-TlWpc;&zTaHIf1db-s zwP{X?%hFFWL}kq#D^LL1Znsv9vT&s%;ffO@z1y}4od14-*J6CzJS}yt+JjQ*(&;o0 z6Apo5(lk=t8HV0y={>K&xY6EPIyr5^=_o~Su`1BHXx%xmprWb7sP}M)php{s2U!tx zV?j&wnkHdBXyvI#CEXHxHFtF|Sf~4gtPGJ}d#fz;2f!k-h98ekhIu|b+dF5y$I6KQ zMdRe^O1AH5y))4gBfn7VQ)eL}c~zQ>6isWd+N)Z6c(x{7Mxae{efth7D6AqvBgs1n z+W)wZ-O%WRKD2|Bz71VyqYG)mnd%^dKbxj)4^*uGd;(q_sc#{uV<@TyTMd=Vi6X8U z&{e(UTDdrRkxk5MG**6BLP~hQHdr);)fc{%76zY#dEbLupTbcLIk$l!O1waeen3Um zEE|zpat!v8Pj|r=S%Hup<(&lLl*C0iWXG?CM;Ix_V@9rodni4Q<K7h!kK@)VsMQ@6 zl{zegQ&nP`&|F+m?uMu#GAJo%jpn`>jS~k9rya8*R{w!$83PDrhm~rooqXZ@$$a-+ z;tI^e0`(!fQO2Rj0OdSNPC-~{-PeaFz6in3;!tm_<EL}5yMO8l6q`7*NPsb@PI-cK zwg%{zUZm~1{^<KPdo}jLh&S16c(Q}58i{NsJtCf#7kMNO7np^RQEB(Q7)8Q|Q4F0? zKZJ0sI7|;nLfs`vU5Xq8x)9R{kZ~^FLSUlNJkCz&%M&a8mIqlAUryq(mc_@CXA{vB z=I+C6jHWm0vi?*3_uDJ%vzzU3y<TgMr6_h9)awY8>qJnh8I>X-R>Q;qMnJj0U3FIN z!75L)Nd?}rI<D5RET<!p>lzY7N<&NO2Z1ODVHdfz<yKhcTd&MK9LyeIF(J~S1}Afx z6TTW&OQARk-;flh1Q}pb#aF2R-(NS|f_{8E@O7=wt!hUX*Lw;743@PmcibQhfuKf@ z8UHMx(^J3DbqOnJ_y1{-R+y)zr|@$L5w&rC8To{FKQ`fXw#fB*z_y46ClDW)SPY!j z5^|qdV3B~<(v{}}XbnhOb}?#OoXDmvTcXuLy>685*+L&M6ydysV*%?@^4>|+g_#^s z)s<BL{5CogW|{wCP_Y5AtryBx(3>$5GDkwUsGj86(aV}sN4pnTuZc8pBZ%W>jkw5+ zK(8O*!#n55QLDJaLAZkTgJ_UlMY@LU(zTr$r(75OUjgo<tY&B*Ycjw-HYEtKu>_>S z8KrvFuD1+laV!>Ho9ezYf=;gm0*Yw^t^hg{cDy+p2E-3k7+b#WmS_1Sg?Am+$qErN zB2twriX5cp$|{*K{H?NN7l~aO5DQ46b{`C&EabG^*;+)2L7~mPHe3?sMa<qK^jNVb zmNU@#zRl)$qxHa0-MPPFoK*-JF(g%SdDO^`ke<Y+Nm4)nI-o#E057jWrUa1VaPqm| z#R|q{sqY1h`JIB7n)P)4Pb@`?FB&6^YecRt1+Uiv8W%a(2xmg`DpMwE)p^A`2MQYx z)n(BlRxQGHkSxW`QtyVun}z0I#4GhfVk;_bH3!J~h~bKTflwNx(ePZbw6&%GK8$!A zv-YpGL0lrR4KUG;f<@@p_H7<%)KaHw0bynG>eeyLyy0)<)!1*zdUJ2*wN+W~E3n-z z!AIZUpVt>Px*hT30EIc3{?i0XG+ns~%Xpc5Nf%za0vmhtu;5%4oOkQ8%3~ZVNMDNn zS8$>27!fj<Q$S+B(N;s^YdyC_b3QCKb6s)Gd8@fh^CPgUDvf@4<;vfx`88E0TykeC zM<rioF7FD`=Fm@;TTAP?zqWqa1r<CIY0&v94CJ=rilM>iJ?iz@G{>K<1;4OOYBJ*- z9zPiS&WT-TX|^BnZ{PAo7;3ex)gc_5`83yB$HN?KWwp^<=)eP=*I5l<JamXIrOI?? zMv$-z==Z98QVz4RuZG~Yjp7+=<3q$y02r@w3K6g{bQ+{OM-P}$ZuE;IMUBxTsii=` zrCqIV+*AO1>Ru+FZ`1hqdB9UC)i>Xvtf_We|9Ttb^I;XK$lUeOThd35^)a`7)QBCL z4JswiN1T)1e|<Y6^Xl8a9l(cLqKWvRC^ge@auYzinelY$t{&ts)C-#+h~C~+464Wg zT}&pBBR&jUY#9nY2TN~UG>Lr$8@IRUd1w+F?GF|_L9Xq{Qm&UC8BI=ewJQ{kBCXX~ zq>s+0umQVrgw8jZ#I%ATUdbnT1z+IK8uy54^toAM(X>n$UkWv6$(>6JYg+WOGokq) zNJ|006<NS4dZTwUm{5=wUB+NWi+rHu5eMMFYZr*BUR}I&=yDyj`d5QK)o#7KEn5|H z0Od0sx2xNfR#;VA|M34zQ<Sy}?u_HII-f!U@M!@$@XDnY0w2NOLhsv=DgnL;3`c&e zE7N6L9fS373iS+jrF3D;327g@5EcZEw<Y<NO^+rz8Eb)MWiq86nUq<q7?Cwsjs>-o z1=$DL>SOLH!e(Gzd%48T!RUd<otLh4g;}h0#QV#uCv%pE-mHPgnCl875ys%dKDg3F z^}<;B2VLn)4u5CE;&Ry;3!Z1hXdE7OsXRq>69BKFfp{uUgZd93z<@*itK<F0+Kp>2 zR-jtqW9w?bT@@kL%9j+4AZ0d%9TQqa<|+5Z^pV}e=q%by9kVDRYABbTIYwQ8(*g(+ z#gQMQ`7?+he2<3Xng}Bdn=WCWZ*(|<&GD7dAyFIBlzH22@mL{&wFXl~dV5P#cDUpu z1Wt0yf|}SBxn~bxM<kB@<#4C8nlVK%)kjwcV|422sfy^Nf^tn;g#fRP`s0q<T6!Oa z+mNB}voaZ4r)ZsiQ}YMxJTy(lOl4>ji>c_>v3cm|qMogg9<9t=s;8vCN7JVBY{E<S zkSX(BQnweA?^bGOE#mkXUkJs;e`Uk7daMN80%m17o)t{8dU)(a{G1lqms`9j%YNiZ zp4k`1ZDJK|<N6-`Xvj~-s0-~DaoR$+9~N!@URj-I<9jZmt4BM(#_y2c*OmzN4?LT) zY${HlO~zo?B<H5d4WG<v0sPHz*I7n9FD5FTC~543@veTX4HNP-fJ<maAo54o#bb>F z!1qq&EtwHS02-0E*WxB0sS7R~kkMp4*;E$=!O{e6=&Zbu!f$C>!j7CxCxm3jA5Vw# z95pEn6`r#(dKe$HXYii2yI9?8oo#L4=ns!q3SPmHNT<G(>$++_OufGm|5>BH6-GXL z1VVGSPegBZ4j(RJ*x|7x#U3fFq24P{KXdG?N&-#!tI|Psa0U628}M5i=(9#F_aIu) zZ)=(fCNVrGw=LgQ+)dI@?lsRQgtxusIYHKb(;I+;K^8DOLCi6Z8tyn~ItYgGBY+ca z-PdoFa{nkad##QrE~kH*@`;6#i{iJ>G3H9Nz=HpZ1R=_x*(Kx)Y=s%a!%)G_@4*o} zNh$Hw5-7M+5S)0PEbyK-@)eNL_)QH@vdOW!mz|#GBXGaOoLfhbGQ&Dybdzr|4BO<5 zVnyJ(^8EJ{!SWlL<`AA(m4LJe#WCiXfE|F>911O#fMi0)g2T&>Hi(c*b{IFFG*WEi zzWQ~&o4qN@gHAN&Hgdlr=Mu@fvN;P&QRzSx=QG$YVaA{!uvT_a79+b37a0^ws`Jq( zpTqzzW4eaZL0b|j{WFnIuxMzl<{{#>_MNbv;|vH~Z2a30T&U~i2!2dQI@L`~<}{+M zV=0Uw&B`nvVb^KYjLORh3NC{%#}>twGXKg6BzHvuiKK5*R!BowFTJRlrM8C4PV-iK zEy5fj3VR*OD`~xP7|LiAVSy|FF|!&Qj^XhTB?J+}CX+nfv~t(|yq&bv|J|k{lry^4 zC5FI=GvKybb}Y2GqUQj}HK{-PVV;o~9Qpb4amQh^iu7aYOrjAKNp`n)Qoh9jNZ7zQ zbPUb3RjD%KepZ15R~4nRU~ScVfZs_c0t|_v?<2|MFgf}w%tfw;f7dKO?u^hx=6qHn z5$Fqw5bEG604}u*SXe`D<we!s6RCd*cu5xT7?m{js19#R)SD_&M}{P+o}+3ywnk|y zSKQ_qq>yPZk58_4s^%g4njXfBJkl)VNzHxiw7}ihPc~NwKpvyuT*kyaq&vy(3~05M zF}?H2vN?jbg*4oRe<NAARzOLYa8`V<6-Mw)wv%R`a<)$7=}HGxc-B(XMym_bgAt`x z8DsR4sE<86Lh%26lvU5iBXn1;I!wjHobh9Upgk@O)lHKU@4B`P&6tH6tR$6DtyoM* zYe3t~1iE#EW?{|K_wV|U;!j<kRBt~^Ed~T(yci>e)|i-Q^2|tsW5xEk3qA+Ua_~MY zuL4~T-aSzAm0UgQ%a>F3O=1Gq3=Pn&pYugE+|X6g!rNL<boc1k?1W$pJaL{b3!e2? z2=j5*E{Y$cz#|*N-=Au5r++7mS16oWT!N@k`P&Xefi>aPFoH9%>z)U^HV+vps2!<Y zHn-WS+{L4y`$jS@%QqCj8SWW)8{mfM-Q`QM9ECn$C0vXx9TU^?kM6BUyI65Ju5RgI zGv9r;JX}_cwWH?L6eCf7#P?W$AJAGT0zf)=NIj-1AnA+*=>Z8p2YuazL(8NTgLsio ziX0O!gGm<3@wkr^_2hIl-TJZLJC2<Y+|tQGwb9;*9O-O;GTwoFtP7DL!0naiTJC6_ zZzFZM%DYAyX+lk?140KxLn{X~lF~+caBpVO+tixQ$}+e|y7=m7NCBo%?=SnPyx3TD zgGkv|Cox23_BT3g&Vz`xJIIn9BvF*?D#XM7)Y18e*$DK)9SZscbAzPcZz({1hK3$h zZZLd`=V&(|q!ehxo9Hb$QA7N|$mb5oG)$a&keomWbc2l}mk|?VWxwkr_b5OdzB|lM zvWucT2gd+t3HP@;?B7l(TX?CS&d-t&#$RUJgBSs%q4_V)VPCn3_t1`sC_T5|J32y^ z>03cVT_-Bps*Q<vkx$3j8MK5<GGsulOeB5F7$omh-HI||;;G+-3Qx;v4)u}v&!%$> zt$8v9kq^%6U4l^yF32|%(4#kiUnJLnfk7+UCYPW$2171YQ4g!q;gM`wu&T=}xI(t& z@#IN<;j}S8Ox_(DP9^!&WOlr5ONuOdsVch;kyGxdS~sa=Z&JzLq>`;kC2PzbaZz9C z4V>xJSSHu(q%6-chpbRWEObg#D*ei2XTyD1>$DJcBo<*C*5Iz_l6+%6+l?*!@j36y zrTYG4)8+V9+XX`CPmS*YxeKsr`>Ob$qebz3komz6uwns=ZJKEtNru-HHvhif{h+2v z$=|vpb2`VJNC{}N0D`T#%>pQ;L+`Jb1kek*ccSoPoV(FSMKgBLerd`WSd)g~Lo@Y7 z9e!8H)^{4yFQLg&qca^E2BN;=Yv&zs8gmJV8Jx?Sb;jF4(m6<fD7?;OJAr>(yCK?R z3;2z%&QM_OZW^l?eA6s35S1N>-|-SBv^6r#zByWNj@Fx_HI}6v19$!lmTH}J2IQ^v z$xlEhV;)Q%_T8OV559c<^4o*^4<7D(_2kvT*N^wU+Ie!IruG2ttm{4I4x#<TjQ1Ca z6!GA;UnoKHBH5=;n3;5dP#{VEBc$yZ+_=7yBGzZ>#Z$E5AD}mXo=sZ-+16Q+4|9<C z&?5-lkIU(to{oykeAMDi>qO1u1@^_Z>jTtv4?u1;8zlRu#e{w<x}II?*Bxl*O8;5h zB_%YU1)!dpM`U~iP(D7K=M#mj17LBkHjww~;&cvP+U05fHT+y$c`onG1+0(I=^<cx z1EZo<H}Y<`yZGRCH?iH#!Q!gzTzPett&PL0?iE`mD;r820qS*3#)Qoo>4M(s7*Z-& zdP4s1LJZKTtynIF0*L56;AY^*W^3?~r*HSsRcDXBpGh#}PU3!JpwoPI#fGzrF8&>e zWT233Ab@vRmg78|IB1O(C%uhU7X#~K1n<mTSDUzLKE=h+i}Ky4ZPyRs|G+Lgh6}mk z)Rqn9s<?gOhGGR;Fn*wkB~Iar4W{Gb4FttTq*ILEZ*OjHf;EF;pWx}}=%@uz2Cmd5 zxL!_+(+s3N$gig)Y?|h9Yy!h|#Rf<Dk(%|)Alh7mq0P;a=+zY)_CaWdtp}`K&#u@g z>4J-Q#JynKpoaStZ@q916FxoF*vjv|gn3*vC2?mviJhCy;f8>qvxl>Dc`NiEhsXwy z!@|CRa`wCz{?W!$>G_$yVxUuTX`V=Zu7|#QPns1FJz>K$8ory$M`+UrqX)kwAqPzJ z5A{MtIykVa4iQqU)rNYWR{N66Vg6r&Q?he5oYTGo!C-4?1c0SO#K>)$mU&(AZy%wj zV+cSzE~kLv;k>-h9|iiO@+l_!ksZ<NIQZd`?O_E7^&NA-@7#7V2}CbJ<CwZF!7j6) zW~79C56kHb(^y!RCSi5*k&)Ol!jEL}+&_UmRjwGqo?%FKb#r_ufyt&g$V<4vDqOLt zeuIul$6<O1lYSx*MUAgw9Pl3Q#%3;~7PNZpy1t=GGw6j;8UyNk7(fK7{DNWb5S9(8 z^63mhCyHvfc(w1o<B)JS3x)x!;mTqSgq-3e=qkv}N=^N=><+>fs0j{dU?C++>yRL7 ztjPDjD!<n3x;stqZV;MJ+S6$}M!IyZt-yWW?X%Rip>7GRxQSDOflUngtBZ}J+lBZ{ zX=EHS64{y&2}=s8rXWEWe70~z8#5*mWfYHcKkv8~#*V(-VfsWvpNJ;ylIcx`IHqWv znIkV_Ba?WPi%~BPEk+LeOYHLN4&oqIr-N?PlJ$9nk?;slO++dW!N3*Lu6ASYh+DiM zS~y?>jd<9QtwB!_QPNPiF67Kbbds34TxLnsrg3haq$a?wG~H5#&dz7a^!SjNzvX#~ zOo)Ti^C6@+0@VNtgU%~3f&l^8nIctVg=>@I4Ahwd(IRqZ0?o@W@8RV}0r=J}HL9&& z*UC^(0hq{>e0pX;$*@k{y{dflwecx9pDkZzZ%TKulYT-RUvV@~AthAOQc%xYb&KAK z?u5E{#0$3jiSYR`W9d}ri)cJe8$nOSjX63@3pY+?*-jVGYsWqE2o6h~>b$)0dK2~K zo|1(ugA|{(*>*Jwktt@wAlDwtn$S#E*}9ZNkeVPf%=%P7x}zn){#XES0D1)QaS~)P z9fsbxQpmaJWqJs|Yhw7}G4==qgmA*WfDAL*#QJM~P^LV5FnVMJi>SwTT8<PbAMHJn z1@$T2=H2dPGo8-m$LpQkE$YYc1T-%b#clrBLs&MDo$=X8_K^pHZ8olh&DryQMYhMJ zNn%KDC?Ax)kK7*_>9hr+jf<n%&sOgTi^qD2(^rS*jRY%Ff>EowBCGDDYJPfHj%()_ za1O^985Tnd&BDwj7|RS>BzsaLr4Y<~8l!_i1Hm{M$XaTfXvYX4b)B}T6sYrU@uhK} zsT-qCTGEj<s=!3|ieGWX8}g0WLfw<Bdj59uVhWiaXY&+VX*V%idSVmwOR&xC!}H*p z`O$a?v8$lvs}dQK{~w&Be7d{~#`FAUPB}t=JvD;WDUhpk1!9M{&^2LF-Yn~3f?TWR z)0_Rdr~KPm^KNEpPvE*{V=J@MuBIgAK(%jb>vMl@d>OH#!S`J<2{E4hg>?5<cM>Y4 zH4R0T{FcT5{RT1Wx01tiOrpXoW~K;Q<YPkhVy2c)3yO^CKgNzUC?m6oiLP(O@v<32 z(yw3R30Ymm*R4@N=7QNh%BmA4AM4t6Wzw+ixRlHn&&zTbT<FRgoRdH^Y*BwOt_EZW zkaB$-<0I7D2p+JO_Tl$H;=zJNE_$J*b$aMv!&gky^;U!}LXwbbrHn6dqSvYjm~Hvq zTFyoxR-Mhy_@A?5mK2Y5^s&(R9n3WnSJaGfzYtDqcXcEEX3GhH-o@6EtR7M@`M44q zvJO*?886DHIMj`F`G_=L#T;%88dfH7#H*5UObAwOXMuB%_M~H|j~3*RGk#K<Pywd! z48+IUx4>v<O^C(DS!f3yYp>}Rv#>UrV2iz_K7B!!oa^g;!~+`4ele&!<|wIpfF{(7 zs^{Sg8^Kw5mPY*HIi*=Dye=w3cKBJ*L?;@z)$%P>znuaO)pS4s04`#A0i_b7o^JbX z(YS&Lk)!fiIeVs#i5FP`^Lnqvw!Mz!zIzKEJkNn|jYY?Gy=f!?v1X5#xFve>*-r*_ z*qwCv`$0;z2PRmeMf=<6xFqDoc$^>ez3ldJ&+S!s+!zR;tiC}x)-~TUi7(=;r4dtq zq>Bv`9IkYs0WT4jl8uz{Sa2<NnK2=5+&t1_@u_XNUMb64k;jvu<UDUgxEE~JZW-=Y z4PH%&>^Lxv5k<433x%&)p<&TqeHb{RH_(bN8ub7aQ|}ic8gQQ1X_LK$zrqUZMQ}}Z z8W-AZ@d!{YyY+FQn)32!6=c2hQML`*yv9?<_ta-~|CwBdIz=U2QwEVa<0ZzABOOi< zser$dgsN3}J{{&-=UBIWuOgP#mE#!5d+S678bkzP+id9-_<Gmh54`%WcI~wtd?c`h z7vY*qFoR$G^6TxS5CBr?+pI9W+SSwqX|1_?`D{PdHkVAPqy^va7xuFuI<`A6C=1zF zZoBXMuIa&6czr}~U3QPG!FXO|-`X7wn)$g^&tu(Xz`pUbJ_=RR{-YL_&a$}e2Ukdt zHB)Na<xCyKN~@bcG(iRG7&}2?al{H1#z5RD_$x5rH=I31W3Rf_*p1miIdyzUq3T54 zZU-_gVmGktcBdsb2hsAOD5Z%SNBBFTTSm9ShvRraA}sofxG77iwW~r9upLNNAp)F; zvdB{GB~U6@*vM|V#2P752rpUK^1wSo@g?Sg(8fnTI_R$L1-;p&p)aHwdYYQBf<GR~ z^9)Agy1RhlddH##t2W<smT=6tLl}2|u|UL^xG+`?e{DIY%J+7RSZ`MPQpW^+(z1nb za&n?m`~FQn4=-Kh(TLYB`0gY;!4AigTL=^D1Y)M^PbnLXzV>Vv*&&W%c|9yUL225E zqIy+Jms+vgqEcLDG13OE3{C4;ThA56yXdiMVgS44<e~r%Nlnhs>RVG=Z8A)EY%n9+ z@r{Q8V?u=Srvl6B1iRi$K(sX;gDbucLwRYry%n$cy@r-TV>!mPQDNevbOm#=HJGje z|9_3i=o|$EILDAo^0&4%PrA6qVo5ma(N98<u#)c=tYm6C)Z${&-Wr)_-73W;kp7m_ zgU6BA!IEk*(r?FeSM41(b!w>%W45pNRo#L67TwOaaLuj?ox2Wyz7|XQ1;IkdtH7nH ztb`t*iaJD)rwEm+Y??5DayPOQj0-NkmE=+N&T(amIa7`38{ViLEzFix1z-S$m@7&& zJ4r}1tn=;R&l^ZZ<WT08+F*Hq_;YEyEj^^GrP>O<ny&m^oWF_P#+LTW;v%OsVIWlH z2Uo`?z9MH-VVBWiwh0jaBA<*ZOil`KV@IBGnbFQNxG~!cac-%lr>~HLmOM*HhS%+O zJE36+xR$NzUh()L(OT2;z7+*I1$WEqfxM^c&gx{ZoPu|#f7IUz40ADdRNWcQ<{zcf zKM^H@oO0fIA4q9m(LzeDp1jio-IzP<XY;c>!r6O_0pK7V`w@ArB)yT*i*`7>p@WAt z95i}G_NBa2w4v69nZ&>_do=4!PZmqzfUA@89O6h}?3)SYNvg+pbTkv`oe+g6xs%lm zn?QRQ7k1hW!^FX8_<apSufj;lY}|X<MRxT0k(E@Eq}UfZ_0%2*U)&fqsAJXKUhsE- zd4<z%;k+^05!>*(GSc$r=uf9<Hx@)!M^+k?H&s49YM>Ct&DV{#*Zg@?Y*XX%7ukw> z9M2~;JFv&;`eu|HeC011;}mY);%zx)!Yi?Sq6cpY`@9BzWTm|WS*GIDBJVnn;RU;$ z?i;^fq^i=<7X54o3-Y9FqOCjQx7oa+NKw@(gsB4Md~sakeF-<(-Empv)eJ(8JwKnp zxuP90*W!sd6}Td6DDTE{A%lBzyjx*eQC1kq^0DIzvO}Oqk0%f|dp394Y*J2uo)UcO zPl{u}b;Y-<i|cG2(Ko7V^BA*o`S)tjIere`)DIUTM#u%e)`}1(w<-o*y5NSlekxpZ z>-S0_P6g@_6Z5PtQTbyG|5lx!LB3+N!+;nNsJ_Bhv*EC$kQKl};42hHDKa`LPV)(b zDCk5ppr0%5@O%m(+QxHU6K+cRWj35)AaZSp3l}BAk8Z3nh)tvLvC#1oR7u6T4A<en zHw~c2YSQX$f}$s{NCr8c$670pSgC=S7-ts-54+OUX}^VDudUBMYYoD2VYYHLBLxa? z8Co=^mX$erD+DpHTavst*o7BO665$jfQ~6B&<ni_7^W!7P#drPV_~_6;9H)cNQZXQ zg}Ua2m*E4ZWy|1`ZziJa#de1I1}Rqo@atyV#~=+A#>H$l&R?BmlN9^f$6yB<V5YI& zpxtiHSz2tZY*8q=D%S;$_sYYCM67JmR@?dG3^%B?>Ue^R3RPDH{jYb&h`|@0-sbA9 z^ac$Z4?x;{q;Y=5QWJwDzN=?M+#3_A%8lVQvf<V6&eM3R5j*XREEcaz3qp4A97avI zI+CHR8lkV31CZ#lpTo)RuQwg$RKg1jZAKc}F<PJl!)3?r<6kFH7lA{MOC)l1H_0Ho z@}UBV`jOnkdb|lpbrX=PDIk@W7GP9G{agF&K7RG!>A~KsZ=XCcIXM*P<kGzAQaW~@ zm5se;39bDYgnGMH`HU;8MDlAL@eu5UijE1C7sy^zgJI$mbaHHW;iF_!rWC{vGm^t^ z`BmpZGxIX}L%hZ*gGd09w#V^cwpPe`0hX4dv>n$3*5*?gL*QCFluGM}ap3p~M<Ikt z?sc8g(H2m&(LG?Mi*Pz3#e@)KpqvVGnnO@f$zMz{Mxo-|H5O=@j*BsD!y40CXd`q# z!L1EJ<vA31Q0YXn0m<d-H029&AspdpN0BZF5nZM2+FE|znT0%^e5gz?$@(a-isOlz zy!Ds$r_nHUlXcyWt|P|7uhBfO(j=Bs$rQ3#!zb~K;cEGwQv!<IS!%M1>N@3~Snesv zEY3fyo>?4f1^Z6UA-3V-n+42%B!Ks^DU1(2@C|TbYaN~!W4$<4%HlxygId0p@ughj z@l!EOhuIF4d62}KUS@QYB`_RDG{0-4vXddM)(n$5wq@pZh{VcL{sBV7`-uoZbj|>E zEFnLGvCFkoHX{L6ewh!|nF@gmG+cI#IFnh<*fEf1julL;qRI<QDgkLLv1F<7X>??V zLJW?mRMlnfWlwDpCP<`+pTyI{<31BbVMkqr`Q3e^qHBOgtqPi!TGa`qQ=y@WEx;#h zvs2cB$I}w92v~BTX;ESt<V@>0I@V!irW4(cc6J;{(TK&Es!#7-HfNL6yBjLsU4z0Q z2j11hH>T(jS|~YFcN9y#J0ye83=s#u*L<U-4*7^!Q=p~ZAqZ%J-4X=@SBc<Mh*`91 z$ro1Da%`{GK5KTc^vaHso)f!*#FEf&1+bdL#iL-UI0QQeIXcl(w!!(njsdZD5Y!7B z@0E_-(8H+l7+w~pA!47$trElY=Odmyp@9+{c`Of*-)>tvDDHcjDWir8HMN~Uq2s6E zL4Pz7*7q$DNxq<DhcFrS+hu#P8+N2#$H0wK%EtAln;V5Oox@FfJi$;_*b!@NZ0*uO z(j|Ec9a1IWE%sd(17Y_n8q-yMNMEUPY;nCwwq**!G0)y+P6FO%f>Q2wlcKVc_R8_o zg`?O|pF_Z3gPe$FdOtrZCb>I}jQ*7Q0^u9~e#h(^R%?>5Gsr;gb3>~%6|zHOsP3~* zEDZ=6LrwT?#QY6yUpTAgZbUE%Rw;VJG=eh6(k<f4d}UTCbd7M#iN;1xdg-7fN=s-( z`))^5B6{Za4a+=X)Jc<)a~HT$n>aew?1HQKP_wLGU@D=B3^>RIz)MKJV1+&s3&hP> zuFO)_T++}f+@AfIiOar7*@(^FUgPSwh-YHe9oC|S)!Vy52FiZ9@cdskG)*I7%+j)| zoF+(yDd0LO9hqxv1qf^HW-;-z)}}4{iC@i(HuSQ#e0IspJ9B$oLEqHfdujON#>27R zzWkgu2+BKH4Ebi;m6lCrmyssb%P)A7y`V|vY^h4~8`jVS;8Q#4-aLed{LX<=p3SVV z(wJcNIkI=r9NK<&!|Ai%9nYvrwt&Bl|Bp3NJevjXBHYI{_2&e|kZr~=meH@HR_N>s z{rKT?U5vmjQ4SsMe6z;7z@iu+f~A;;2K)#M(OY43L^?ueuqoX25v*Ay$y5#LmDHuW z2M43+u8#{6RFcin6}NQmw`b){ZGb*p<lchy*aW=dFGvob&9wAiuNG1Yxb#Erdbr=6 zSD3BMFV}*LoedD6&N6k08<rE$oZwB6w}v8n!*N4n>0>Zr&nA^DM%glT^J+=7VI?oA z3!$I|4Lz|vyyc%w%foSgYU38>lVN!d>d$=CUo*)+k<nf6;Z9<Z7}{Gg3>A_Sg7i;; zutK{W`xzktsqO5jb#Qr5o#?hZ6kGs+i@lh%dxtqygYY7d?-di(Rba!JdC=$Z0x(l* zJpi*^1)ff>p1yNtKy@isSf3m6agQFmEMqE+J-@5~DCNWnRMf>NpFw0u5Psv-Ni{<( zeOI2a0qvT&RJg`$(W+`vtkMQ@fxql&em8j!_4*0<a^OczlNM1{iQna~cWoE90C(^9 zZky)H5Jqus$K^)aSHx^^iiRF=_k6pHiqeX+o=j}{w@P3ILw-9-jy;Z6o6QN{w1!%H zHMxR94fXNpRY~q=B&dP>OQ1^f+cqD`nLf%1+&3m*EpbWY>$K0{Hee8Mi~+C^#FRI8 zqi?^_x8La7YjZ2AZ-7H4G3uC9YcLqZXxa|b91pW0;1}&3U0&7JHNd>{v+mC;#V3Du zr<xA$(EB^OAbe5azxb@(#r^=D$|Jy0NMVb9@Cq|VIbnuDGxb;P;1aS2qVtgHTul`w zMaTMt5{)AZ11Fx@mFc~``|F?Wjv+HG91sA&&-39)Hl0;8LLaS0pMBAGb_i+@o+$4A zlix9xN2l54mitmn*q35LU#ts~zQUX5EthJmx5094;p-PWuO1!Td;aqNgO>;2Jih<x z5#}Xyb`9#FC%MBnkh2&v5!zZ`?!2h0a-5xo<-dCILUr<F=iY-S2YZj6e}mO97w?no zFh|Fi>ZE*ITj$Y($6r2r6{$r@l%ZbC`I4DsSf%feZI+=pA>Egb!l2L(^DM!+)aS+C zD@J0jGeVnm&>iqt$c(@T0l5$-b3VkEkSFo1fD;ZMQ%~ZT4<BK3t{6T0<!EX)x&l9c zgQ)D3KOSbLQ%_pW`AfA&(k4rTd*vmSd;v!JfrUY+YtdP<<rG8Jgh`?8&9O%L(Do)% zfrHGpfI%1EsoUlLV9S_uD^dhh9nYA2xY_lXFYQ)nRt3WnyvP+@naq5(kl3ZEgJoBv z0Cc{;G4Lj;S9~p^ToEI%D}JpZ81%z2^ujSv>vg)thsfXS-GHow1e5-vd0A5q)6!D{ z(2%YDkW8u9$&$)B`Os<#P+YZ>iirRdE0gvD>eLm%6u!Qzl$pQn!#6uJ>T{icwbq0u ztg!=mR9|F>m8vNGdR1a!)1Gg$#YcWC7<nv^jcR0%c2V7|*{ZFDsTlHVR;W`AGw4D? zab>0;z;0bTOusDmVaMMUp@woT%$;D?ATrK<^UZ8k`%L?05NU3I$(ROS#tS4#<#ZO1 zB=s%~0)!>i2ExC%SXnh}$v2~1y^6+Frf#S}lL@*O5F(qi9c$<p=jyzA3EW!W8@2n= ziT2;ef5UI%JUhA%8hNil`(6&$1EQiunlW_lltWb&x%7MpJelGFfp2xGsI3(qz49Yg z5{h+C%4!Ds_AWL@$61xO!~S1AzyI8SS898*KCGQ)ThZokI4;htJrIq&>sP*~%FnVl zIR)!OKOohLt}{i#L*k>LVZSBCVxiTCwZE#=Zki=$Wr&Gp-X7n?|GVsi=gl1ctvkRC zfk4j$b6VS%y+K$J*dI|(v2?70zxdIms;o($oQ1zwh@+5Mf!V1LvUey{aVOabWBu(Z z4wNn_(FKbF&kjvk8wO!wdmE{s+#L~FY?Rj+-bksFz5>XWbY$4uNe@Hq*%QEtO(I4n z#{5Z-SWB^@B>Fv93+%grbl9K<f~`g5L1zAu#*2+bv+)THBP8YRrr5QCxpe#>WhT?w zGMd@?QY8inFQTg6O;G4XNw-4ATDil5A6_1V1saDabH&GL2Y?KW>%nKngbSs5@%R7k zzkUC!|MJ6s|4%>s>JNb~eE&!P;UE6h-~8iW|M3t1*DrtgKmNz}|Lgyr5C7l)`%l0B z^S}9@fAC9|3GRF{32f91Gy>Z4YMM<d5Fw!#E_f{FdY24KQkVd}nOEwrC^rnKHSU23 zO!b8~iFL-7sw)zIoOcX6+_5~V2T8esq69*|-H2N?o1jXxg^ip7ZvlpGB-t2rJ+qTj zayeFaeUv0s{X2J#r`g#_F|4}z?Brc{cyeb3J6uiiPBknpit1oko}QMIJ5SW*c?w$9 z{Elw6$VYI_Jk8Fk?%C)FS_a9*s-h8JFoHufq8%fnP;`Gri=z$`bS2IeKh9+!&N+Ts z&eW<v{66PZeOivr$9dmKHDL4KfkFRE_y?H11rm??MBG)(onC)Jjz{w|kme4#l$gW0 zE$?`ZsO$GhG0L5FWZ2G#*osf@ut0g{Xdtp{j|JXThbnTpKOTE5xC<gE6ZIoSt?`Pe zQHrB&SiQx%J#2M6Gp*8Q135AGLiSk<4DY!v$cnbf1|ipRc6K%MdPd&^Jx(BQYV#;K z<D)ON;3!_vN}Srson+J1bmAa;|5bIq^4>b7K-;ToYZ*~n%I44sn&(#c2+HS2M->M3 z;Zt816N*>)N~ad(qo}Lb2>Z3jQT^Vt0oNxkpPDTp&S3W7m0&>V2XAzMIuoByV5OC3 zrf)THHj_^UC>)z*an)5iF`yCfUJqeOt+;(t&LHSx4wiG&@uzk_*4U+kbE$cheh|VW z$+p}~7uEu6m}}Y{k?7&QVz(vG=KUBDH0Ld(ihcc;#hsd#Z!s$C6CLr}371n*m2d7G z<4W476goIQy;toe)etmQRjHWgDes5{2U1Vnj22~MtI3r=0xRduADBs!jkl<T&ioFx zs$UE%ghhFFP&1(0+fI>a$SZ#FB&ImWZBU_AvsBgYc%baWjwO#n14%$JInS9&4s1sB z*)C)<)E_wVDkulx18(1zysus&tQ51T1e=6IxOO9XpG_4D!%PNZWAIE@1jyF639gVw zpaE>!)0z0<D8#179CO;IFJK;P-+;7JE}U_KnXmyH<KDx?2pC=bm0DML*PzH#bLH8J zB*2bhaIz9bdiDNmazBfj&4pzGTi&o0W|`)Q=;x9Ce01catqTr!?LF^D@DP`Gw&|OR zGTeZ<4}#|M_wpG^9)OodWsNrXKuw>OmH?Yewj48@f%c;rmT-0HN(NG#CD%Pdr0+uL zLp5Ypt^3Ti5081Y1>r0;eK+5P%uu{Uej6?DTsu6%B=&Hj&VM73WBphu9mk^Z<LBEn zLC1l*Z(v0gjcf$yDo_j(VTgf5ERfT{*$hvkASDb$(qpz=!~-8f+^}lcwXUeF4RuMP zOacv#Qjzi8qC<w=0X+8uSgF7POD_apfr2y}aFZ*lSuvDWOAVDNhKssPSLdfX_}4YT z=33FvxHo@wGR>=#ay&}o*lw!WQOUu6{4v7PMmKl&V-X^Z*G0#OM~awmExF^M^{E5M zRwN}0h^QGS4-qEy`OvW<?80-KLz%SV2CGme>5qvuO|n+_cM+aFwHqq}9LiB4Zy?~& zlpTS%rH`Xu1kt-=4cVi3!R|HQ5{I6ne&1XeiC}jxyi1C8_Tfz~cpzoG7bmR?cY=14 zr|7dGDFWV?^BIb>)GB+&!K(X1ZVmjAk2nWlBf+`zx}fxQ7#a=3fzH)1wC$^=y-5FA z$}>X}!cC<H5VOm#<uEP+&VoGBp{O@}vy+@XKBlgEQ5I;B4|~f_PsjEnH%Dzaim`7@ zfHsWuM-P#m4E;A{*5d9i-YEA4OJh$!ds^PrjTg`X1a7wF2SS)Gvv^@&cM@;=D~fVa z%S}n>c#)!@q4n*=3&$sTtYGLYOr*au)fxIdXacy-`{t1$YpSu*u?FN;Lj+@-mqJWW z^wx9$GQXY(4hxFn#b4!tk~kW`^~YdA6j}~yNyaJqdUD7g`|@#J6yAyjB%z++aEtVn zE*}sT%#gTIBuW^Pd+Lj)bzX8MeK?G7X=;r)-P|)=iMO;dW@T8n$RL+=n#%K2XDCiQ zhdwFdNBD5%dxUE1wkt1>?SPdq6A11CV~nsHTnVU}@v7jJn10%Y!^kQ!^_*sJ?TFS` zoJyecbd+G!=lm^)9$0olmJpWf5<N%I%fX~Ng@#c6k2XzkNW3c*aZT0FsdH{fNDDyy z9L_nF>auiq#;Cf^|B6{%$Gor{xd#PD1*w;_ig+p8G&{8TZRggoUXCW*y!M}E&pL_v zXAlh$&87hR4CyJq5!JW57P#93_ISg>^d$_RI`LW?yo@_fm~T>W45=Y9x3y`mxV6fQ zSPgM((Aw7nW+X<1oSKn)bX>?iKel&oBOR`C>+ug;&sN`#%%hN0d?g3FNRlk7y^=4T zS9=jP>wm9kM4wo*xcA#a@{Ffv;C4eM#wfnimej_MTJ0$i3_)QX$rq)G>fsDzz35=+ z@sADSMl8-H1+an0DRN^=zC;Gjiz@7sPqIHHBI=}D_4HF;eN<6RI%}kWu-o8G5FL^D zATvH#B{x>Auoag7!cNkb#|eAo7d|ITBH0}~WRm}VYJWO-9Z>-;Zu~Uz0$}g)H?|AL zZ#i{_m`i#DC_tl!E26902@O?f*mqc^g1LZmHqEWD!%AbAP=$yHdS4*lmA=@3m*Z;? zQoi<(@EStg@p*N^&T|MC8c1=sw-YA4HAU%)ds0q|cVIU+24nmYXwGdMXI02+s?fU$ z)jitRqox{CMp;d3ni}fC9S<R8JqHa)6eP8G+Y!18pvO$to^NkY_KVTw22B6afV>p@ zbo#mp+Fr<jO4Qi?0$yz3j}}hP`Q4E%)*OoWTygcHN5$tY$2i$0L+qBz0AW=XCiS*> z)t;%^gZqzZ$`!esqrL7W*yqk$Odk361V7NgrPaPujiSgMMzBwl(Q_XNofTg;e+q2B z*{vO*NZ;z6Fp@3cC-4(q(_hd)Xc0722jaFI3?(d2dBD`cd>g%Bj>hF%b~^iXSGD*g zN_6Q%RP2OSe}?vM1)rSl-ojI2&GIv<$0iZv4V9(_44!=E4xVnYd&0fmgNjh@dX154 zSdx$pPj~hWIq?{E{hd<?l3pg+MOmoLnI9{Pe4$Ce9lfJ*qwzd4$7so;N=Pg9X?~jF zu@k|<<ThVo`*s}>S3>u+9DM`3BrRxD(ZYhX01%D(_#D@ujVW>PMIT>md63+QL2@Go zN$PYd09j*#WDMl2dv4ZF#U`7DWxkVavePzbn++7VcT-~<x-pjo7He!1G`H4jY!Z2R zkWhyfosp0CTdt^wsq0};@{)h4lfNvp@CNp7lpm>^(2O}@2S)E7Zr{$1*vCh#i7rxz z{8HUns}4Ak<7H19jG<P_RI5rmF0~rvc%)BJIPzc{sh{c|NG-D{d8mjypH80<B}$ps z1!i<^;|RFO?<hMT8>fL)P2}nNXS#vl54KAd*DWH=WZeZ)O^SadjX^YL=y~;g>W@pZ z)mkLIL#$-zL)Cp}eIQ;ke(~)IxEiK34CqwPsp}$usTslA{Jc5=Az*=VyZR6)LQ-=s z4ROv*Iw--mo~Tt8vON|TotUaiS$`%zF?C|%6KR6LF~-;`+o{K@qLx}#@D)N$D=vE{ zet#Q>eMgQ%9y6guT*o9I5%)A;9(%sC6TsWpYia2F)^c%+IaamNX6`B`Y%y~<){ijC z=C;(vD&}_-Qu9%YC$R*#lk_vM@NGWCw)%);JS*R(bkE%A{)7{KeYtzO^V5U9orez& z9zT2a;L8Uu?JW-`>3tLK{Eiaw-K{r$W+d)<ud+tXJ0_;8h8f1v6$4K0*rH<W)98T! z)Bsuu=$iR3um=hlr7PT`*jQjZjcM!@ASn%)uKne-JU@$sDZ85GIg_EA?-9}o_GZ@0 z=@PBY?Bje9P*c6{%qX<Mn)VN2QGafQ0||GpX~h@6in9%6l;C$rBFa|i<JYpM8=Pkt zbsKMR`CI)kC97zZJi;4(8rq;NYEjf(kIqo6|CR!^V5rihm@$DU4NhaAcMAJfpti)b zcob>`78SiZpqw#2Arak8%b||?YVfJ+jeIwUAUJR^kC_=UaAqB&SJo`GdNq*tsbW4` z{Dhm7qdazVSz^_U-Ue(~aQ(e4;&xru6zus0=aPRkUAludD)n1qj!wR_E&xDr+urz` z)MhTKIH37;v`5pz5Q3-K^o<rVn6TnUn3|V-G3Y8IlnjWH<OPN*2aGYQOS7bR8tJgG zCN>2HFsv}T5Jh>ycvcFlvm?L*V@luzK*lA644S}~gs6+>wdDBLz>H~yg|`vWF?>3A zW0fvVen9i0!f#(YZ`oKY+EgKEe4C21-Dejwt!d|$*P{&iNA_lhLA4b<lL<7rx)2R4 zu?em<^#-AtjyZ2cOxAO_IzJ?ucUz8zCGn-2WUSE<joJwJ80AYhUFt+a*4vPXruHY{ z;jBcKN;L#fWD!x-NQseXCItnbNhn!qro%+en3tntv+R)i!6M+o7|f)ET@`p0ImBaH z7_V;Me-X25_kEqn_}Do)b!8N&T|E>Xz)g5MImX3|7xc88!gazTb6I2_De_iY_}lj< z&RAbYIo^oaQlU*@qjJZR10HR9cSWMWEiv0c*wTPwJ>?;`Ozb+zC;LH0+7w;2t_Z~x zX_Ex&CRWo;tfre-P0?6Q3cb|a@~Mt~Cej?KjcY#Z<4A<tX>Z+ZtD9|gv#sJG&`>Y? zCHM)GVUU{X`4BvTjq5FW*(Sov7R%$;?0j~jhWBle?5RsZY8;PY0gu%b&kwr_LGGNX zfvFL<QIiXogJOh80cpm~c?&Tz0WVDAd$lDLwkYr%6_-x8!Xu}OkfIZCU`DUs-^=Go zT8zA7x^?hi_n@WD`(gwKt%=i>Dcr4+m?yEDBPeYUDv%y1;@LYYrp7m!qJ0rKT}I~A zl&}(V=pFw1H2L9A|LgaE@}JeeKm6(szyFi}?fXCbTl3|A!MMaMjkkV%HZ3mHRQ2<n zHIsm*dtkbOEC=SNVxZ88$?%P?XWhQek6jCbF2M8)*ZnllM$acERWR?LZj9t+ciqk& zjE-09ELR1WbViue{hU0zJITsZtcNg8@o9F()R`aBuQ%KJesQ+0-<pnN9YJ2xRp1GQ zf0Tw{==ZVlg%0_LQ3+m5%Ne+i5Fo(6zohV6W@l2*+AANomaC^jb|)=-)pCIn9v>0C z*2sTs_plMCxZNZhEUNo%^SIkaB$a~OW+D&$4w5UlT=_8vOkjax6m$FEx8|?|e@u!3 zYAK!@P%$F&ug5$DO96u}aIdE=pmDCmmdx*_aY!Pw7a9Ow?Rx|j=&3M0fWij{_aA(H za1f@%m{bbL-F!MNr)i6bA<+hu?~Kmzgr4P^<bzd5E2^bwNK~gUvM@XkCd?TFq9qwx z3{%z<b;OFiadlQMTdx)XiIL7Ql%N+35x&%_N%Y%-6IDkdwoA`KJ~&HghN89P;$LD+ z3m;3gu=C!WEUY=Q1c*ZMt=~Q#T^b~SB3%r~{g#3p`+($_kHFcd1_n6k$eab52iU)K zlHDbf9C_Ozx<eaRv1Z!>oeDSTcQpR*mW(%<^gf{OW;0>fUIzi~O2C5yWf7qx@Lm9J z((9;xBeY}*rLeI*-GL-eC?}tK@$A9<$IrgBv;}B382R<cfSBefBE!Kaj%kygu$ShI zY}Plj={2%B2wj?=Q3#aBim`*MivmYG7)UJ=slvgy!WK8%!Kmt6+>Eq1=}|Jz%@x8k zyvfl&w%1js!0n{94u`;GvkSbgS&awJ#A=xJ+E-NvEA)^P2Ek4NWQrgVRe^GKgclc3 z9HA2EU3FWB#x-4rrnqH~n$INuS!adp5my*|#*?jwLT(97)ns1NpvP$jB?SB+sIhvM zdRThnoeT)ZU*E|9;JW6?VEDF`PX~lZ-RWTFJ$qZKo9X0Du5DPw?3)SYcjhP&w08Ac zn;$|$H7p}ElxwnAA}c++Ef@6_W7K1lRa}`6H}5%ys))>LgpPa|lH~hpG*?>lvN^e8 zo35B6>}-EL#vo*QlA))Nj~ov*+!x94P<;4wK_(CR<t$*KL9r0<(8EKrg-{iOQ%{^7 zzAGv5jNE}#+Ah@_DOuhcOp}~D+!qlOqTyk8s34H)5mLm43S&wX5wC(8_#xCk4*UYV zuYsSrkvn4G!;dKGb>T<!C4irwip&-Rxb?15c(bnX(j_v@EM1~|a8I6{Bu53f+Mr|c zv=VG*%`z=xm??<rvzn{tKJ9(g>^9|Z8|XZ4-?fT~`bV9+BDP%<N*vM@9>NS>=?Mt* zSR)X1+>knn?cZXK%#P>NKU-ChLHjmfOaqR}H4rjZ?%Qf?j}91a=Rm9{!OU8!w+!#n zO8QCal~q87BAR`H5-mg-n|m|157;%;+Ca)(!MI$7!UqRv3`7zP68U*-Z-BRKg)p|t z3IO@Vd5+eS`?l^t*xBIsh(DyUxYV{Tss$=pofJnw<ZweuScQGF5`$XPQ39JFGBIOO z?7&bX;j&=k%7AQMk1{7Zg6qhJ6AL3wL_{sFt`o+~zGYi>s}+l*8(l10x5Ee0j@7r0 z!sVGEGKvmFi}7Wy55W!p(Rv{tY=;tw*BhB)5QfRi$IR)Z4qdJOGMa<B`UZ-l9gvn2 z9aRwHSE#?bw}<FptfOvoI!AA!(m>;^%7rNMYJ8u4bpp^;IE~mT+TdaC(TAGjGs1do zC+oef22UVr9>qhLmQHQaCCvw-q@pc5ECeyJ_X~3I-pj{FDHrTq`qV?;Kxx}XZzoWR zZD+=(MwtP_07MUeFCdb_l&=UONKRA>F^~MzKrF(`thOL_-b)vy2~Kqj!#I`Y7p35i zG#o3IqISa^Yk2@j5U{>~ExG>ws5=T84^JGAk+D1G9E8c?c4^nI%nGMY{fT1-fie|? zrZ5JBmGnD45WPg$2uT`N)oXS&r^x(jBcgOqTNx^4JXMd;Lzukjisb=b2X3wLhOVLx z6de&G#X@?1w5AOk_hYo3*EHO$XfvD5Z_NtXYSngHniN;|na$6B+htpam_qgg8m5s` zkWtfNDuy+q?a|8dKH^X(9E~9*vGI&@Fwf{mh(=VtByNw3EA~}P?yuaN5j8gTSJR#D zO<~gN-C4=!vibQpyR&R|G6-hx;Sm}j-a$_r2@&HE#D@qi`gd;+Yd){@e5&)cI%dLP zj<~!GBycnSN<<e8NAcKv@y5ZuZuHD;BhJ?e=My>MzW=ko{fEE(%ay3*15Y<}HEqyG z(*H18T_b_Fk=Y!+{KFsp^6!87m%V@d>p%YfKmYQFfB!3PX!8BP{XhTiFaGL>zxop@ zv??hw8oHSI2MIX0YKF1dFpR(dvp@ggKmMDKHxiPVa*gjbh@Q>n7vFTNZa6hISTRRF zEpiHOiEq5+n@--(SJ`OsO~yIIWgBhjCNm};!)dN~W$YW;R{Y`R{AqECe(i3;FurG) z8X0<e#*#k=-Y*uHVq|a|C0sg)&$f=AG)V4~dy)yL)J0c-!#rtam{k&UNW(uP_{Zds zZahaAqG{@hPMe&1x?n=FFmLW!xNjyu*f*0O!~?YHwMoqn8_$Zxjr#68Gs|`-3D(Zi z<j&eMfRgQ!RhqoX=dn^CAH?nkQMgo)6AmnMIbc*%9Ubb(gN%pgU&Lb3K^W*7sDT>_ zAg(bD7Oiy>*6)=dQ3rz1lBfnV;t(MJ=@;nqRpUKeJJI9i6BW&0W91jx9j0;0$^L0R zJ<hjL%2<m6WPQy6FxD{=u=XdP^nN5nFh<}We1hIr1CN=!hELschqJxr>PAO@#j)zs z=pA`1-FZMcduqr2C8Y^^F#ZU`w{3mc43>~xBg*)|0b7Yk{aCGMq&nG7;RH*y2)6Eo zOI!BX#luB?#B}de8Tf$JE1R>K^2IxzN1Y+$FzVP-_38ncAmkIUe%~EuRkeGP58tF( zP#e5|K-LU5&Jj1x5jV~e5$6bxk$pHVPhl&Cb|4@w)Jouv%oA&bn-DZzjWmB!Oy00C zId|{gb(uQBF_ofcBhRM}v%3w#Q%`LAf#OdSwjlKr>OBT=sAbW^u)T4)Db;X6soPF5 z&QytD2Lz-TEXkQvOh@W0M!p=*)Y%2mcU|b+6~(d8PE;aG32@J+Ls(-d)upFcUT0H+ zo<taZV{-|+`zR~M<TI}uE~hSr(M$(*5aJdo7N%MzdPc{=pdH>Z4A@9d2PHif9S1rU zvTKiXfpyfwyq&a?FA}iVp`HL%K&ijmk*07QJONM;?Gk;G_vTfY?lNsTf8{;Q$=LFg z08VX&8d2L4=+uYmqMcWYxNeRx<F)*HR*o~zE>yP%YGvHi00G$3D9tsSI84C3s0&wX zI^2cRZadla=JGU~C>k`yiJGE8)^zpSUgrQpsc2O3y8M~E9xyu!xG@K5yhY{i$hC`3 z)Zk;hKiCR#boSL5f2wF@UYcyakkKJ|jaR1EI&3fKP%$`jRwb_?XpG_ormwMN#aooM zQ1uGl^F+QP?LuIx<ngRkDf)<^t7j!|?tD^^gFBq9hxti%QIy;P9}{#alJxv2^<det z_u-hZ(kt9me9JJKrTa#7P@lZj4jcARWpT;1We};c!@mDwEtWTyVJy&nz}HmvUzaf6 z)a*h8R?I4kqiRRZTl_986k@GgX_0N&(VUJTE=FeL4nDwV_mrAJc5I`j3N(X5aX^Id zgixe!=hk6nL7;!=6PEd}cV@F`-#7|&L>O(g4DX>e)+P?6ZwIvSDo|s(60!ECisRK6 zb(&*$vo*19kryGYkWH#GL4cCBTl+{(DNE0qJGaR=A@$^POc8j))8Fv)H#~iur$+{Q z4@n!afS6Ex&r!NmYf<2|Rr{J~VAl{3tw=0{sE0x<@>7QO(N$c1KHX8vG)Fl@2Mhs= zSqq|^AD`nc@}kSWn3fk1)dt1InAagcR%2A;c&vDSY5qr_v=re2(*$j=CKTx&fD<0% zj?OE`XlZeW>_lyWF%)^FfVDT9k8?d^t<hHeg?<LgEoMU<5xLqG-Ptq&8m1_gdydU~ z2xwU|brAmbPDyJab|xc5x=!;Co}1U6H%XVb2TMITJv+&&qS9S;l6^d<Fs2P0@cXUm zq<m``9y4$Z8K>w*Hl{PzA2Q@Uf68Ow_|`d1u;h6HeTyGm4iVo~qpy)_YC{}J7b9V8 zZ!NrQc0tYM-n-Bf@G&42zr{1FKaWqe&}wFOyfHzd3`N?2UgwU1<4QTs91AY*t(w8p ze0EZf(iX4K;(?P+{q+(z5sSxIkuGcFBTgdd!&X!EIk^wna7TM5*?3&ORrfsoz1426 zZ#0vBuluZn!B*T{mN!vn6DtaJWr);M|J_!!iPK0`(d;Uwv^;c_XBEpS4c}F`Wle{; zHdgn_wzLOdxZ|nggSJuf+Ln85RG~+}0Rk5>hS%N8%S-qlocW;R#Q}DM;T&aea&}(o zy913SnCg3Mx$n(E2PIx~g7RKD9wRm^OGHS#Z-?gGxh8@SmVr^1>(;`PxAyQ#P%yRn z4j|D{8NkFK6R&U`2(9@L{|ID+HpcM0nw6);yZp<1Mp{Vp+p$j(0&s=R;G&oFHUo<# z8yb!RHsXP;z*J!jIBpLV83ulag9H9zvI~&6j0qcRvY&YyB3i0n)3RCBmi^LOsm~fT ztm)f;AWqu?Q~U<Ix)m)HjaG3L+c&UjK<=q~?2J{eItCt$sM(q_xL6Y^hXR-fL zMj{!-RmKzL&SPVN3(>R~$*?hWrG8bG<5_Xmk9q!flGAheIM(Px5`OTo@s0n?dyTLP zIIWm*3lmq#WesU4njBPK!58?F56}*1D|#eq_XpyWP%I)np3|5@SIYQ7SS6atQB9o2 zd<G(o=vc$c8rh7SESgqMW~XDO=CJZBH$s-i8VZx#-hKB*#zqyb=)QXu^+58;P!0Og ztEW#=tn~8|6w{yzX#2wl^q|G;MooKctG5;AfZJPgn>R12*3l%kF`%iKi783vf!&d~ z3czoHtU*!B**w-_^My<7qMDnQB$?5BVcm9@oHu4tIU`d9eeq!*!$7E->5SYXa2KAc zlNi&OBXpzJAKe1M-{Q($`vF|pP&$&vZVhPoCJl5J9a}e&&n}#DgXkH+!0O35PWtTL zhgbBVAD^PumbaH6uUoY~q%Ep-R0_ds>I(BpRV&Cuz3?vKRX+P!S)Ov_fgB!z11QVy zp+*dUf_5m*H*aZ(Z|d3_nh@;tL$+5`J0?u>12icaEjiADJ+=#ejYbp}wC1rql({q^ z>lGHE85OFd5>C2d9$2lBrP!_19588%N~n_yDFfDO8EY~sf$zFh&JL>8_LfCUR*a;| z&Gy|mzW~O5!?EG-`pG6UcJkGoeXYpr2<e|OTh+HVl$MXjta4IeZJ~I(+_?nzX*7x2 z5P`GjwO>$28vSydm+rkwhJ>QVN0^hnn7lDTy6yK9_+kMUd>(5HIUq6}?!&9@3?O>h z8T~v{_%@vP$$h!wr$RX@j?Z;SZpcSbOd;>Y)L(k@zVGkKat2CYx_n^=+#s!~C&Dlr zRL<)Uzxtg4eR?A18=&+E^g3tfW72`{(tTY0n*o8r?0q?i${{V!G@BfI_i$UapX_gR zlArLf|5{CSQOqFiMYq>k^Lt0r1hS5}de?Y6#=8CFvkk9tZ}$)qL@oayNuk;RL}8d_ zZdRVfUPHn}PzL$%gjB-iYzA~P_<#|}Rb#)q@y}#S6oTA-aVo?4>0vpB?iCV^b5@DI zKti8>(&Li`Xzb}~`xI26qk}83C2^%(6M@9TM<SCQL5=6M7>(3;qJSJtv*Y6o!_fQt zW?E*a(cNTe%tVuTz;hif(d;9AW_a869Ue(N0Zy7(Qb9f~%2=bb5>0RfLM^=q-!TIf z;O0LU?F`SSRT*{(U+h^5Mhx=X2sy0%0e|;=%AZi4>lNYOQ7qlu1j>T32%~3_H3M<F zg}4x1AS;OwZM{ES#Fr9;Zm5h<&5FHJOmg$yvnv<_z*@hZWm!vhsFA<tWqUrKUgVR! zsszbLceS%@s42!zVw90du)G}~0fPgD*#9+t|2IacHwx<;g>_?uZpCorB+rDt4)b?K zKE+1Vyfef(pb>Buyrm%9lwp;=L1hzf7k=|_yO{nBo7)A_V2a&yuXt(af>>10Qd*s4 zXTH}~Q9a9^rMK}@cX)Q$Ys2l;dpqw@z76Of$49bSt&N95o*q6QuEP|~ab5Z3P))Xc z0|kG3V`GESLQwS5ks@zJ&;_r5*%KsjE*~#9<yZNrR(6Ql*cr8jiTgYWOgl1`!}DT1 z0sx2`+Du&$1$Z$Fkc9i)$Qt*9^=x--54>4<uQ@A=$!tfMHN<j$>HhK7M9p|sh{1rm zx@8JyqqV8BRygE%B{||5@TQGp#!Uc&G@?d)kkSZ<oF{<l&1au5_7bvY>7P9f!S39> zoc9LHrewz(o0JGCtWK9P<YYbTBxlZb`R16sIVNw8$;M;S&sKqd?wsUf)##lkn6uU# zj(guez4!dd!S2qh2VXva3G;;P@Q|aBt}}3ro0a<afFFIQpmM|aAZf;EbNICDNn~y2 z36OfrB4Aq&m0LU)MKMv^K|1=Ag$i}{NiQY83OEMImV^l($)0?Srs$@C=P-&w#}*di zhW3@6%95%Rr!jE#bQ0xd^<ctKv?Vf2vaS_}zz0Io`-#*vMMBbHGet#GSvMjXHjoc= z-#vBMmx1p{PoFeb!j~cS+J*6Ul6BV<sCF?~C4bkWcabqc#>PaH?9f7r3~6pS=v)Ir zbM;4>|GF|VlbLaMP$wLosujl>WE+hLp4c!Z?T1bjONETr8W&Q7e=iir_P}!_r?a(_ z=q^NjVE8V_B<qt#YELx4#&`x{CFr$+mcziaP4~XX-Vb>N6ULVHp-yo4-m{JIZ*%>v z7psRIZpQ2BZ?SrsKU4*J4E@zGg#eya0Ok?!j*T%aGB-tJm~_uoCDN>7#2eeR-xp%d zNVP?~U}rKynbkdG;+AV8_tZx&Oc!j8^yKyet2<3Ruo$HWe}07OQ%;LRa#hyXvsAmy z)7>7TjZRIKF}L=)b0_)z^J4f$Veik4y)7eGIA~BV*pa9QvY#UF`xT;S7L$uTo!Ys# z<t2mX0Zw@WX_2bk4_~SkvHD9FrEu*)D6Koavz_>51)4b#jTjND6G?2%h)Ergfr>a7 zKR%-Jz?7+TTJgrCHSU;{kadriDDo1N!WngT5I$};$K^mGq+hJC1a40{>SZ>nTN1#* z7iDEi>03#<!BA^fMhfVLc>Wa#j#ix?rl7{fIvvxx%~@jjeu%=x4@!r4;kgEHyV-0u zO<P7_-11v?_6m3dF@v=i5<8!0v#2?tW-$->i^n>NFg~e6f3lf+1_;<L9%bhDhPxiM zn>xeQRz2-oZ2i<MRVNAG4cdNqU$ZMiNWCgUIN?I93Z-5!aN8t<(fW@BB-_`uLBvyf z$H^7FuZ5BXQ-0~C{^nnH#;W!3wYsRy)U9T$KYPA)6#e;=Pv8*xiJF0#jPP1~Fc}H5 zM`J!XII~&b(M)MF3apg)h=COx0ju_@==V0w6`8UTaBcC=y@6+}W2X$krJ&g_l8x@~ zLIgz6b5Trac>Q^@uHWMo7;R#-uB#okD4>Nc_gKrb@=Q0};|-HK3|rP}qiAv^$n%Y# zr4>y*L``E6)31|keDuQ7Q$tx5{>MzFYBm>ZBVuWV>&3Usy4y362+qSZpCH#akM05* zurd3k3EFBV>l1NCy01O`wKr(8VDfQqc!sIusda&5iv2&s?D5pL_||}R291_uk-?A< zY=(-#gc#k5ld1?9&E8Sis1G107lA43$WY7M_GJ?oIe}s{*Zi!*^gW0Q?U{=;F3)<D zHn>SC1dNggQ{oB)!V&_XLKw<%Z35vaflnhe>1ZSn4Ah>EGp30&uC5h{e9o(UYNR|M zvr=PCG8`m`bPlsBN8S(fAO!6MGwUaYBwdIJfA?Kjwi9j6YsRgHZUP@XTeccyJVzB- z1`p=GJD1&QJP574czi)W!zgJ%svwZlF$Gt;gUt1Ug|74skpsEcLduok)hE4FNRo`Z z_ujB{ItR_h8+mn`2UI*@f`x{bteR)+si8jU3DuHwlqP=1f*euC?C>?)N|)TLzA|yz zSGk_5Zd`pfe&I8@94h2{#(h7m{0rhYF%x?`ZxlvE1Z6th7fAB9f{T;~;1^u965d)| zNE9$XQgb{b$qWxh5U9PR`YNz$mEmmIC=mm)(Fl7GL)SNLkSKw3Wki~Umu(?Va;?EP z(;Q@<QCJ#CYPlI~T=Xi11)c;?H7RTPB2~d|QqhX+Y1I%FHOr2`Vg}bpAv1`B)x~a_ z^IF9$d0ULfU|2<X$!q;Kz3NJHlSZ`Ht$^eoTM)Q!dV=ulM^g|FR^#%mwCn`nQU`2$ z7#nS=ID4=}zUvh?O1dN@7}_|xJUuNZd$aKpsv$NjRn>;PAAhg<I}gWOE4{edt`33* zh1=1FnG0pBRLe+L12RBx;hWur398$<A8S{wpfQMIhRj*G6#KR!mS$WS#G~a>GCqiq z<AxXwGD#6N(qNUnzGHqPA4pM}H{?QYO`TiNP3FhhTYlZ&@D39t(d^B}j>3LH+Q%Nd zwwT*$C)!APmFlvrCo*=fqV?U|a(@3SHsBR@abv*7{IqzNSv&ACY;6-Aj>)B2+lrrc z(9bH^k<WuL1AZiEe-B$H1upa9s}YF+-Ll_XZFp-T${oOhb%`}({cxLFl-Cq9k?6R5 zPu_5Gnn%IwGXe4i61v@M>0GJqb27P9wM`7R&r$*I+6J|;W~<!^m#3>gx=%f!N<_v{ z-OmV=+MS_t9s8F(Fspi2?$O<bZ2E;^E816S%jZbdJ_l5d$*BNG%=pw!ZjH-EaVEH$ z2A%x9>_uQALi(|J%Vnp?mN=(0&G*5KZy|y)!YO4i^9~PJk`^$$hA#oD?~=8Mohf8F zRla><^k&ZCoCkKm=pk*7?(MO9-d>AV4z3Q7qk->1lob=&V#^36_X&gxaPe@fujAZ- zTw+`v7emD>s{thH@_CpYj^{AZ^YI8cXpFFeCN{72UAv2stW^bs_Uo?GGuT-wk}K!U z7dIHFnjfbe5V;*K78yx1GYCT_KGas^bi38Wfb>Q!$8&Tej<Yai*DksG#YDN&?Csat zIPCc)zCX{?key+}HMO^$k)yPx<5Ufo7MfcN9oCELAzWhflv->@nwo-@o7%#4CHi_a zVQfn0u?&DSkhbf2*UgBGHCgs4eJJQUa@konNJGy(ozE((X#)bp*0U1@yi*#jxyjSO z<=!%6lEh$@q>(%0x7oac+eh+xW}+g!PSh+WfIY7XT6Dy~_t#)ihW4#Cc%4Re(;_-^ zR>?_rffr@9zo2o5M8eu)TZ*lRaYls%!W`zeLd;cdx*$$$W*tVfIuUVipRGSTbG(w- z`K;U}FN<I+uSEk@gfhl$2K{bCITjag2DLoh8M_v>FzX>$tZ9L6hZJBz4^E@wQFNy6 zLu+l*P@p<owi>{;P83a5#8x4MBC%&MYJ~+lwy~nF1w}Zp3rhm!1j37Uy%CGUJ+_2= zIGy18L*z{&XAl&pgBG1|JF%!aa29|)B39R9oRu1B5{+UyWa@d9`%S!#bo;P`oPDpo zsgirpWTriQnvP6ctkv!W^}o?xZOa;<a<LZ3Ic@0x(2g&x{V+Q%#`ER%sT_0jT{M_4 zt%wKWxLF9S<+^TF`<5g0U^OC1_?C5<eq?(zf^T_eK2b0nqZM;3+#Yf;>IgVK&Zq7w z(F$4_m2W3!<7~b{Bl?uD5sZ<*ss7?F+6;~NYGhYIXQHM|UKF(~e8D2{)JoIB;h>#k z%%0GGL@S?EkFS`h4OOVRq*dsU*5bxo{>EJX#$5ix%;oP}e=^W%oMLi<$CKd{u|6B$ zFDjs32zAhWCoQ9?tfoV&t&CS_Z7s=G3K*vL;AD2^G@HJW1M*d-o@x_HrSM6Ry@Me| zYR5l{$02ILg{a5cR+Z8$sNbp7UP8NEg9*<<hbanmi|Pezv}#7mxsbw}cu$xdn<w9G z$Q+2_rR>!J=Pr9)qABr7G*k@Ca}6L&0fG#>PL$)(6Wt&$c3^sO<XXOGk}`Mmcm@0r z-X==Xa0!eg#`!=yfrM}ikX|idrHGC?Qq%)rp3R^!o8}n>E@aHwDW>ef0QQO{%`b}b zT(O^&6{%v^e;sJs-AHb+;mGV6pcbd%JL7R0N(Z@2R%<!j8>V{aQaQTo6-P%Y@78vT zDuc$zGox}xYh(fHo)W^>0l3SH>p{mAXSq%Cw~wK!8qnide<WCAU9yq${;7T^G3_lM zidNAy&X+F(hgq16N^>)@j`GWVcuv987u?O~3czGrs<0f?O3Hq+##F_gK`I5LTdsxn z3TDh!*Y5Tj(6@By(%Z3B5m>2%YTWkrFaaBI5Wg)1sG9LWjqk}ysNeze0ZguOT{T|T zLz8vwtpfGm7C`nUt1*j)5;$r`9FeFXx63!Ph%AwSO8v%&UW=$*M(bB^jcm;sSONqv zwe7s?5WyB$tVIu@$gLzeeptl7gYam$Pxot+7)e_}P?Q<q>k7wPuxPaw4}7{ESvb27 zKqDaG;6`m!=&Y%HEGC)86uwTVz6hBEH}V(L92_dFB~$&OO<=mh+2SfOU^|(n<9g&_ z);QeAIA>Y)hT=CmI%&r2`42H}a7RazN~OpgR}Zf272V@Jq7Pr#s&C^;R5`_^%H|li zj5w-jP9m2s3WHU<k#|vuwuSFM=kFEQfp5bsQdcDQ)?$4XdLIyY$HV%>J-`Z2K(7Ea zn`R0;Ri4%^f*;zEp@yaTUiPPz&JPjkC2*sS<1M2R)`FnH$S%kh%;M$PqAO{tJ2jf> zcsna7syh)qb<Lni#nq`(Q!g6=ix#|y5M<ik^>U_z;W&qAa2798K|SP-yAA;fI;cGs zWM4u5E+H6uDd>lL-NjDzty5h(t5jryXVFYh`UDY5&SueYCTD2!?gE*dfjPX#2FZPW z=EPyTrCXvKvW*8Br1#pidn3HM5nkO0ui`m;E_ym*GCpkbhtJr<FV3?O#G)JS%+RTf zJ)5eEIL!9cdsGgL>;rvPD1EYXSYcgqh&imb7})^7j4B__Fv`m=1`SLx#2N{+J35M9 zCz)oW;#@klZ-6Mum6e|DJ?~@BcYEg_!Npy;nLeHzf%bgPY){=!8j77VJtm*(A6twJ ztC3$I4c_P)F`4C_4rcm2{Q4Yz{tNth8{Y~>sYeb}VlC3M4fLWx2lo#7)OS>UZX?<w z*Q%gikLvZPUN5MJu7pQN$QtYAOZhsd7d^8u?POiR!!ww`W<F0wf!qU8<><&W>r`(K zW;JXlDA=p&{FHV{l^+A?g?)NjDoUlu^*{dgA3rS6;#(1}*@-$*k57_&1z;C)OPH9! zHZ@cAs#)^cCh(vXs<bv4>Svol3RG0iPf->IN34Q^S#2*b57{}WWsMYoM#8m?uPpS` z_N(?HRl~*gs$Oiaj7~FIZB=X%)jnIfH-MF_xoU^HW(<QR-fq_6twdXg_RtDs!0hGg zn?4dBPV?+dG=UMrj{C7;^p+39AWyXZXZ7_N6Q`-qoo(($%64VotcfNhrq3_7<KCS0 z=o~s5M*IX_6YEQxSTs2tUSY87A3oUID-L!c0?N#Y4OQf3^mFij!K4d{CCM(zVua^o zh982A*p!Kr{NX<Nq{olF*(n};Jg2kWA$#YCqXKf+eIgHQ`<|VFsD9puSPJyNf%vxR zKJu*6tYb4ajbBny0Tv53A`j;7iW`6Gm_kqh?qu3Tx8**zqQ;+Ct(cJCsNyOydQsdW zRQHg|@Itp`z@WBtwO;rE<y>JdQKXa^AoaqeXH3|o9s_Y#;PQgmE#R_CVh-;BcClMn zQ3Ibau#1bOQCo>eb&;YXH>~c#L8-1A#Uu-C8>58)AA%h-9GBKP(z0gl&MM{9Qix)M z&_$Y+-i*3NM+ZuYJ0d-*HrmVS4{GdmQ^IE{=tvyVzi&1mahq$k^N1OOQF!9BxxVRk zya9v`<hF1xEWBA;crz^Ai@ByVgj82<_H-*2X{>guOUmHV#Q4%Pi_qX*5W6Lu!R;Ub z36BJ(SaM51w_?85mMr4c30%vFwN$tLQBXcgWcAt*7lV+qKR4;;tb-IgG5}i@4j5Hr z|Fc27P>&b-ok*d^q4nI*dTwaFRfg7EWoW(Hp)Dfe4IBp9-ya2kHa`mf^gagu#9i`# z6!a08(W_abO<rj8*M&X;Ga820s~y_HHwfJY8PZ`kd;=_0Bwq=VG;!#3G$zMrpEz~Q z#FiA?w7{r~lR+Ue>p4n8b~mp?(Kllx9S0#fp7X=>0!O%M=Cm0$>Y`++vKQB;^dFbh z<3`(=jKE^Rg2(>2SZ!PW#tBX^3%d$En#KCnr%{8|n=7OBW(-{y?VB|BHzM*I5qXn{ z9Jaak{nKXH`z@Pbq{W;_wX7Vro?qT6Hf8xWepMzPWBi87?2hq3e8KXv8fBXL&Tn<r zkrg#-`XlK!QI(qVrlhv*C{y!0$KJzk?E|Ko;Q|Qj@M|-EqSBiCA(qxJcj@e$GLrWf zyARn$T}sB(b;OCNdHd<Mn1rxe$;Zxj0J5CBM{^VBN`IDB0F3Z`V+(xQ1rt_`ozOyk zZg9L%DeHG?m(BttPNlsSdpwCR7+<0*!+(W!1t${gvOy5D&;Rs5MggF9!R+_zB7f_p z!a&K5NrVB49-aU}r+n@xidn>^R@&khY)ba*3txc4OoL5q=vc917Ts4E2{Xe2I9bc_ z7!7lvt(RqXx@%viYMiiSKbxj)FEkCW`v}w>+sS*1ZqlcY7pya9s^VrzBVw((LeiQo zOdcsf<sSS2GBBB+K~s36dWp8n!ZgX`u^_W%zJ?-nOVfg4Qoy}=<@xLSi3Woqor<Uw zUP@>xB9nE64#8<lmT37J3;{tOsI|x@!Rj^Hh;6tnH9Tl%V%SQ|uoyF}!urp0Fi$xP zyvk(AH{0x4H0~RV{bozzv*e2-@e+Ofh_Un<XCV$BA9DK|$^afL2;1riD2SLrD~J`r zQL?xswE*nYY&au#En*k}KWtg2DM&p;(pk5S85=l;t508!%foDp=*26v13ej;G<t3N ziKiJ!U?#I8W`A#w5uN)xY||tY=j~c5!df*ggfxW;VXn&w*fhVP>D3ivG_sx`u)1jL z^r|?`K_0L75sDe~J6}W(i7T!3BA+b#;_XwJ-7!WKYLci*H3;h<8lLF@O)($3Qjd+2 zn^*1l<7r2=nWJkM_r`+cjA{bp_z^J4I@V@o^er*VqocG1Ut4YW8>1D6!KQ2@wcQiY zZMjxN9%4Vnhzks8qQ}#zN#h#`Sn5~L%Xnytb=7_B^sBQpB5X7N-QozV?me{yb!y*_ zgeOgdR(zWxZ}}*)&fc1Tqi&zM3*6Tr<P%mT%zD-t3xnybJ!fjVT?B89rMX>Az^ET_ zLDjIonj9^GPW>>O&n{^FzQJ0DzbMXQL-izBW^bLA=T#2Z=N5wU;2_K}9NI^-n&&f9 z@q7}k8tgC;J_<;nU#Zn@*n2CCH)<;D{|9{ZsHo1e+3;is%ck{fsc#aIp>}HP5Uqba z>I<r0j5>`Nt`kYa4b?owktKpev3CM$&1?0efi2eAH2`-dICwi|E!<M_#A{UV*E$*) zt$TQZ{>^VQGd3<By4h@QhMMm*8xEj#v*kWy%hlX}{40aWIRDaRn2&MB#0{vcC|*lV zrPi9q*aY=V$u7%a@7v7`FBylZd5PBWGAK5W6`S*7AHpq*oM}4ni+z<wSknmP>Xce% zm}6(u6k|6GWj3;A+nC4T3<L8g>k1AKR|GQ^sE1g67#-CAJZ_kWVjI`|i^s{Q$tI*Q z$VL%VijJ<Rp5#ZEF2kfu7+%K5K_#1q0spR>!K^w2FX@3E5zjn8xe3DdSUS3fK!hed z&r2P|x}U78adv9Uy;vc}J}>_qHOekQ!b-%94V^_50%?5oOV<Muf4q(e=DLvExGsf? z$sjR5y%a(MJua)fUqikFQLep$xp!UNM!JF+cOiQZY5PjzP_>J*`MAtRzFc&~y^2rk zq(USGR3y$)7I@eSTEY_)6QE&d?o{21ijMr^;=OlvOenP)F>6}%b#IO(Q`=2D?1$F@ z{?619eFc`1*c*79#dtvO8}0F!j+cb-@$e9yX)LZK)5}dT@P?;}?4XCp)>;gauf(<T zp2%p`(_zMX5)i2yzt&PkhwpQ>6i60rfMF07zjbGX&bUM|0uE!~WgKcXo;==4)l+#k z7v4<(s0f{`sY*65%Yd@1fz4$NETR@l<`&SfWcdoy^NO!FrC6oLX)FYVi}9}?M&k_S ziV`_P%6_CR{A=00kxmRW>ji%trj0T{Up1PKk3<+G_|MItn&oG~eMShxpa5IWS$TGr zk77F*dXk|d@C~hCWFP6zRx*k)3{CUEw?t`#H{IHc(p}lURu$m=#XO`iw@%Xg=k0cF zGkp!Apg_~UZm0gT`ihThDn*&X*=InuYKm&cB*w2?LF3JsAq77)WXq?!C;9MAKIPk? zlU#O^c{KiVKAhp<4oW|@o$rD1np*Xj>b-x3g0fvOjGDiiW|Io+%Sf#UW(@Qk)Icj7 ztcV)BVv^!W)*>SITjk{ObefOzi%gMjik1aKN1_zh6b1)ulUACUPehfplCwlvaCADc zlY-UFCs;MOS5M3Aw8c#h<f?bymF4LZFt&<a=25+iUt7&BEYZxP<%23F#B8n^F<X+J zon@0&JMtbn3qDM!JZDKj!!Vk+Yqi5*Z}NQdBAcXgHmVlY3@Oyg@|>#)wYaql*o@SO zdq$Ui7+U<BI%7xk<yWT&+z_4|aPXp&pb+e*`tP^Pz=%uh!!g>>KQ*YrAp7(uUVzNG zf7&+_X(;rqF7)k67xZPi@&HaB&$1vs6i>+?I=qFNE$=|{r%`vy4m0U6=5Ff>b`QZF z(_|Z82@<j=maBZ<Hq~*h4z@mA*KTuqn%u^w(<UA;oJ9@0aBZupdefr%Q%fJQz34?+ zEQc|yirHJm44=#@NE@RFck(kjcT!eM9p~=JM6&70+*()=MFbdg6HhP7v{i{d;Na9< z*rBjvtPb^3TW>w-wUbYMK-^AxY}Oi#u7NvlZW0gpu3P~Dehfn--@2`qQmjBwoK+x% zQ(DEcGcZ_m<`Hg0I+S7USX?DLI$340wz!F?edBR)<8e{%agpIheXP*V+LP9BTaZ*` z7I{wu!KBmjLPDbyh<;OAjd}7Oz&SZyU~1KbqUqspuh``L^e~?;lKs);p!U<e_7fZh zwI4Mjxa9k{0}NHIb|J*Wo@$2HL5y?SdaCx8Z-||KL<VEmL<djbpQ`Qfir`EHTJaCR zIM1hw_tz~gIv<%akmq4u+4RG^sEJa%p62|iJtxCsRe2AP_X}$_X@hN{RQ1@^5mf3M zgb^%h4hIR1!2%mP4;~26>=Mkg>#MIHAhaITV5ccFT2cUVL)7D^5sgPNNo==TQvtK@ zY75v6NCP4<YClqZZQ)th>C^Ey1+r#<G+0j<kTevD10`Ca4lFlJ!wu7L!!-Cz19A;R zohR~PF`kij-skv5%<LRYd+{|!;n7FpQ85|WBe7zFB6c`ZRhf950_gBI)xA)>=#KNr zvGdRK#jcCsWF{`;-W+;Ojjx&?9Eu7B=P!XmebFu$tSsEncE$HPRlZkAU+bdc6H-`> zT*z^6By%9I0B1R}?rC<0L7P(Vz0PVF7-Jsc+V17!qvnJL7<2Lp{sw%g5brR^w`D%Y z90P2{n&>^&OGz!Hq8P3pkbTfu)~Zucvq1?^?whB<D(dSycaq0PKsU0<Tw{J>)51`+ z8@0#IE6N=*1JznSoS6h3o~ka0ix|Q3AW)(Y3$Zo!i$S-j_H?Hfp6w<hdM(#r7C0+d z%{Q1Ci4-!SsEo&-zd40(PT`wVc*!YDfeGqPVHaaC8|O21AJjP*j6K^`&cUX8sDBQ6 zlFH_D@CvE{PMaT(E}v#+dNOMsAvXscOl<iPhSG@O(Bvt91Gl-I(Fg*L9u=21!X%KH zBZbG>o%H$P&p~Z%(``v2AI@aIl@Hfj$!#1BglSU!dR_&-i(fe4rH8Lh>Fl`x**F_r zo%%hX>59$r7ZplAoR+6A2)9xgcSm5FA2CM`x2nxN-=T5VDe5UUG31=J$2QGNtpw$& zUW@PzrrV)9F=lCS=#5rGm+NpnAH?}wh5KpbfaoILYC7y|xF8Qd8(5+^KVX>=4y@?1 zV|Lr75spH{Y4p4l%{P{e?<L)bnX+xG-m<8DO)lvsX4DNEbi)Q+g$=TF+J@Nsq?g)c zJV<cTER0($l&fGQkad!5z@-EFj*{72nqcnP%xHZ?X3B^K;@aM=4~YKYe4bumxDf%k zz+?>CHX)3ojo4_?D>Xvlr2~czsOj&6@<X-c!gpylq+2PxQmu4-$1oj^C{odcED}}M ze4j%&LL$+fI~+Wqey~q6{9mjY8}GTHk>0XK+*lA?A`YW%N=MaRaXiZ!S~@0kHv4Pq zmae^|1s6ujZ-cL6JGxM-G4PxzwpCYPhnrke;x%gbkKm{+S63OFAkL<)y~tK-YEQ3e ztWCumV|aVwgOgK;gP$FNpcXA<JodQxTEJE~9JmX5CM$_0mDMN(ZbI$GxV&Mej*M1S zo==B)s~;EC>5)1|2p*nKGiPxY%u664JEb^Xt9H8iA)PMPB7yTYk-<=J(93cH6-Ffe z|JZxiCO59^K=6D0ij-Sz0AdzcD2nPfN~BDYlth~p8Dyy?buEI*0<u^jQ2-2}SOv0c zqwQIb?FifL-LM_=4o`%4><?qRJv%$w({7J{%r@Efr}+ze9`|wXE0IM~J@zcr(JW-< zz30BqJ@4aSni!-gjtb+CyTSV_dlX=oRIe1Ssp?e-D~!48*G=(@v9guX?4&k%O?0n` z?lsXJCAzJH5jL+(0bRmRYX8n<xhkzz5l_^yU=3A!bx7!qb9tCaagR=&qGEbj1VSI? zCQ8BHg(FJ@pEg=~CSNQYt)4(QoZv-FC|P?_|GbE#i9)KgwcXihX)rkd826HmqT)m< z5yZGI%3*J}Tw0uSzo}Fo?zOBfMLp`B6T<m5wySFBBp`d!4yK{%xwg(1Ob>mkf-7=5 zk}!2jlQLpu7dRyrrKQO>=`Dp_pmbMg`D?)EQ4k#kq9Z_TbFc<#zyaYVT#34k>WfQF z29H5rQ0x0?eLt=5r<7T%M3OOijbo7hhJ-ewSX@dcjLy!RbLpsiIi6F&W{MBt=<~eW z{9|7D0MooJEN6;7-xwanm^=r(eL(-tezBk^5@@e-Lw_;A;tX#PYs{EV$WRztJDChs zFc69$@g;6cL8;h^(Qz4>4*mVGn14qVNtjB+EIP#KYuIzBeh8&g(*oEV_VO$ifg@1D za6V`NRH<kY19ELOR;zkwuK3EuR_YkeV8?Wesa{3GPnz-O_B`Ob-3hreH>oGBT0KaF zztQT((R`9UC;4&veKsY!dY1D&0_`6FsWh;9;Nd~L-9~`$hb(^RE`5bT?ZHar8T`{* zIR;;-;1h~AUQC?iz~QsO5Mwf+^E6Jol1kuG!2_(7S!=pwO}D%PU#&yT{UhV7H@tWc z(vi{+`LH3qDQ~QdcP<%rUBd|nL#|5WN92^bW$Vn3kDMCi;=%Dzvq3n&Az&Ymhl^{f zx{Q8z5ePZ}0f^4P(54}xVTx2p@h47(12|L{Ic^@lIJIq1ph9|iSQ2Uw#g+ovO!whv zIBr^~xvZ<Qqn=+zp=lJ8-W8w4gjlU7&Blc*Vrt&u$@oA4>7vK0?M6(%;aYV902)_+ zGH(+278;6pQ4UP0IgH+xvhfajui8t85H!naduu1Ef7*5Wg;9-E56(i#(En_5l>W5i zzBuh5jEEe>Ew(hpJXuFwIgFj9cdlfYJhLzwc_gvzsg#>Qv)EbK0v!y3X&Q<ox?Otp zma%%N#J5Q?j1oQN*x%k-8ndQq)>KU$X^czIe9iVVeh8<kK*j-zs-nEs{LK2~uTOsc zlTYUY_mC1IkfZ>2G9QCkc~H(uSlc;H-{4aFG3;<Gj=N!UfLjcmrN|Hj7Iskb!s=ZD ze+!hz%#X>&UZ1-K^c4G4klWRmgC5VZ>ToePhpPGEgBzQdu8)di+^O>t$NzrW$J}-E zi}P7O+!cdMS6f27Y_rb3jZ~3%Muc$DVksR)lxX)ctPP?ZC?ISMfn@6tUK#^c3lG~s z)Z)7xEa&7Rw6Pmi^wxQvsrapv>0&N<L&c-v>o)$jd<ye0lA*ER6zAgbF@nP(_kE<( znD+s)$}mKVeObag%l;^m3Wi}OP4|f(Y(O8y0X}7OA}V4YRrbjbFfuO8jr^#nb)4~t zY?bCFCRSAoK;~bHW=HAij{gxCMy-YaWt+cjJ72~fj;D(pnEnZ4+;bt1w{5BIbSVXZ zrKsAE!UGX}JkvjJ0mo$0`)s77&$NkBf@d11VkYhM*vQQ7segZBE~z;q7?W8D4TU&E zJ06A-H<60iga};=PMw|#aCc{f4~lFCCmH~y%ApeqAQAsH1x)6tiu6?v@-Yl@v$GTX zd~%4$rg`DQW1OwF+))XDa$~6qdyjiNRYfO+udhUqMY0;DZ^dfSMUel&G6CqPWq-R( ze4?qgQ&lTsvnEQM#XbZt&tj_)+cvhFeQ0)3#{D@M*8meo@&n!v%@#0pTkXpvL?HBp z*}9|E6<S(ZztdY45Y`!*{RJbK3TAxlO!3$rdBA0kNDX%{P-Q@OA`#Ib3zZC`S>eqK zR0o9&-W&{P<g%OH8^IpIYqTMe>l1wo8Trbu%@$2PWd<e7^WJi>^Akj9PoV4*A*(u= z4f`sIz*hUcoegOkZ<mlWrFAQ^s5o#g3qm@Vp<p<5nS>KD^;O7daN28AF0Vj2<-t@b zzs?WU)8RQ_7o{`Y{(em5`jiAFzP6B%>h03tRgHW%Rw)XTmsw!Y9NcI@`|h<Ce71L6 z7zz4#zX=1&@dldacu7qYo^CjY&|55xhpcQ5;^j{G8azQ^EPy*f??-rSMH=VKBB;7N zNh&T+tc18iH^ytOEUkG!*w09tZ$Y1UOQ6lXr2DY9Y6_@!4s8Q72LIRFJu)+I!PrvZ zct*DkxJ?pQowTZ<23YoECXH5ZDBOjW8!3MGdo%zICbbx5w=izavvG902sAX%ca`2c z>C#w=X3(r(o^@as4XRsEl;cN5e?bP_hLVg9z+E9)AhSN2K&@QxN);`1>3%sq9?geO zOaH^Yo50_F`tciB#!lrr8kk504Jo8$_SnFETy2X$sDfcXPWXb>!x%BFkv3o$5Wlol zWxRk>%OvBBX1J`#yS3mBM(Bd*%ZkLB*!|A=3?-0Po8oRn={n2~JTVG{A1GfR;Q!+w zSKuZ!+j_gIW?Cs&m551UCWD&Nz^WpD(6t!36#qw}Cv~EcdTX5%3FK7=pPfdgORO+W zVZKW2AgCtu^BvfLzw}G~&D`H7mF~VL6fm{khgw^mP=dMET&(4nYx!k`=E6-l{zlXm zRk6gZL5B<o_U0`@(@7{0q8E(J*PhUvM2$>wy~^3sa&S-E>Pt}m*YADL#GrYVkZ2JL z6B!yU=H}@X(=WoJG(hc2>UD$F`g#t+y2J5sVfTvxq(ZEikFnTh6>}98m}nD+dI3vJ z2M3<T%&n?)*wT)|&-v~35xD0bi7_h;7FXvVWCK+@jQ~<kYSI!hVvQ(|TCH~dhLVcH zsIsuCx#YIJdAdM}sJkZigJ;YX+tCJs^m<+iL2*N`2Sib?$iOg};%#{IE!F?qB+iJ` zv>#(f<*nhIV;PzTqVfRQwLSBY+xNYyUEwrj`x8&qEXT5EpK|e~w}NlKjqb<VgzK=F zXY-?iGD5M;XQNJgd!3$aa&N2G+llYJx!iIlHl$i+d0)|+Xa)?&Gt0*+wX)roC@@9i zsA6`fnChn7qal{7wNoJyLUt*geQ-+I95f)dbh3|uB~zMd3#6Zp@TrSH^Hd)yzA7Q5 zKZQ1Mfl3{Y#Tu<R41nK!ix&ftCd~>x>f{;n6%4tReZZQvE-zs?`g9^Rd5Gr{ZM@!A zI$tmbM`+;hA{VpCQ&G8%2FXo?tu&pp1$)RjdT(YEjXPb%*9r?j8%aFA_T%lK()P+q zu;CIJmyC^E_q+y;bv98X_QW{}-*cEEN2$A8Dk6}+c@kRn*p<>>bm`x4;*>nF8(e1U zgBLL@cAO@o!Gi@ME2o>3s&OYw<mh~N7?e;Y5z1NeY~*VpILPeEkg{6rQY~Il_uA*c zR+ia*(SL$`rZxsqJx|A>BhiU&XPU?J4G&uhOV{(nUBmy>#Czt|b|+LM$9z*0Yo%7T zXV+RPhx1~sR_!cSNG{KkUwk^>XC7KTA&6^F&m;YeO`E6Zsx@t^)n2tPnO1e(saBn( z2I?4QqY`apLCq^`L>o`m7J9T}x^DjQf%b8qqco`5f(w1Gx2ihcUsuF$VS!RnsUs?N zR#u`zY?=U;vD2zo7|Gb_c12+_H5a$fs#BuiZug>Q=C2wQKy)Cl1+-3>00FcTX75!F zb5&e{dQi~Dhmvb3RK5`>AhbkUBhDJK0QXT60-hL7UVZ6Gp)|^SvlA%e=<bC}3Qi%( z1Jwwt@7-qFoAP<6?Zf<J*pa7j1wLkr4mrB$y_lW~YfQ4XOJ2+M*K++@cF7mBk8XW& z=Vtaf^rpl)VyiQ@Hzo;UhEns)vLD%;_z!D}OQGM&6XY>mF9DTmy1-s9q(Savs#JNN zZ^DO@Q$Ef2idk_q*T{s6w;2wa2GWlmX@F%&1>$tLf@E39_^V4fd7<d%_|z1V1GWh> z-#?*8l?`3_G!bh?bAy9j8ApS(yHN1<kn)mi!r)B>m{&ZWin|!Nc=*hslp7LR?EnD6 z#Rcf-O3oQRBP8jx-MNa>V1y#I;)=^imUUx`t39!I!Heq7ai_eO7<;M)SAH}cCk)t* zic|H)Q&>-q_-bvMDaa8_jx}20eS7ObS#?f~?Kz;Htw0P5wV6l)SVXs`tUpx23sEZ! zRe3Y`couE2qZ{n3Xs}b&U}trM<lL+ex<6K=6aDUlqI^bZFr7%b5b`3)2uJ;-%{!e< z`ha!I!3Uv5hQegX6V=0OLHqZ#wKraS`(;KtAiO?pUy!mXF~3|??4|%mr<k{)?q&Nl zH$8600?@0?Y0Cr2Z61`bwFMwQ@)qo^)ZOgwf3BP;yv5py6#Yc|RCtRRIdIq!4cYDS zPPD86?TsJ-`g*;10Z3NDqTxOWkeh%)2^eqVg&V`hWHUow8v$yOK<1vnE^%mcHEFq? z``pazMunxe-<00lVKedFmD?rB#f<w+Zp8T`Odd_7ZDpTSe$4PbqxX&0iXl-x%%C!^ zjT>oO*Tu_O1?CZuqRx$y*w9titi_tOShE%>)<Wkqy~mgBWY%;uCE}sdWmHIFj>gT= zk1a(^mIou$o>86`sOMF4b3cXOZMp*4rjq(dGYL^ueRb^`!tX)?(PD2$c3DaAOuF`U z@0wAAMU>poYzs3RUBPs$Gq|tu%^KfSnJ9i-96u^m8ucqGpSohWQS&`$Dt2}u(~Y+u zVXcPpX+r*T3=><7kfW8JO<Jnp**i+M`0i9W8l${|SPf4p;Mmcq8qw5S3~5jOjK*V; z&0NuycD#U93Vk5C@&K1**~FcnXM4&d!9;FR!yl9f#qnrymtc2A$DWPKr{$=dZCR<w zvu?JX%PeI7@HhYB@Bi{oU;O5uzxeC#zxeCl{OOPW!p0RM3a$(7Uf%j9B6a*DRPmgb z^Ap?xw};~=U2<fzpJ&Bjcsz$C`_|=eio{j(MKR-8NYIt-%k~4nQm;4P6|eiFN&m^o za9;ZGq4O{Q&G%pY@CPrx|C0?tZad>uh5q!<oI=HEH|uP<#a{gOKY#H%|LNsl{@*YE z=!gIPC%?<{^3xyvxMSIQ%E$64g-*o!ZuNir2QUBRxBmWb|MSm&{C76~)9G*yQ&V<B zNjk%S`7i$4&;Ins(A<l^{&z3G|7Y{V$;r##|Fajr{a^UQPk;3LFaF>^xB&~Hh(8mw z7}}x%+7i7Yu;v@Xh918BxBvd-pZq^Be)5CRDiE^}z?$!EwYOo(zwt|*{<jL)bFlrk z+TX@E?_K)#d%whQI{4h*zI6Fgr_qZTX($oirLBbY;LKlvfB08_DCdtR{O2@*cD6`$ zYo_WS{^;-AiKfpus8oGD+yDJ1zy0@r^&kHJ&wgFJ`JEL@AeS+<HjQtTW!Xs1_ICJ1 z<Ic%wsFG2yTnoLO;e6qbzx<)IsdtC{Cy_O&S_E;XevjYRU6z-B^@E@O&EL{q_}Sn5 zb3CVi`mbL6@PCJ+>OzpG^YZI0?zdO1?bpAIo!4GQ!al`5-T=>Q%{3AlNJ_<~kEues z50IpHzv~edK$kXRT_HU!)~(kOy$p?SZ++97AvHVSj<sS^fcovM?B8Oz2y0br$<sVr zBGUQ2Kl<t4{@(P|`8+u|Fk%rvq+5U^H{W${PQ9mo^S}J`Z~rClEOj>i_V0f7hkwqu z@ykE{t(X7iKl0{+wiuP{-uz<s!S0v0Z$`)WjZ2p<dGmDu3<D;jfem#zHu6CUgmLX1 zf>uzEX2_^qS53|y?HA3hoc`DH+TI6_shoYzE4CH;rlEYJ-|xp4+PS8s-iLM}&f>fr z9c&hZVj9HNm?B>@egunfIR`+!*ImZ=DpsD1uVa;I7pGQP+_g#)wq`-sEa;jAtztp% z@$Gc4Ak78-iSwQ+!WMC?s*Yws=ZD4Axj+hLWwu1v4TI6dyP5ZV>Q-5Hl{QiHdi%%2 z(Exks#P3)DBBLGzIe(z!^~qd^?CnqHJHht{q@U73ZN21{7-4`Qw`Xom9fpfPdP*J{ z?wAYElNYzud^|;^68BWc)P2W>%i$kauRvceW|y)LG7O@%?L~!M8emHW?12r?TL+jI zv)Ac2K-5u}9Rqoo_cq!??M|9_leF9~NCUzb?_TBcUPz2LkCa}j(&2zMB5I@hEsFsn z#M!F0{qnEU`sTUDz4>b6_SV9U0=~Ws*O%e?GF%nHe_G7ur8bHP>?oWd{yL~)QUM%> zZgfq$BH<f7n=TPBpOeg*`18sfLPee5aYNqoAj%nb1oQov_-bAUT3!(Rc)gCTr~4%; z&cb@Zgs?yq4Vq{e7wx?h_*2D0yyuc^n28V=GQ=j}3S#=3Bm6hd=+8%*N0F(;<6rbw zq<P?6x`o)z47dOIQQ%ZeMbVYbse*A}Fyvda@tnlhXARY->@5=*lb?aYYE)--spylQ zf||YJ!G~r8&U#Q8V@Y`L*7n<%-2@CfLWQAB46h@J7$+YcoyDxgBiN1G4jP4pIc`=` z0Z6xvEcg^A7Kx8*qfs-Ol3bZF2HQ{zrQ3e0@*rX1{1#k3W@9I@!H(Cvhdj1BfZ#nU zAT`3=_Bhw=`j@=Xb`0lGqV&S`>93;gT5}s~Im~7cvyE~3%+!0+t!GplJ$h5FVlL=X z{ydvy(A6Dq0)Q#l2-aKcNTPUHfAkx+niz~98k#_v&kZ!<>wJ4l$7Z~D%LSx0H&HP9 zV+=^hFx-cK%Lmh9OwOtr?xyH#EBhuNMXx&gB;2$eu@!crYo+bf+}Y<Y)2-r6axB1; z**H}}4KH5Iu8)eNX=r21_k_I6_(yTtG?4d(J-V;9;Lhm8yq9C+1(MyH%6D{Yk=*U2 z3L}Rma}VgD8Hr2bbGOb%q0p0y5cepuTE4Qf9NvKHJhuHLEb>+~WtNFDR()uGCLG+i zEVLPHIcKLNs)!n)e^4HY?*Ut7!GhIl`(<7iG?1gs8Ceq`yhq*4*(zS>*OfrSy?<N3 z2`vm^Cx2M>G2(c3!a>f}-T_K_KE&{^3!vO*{aD30b6C^a1UBLVHT`&?fQ*<tL0T25 zZU8und5rCu{OAoKPPUIEL2kGM4-5zSz67qS$$j>}d$>dIOi3NMH$u6fb{&@jb;cqX z;5O3qi$gexp=r3r1Mepcw6#fqS?8@D8Q-SOv0oWi*@#RI`ax-l>Sgp0{NgWW%^_Qu zV~q36*_3dOIz2K2e?JK%9reN+`Y;^&s)&6s`*)B}r`hjpRD<Wv$|lalMqwumjYDGb zqZUWg#LeU4$><i7$PtN+qiJ;eNeT<Ku=Cm^mfp06&dC$q%PnfQICCRrFDyHw1fu^~ zy0eQKy;tu{OvEI?-ypTwn}hGsue7p~fZce#8Lcy$b;w?a=p-K7T+!agrTn<u353e# z-t@>gAcVd{31Tk<lq7ueNm!tklBJ8&fKE2{B-NC<Ddsn~fMr=t<m2K6L_V^THTVN8 z7VkD&Hbi|D?B{^QKi+@fR5l}sR*g><NBj1q8=>ii!?FOkqM~2raY?bB&eg!ZE+^o| zbq@(9K!qDgF&G!+jE57-l?ld0Z-!G-NHi5z3MMM#?OZx6He~{!GdVS2RdF;|oMFc( z1f7fW3!zX_viY58!7qhoDOwPn*0E9I!vf+cwy)4Mq0vhD9-118rNN)g1m9A{)Q~Q& z(^aE=2T)d+3sU~KRAs-^WtZu)r`r~86FCie(psw;+O`eFD=*{05b^}`M&>f^Mokn= zF)y)T2*C=npovI+<*iC)49U>Ox?U9vWCwvzyXFD}a@0A(t@w<zYK7Ssyo2sjb#z1u zg$HOn*v<A1sI!x`+)|2k<76`GsQ_tugU0=#uE$MvtK#-hzv4^m_t2QOG+L{YiWrmX zp@~f8L(`uciK@6EG+UKi%AKke!V|w+o-R@+UTyYrfrZqrI?F{z^9ppZfI3|+TXD84 zjy62%DOh>RD-O92rUKJom%oD?cfS~28x0?gHQ4vF&8_ykz^*kGlW7B3wkE&7nyJ_O zlf`0kgkON{8US}dh`$W*E~#!tfd4{(AC(6S1OE#PpH!CwUaN@`SSx#Ownf+Okh9h+ z;i#1d_ZrY(bf*S~*C(9l>>}?wq&UTLi&h0Ld(5}(W4di!(qUDuf?5~vxi8=tak2XD ztaX2$_YOVpJsQ1B6;0Wy)0Tgg%DT&RaH2F+x&10iF&c76x#SI%jA7?guYa*>in{LI z8oghem}ld0K>fDrT)U~OH*x*C2wwL*QQzd-R%CjeSeDAdCs8L7X!-d@y4i~QXE8qi zp0<nrxpVsGV)ZAZfr>rOG7t_??n=f2wp7`Cx8r1v4JHM^VPeT(#x=lIjRKBUKPdzY zMiL>1&0+uMNG3KP#kRcElr|lOZ)_iiaplA8^d{2uUP3~Vr-Tu`h=H7i7F)QU$4}M^ z<6^pcV|XMYxWH36MuQL$40}WRueArmgM+4;YxnTd;j0z=MXkEJLWE`It8!t=kkU?1 z-58nC3|xTj@69IDc~kW>Mex<_mJQphBi%Ih)N`QVT<)4&E_zPaM62#_^2|-<TtNn_ zu|<&NK*Ykghls=BM=PCq`{0;DL&z|r<;g9q4%_Bdon4`i@*}?!3P5CF+~&`3*?36* zBvww(e!az0Xz-lpIJsi+NKOvMt=F&ewCo=*T=~>s6}~q+Au@<pi9#g?t*bd<r<8C_ z6$zrknA;9WD%^w-bhkpIy+WC-tjDV)rCwh`i-x>HT^-@5W<hfyWGjv}pj*{iXgyQM zb0wCHO|x<3Vj1Qw{n!k2yQD<blTWlTYQ|Sk!g93;Yy&GbEM*m+*z;n0^cq6D!8p2D z!Hz=T$hSJ7kGK0jGJWOI^stx%sg|C{RNSGnP@^W?)f3t(@}7H58aAqgdgBz2%kM5m zD^x*L#1F-1>s1Nzh;SB8WF)P3E6UHY6eF&N4MXp`$5Gbj0LA7EhQM5n+zMbF4_GX? zUQIn+eO;YjgHwqlR^K~)Tao%vf#OE`P^-)fdpx#W^|)7cj{T_-=9w!5lGU<;l&I3~ zpcDxNw@gCr0T)a{nqngGeMEWA>ClafqcZzoBP|KlDDYD#*xX78<b-HYOZw6UJyE5W zJZ{vL3g#S&`2Mhe$n$#UUqzw8uZziUC~w%W1(gx(YIMV80xkC&)`?48CVF*FWERx? zr-RLWVA?UkgAt4{B%>n0j2FWyXk2g=xbuZ>)hN@@C+WNJ|2H^OO#GWfnv4Zks^?w- zzw%npyat=5N+p*d<8^11BfiQ&jt?S((n;FN73+SYyzaTO^0%?I`NcocD`4#txb_KL z`vfM#&9BeJ`dqBfMKo~4N5|uFIWoZu+3Qb)FpS48JfK?I5fD`pVaP&Bf6G?d^JD1k zwW*B?NLhIsz=_Nr9n(RQ<P{JeH^;o96s!+}<&?%%G(-6+QzIxRlC?g=tz~<qf}i8& z8w@!#dmkgjX8Xz|gn-P-gA(|teo5Q5e~1o916P*B-9YN~-fZ%8I4E5oig==DMIn}p z`^AY*_=>DMI9OT%Hqs$W1}zBlC0ZOZ@wP6fXWbQVy;5AsSBv2o^r(7E)EcS+c~iYN zoo<*q4eSsxd_CWU)|B}aQR>Kvl4-u}#H;8Qok~U|8L17!`4kW(_C(peA%lVZ=~wjF z9#bbsm5lqP7|qMCHXN%pr>nYP;>(8Tz9NT31$IK%VoU*a|62mSI|HI2y$N6%?gCCi zL|f_&NJoWItH>Q;GGiv>rTW0c1f^4g28BYra=jRhG+J@mhK*vId~Lbw{P;+)s1J^h zj2y4!><Ps?Q%()s3|P;}ufaoUTVKkzun0RLU5Lr(#k^f4aPMG%u~vIA`3Q3rHl0W? z3i{j7<vE9(Z>W|UL3j~W_}qb6qrBozfAsyI{rJyb{Pl0V_`#pJkz3RJ<xhY7yJ4Lb z5n9nWubX{a1Xx>4rrqp4@nXhopDe?sfo?JAfYMJrUrZLoh*-_DY?GRRKQos-gyK4k z8<%JH5-UIt;9qVd--tx2{lOo<{G%Vf{Jp>A*so!5S11_?0vm>Wg+d%Lt>MHNgo5fd zly>6QPG->E#-N<T4nVT9LDA<Lg?N@<O~psW)aeah|4EK`be@QfI!z4#nj9mXir{oF z|KzuR_80$6$D8}fi=X`9#lQS>jDGhAzq>n`j21u?o6_(a!*u@PU%mX@Uw`qF-+1{K z|L2Q;{qO$%hyN@VL2zWRtn)>8+}_IT2hD`BsQ7m;{@{OuE`5!0Gm~K?tNY+ZG(0#s zs0xSJiM6b6h;A%~MQm2=6jxiFtwkJbR&LG8r9~X?Yyc&2Z&(8B0*f*o!hpy9(J^f~ zj*5`8Q-}I<o4l3Y$$l9Q0?f)WmY`>50q5ECqsibHFvv63D_wlV7AzM(Mlm-WN@&(l zb4-U(>qN5{lNLI=RHNP3l$j<_*j#0_d_+n4*w&7oWVj^D9M~d=Wn~$Zx~k74byuH= zf@G5<0_(pvp#2XBPj`}DviTNKqGohTEwE$gUZPPbmmzVDiVG+tgR`M7PoA{N*zh%y z1~#SJaJ?d?5@dS&5F5Eg?}b+{^w$=qr=Z-K-!}6T^;>5CrAE_X!81FPNKor50;ml; z1y;sQWf%yR;EsCVk0yY}aEw(zxX|%Jf-$j>4(yf%K7KJV+yuR9Pw^ezx+*}@1hCj} zvAjky0~Ka-PuTbX<)n%<dOI6FaIu3NVS(692dG!MPAs=MIPM9d3G5#ZM}upN=9WA~ zLbIm1lEcZIHL~`Y)HNsLW2e&F%7QBUj9XHTIti25mtgixj!j+J{4x=>Fs!9|YY*A| za$YW2O}4?*Bh8Mr#CmRwe^52-O{%3ixmLo`jZ-pr)g-j}aU*7NEdg=!W*|T?J4L14 zE>-dsdGi$As34lzNRof9g5NF^m+>tBU6a%|*`r7#%x=nnEji2e$ELT2O8EwK%n=+H zyG8WYcLG$cFxcA>*;FxulU66oEw0i$(cx{F@M9a%ZQ%>FypR{qquS|TnIIF`Am_-4 zzLBHni2hZrf;$1O9o?SATo!@yFEtT*Jcq`ZPfei<(zDzP?Dgc8`jGb@Yn?60po+ML zgNkUtNG1Vdm2l#y)xoBcoN(}I$EP`VnW%6IZU19Ix;zYBT%8~l>+iL8uEYvvt|VTF z9%p-$O}8jCpGy1wz3(Ny1eQ#(Qy%XZE|1f%7_K^XyX4tNEZwimTD>uJ5_X_nEEY1@ z80^S`Wf>B%ersEw0RM+)d(Z8i+Z_?6|JgQ5e%!2(K}e1mN*n2598L{7T2<9tF>fPA zj<0N01|M;1p0jly&MR%}dC6)C4;$Nsr0tW77Y?fPJ*>T1v<nrHd3;nZfc>3yJq(eD zC2wfSZkH%RH?Ilb8@r*|BH3&^Wrb0Rm@Kyp&`Y<*^Wi{CtKND`?!6&>iivmJ0Sdbq zS>3$OH&z(O$XZY3C+{rkb+qf_awxk#<AH+oc(4Nh2n$ZhRI*F!*4#K3mt??2!+-2} zz+(Myk4vO4K=$0=ok4OPJWXoNS<L6P5pkB)j<G%+aTavY#@q|Wv@&W-ICswZN({C} zFc_o>hGRHiL!hYy|CY1R0oxU7?$rTqUB&h}Biz24)&C05)Ro~|-<aQ{pskcNB`(&9 zxPMhR<q4?Oj$>}Yufv0HSn9#Of(xIn9SVb#vt6}UoT`0(x43x4*Yb<2F%NYd<LdP+ z<{7ubCx;v8CX6al;iIF#QI=3E`0`r4uvRau)e9@LDgdIuOZ0x(U%b7Y%&MRa3h=Tf z+763H-B1wmd^kDfQf#NuZ24j+r4@BE9>g=MdD#s@D)P)7%Y(@b77K`O80=i3bJUW{ z^bqH;4l%{A&1RxF=iRj?92WCDEn<dO@OH-`!bp(7okX#7PrRL9)9QMpHlXXuZPY07 zxvU#2FGmHo?qDC#8R|?Z$}YSQ!se-#_l7-W*nF|uwZS0kAI}$)BWj*blo{YJ0!|p0 z_QPaa(t9|7zrZF%^EQ6`1tYOl`4Q|$qFE7Cm#A)&7EE=^CR!i}7}uzQT}aoqiverD zpRnGO)BJ&1;=Q7mZQ7^(Ue<M<Hf713K!AKE&x-1kyF&$ggx)tu+o}E;-}3a8e_jvr z^9vN5S~|HxBx;&A@n|G1^lD2Jyy|u2WsYb3+=|Qi*#oKKmojgxhhm3@+i3`7s%NF5 z1zdhX1ky-+RaP@z`-XMi30{8@zWOpu!*I_Z6`loWRILaTk3qTE1$~auxwm@gjmD21 z_i@{Oyu^{QFJ|xV1VF!Zfp%P=9T#ZF1=>jgrOC<U{P|+@dwQMs!bt2i)|`8X4qnc) zQ@oeV;u3llo^~S6eUW#k+u=L2yE%$%OkSYl6YRvpF}mA|qSdwH)<?I|lFgCq*cfMG ztuDDsyrq|TJ7fr!UcHW6ual~Gx()T9(M@OkVL81wq5NicIsV=32oA{i3c;^XuSgX0 z>bZ%XhB|W-+wd#q=0g3sxv+9>Xj@cG4eeQM88>dlnc6$;<WL3=&*?V&+V1t@Cx5ve z4MHV#6)0IvG}RTqb6=*<r`DI{Q^W4tr*T)jJSD_T2re0sciqduH{U<=O$&^AMg;hB ze6FX(ax^Ih`mm~xbgQ#P^M}h_poW@8C>57O{aoWsFkKc2;0^EnvQHJGz;3uzY=c|R zQo2<Xx*w-{_)J71^KvLxCpA-MwCGN(yUf`@Jtku%9JafSz}bl0Dtf6*r!^6C!@P{y zlq+ZY*c!wg>7yk>CwhX(@)G~{II`JQF~^VXv`Xv~yD14IHl6@U{SuIzj1}(63S;Bg zSj1<4^pA>ZtOmUHOCsI*iFSH#n$=T&@S6nb9o8vpehD*ev=D_mOw>k@($xT4?gSZF zZcEha5b`;OD)=%IaquRv>~x9XF)2?;>>zuEEd5ED6~N)cd<_>~z7}=trF*>_{s*bm zt(|BnDw%J}c+RumJUPwxa&Zccd0apQdC=!4!$tovYl?M@kuUuMu5P}@x^e&aEjihz z@#vcSv$A-ylK`$L%39#z%5A!b9QK2mq{Pj>vIk7T)a^jJ{n|~R#hBd)-F&*m8?u+j zzCmA1)2dvOmi9Q4n8YHo>pz-Jj+93QNo6O~z`Dg8-%b1E4wliuCj4>VFEQ?^cji4> z+uTT6bTBJ{wwOD)4bG}_t?8N-*^8*g;M6v=H|&K6XbeQkEw>abK&KapaP%qx<V@@j zhZh&tQEeUcBjiVP-8j;>f;t5~wn()I_EdZl6~n<_%v50i8hbBjaWl3*!j7MXi$UQ( znW(XNpK<*%o)|AEtd>5<Eo(EzhMQUS_CiK`eIuo9vZ9i_!ak4s4fo5qUo0@)NPCWQ z_GZhTfmSjitwZ<+vMfP3uXQhL-OF0{64kxH_JXmMGiBa{Cx=5CX}%DxD|8`sq$LL` zzTTTn&;T3iB9xDYBg}Rt!K@GA`Vg)UVIoup`bUpO<>=n5oa%$*@NI680}h{XPgS~g z@F`4gIdH=?9F?<2C1&hk2WupAbp>0HFGuq4Vpj&(9J(*COD4GO@h#9axB*K52M3IN zxky*xx@uK-OXOBpF8{ivP*3S-0*Q1i<{GXEC_;e_6b*usEsSf&fSE53g<3Ebej<1C z0Yed(hc@a8nSj%s4CuF5myj_HB4|mkk)V=<>P-tuo1UNb^jw^orMiPln-#;;IT~-G z_XmY6K}N>ZWmv%QAE;Gp;pxLHdb*j^D%RLILWNzN(!kj`5m@xy39F>Nu^_ybyH;3J zE>U5c^w;Pu_^|&N1$-S@Dy~pX3VU={$PQK|62I&Al0Ug(3R#tl*BEYV&jH!<SW^!k z>^%34Gi}NWGmvxPGKuNPYrx3)%(P-#^lW`YuW#t}4PD^@E!~+j<-uI`(cpJ}k?zWi z`p8|pC(d5f^VzM3#m=Z41xm@D<4lepoxz+Q$=C0kW%GV9D&;%EKkfI&lvL>I8Q<D0 zD2+j+6s&N$5za^4CcEl-IicK^n#(27+<@R;CeRLH5`<#ivGXhe#2A_5%;JCVsN`bQ zGk%e6W{p136OSgdWkbGX?U8)57#_JVMw3V8`IqS~*At-LUbOCFeASy#A^KNMgq>8d zc(TvTTcCRecgLe;2;9t&YJq+;-6bd9`UI2Wl8HRK+q%vw<?*>YLV=p;l3MoaZHo0s z4(Cn_LF$sAEo|$T@hr`ZmQqz2&Oe#VhR*=)7o(JQtqfOYY0C#oU>}dHQBF%)CJ=)O zL>Jjv9U9;bLmE2v`Of@gn%Y=jXzL4YeW4{UwClyFe>_6|Za$)5gOqU$dIqE-u?L^c zp|LLhYIa)Ltpn7P90KDr9*oK@YL0(*GMvycv3oe<`z3)Ipqt}@Vo6PlF?C~(ah(gg z6H%v)uMv#+lzm0&;9`H?WZ*Z)12k~i%*-Pi0JXlN9yYhBU%E@UQ75zg;b2gXDPG2G z0@JKI>GlR&+9DwGnpBt__^Q#O$nM~LuvVpAb?4fixt+}V&=5?<{_xQwUWc(P(CHCW zR~ukKonWRGn#uvJKFsWpktdM;i^IvFvPUJW{spul9vIxv{RJNxE)w>j)CzcvpL9He zEv2?995>(|pbIdlQtQ^+;p}}+(;D15Uw_wmCK?4Lk~u1iF+p1JmZFV^n_zJ=5uMJ1 z&Yi&V;gZAg^jNGWY$Cm(Xx<QcA)al=R(DTT>k%TIQA`yK-dQY)?@oY=#$`hQ(Bb(J z-YYX6HFh|huv;t~fz6dWXT#ZiZ7hcS5B6PwrpudS!10UW(=vd^y#&_X1lfU&+S0Jq zzQBlk9HDeVDCGqA)(l@jg#aW@m>P3pLU`_KOvtF1JqqUIm(|@K?89BNQg&6_hW2E% zL#NE4Jn``5av!Mumdh=b>k;L8<u$QE0W%eY&cRPc%l3wQx^RDAF((2QeDafSP;tu6 znN3#f$Z9IY;fVc^=r79^jO2ui(vH1i&lBJ|a{#R;=BJazkOIeAl&N>VLNQ3JT|{($ zFdUbI_J%ONp<-`^ic|f`8IPG$%uryv*mDfal?hG~u==Dedx}$C+N_zbmVIE}bd9~w znGly*48rQvkt>L^WAGYv?vHuw0<l66rxh*x5yD6IsV_!1C|)hu3ZeNJw1!VjxlaWs zy$M9C;%g6;skASg2sE?|i0BP=c6Q4hJ6!e43ahXbAb^pv`cfd2PE|$4@rKeSTb}o` zEm(-AtxcAwSKLNhn5bG5!725N>{O08b#P>%T#P}uBHuin;-;T70#l>yAJ1mzUX#SZ zKp~v<Ba)DLijWP7Padp*TO6UjuNR2DgS_a(a24q0SvZSP1@N|L7zze@t48W0AhVIp ztR{C@qQ~#()_sSY2ZwNRKY63G>|zO=<#4jD`Uw1Wh8!-PAvK-hsvFA!GErcx3)iY~ z3OP733l;s^tQybGhTRumc~{hxEAH*{Rh|{2lVXX%#es1kvZ)ZaD^$|ZU@O5FiZMGm z@a`~VE|3Ue8U;<n+HzK&<GOS$CdJXU&;}1pnQ5q331w_zBrSSo6oQWuo2n9>GuQb@ zpaGT1h2>+Olb^8*<*#(Xnj1yE!@HVbwAM20HOs$d`Bz2p)cV2eMgT|5`1`mXb660# zbxwv)hSPE|ENDsa$;h)GTDjf)Dv|L-$FoKcol^MM&IVhEFAjk)c>A(2@fKf-Q}LxZ zwO>9OK_hQ(>u(46Xun=Bha>y34^RA!Vwuqg{?$>@74O}8`;snw@0P^yMysjip^4ZV zz6A71xkRL=ycs;vFe@tC?=ugaXR8IUSFId*IvYMM7G)?#eu&D_J7i?aO7>5R`5~G~ zM+E8d?h%gcX3uR*>^-Elbo{97Y{fYExprTThsyJ_h^U`0u!G5HG&xZ^X$=0{_WGch zN$$ecI^uRS>^WO-+GQ1=l45-?Ds3Nbfr}sFW`gF?<};!^c!=pfRsme0B#KDj8TOH~ zuXP6EM7l%Wf93Y2J5e_j(=w>wG{(vyuTVaO$^exB1o`Yf46&RKkt4NsBXbh&&nq|0 zLqEq$o#SZ9u38HoQ|4b2su{OtP(rBh6{>4m=((>mlYs%9<bja}O%r=iD`JsdXblbG z*1oZsz7BUWP%C5ffEJJ%QYE(&?|}&hq)-Z4>~g;;2C{$_X6(aap??7(qz9<u`*6uR z9MkJazCDyHY(<RyO&!+%;J$3M;>Bou8-B9r&_sQHU8xV1@=aLv7{#JH<y2}i{;(hm zX#oKE7O#W*L_^M&AG<C;2Fh?uCd{g7Y3<G*f*k2c|BoMY{-KTd%&7IlKamzSx-jJ< zWqiGx)4j+?+$y4<m}8eCW;&T!EJ9F`QmLb)_RWd|Oo&RJgUYl`XFW1v$N*8&NG^Un zn(P;&GrjLuRU(-Ip2%zWZk-{raIg%AR_Z1^CW9bAD)#3!I3s8P#kN{aftGD{qvTw~ zHKoW_0DVkm_YT&>7rw(KYe6ylsX4Ys#gp>3dF}gM;>3Sg%u5rCfHJ4*w>uHwVQKr` zL!86Ya&%*Oq;Z(2;(YRIDZ>I9AF;kpVb5)GY6u4|@0Se{%MkRdSIofu>_S}NeOrK> zpPiYxO$wf%qUy=jD`KKjh2EEi+!pvJw-F@Jy2G0G)%tSYbgPaX9Iz?+B?EUz)_`o! zSbh7(Hu~z@SoSmYE^a2hi37i$x7@2&osM}l8eS{rLgQQgC0t~xU6)<YAa%ui6s331 zr$V4b@7PCt$40z`2rCn&Y#)ySHcLKnDMT2!(1jX-MWBs=<)fQedHGuCxws?zuxbuc zuZ8CCm*|d3TxQH%n908O`HWFqa@ZxwRzRvo{WI!p#h#8{05juW9t$+3Gho@B8x1$L zA{2Lx@Kbd{P`N&0VKh8OL3qTQ6}OcZ{hf~s!n}j<vK9_wUMban6g#=MU8)sH)@y1x zK$})a(l^n!MVE{d@siRnoMPGqO1L0Do^Wmk&U6k1l)qwcCmuW~*df-gsm|5Pq^hue zQpwvovF7-OAstJ9v3GLlU7gV`+NcH?w@ZNOg;d3L^a9uOX0f7nI^75=u*ybzc59Ju zGcqS$X^e6p`xhZ`xU}w4J=j#b!CvUB-ZaDNC7U4eVss(hGG4xM#V&9MuV$C3K6*Wj z6_vxiDw1ObMR>NadY<`E#MvWPjUHO@9bZWZ<H6+QD-?!a>-Q%tkyc`KA^bzRuAV}! zs5Xw1R}STwb2!0R8YK!tEt({sbW&XKOpHdwbY61rDW74J>>1|3Tb39iEgKiJ+2o|< z=F}rwkiM!sU{?fXv$79u0`(1Frdk^w+nYGnRm;nz{1bb^kv-f<7jOBsT0y))swMZV zzj*ItO@GNT97OU+M2-ao8(1|gF2(0TNL`zDYhKK@BaE##b$em|gPv@faRbO+HAptF z2;Nd;q+re~!)Mi)Z{6T#tij3|e*;~QU|4w!u3!u<acIpXVgv}WN}E20aI=J7dpa2o z;-_penXq}2Js)AY_p?i+8jp2w%S)#G(NLN4k<E?DPc>hd7zbCg62^cNf}h^!Co&;( z57sSoO1fo(QhM=S>|Rwe|7L8?FZyUPr=Thq{1k{*r;rBMNrKxH*tqA;#=Xg$3_1D| zZ&stCEv$1TvI;@#&M`BC4*6q0YXEL2ofpRoK_tnAuKSorpdhE)Wn$xW=@T2V3b$2a zOZk)sxWEM)iVJ#S6%AMuKD8>@tGnwx=Slp;#JaZ)g3`{)b;DPACI0IMZ(=PRqwL81 z%>6q?9-yxOqPl(Dg5BubASzj18s4%WRrLD`vRwHYI&Ae$S{2|?sXMPHRU5hKaD-e( zoH*>1A2$`}F&2u2=Qkj}J&{yIAHXqO904<1U2H{!z4LM*<N(TS3-t`S=l~rTeA#lt z$i9NcBZvk+nX5@|dgHUFEx1)b$n<_0&OaY64wdCs*LzJDGk$UP0330|wieS1Xcg$L zBJLwWV1zGAJZKAINFH5VgUh1@m)#oT#z<Bz8Dp@b6I;nv{qC)bDiiKCtsJg5Po!rD z`mSmiTYi(twTZ@9brx=qr?p4%s%8|pDz8~%scS6#SW?M3AhQB79U4|RYl~Sio}*!p z(bd1*X?oNnfhwD(Xr76mx*e|$l^CU~>7ho{O1pP&-1XnViahz*U;NI?-~T^e{OF(k z^zZ)t%U}Pi|M&a9QLF09Kl!gOfA24?+CF>vumAJQKmMUW!2j^?fBfRdKM3IY<^g+9 zqZi#+)=D9Lx@<<QFbkG5X*fS!F;!7Q9upp2ds+-fxVq}<)<-D*Jr0L+K~dsqS>3!2 zYmEW&?(7(2AeDEDQ?KpV*T^_wHE#@OtUQcn`Q|iGqDboWuay0MTr$^=HdwHLft1(r zU5(2YYk19`WqX(|el{d$_MR_u#3J3aK;98M#)a^akzJqQl?tQ7zO%&)N-m0Q4g(sg z97q^Jp2IzmN?|d{NR<~%!#igT;XKnr1~0CB6&u-|1lmGnHd!%jrVe3#RqbZtD9V{> zb8A$MoA9L3rqecoV`Lt8XT{TU#Pfq9AdJ(GF1k6cTvqha>*WDrK%7kSVWFbK8ae|k zc=7gdzBr>ge(8^Rg3hx3K1n~|+*{9Q(Qbnu8fcE!0M1N2sr10cn>hWSbr#dv)%@-l z_ZkXxb_KXna&)6;ZKe{-!4^DcsJ3e-!Ia~{6&aF~;bG`D0Zv(566bB-YG*QTr|s-9 zT!L$McDg~TOLXYoFZxe%?t7jITV2ldMe*l^CB2SFCquYW*f~*#!_dj`v;r}*wt9Ob zbU!wALzdo)$hk>arayW_aDoQLYBxfSpxay<J+_*mCQnz6h}yU-Tu~lXT_w=wo%s`Z zSj^SJmWH{)cgSeZ0BkvMw4Wxpq}?}HcyV{ctM_pw#fx~fNpakEB5GgRvzRJXp4Kbo zRK7w$M-PxX>N`>0Eup-*h-mp8deL-OGPgsINCnLtJ~ru4@K>lYfdZ5i<uUvUr_c-U zxNr=K=6jEO*gbJ*8C~OtShg?|?T8_93JEn8sg@&?XX@-EYb1iuhRd}wu%$*iP0@+? z)Ssm;qR$UYGQK`Ur_1qD52qBjwZ3}yCzDZGjNQxEJt|ewi~2~Y7Ebfdt&DW_2KN~5 z2#*9%^>G_9cJa4aODDde^B9f8>fszGB$m7CXMwy@R$fV`5&1YbL<A9~0X>%8SC&Hb zHv0%2nNN$ODGL7fIxu<LTRs26jmA`&pPQ1i5S(4*Q)Y5sQA+_`r|%|X92MoHcKpdi z4~gZj=6m4!+Ed`Slmtj8Rn<jm5dA92LW~~2t)$DVsPg^@2*PG`2o>fDiKU@s4W^&1 z)z7l$fiN{w&c*xXVexc`*3FH_$4Apf_Pwk@?#T3u@;aRbqkMn`2G;_S?VGmZdo@eD zh;}Y2cH^(EU#O?njOnpbdNLP4Ss~T*)STW|tLyX>DR++-ny4+{c41|5+}21_7b?b# zwX{?VlgPpKT<iu~`n-l*{w%7@gZ?slV&f<Zr%$$ckI0%8@l(kX&7@X{DiMN6m_br* zn~1rl`#vVa_w;pu3kS2}(IeFHqvarry877v@vt0Yu3H?%32!H*TIV<b5)Pf40f!(s znjEt$6{-1I|EpKc!g2?!+@R$vy&y<+@Uh%ksV@!ollbf<xSCNwj%(O2$5O~wlGB0T zwWS-ba`nUGg|KUw93v-NJ{{t`AyOg3g%VAki`mj0GECC1V2LZTFQ~SBOD7iHaBpdE zJh7`>!!-6Ka(d8M)$XhJ%|U<1>p<*Amy1EjGLmUlMLG~|Y$n?9EdU}^{5eN+RkYMZ zb%r;juV+j_OWVEHEAS`Hb4(p3cDj1S6Qc_&pXPbH+`-9tzYfH$%CT{&cdk@n{EJz| zsWd<$`XC!6L`Mb*Z*?6Xgabsx(r~dM1Yq|$xmw~ZkjpP)EDS)?4ytvtrral-?J;J4 z0`Na~4VKWjf{m6iJjoLj9%3T&A*xa+k^u~gw9Q#DLT%QgLo6}Gcri2O!V0Jp7?$>` z6mhS0WedHF6NTg*xrHu<<|`>{AmiED+#;2PYx~oxW&C6OMw_NTd9_*13Ns~+^%9?* zD#M(p4aIpC_Lj8JzXC<N8+gE2DgobS0?N3K@pgvne2dbE^K!eGEkE;TRFB#;o>h+i zRD?JHI%^u!fhz;0ixm{z&PH@Tt(u2mzhk|-@{Lu>8LZ)!5~>$uIycl5r^jA*;GThP zrE^Ez`ZbLf-CEkBH8zoc$@3CFapNjc&-*As73p<yyAZBQ%y!AGW7fz@HB9oEh^9+K z&bHo@@B72>$QGePww2zgx_x3zr^mu*-w-OIV^@Nnby7WBL8v<@<U%kGxw|Tfeh1lC zE?TfBgJb0gbHpT6jL+CEItGg!bt|bLDsOaYRw0^DpPWK4tF*oz%1LN><J#TWTY<0E zK}^;`Ox8h6RtGTZg8X2u}~{mc|^Z%3VeDaaK<da#_|<}gl1_a}WDBTn~D;#AM8 zERr)_w}Kf2gtPsM2o5$XnW|1kA(_Zc@vwn;@&-a4Xo|A)Tg>B40QP+_12=FDF490% zkP2B4XO>l&`i)4^wc$9xd(I}@3pA#NLm?bEH_q#P8s_~Fo)La~jn<0%A2Fvh-J4%K zE@w-#U*^q_?LPwavKz$S2y}LAj2(2=$u1EKlQ0}q)fzPXylMecC@V)cMD>nIra;je z0I?_N!n^JPxKoS)UCi1#yOeX{p7Uw$np1tYj`h91GuL-!I=z&M^H1@y3|>;0lLF~A z-FQIz#k{=dM3#BA7)L6zg{S>Y<`!_`KE-vYiSSRX+P{TDv!}pUQh2MhkF(Mb23kx2 z{h%DdCrU@U!l@a>dQ|QXdKu1K1G`A3+XkE~#9wgLj3%>2Ea7bf6Ci)Cy^HtByp|uM zrD4xbo|Lxe^)z7PvV4*TH-YmwTr9Da{^@1gwZ?y}zcpDK8ihM`jaG$uAl>eRl2HWW z8$jd7GdhPDDH^8RY}gErBq1j^0fvIKU-k>cS~g0OiiTW_U^A%DGiqmY1Q<L<2y!@{ zFA$?aA2cv05eiD`uqaA%0XG2Gi04-6teveUJWihg!qm`68CLM-K>)=9P~9MF4%>h- zN97|le(M7od(zTc=7gr3{^&z+^^E1hxW&ycW$Z!Z%2o}#MUN1nQ0x?$d^A$WNLU~q z??We@b28TkA>y!!1mpT;V87tj(R#P=HJb-mIIhmp1on3IV=fe*RCAIhdu8?PZDt+J zrhJvNDsOH^jnd|Qzp1@pTI+MR%9z26m%m3gTs>AL6bqn(rVHhMJt!AQ7&pd~U?O2X z8u_YaXJcj&#+`z)hh|W^E84&ZFm<%Wbc5Q$uA+o7BdgqJuHjK&{QPSB%hRjA72gaA zGl9?w@yrFsv#f1gzxTZiB}kvD{-%INjOtu_f(J-9l$5sbX!xvfoOvRfU!sFfG!MAO zT)|lgxBvvNi=!6h{VQrG{o*gGAMal=@H}CsKhCJ>;8{IiZa3>W8N4M=GUr5x-_b<q ziAjTFoE%@IXndqAM;o(wOzWNeoq;)zS}LmPfD`(0s=v28K|DuJV6}?EikhblhDVA% z!_5bi-O01<JZrbxhD~?aPluQ*d<x3Wk_vXSEnL<Ff#W!>2x<n#GJCXNG&}EY<(*&p zR=#~{yCoRqevLAUmg#0&?Mn_u#z^z%m%#d>TxoHMYS*7s+&D`6&UgBpMyKZD8FYJ# z)OVbYQ4rcT*k*3&6Ck~hCgVH9(;@k3$zbExRQ@rQ;}Rv$dFJNZRQp2Znp~)4WjgmH z`A~cyLK|jgAFu|{_5%6liOW=rp670Na(}a}x$QN#z2>&#+;$z_+K;t6D5n@|Yuu;E zdwXs~*Ixd5!G+Jf;FGSLEyal6M0;v-cN-0#V4vYq*h0P#{&v*g?FL^8uMxA^8l0y( zave|va9?8`hDeyW*SgXY4F}<Oo%UIGi7SYbkjbfCD1is%)%I*uKE*hW;%a;5JYf=s zZuV{QW-*y|v-iY{8OM10wsSo$7Ly~l7{)!~`|>&5F2#s0&ofj4W1fdi2ICah(c`#0 z2am%F&;$6F+sG~Pp<{%|xMR5i=0qbycRB6c-Eb{SZ+&s+rhG9jj$j2p*hq!oAX|Vu z@|i;j>E(%h=U5n9v2Tj7xV)9S9m^V>t#3B6Sa0qVtI_#Z4BU+pWB&F_f+z>Khrv_; z8M4*qE+)uY^xE02G2#%kfd#}u`M(h7?=fk$)!w??%b8JN7X08?M&bdmHzssZ3?_Zt z`A~NTSZ6UD#cWE`CaZu^Hn-ZH%iJXX`))5bI#uN^Z0rUJCK^N#HH>*2uQz`RRYxMr zG%wcqqT>27z$JO@;Z#FcwXss0oE%iPS(y1_A{&Ajh(w<8!EHW2J8#ThQCoI$T%Lpp z%gMg@P-o@VY$(%cqF1IavKmZ0+FH5&oD*#t#&pE7TbHzoxQ?2lRZhzj6`^!EH|Ye= z9k`RjGqbksdv!C+*2+&?75Lc+pX|t-j*_8iV|m|?l4`WTfyS+>Otbyadevds8@UUG zwTc{8TdvrgNp3!ia&WM7oM5}`i0aCk{a}P>2kQrVbKg-cMCX-}ItP*OJXx{W|G=Z9 z_-p7kdYaxn8Q<fe#7i!o;+w@O*~5Zpu?dg-dnFg02hQy^+|<+A2yO_v<kfusBF@FJ zyaQA#_Q7#J4qTIgWk97Ux2dSdh4vP9G9kN8%E9^29xF;NsCg0-hB?C!i@BDw`_+az z`vdcM=w->$#Zs{`B@+0{a?y?nzM5WKeD5$)oKAaM+I@YtJkKW^ufjhgcFJna!@zUZ zMjE%FZ0|%j@vZNy9ju`C*|w4OW#>JQZ7JJX^VMs<dd*iSEx&+lSdJ#efPbrt#cC~_ zbLba}YL%rz&7`GewH?~iD#@x~-tkOZHL;R10{4eZi1)D^G_=4}XP;>BkM9iU$H+3F z;82^mT%$&tvTfJ6j0PT1IdKCugI}IU?2J^V7_w37W(u&lLPLwTYbl%=6lmKh^X*Vk zs7KM3+CBG5M^PmsLVv+8`cvf$h$)uF*ED74o36^Kx?|?X^jh~cHW}+{VSO#EuZ1e( zCQSIcB*P~9wIebTZU-3&r&RC=<88<kh3_R(6uuWtQFw21Vsj8qCnriPcm3{nZr*?R zUHH)1g8#VuXRzY8Z(iShxckZdn-4y@d;11_e~-W2x%KHoczNr)Hy_@<_36!rpWnK% z`-%Ac+3w9Ru)y8V?q9$8@K<ksiB`YtNq(;wH&nAXZrum?uuKo{T)Ss3tdp*jYpdkP zj(WrdfF1jF&X1iQ-bpl+&+b3Cd*27xC{G#&oP9u<(Rki4pzOmK%Z<yqE;&DOpU3ok zGS~J3^HM+Sj@-EU(Y4QR?>_wS{$~$9d3g8UuIbM{hGhxVjK+ehD`QczrIc0_Zsqj9 z_9dw%MC&ZSK&RE%5DcaXl)*wv(i+;XD1k8ti&KDSBs#l0zK&uuCFZ1SpPbx_dHLC` z8=Q08+<3rH0V5TNRn$Fo@vt1hQMpJlX|5wOpTMm$qnaXVA3YzTo-s)1L2obKM3Uv; z81(~Ck_eddw)qVj^@cU^Aeqj*yWtvrph_6_ge1SN<}7rA=^0Tr0YGkw<%CoIXf`=U z*S=atOt%iuLd8~AD5ivKAAs^vX?w6Hfcl?D;KO~4vKJK!DAogSIaNuoAWrE<DC5%e zum1k8-@Q+N&$4GTqHYWw;Z1Y%+00~4LdnX*hc|A1=ix(1Ulj8>(73?zLQ%&NO0RMo zgDEv7pS&{rrQgjOi9esAm-Mq){rsA0(Jp?BD_$qRCv6SoJwcUX2~e>rT{?qVae`M% zQyBt|@z@S%dRuL2o<wGsDEpcbO%HV6WVC!V8I#DH&#Wj7TW$(7j*#iwMU)Ce}W zz)<v_IbGm%KH7<@jRI(}MoyMpaPy7%`Ui3lQ&+MeoqCFtXkza5yejr5vLgE$!fVdb ziVnogX+;O_O5t}}0Jj<%&Ca|wAj9hI9|cw}3=j}{|A`d0tp*wm6vohWES2+hFb1iQ zWYPS59XpyF*EwEJGiV3`9lnmug$;d$7u;7$J*DE;&=RcdNmWO_S22USL-(+iH?btV zn?KeR)9ZmuU|$_S<`|gTfrEZmx061)$3qPN)7W<}1M>7zbi;)UZ{SEB0<Asbz4lzi zBT%$+lQe&ysPB@oR&{cgdwl9?0bICyrVL8-_lLmkn(9uRVf_SC=UsrYw8c(-Vy}E8 zP4NL4I0Hf8qUwvRc2+iB8gCB*{g)0WCa_sN7@XPLvS{02;d5RzDT3!!Z=Y50&T}QT zYZ;n18Kg8kK1K-!kfjozw2~2TgK0z}`--NqdxqL3-SiQ3a5#l0ADmeg2cARCUqM{g zt5?yX0<X|2^io?U9074Gz4{}j@@+EuICm|>4E0jM3sW_jVLEp;WTNWz@|hdcn-Mi_ zFR61AHGB`w2qt!DVFxX@qQ=!8k%ZdZ!Q=*?AL>feON<#m)l}`~*sYbz!mThfPpAS; zM?2)rgwYQ1v;fFC^F0eXy19xRq)t@y+#7?gx#5-Haix=E^a~}Ek0Vqg17cmq&Uk+` zoZc%i{gG4BELp71aLzU{A1<#S&*qcadFuLjhw8GPxESTx1gTg;DP){$*97K+aZd~= zCiR4qQOpSJT@+>AQ~{&}^mND0e1{mKSG=^jYNh;bYnKp%nCXXv;{of9$EEdWcxWD< zdnr4V*3*E@SM|nO`}v;ji`oo5<BVggd)E7{nz`7#u5*ODu;zJ=hC#5fT)kvCU;5nk zs6ZEGD-$2KBTL#{pv-_Q5>PMw{LJ$sN#G&}1?li96fx2Gj1>#cmex+=C$IP1jdq-} zl@>@JD`wep&O09DXR~%O7&J{`-^_?!wu{AL=6SH&cq-Tx6ZQqBMv5H6OdVL-q*S3q zoUYS3W-8`VoID-@vRE><<qQvJ60X=z;}M?#3={sgSqlfVPUtCG9Eza4`#DLN%F~D` z&URC>Y*0`XUX`z#>$F#4eQ}Xce2Uv>lk1_Ry$G6nj!^&_r<lstAjYntL1AJZp-_1H zQl7p0ZZ8+|)ZCSHp5;m4%cTcg5w;q*g-*XNzuW6Yp$S7`*VoiMe`Q*s<fKMtf+_a! za-+E<?Nb|8%+i~D3$%P_!vTT8LdpB?D?1}!<;V?-ISFg$q+<%j)tDxQFEJlJ+~NMx zB2bT>N4HER4`9M`;Kn6pl`?JGd4hC8&|d@j<aeGFD}KBAYHCjURFfqn-#Womwj7$u zSVktZA1schw+8oSFp+3d)%ahwHmUk1Mb+5!BFauigX>!AB2TniYFwT~OGWIx`i3FR zq`{y0EM+eiT0|m4j1)>dZ%`V7gM)I`G`-EUV7}qo$K~Qz%OyGTz~7b|?SpVW{QvHZ z(UA9*_ftgy-i1y6<9#bn%l`4AOe5P+ZO(mcIx9P5Q_1KSktN&1fi}y`KFGWeU1tMa zP(TCn=R(%lB&kY_wvX<6({(e`P1*(3{eC1$wjVx>jJLWmu^_k`RK!B)!mU`NYO{W5 zTS4)QyH)ly7|+0xV_0)kV<2u-bwsqJCK{m;2I^WS3V*S=OYXzq{LIGfo)I*W>3Ww7 zItcLUJ~TLP2mYsegl3_EZZ_M0Pk-%^rJ!?sVzjO~zjo|MPle!KA(Ag2dOpp`cG9NA zHsEbDnO!5&QFkkG(_+>0^T3LhZAIU9F$v6dHQh~%>v9#9hd?{;-F~$qsZ+#Fb`5nA z41O|p!PC;#$S5HKsuI3RofNglg8lSXo&98c#uRqjHs%AY87AO(9IzrauWlRp-dx*B zckCMTN05YArb%3r7mmRyUeQRV!K1%6Lg%341!53;p8LR%&3ICLv5MhF)a+S~rS)oz z7KauMI4#VH)voZk4*3BU`y;g))UH~wraz#`!GZD1U>{-Byf=MmwNcVK9>K0aNgjX* z5rvqCl&@ktKD3HhfzD@>;wT3sJOqk)Q9LQN)Cl>?#bnYpdXBdwD38~4W&nURpFy`m zTb11D&hc>I>ZUdOBnus$TiXDe1`ve#lxM2AA6!nhVx>e^s&4(Dib1ijLZzNLi|Ys( zZA0}IbO!frF+b0=zu^gojs5B~o}N|~3!MdV8^gOKaR&75OMlsJ0a0*tjeG4n!1YcD zXf}82><CWmyTCjtaxezTyDyLymsgsJkVo{toQul)*1x07Z0K2l{*r@|c-3@k?wGUh zRBVfO<vvIjs_2|WkYcK239o`X<t-U`SkIHoFUk25)Wn0sVp>M12r*gi(nc11M+c?x z=8yojgT^*O3PH8%Y>PGtO7cLn*ouuMv9l!3@G#ml?)5V#?;;jbmWs~)rqqx#z$+FN zxMs}dsEu`>?Kp3?>6LTKpn7lkl)QixdC)evA+bcO2tL(~Rr8PGHIn3FjUD0kFVUJC zj>AJXk*y<;4u^NXXb29{i?9S9RhY`+q8XZ8w47d%zTv|qr#6zKfUPt_u_r59?#XOa zjxIqWVQp1ou6}+IODwD9*B|@FAZKn9HmbXm4qG&8-n%vj+_a;*aLA1*aQ2=ysTmow z5MZ`w&+`mlf%@W_ay&h$*St6?V_ad^h4KkR79hMl0>tw3n(|wNINs9QoE=RIel}Os zIv!EYm2)NtWtBN!&PkA(Zx~J<=|xWJgk8dWbC4D84s8eXc}ogsq?QSFOI;OA-ns4t zix4M@jI>S8rWDkXC~r1=G#nQrld(a`*+(KzgC&NZdgM>v=k-!No<uEYlIoIJ)rR9D zBVRE^Z@uOA)13;HrN`M@LM26RN@!TiLf5xls;<VM&T;4I;&fFRonUZ@h3?ZXk0!JP zQQVksL=@6)S*@jZ#cQl;pg%!sl?XAaXO>N?Fx4B*V=j4YwgZL*nl9S(Ai{LG7QkG_ zc^SRwm<`3$06xl)E2_;AJw(}mBJyCoMK2=yVm0X^tHzng;IU2WN2s|c>toczo;^6z zjw!VzUJp=wKHbIuX`4{S{kG(99raCu8)&6~a+qiiFn`4WWwB5Vel0N^#bqxzG}XEq zahnM4=3VS5tj@eieRgKD7>@K<WQ0eye8Z3LXIpeLsFGXmeXyrzA=k48#d^IMcY>Ms z?w5V06q>-=&4veyJWFsCa77OumB={FW1LH9*v!Wg*#!KC4GCQ=ddGLO270VDq_YG0 zM40%rj^0HS8;;0r(Yi5^!~>03eg6jP2wkt(+Qf!;qzXd}Zlm0A;uD~#*2Z{#Qp#}U zlQA||;%U?M)$w%eKUYT*dvw-PC(P$-Emf*#IOe1m3tCV)$L?I?zoAT3&G>U0YVIs7 zl$_b>1+lT<RsOJ4fpaVbO+pCaHI~CF;i6uQ)vPTO=K3HtBON9J?|#55Ia!*tty@g0 z<C(*e?SVy9EWuD&)Qsm>(-hC+j#@1XfwHukJ_6owkmS<++Ht?0Vt&0-4B=$DcQM-* zwekBh{rz-1Xk239<#y1z{Cv7i&2IyIF%1`zouT5(y2Ve_f)M;uG2;}5N<&(D6|f1e zDFFMGv5*4eloG5S?xqB%musw<o#q+bLnpk>46r5c+oZ*)L?U&XJHfUJXspP^)afRR zKsZtj4J|le>E0B$vFIExfrNTaU~>&@I|c20eM`>Vt9Edlp1oHd^NAevn*nKixf14C zRIZYchMZsQ<#6(3UGCyo=bK0zhezz@$UyEN4o8D)i>4;F_;dSsuIQ9F#o`wBtkLwH z`Igg#kZN&z|AC@nFhr^{&S|&|LqJsQ(E+A&N2i5$Ij<2fKJO~rt-ZQ*2YD)c({uL# zNf$02=ILaH`^Heob3fLPWj~OcDF~kCnj%(>Vm5tsW-~&ItSXvX0PA49X9m?HV+>AN zgliM%$j_qjB7&V?d9H|p(^wylk~|Kp7sJfpyi`q4qSX2Bgh-bSX(#>RlEg%@PVDVr z2hc1IxgqGr68;?adQ42Uyivu^g)4?s+j!o5&ZhgHP9Cr|B@t<Pf+X@9;?NB^5~3BF zJWHqBh=Sxi9Sz4O+bg=yW5LtyR&E{Yn@g%A2#urSRAz|v>d+fg$6>|n5rk%mB?D0K zw@236ryl1|g*vKGr`N+WOHrm5V<UNIl6c+c%dPc}H6`^WLZR5W>R=KrW<Ke5kk)X& zXukET8^+x&q-i@_Yd#$f7tMwYXXj%MH#y0<x=XobU!!`bXZZzTWYaX=qh!69cndH9 zQ0d|OlLm=&&4>1^WVJ;ofU;#C!y&bE5=~yI14MAlAB;<YAyomTlUXYgRqz`l9V{kO z_%)~4uoyhGapul6AV=)aodS)opL6I}x;#{fSGq$e{wrN1I?5|tC}-&<Gw9RK@`jsF z412!k&UP=a*x!DHJTY%}1Ohk52n}L63Gpo^25aQm!EACQ9+OCT04M;3K;<ivBs1Lx zPLS<DQZ`9!BF&J>YQC7<HjmD(<(~P(0QTCRuiU%c?-jF!FJc{zQ7rES=-AU`dve}Y z*Y}_TqBi=A*z3X-(PRD96K)2>MGF|Y1Wg~WM;a!UH5V^B{tMzOy%NeY-^gOlZNe3k zb8GPei86gjDs8!Y>^2#@S)+T(h^{005&HIK_J>mD3gwklz_H`Rkn(eT>nihZaFLE* zq~ovp*FV*(Mla>9!r#Qd9sRj={4@++qZEL<++x#AuT%58<!n-;GJ2qRGAD%>S%Pg~ z(f(FnI_{TFAnUEB=P>y~p!H)KeTAyf?Wj^zYS%C_LL>vC4Qn3C+BWTo*TkmtxNg<f z>ME@b_0t`hL%;Ha9LXuudX})`A{t+)Cqfoty_V@(9j8`D);eVx(Gr9;+e+4ov=vVf zecGjgTFPeGr7`4w`V#8mrdL>pSYPr-tQgBa4~$K@P)h5XN_(`bI4t{5R1%uFd7e?B zh3cR{5frs5JC}A9CByfE?Oo3lL0BZxs7_RH>fzY&g$hQfBWuV3x;cS3>yNAGjphGI zP#BoiC#Cx|W>I?J0gsD%Brz@O%p&<3(O$Blx-PBXwqihQ+Oe^bP26hSj4oUai~i)x zPG|-0_AO>q%w`3O*Jo`AMO>Jub#0&93|VYjJF_q)&t`3Nh?pgA^k<X#{ID3#8a`&5 zk(HtfOW*V;f|HvV9j;A9l<p7SwcSeCWaM=-V9<wSk_KE?YoV?M<ey{aLXLES1<@_D zj#MdWDD~m;4#wqJb<}d!VmmrU&*R8B<gOi^e~rb8-t!E7;8y<7J6KUePg{j%^d1Eb zi`a~^?v?^6`-5xGF{EO%CFS&08g@8{ft6(Fl#OfsR;9(iH%1$gf;m$iivmw>+>&Ky z6)vJn+H1zE6^}u1#YXKgzVgkuorN+eOGCBxL{k@`eZa;%T}6U8mPH2P)ZJy-m8`x6 zZp0QxT}&#cc*4%qOVC%jx-pws4+BT$IC>H5IqvPmTksA_+UC`h-};r?4r61ianWv3 z!SwjOmEuXy8rMIM-c{grkJ1H7wByL0&uJnYH#APGHY&iJx!tU`1NGpz@^g!^P`0C( zC;D?1Bt5r6CY%@7x@be(^7XJvRgKX8NG<?e&YzT{DQA#bOq2<eCico=J{&DoBn=Ee zo5ARpWUPRGi59D2P-iDU&4<SeD9xWamu)uSlr@C?GHr#Xv-BQo!^6V@n=dd1w&P2L zAm$kgE3)#m!2AKZf{VVEL@1h=loTUYHCLWaF?<uZCm~`er0Ep;(sDXZq3`CCBW?Yt z+^TcUA*%r3xk)~Z0>-84id&}bpqF!7=B957{{&U+yZ}Bx!N1%$N+XH?PMnxhRETr+ zI^vbYEh4d+kXVZg2=^-c+Mm<YJRXq5@W4UnsZht%xbxYAUEWrH;YeJVUnmyGlV51~ zm@FBNB;JdNGlK9RI^zhhP6#y{y^LNDCMQldq0*l>H>hAFZO5%Ko}!Ys^8Rdcf(J~U ziTUw#I+-n$4EgSH=$?xQNO=-Lhu|MH07m<L3bU-hxr95boo_&oVB6W4q9|-j27)18 zu52qycc8?~L)#ccIrJFq0H1RA@URgHiPPjnI!TCzO7vX<{^1MgvikX@4?E(BAB3#& z>ElTB!U%V)<|@q>2PA3i9(A{cjw+KVW&&KMNa$WYuT+x-EV*O9t|gH|lUfrPKRV~$ zUM|9oFks2f<XPY;>tk@d!<95vfw3QhqvWi?@wDq6LpaL0k*e6ddz79BT{<x&Uarsp zop5%DRnbvYFLX>1sAWoe?T`nnS$pS`-3Tk@zG~jz@cwyIOBv6;CQhHQw~oh^t%Fx2 zb)pFj4z@tcRhmdq6!eS(^-gD#emOXv!4)?IrVL7q%lX1YhdKX_Bh{XYLjI&&cI|z( z5s4(Ka;3NolD*>4An%K=j<jYRsJ2?U{r+Y6z0)$enfnVF)?KiQPH3iTr%>-Ej~Q&o z3|7eUH7ZUs3eR|41=}%JJ0_Byi7pB4Q;_5A=g~$e?8_^H9E9KYt3pkj$7U)?j#;oi zTPruhNCo?{ZU7Dj7!T%rAzPmTQDY~zS$v%-!q7@l{kx-oZ;AI?LaX78z~?+uTe+Uq zvkUcA%%>|mi7a;4dCDE1sA4$o29i(b#!}I3-`qK_c9jTory|?=XjV)QhyAwF85?#~ zzDI0inb!&BiV4!)aaMYr`(=)UX6`~oP|vNOTmh{t7Mvgj(`1hOoCf7MAgNu~1KpRT z`+@K3aZZ<yn5RK#z8^)MRxtcVPNf2C3q)ZHnNj6Yi92*iKRsc4+6tl_eHPg!W*hKI zuUa*<MmX=Ht#k<SJvxNxL&U1)=i$)tb)zzWt*n`4ByK4wcDt)o^S0$y+LrW<Vn3Hu z_DP)6r4xoIP(}YwN9p*MT6@Y&hSCvj8FQxCe`>Bs3#TE(?EO-NkFN8o1eUH}hsZK! zQL59u{~;8YA-T}DSQA~np6S#-9x}_?5nC$}O+V@0T1rd5i2?D<KWYJq9U3$pCcEL@ z&k^I1!@7+?9o$ViNGLm3k!a7RI64?E=!y~!_%ZQR9V?`${K?oKS!rxCc6RKHh=FNs zVj4gk52-avSU81;=@kR_CGBF;!$JJD_l&e{v^dRHp7G-+WDnGA0V9C6LTcAl#uN;Y zq})EDT@T1A1bI$AVP=hXe;#ZC2i#cawp{17T<5k7a$7pyKX_mXg<scZpLkR)4cSM8 zG{((28b0IWO$D5w2HrJJ63)33Dkq30K~|<z?!zTPb!v(x&O(o+1eV82xxK``_|hYX z&p8y2oHmB{6tu!`MZ}{CK6N!R-3f!FXuooV`T_Nk6S6=hdSC-kuOceeoGPcf_%iUg z*u&B}*SVn7s@79oYiS~rjPrBLkBG!mTug_#iZJD5BtG{PuL`gf>>3)RHfO7AcIa|v zXp1!&-<qL@@@X+%+#C@W$G!yPl9MCDkkJxdR6gPuSsf5ITG6)c6h<b&<;y<Aiw7xT z8WM3;dal-Y*ZS^S-(AVP%q5>#l^I~KftlfNtMq61dw1A>a=X~4<m&VSjbR%-l^Ykc zqkm^ua+>85Z;pY<)sF9*O3$>2<+cx##^7*ffE3((e&eANXIUkNCk!L8n(a$_ehl+* z4feuPsnHq;gn~#tI;NxQ1W49BP`z-{Bi2o`EBFM}Z*rIvxvQ?rOamy8^fSo9c#tjm z?yTAJa{)}oHV_tN=VQ2&F~Lw-`O=9@;uFh>ALZ2I`l`v5vy2u+%h9A5__i<TzJ}9& z4KOZ;myd$bwc}E-bj~jW3nt9`_EfddJ^VTy`r2O^1n$~s)bzF3lhFXX?xf#&Sm-yt zLbwn`9hF9;O`WVq)bcGK-ZI0%6>m1?hm(`WdFF>zER)&b!O~0-#laM>B5Tpwi9#Tz zTGVXQ({K#eD7;#fN8a2OX1z&`A(scobItwS^jgK*npE>3F}>!sHW(f`E#R*<y!4<V z;wqMCJYh#ey)hq}P|4p0`^Uo(oPxWQIEpctE8$R%`idjoJp_z>2z#e%hv5k*ZAUg@ z7Pz{vA9BNLKV7qL<g(e`Nf0WBm_XgR1c@8ac@bJhn2pI<Mnqlo6X(4h)|!<EIC>v% zxfbfC$GN|_c_v2Y?6=%bCLx^k#Epkc9O*sZRJesDU-YwW3X!!VTlrX{_y{7QV@v+m zM20mbYRLT=%e_wcSofkqyzn!?z4Y#){>kE)?+nq#_EqpOLd%>4iQ<w`7RbQ|SyQBv zQO2!0nC>kgL~&=?zUcb}s_MZec7z<t#+%<5p4BwD)goaEe@MTJz=-OEtDA&mDse1= zg2Pr0D3krZN_rx6hC~l(xuJ(|U|tkw?3*po+uP+><BtV<sjA;wy`cCEeU|SOi^KL2 zFkY9oa(*cG=S>5w1v_V}-Dy!!*=w`?A=H{J0mA4QIxL6puun(yFBusz6Q#A?%J@iD zG)xs`=W;lx4PV{~9geYB?sawAwS#t1;<B4<TC9ID+jc)Ir%f|>_p5f>GytMm<`nC` zd4*@#`=G*<UCFj#UR8lueo^m~m?OfeBVyhXPRfOphS;Xov!}ph*vlg-Q=PX@6xT03 z?Wo&NljO3wm&hQA!CD*BQAE$JU6s34qO3@eAy2H)ttIeqPI&}sQvJ|fEwtM5G{`+a z`;|!9@jR}$6FK<4Xe5+-57?N)$7K;8%E0Wuat+UkjtwqW%s|(VC#<VFk%?UcoIVK# zU?S1JoJ<F;KL~P-N97Wc3ggp3JD_FsZR}F*A$=C0RX-#Ppm0EODqOPP{m8fydiA|v z5eSF(*&-Dav{?}BoTXyO9>?NsuB_Y9b)BlcM9w?b7Q(I>Erv%VVIZWTTvc?!LQH8> zEMQqk=z#Vis2?@U;+Ues3h4q_34H&Y4Pt;%&!%iwYD6=bTZapicM+MF<{O^Bf${z! zmjzfWcqS97V@g22m>k26GA#z}6i+kJ4o_-~NQapy%_u7k!ZE`_V(X9RhiFhdd<2(M z*~Q}*8vP@itY_yM$JmLO-}3=39Og7~lBGlfQKKEha1aZqrZ#BT{#+6HtTs1ZCx?-L zNwrlak-*4FPjpWH+?A=Sx6-3cQ`igZO5{$kEUdt{4~9Z0H20V*)Hv?OghSb{9hb9Z zS2t<JD=i&jO5mATHi!tulu_B!*huHN1Oy~LQ(%W%deJ2^(mNp{VNZrukKQa5_p?sa z8pll-E@XE?yuazqN`w}zl)z-MfbGGYuaG>rn@evFs;Tyd-5O>uH1f=ol;|&{15ycN z*HZqqlz%PdPf7XL=VE;>*5@Lw{kjgb`l~i~1yBT+N#b%fdzX~d_tb5ZJsp-O8*v3! zM8DNA?oqymMVE+3_d;s#NU>E;r9d+gQGkdXqdIk9JQwGoaC$y-ZPt{K`TVH|4V7Wl zSzhu-x9vUi1(WZRcFQy%^;*`rE%OqS3cUymrc4IrV8|{p)Off!oJ|&sQ8~DwIEtI6 zK!yzh%1kT((;-NfaM}CNP{X6L8VAEudhdtttjJiJ+6!tS+(|p%ayUy-l@`+HVS-&^ z9js%F4RM>s`!L%BHm`@wF4oGkK48jGY1z=i$)SYj7*G44+=siUuf?*8J4!8-oIp>! zp?pA{;#9_yn+)m#ghwk>k8q*x@nKcc^N8kKZLu>J$OJoNgPAy+@#6e33HlheZP#%m zZBSf{P{(L;^3KZ}09HHn?!_E-dn<jOE4<EwCSomnIILnExDsyNn926E=5V}RNF<M+ zPEML`3o5meF^}4grKwNV?bx~<svC(Wppq(iw^IH5&=FhZIfh5OA}^Fcxr?ab!Du)r z2X=RU4rmz05PB{|C$ci!5ci?IUmg}uhj75rSiLcZ8?<3hlXps=M_E?cv#ti~f2a`0 zY^>PxA#Ph8PXTCz2kffPeu;;O#%wSXcxp#N9(YY-xQ*CWH_g{E4RFtzkjL_>dr9K- zzIeSIv0^s_x^}$<uK1h6_Rf~UZSwf|Xezcz;u2`<JL6Npy4Nw@$x-a0zM)DrTEPvM z0PLx@ovzUi4)&>1GoyW@ciS0{zM+Z-vp6gkyu-3N&NW4LQOp6UDuJ-?KN&5<sEpl& zpHuBa68ETrPX7wbH}2qLWT%XtJ13$VJBi;gW(^YVvP3)HAN{!-T~@1;CmsDp+6T+Y z&u)YL$|HjWx(N++*GW00PXiWlPJ@>8#Wo9aQTmpNeBRX!K^YFbr=Cd^1)M8j@^W@> zR#N<jIcmQ&2_RqM30d>!YyN!ApNIVU19Zt(qF+r-JJzIgD$w?s?m;<4wtL)%kKJs~ zGUYv0;3?VLT%U|4vuk}khphD`nLJye_3@jA2Pgm57*?hjq4Lk;4>(t(E8^C8XFfTe z^-B{S2d-3l;aDQVg?V$_huYWRej36#rAcaXRm13RME!<QyYUffcxJO==~qdxXp~kM z7%?0bg+s@<xtRX|W`2$v$kXVQgN6!mGb{V$@Tt-M3a0OPA9l6R1LCe6KRQzpu^+%{ zmjIg{8n~qzKyHX9Hb!X}C|ZF+V{5-ZK0ewnXIIa%`?j|Ze+a{YPq+BXhs$fWRmZN% zzV;VOm_pKWg%*$wpHOh(0kyEC6>j;;Y@SmNFC={Jlw~5a^`e_9K)mfMoCoolW7h{h zG@7iGvrN~KQ#r;!sP1uGR)pO)Q&^rhZDUDK&9lh9R6spZ2gi|OCq+rRJR8Bz8g;X+ zJW7lF^he+S*^mG1#b5u%iy!=nt<%l6^Ms2x*7@=8+B)u>i?wtmb-s{?#*MwQ07hs4 z?^9i9v+I*CXQGnc;CD^7(e~D5+no2YBb(ER$Zt{^N_AZN&89PLzkAvJq%q|LXtzc* zbjQ*3u$T|$eoN62r$+5<j9i8in>@lxWQZ)(<*hA|*7j&J!LbmeoFi&sFm`?cfBDE; zP==ViS<ETW2;u8u)`)7pSK!sTy<3DWB@!%0a7p8p1yq2P*`N_J1HsFhj=y~a_*8?~ zFRjZO-suvCHj99YZ6N4G_|)NnuAeB6H+=*CUTQ$$h3TXs76A>-1{)@ts_qsHfeto> zfc=VomNX|{Ww7SiArNd7pbW@z*ght-+#Mh#+0WP&ds@J5a5^RfInz8g5_AM8Pvh)m zUy`>8Jid#LCGdA!{e7>|lkvi7!BoF*ln1cnHPR<I9Y+U4NlMh#Jj+^Dx@RMCcbcuy zO*ty;WjIz7efyJQet4%a9tTP$oLC@7I*j)@oB;p6!<B;9>{LlU^|0g%c!Of$-N~nP z`b^~=5$nhH4$Td9k=%jUirWb!S{d-OXCiPxy>0`)G%A2@!rg(Jq_Nibulc4m-&Cd7 zym9lRYoFcTefZ$c-MhP=VCI$fC8bl)Doxa0!iVeV-WKPte8$Rm#B+j%Ryxr=V@2pi z<!lVU$d%&EsR0+!Q^0glKRP8P1`HE*!m9SdGS$xQ^oKPsBAa!#qE{;c?@uP9vKUvv z88VZJ2Kle;$S1C@8m@f$K5%{E%$q3d<6Vw14rnqO+z@<{ny3WRCE=~$y(9@?*eUzg zEzNKr0EXhM@lVPJ_RZVda;D_=AZlqaJUD2oQFun$<Tf=JL`}Dw{KxyI!rbv6-y;3A z>;oopwz64F6~FFAivOdKyi6-V(VHX1Nt)%$Gg&*&B$=S6&*SoV05?Y}fdfKkfIciS zyKz;Emm8<)R#$VoYFMfm?z3C49X{q5fG|?0{!U!`H#amCIt_44jAm>sHRgqO#oX_O z3kLff>B}4NToYS0wp{mSlj&To)$=)rzIv{s@A2QWGv9m7orHKOqBpt^)G_!PSKe%V zedN3qIde?$KN`;F3$;OF_A>%2$5rQ|Ks3rb;W_0)W47YQfWy(ThJr1{k}K#9=x`x< z!ZzF!f}jR$A0u1qh||OI)5#O$M~{xm!4R4sEpdoQt(5F<V0T3nC~Wy%I34IhySfLl zH84&@iD-alk@sgC6%oU10~mK+L)Y_MrS?_#m%WV640!`<gA{*3DjJ|7@7KRqL&KA* zec|-P%~{~xy{-d$qPt-~7sdPuM-BHjP(oB)|5E?Qdu5wUgGP9X^KK@hJzoG#w<Es3 zFTcVRif{3Zgppg;TP`7{t#zRw#I{(;C<dv(!h_W)c!kv&j8nKSKV(w!qsi=^l-xxR zfaio<i-`2fR&O~`I8925Lg(6=vM056r|gYR2_~DFh_rd4tdM|aS5(cmco|e+!Kf{( zo<GPGFV~gH2vj}JG9#O^lmzp-$UF~VlT3)|pCe;hYBA=)LGA%#pW*W0pzH(v1Y9VI zFEBhd^5$)?baQt(9b%f9rBjrQ`LG3&AaJtJ>|0w~TNhy4KPkH&6z<av=uJ0!ZwnC@ zowIJ%`S!a<bH9hc_TRtr;k|6T{qDz~JR@(cQ8xTmp51-$Mb_DB|5DaJoT2yH<*oKs zd;7ijI_=KZcGi6F-Oc^sLWNgR;7HDBTGyn7IbvoXw7eZ3yXXX>_DYe$M_iwQK1Y-% zd3T(auZLd*tTXr3nX_>`)WWTaeUz*1*b4TWk?780d115cmy46K^fw_1iJkpIQ}OWO zbac--7#8a}F%5#tS_B`c!4~_bTM_e6gR!hFT6#$<?rvWJ5vTJKWL<yX%}VV`uMJ8P zrYpiRU&cD2_-HM+$jy-wm(WK$0h&edefZgvK5*dYka$tYed}T$_uLo3_xy`VZ!8<< zC1PtmqG&40(x!1ZnGK(zAZgS9tk|G-8-NxY+(Ki=gwMM<vVqA5D5Bod(t4oHm|fyx zdA4F&UVotBiaRz)+z(G$9_LzDVF0<4Gy|+N+{Cgm3q4IDBePl@6vpFWH0Ae(UT_Nv zPod5$Egk(hDyBvSXJq|Sp}pfWUc>p#qv>M#9R$`Ska-Z$$G{<9)WAHF2d<Kinj4)w z9y!UE0;{34;%OnZCoDm87v~kxb8K;5ah>fcS9ED2HAO-cAXKp;&4hjXY#XlLtqpmF zSj>nrDZy69<syTqP(-JcfHz^B%rv1dCeBbufr5^|G)z7yt7x{_aWM<Hf#Ax?-5x%V z>Epd7+1u4x4mDajaJGtk6)L<{+akm%zvz0MiG>pNu4_ajm3)AhG}A>hZ&ajh-V3EG zE$3k|$K?#ep*zs@9W@YA8lDt;yyFwK6HYI{aRGai=_pX)E0D7M#nh75NjcI$q3E24 z$Q9Yh>j0%A@(Ksq!ZQKmC<yyV*I=G>R5!u+I9?Nypq{#b4a+X_^pbs9+i8&_iFvcd z(Bxrhu=!al(ko@^v8rEFqvOFhZYMN|mAy~}8+uOVu2Fjy&k{~9rC#xlr7YOeL0_$X zMugs0B1MPfhJEL<fwxQGu>|4%ma4uXNM5w3*OEhz)bxrq8KRIh_9@a2Tqx+Kpn9ZV z>dK;50$(r*YsqYv!{k=NyH*#A-OOsZ`Z^X(n$nNC^kcrqsr2KZw4N&=O>K%>{BbYO zhVFo)B_dE$!?%~I<V3>B(LszkJ0BAF^obKB!jBif`5%AwhkyR^kN@k-|Lc!Fuz1j? z5I9NzhF0)w2=r^F9Q%MgA5CUUYYFuMk}TO3#sVAGzP>45<37Q#r=Q}>7DwcA;Sw>? zSlcA5Z4%Zt32~c*4Hlcxg<@^4-|mnRm?a8wV+btnA02Dhz0|BrBwshXDGzM8AZttT zT?1aY79AQVPWzc+4Np=Y&`2w3N4GwwcqK9dxddUi*0dCYCz~IUb5%%0nHmn4gow=< zWMxs=pFKGi{>?J=Z#u=)CD-#UqaEAV7$NT!@uy~G{mR-QDO{hP-`RKr+K@`gw`)Sd zBe+vcX}>#3>*%0#L*mejMoTl%b*IcNq9?oSuZ#@)v*GK&6~(A_OU|1wYQUgHg3YPY zNFj(YrCd$B_@b6kyf=X)PS;bpCqP8ff5q(SHCjT7x0*ZhJ20eDF_JsRCN(2C(&1)< z&I<6Fr9`USj$4#isbuwe`3kNe*Ap5>XP63on|Uh7gSb{!bK82Cbj^M_lU{#o%4$tn zttqRJveK@m>ZrOz(%QXreQ?$XClwa$oefkS(xQG`E;41X!{ix)8L$h+ycj<zm*hR( zm@BG{ox-VpalAN$Ufw8w4ZCuC*eu55$@tOMrOUtk=%^SXF?a;Dw6@HCK+ssu4YzY$ zCs*!-=4x0Wh7m5=8X(k&qQ@%iI7*kyBZ752?!#4EQdCfW2fISqGH^42YbW_~+JHW) zFij@M3C6=g8w`-c!SGS0M4=on%Xj8XT318oCYS-)Sp(m{v(gDSBA|XUw?-7@;1NtW z2cE@e`s`BWV^{-GgXYIpps%i;iYoxIMZjYALOlD{<`16GU-wg}coRCr5OS{1rbJO% zPfZ^|Yr96&u6YkoZ3z3G2_GJ@Hc&~ubeWhT7*c-P(nie2o`E5VW?jBbP`^OtQ-XKG z-@9eM49a$TNxS#^O2&9-GJt!V+TXcVTaFgutQwHnbyPTIL!d>UjvH{B04Ilns0Ozq zw+pwy>ko*}kax-f@(AAh<H3#RAEAmN(ePnRrK)yL&jh~DcPEq4VmM9g$D?EXI8wSl z=INv;SGyCc*P0(2u;+M*f?ySVhn!OZ8BuF^BP!Qp=h(V%a9oXO<R}iD?fQ7Lt)T3@ z>1=59J1a<*&Y5Kt7v!E^UGi{ogz_O<p{+s(T*w;P<|h1eL4M?<da+!<)CNhTV=O5( za{&g8#u5Nhmaj^Bt3&pZ=iev0cWyTkQYAMhZ#mA!MPYeVTq9>!G#u@vyBS*N_9S;5 z#VcLF=|Xp$yzx?XE>sa<U8i5r^xMhd1n35P%^`sD0ID}Ge^WS>FD6s})r@UL8rxg) z?fzu3m>lV{L3sC5-7aqY4J!j0l%KO{%Jx=R3w<roFpsD>vdPm{T8onjUw96vj|=GR zw_P|Y{jjnZr(zU8g2Km7@Y=M;3**W^Li$tN68IfrpKct=5Lgzb(1>`T!~)TIcE+pd z9#glQUD~earXS|zut_!=v?5-}M-pejw{L81ZF!##U`iegpTQ_Q+i}l-EmZaUvJacE zoP8ek;^%MIb+eZ)U1~&uCxZi+9$)Ib``+dE8p$95UiOv#@$6|iCdtcI`*O6+SBw%6 zrn<-j>*wfDybixtBho-JJV30>jpLb$OVxqpb;2&L+2u96yk?hIu*<ZW=$B^y1{g+2 zaLST3J}+;K)+8nwA6suSdI(H2PdgMnX4!GB{?l!KyY0N~PgUvu)GH5Pw)K~7H}FfT zat>`dbO>c-;-FC?C(Qzluds(cPjy&~4sPnSVr(m;vW#8Kwk;I}0NQw~?oOIq=(M8% zwwIl3Q-Eo?mG;YLL%2B*jYD1U^26#l^xXXRfaUQD+oHnu$_lo)S9l}hzlD89<ZK5j zYhQT1fx7*^uzH~G%&e;5tjUEM1MQC{^HRFLDMN7;OB}hlNTOU<+~b5;mR|D7WVQI` zA_KW7Y4I~Rs4_{h9Ex}LYA$b5+TrOn6$k0*wxyHMqtMCR3b;Ig_QQ@OE)nIhk+uWo zL}eMZwRD0}zpiJrO~;l~>N&Oj4Dx{l=|*iwI?YihN-NHEXCo04-f;$YGg&5*-m0(& zi^Z(j(8Mn=UwdMBC>^p-%bu6E>JgBMGgOHd86HKr5a}$^wS#I~8k1-b<yH8egk2(l zE<DCqZX!gL9kaL!e4kM&)|O6w2++QWm6j$7?tF_csb*MOpkxI*QLjM9&V#zM!oWk0 zxgdE>!fZnm=dsG;j!Ae+ZQ=&(kii0{yNy-BBC4Zq9qw(U3UYN{prwwjtK2e3<kv`4 z`7&AM%jj6P!?A3y9?P~f>84WkV767yw(AcjStU9c?2J2{|Bt<QZ*DA0?gRhlr?_Rc z2S5=70ao{D1a@^#6|1_tta_<fJr6OsB@nnIZx?_I;{rvZYT%G%M_9Wauk2l~WUV(G zij7^%e^_fNR^iZ&XXGz4-8246Utv#Xo=2Y7#RbWp8Oa!Frigpq=j6$gCr{=tt$~CH zl#2x_I%w~*E{+>hS!=LxOG9gyFw=FpOvbKUez+~UU{{k%>#`w^F8yn8=?`F`tNgxO z<@cdV$s1Xn3#gNIwOH7{2Mb%;(Vd5xm8;_PeUJBjPxU>}**)D^w~p`cS)JXBbaqy; zvmh>rwk}}`>L5nx?F$uNLSy<%s5DONq7$rmPgQJKf~?YMDOfR-UhIWQOSwS#cWjV| zFFQUOGziFxz;}?7FZTlZ#rH+vJIUNAWChX|n6?O}K}#sjh00;tV$Xwmj||>+5zrg> zk<!xCU64xvb%*<txMQPIrAbb+q?08L7+TuFZ3}g=?4vC+l5b>P_C>oLgtW7W30|W{ zYTcl*k6Vq$_idZ3h{@2&H0{0KkF-zYxkCGU*J<C0Tp$+hGq|nN>R_u)_f%CXsg`4_ zXRoSNt-*!DD&1rykok^GwtUe{RPk7NPbMd!kEWK7EM=yVkKoac$w!bY2tS}s6v$A1 zG-k@ajO8vr6Q!kC^%F5tAb1|4o>2A2Dy3v3$Pg`w#86h;5QC~G5D5dFWdnY&rH-G> zFP5gsIiuJSHIxTb7+inRmDA=NQ2cz7H7vq4NFUUpI<>>Olq;&rw(w2<{DK83VM9~P z%$uF<RnC6#2BkN#M}}s};tlM3T;VY+FQo<|qV#9Po0_cQCZoNkOHKYngcl!+eUd^n z-l^pR*o<e_=tNx_xnUo{GV*EbrH}w+fl&Ned|W7iekr4;U=QNvZ28lqPQ@Cqad8P$ zi{mixz!EUVOwqQ@T*vt>h7Na9)onR|r)AGq5-N?u;FmLe5RR~9#k25jDr7FM6Kjqy zvQB7t*4MK4z`yP8vy1L<g@rPJwobECU`*_39G;aIF`Hu40!UpHJm$L6dm!He^DRp9 z4YKKM5yNJx6mQu9oQ8RWQ?1sF=9Cxjf$dWpqk3&WVz$(SIB0pi4m#Aj_B8G$0iS-a z)c3pgr0%*(qm_VG0lkq$35G&_5FnXJh#m#{c+@a1(Ef_((^gvy)eLP#zVVHK<Ai!5 z^Ft1u`EXkSjElWG<rB5thgY&}d`6%YYayAPRlp8gHY&h;l_=s?fFjA~z+HH8V{kh1 zMG)UOO2Iz%B!4Uc`nWnehqw@S+7XD3K$;XC+AC2j#FcZe9l+?g8PE)@{c3#(!DmG9 zGd3@{n-|>83vS#~z&gXj=QT!r@jvgvkvAp#pL{%AAfeO<l%ggm=c1Y9I8?%cL1f7p z#tX}*NI>#^iU0|yTvu1HwQO2}auE{MLo8HokRW#%{Qh?%L2xg*#Wdje&re?3&uPg& zoTpR4C}rhVg8{G+Bc`ag0?WQu^^wb}N9r318X9g{+PoffVEm1_$%a{Nm{m#8dY~c1 z2|;j72_JkaIM5gZD}mL?oz@qEv>_jmfm}S&p^EZguSy>kd5C{|!y*UPfZhu#fQslM zb*>MvcB*e^r&#FSRKI`tVCT-kus1I-giM-zs2<#lY2PP?!JUs9(*0dp&y3SzCRpfD zOo_Ifp{H;`AQblz!d*dD;ISr>45SGTMtv-Ro2oA@G@sFI3|cV2{2*jPrcYF|K?0)y zWz*Sj`pK@%!KgP8?IswC3y>CR&cs)83u(EbzcAyH#^R=t1?Uojw5hjxWh!oPpeFCV z*QsOiCS`Qv8{^01qr2ANq_cTAQY!T(7B3YrS9Us%KL{Yb;&LdY7M>~^X0yh-afF@Q z-gcbc^>jI*)-`NeaepD!LZ<5Ei*q2``t~;9!Hh#%VbS(?B<vdN6iwezb{x>DQgaXx z)3ke}syPmXC8m5~7i&l%oV7@cwmK?>;7+l6oSpzVs!ETeVaT@JK<TV5e!fe@H&MGg z5WO_e^f5vXBLymqIHbV+(!giB3Jao&?V;JUH!k4(#JvOl{LeH8LYsGuwj)m3d!e19 ze6U1QSJ+f32nRxr=}qdouQ#{3oZ<T$4408{ABO|6t>p3~ww>ICW&^3R%(R)2RDA*z z`MdBxO-YJfK4TUk#5FDrCwjRvxH87ng1k&~*lQ*y@vz_SwAFhp?D`4()2N~o3T(qN zKDpcq1LHZdPQ3F<pKttlD_XpaI0mPMbJ_{PmSkFa!0{k4MDc3mg64w}Rd6|(O4Xf9 zi?k^OV%X^pM2G#L!FlP}LHHCs1zB87fpuV)4+ot9f<sap!}5KE-0s-C9TeEdpd$iK zhZS6J;CfwQq$eq@H;TN$mGgxIXPk21Sz$XNb7cG2jExBn?S{d7Wt6;85p8Z=n_E{E zBmb8exgJdpdc!k_5qUm>m5NyTS2gmd;@Ucny_UtoRC#(IvSq%%0PRlQD0iZ|9M4Mk zyV5S$d;ZXgE@qT;kBgNNNgf)PWy6ebtLX(O`QN)^+f;)owG|OMWbJI3Av+DNwsKx& z&b*c#chGB|j9DBnd1VS|GT<*O8uDl&_7P~+Q06blC*EyE(4)Abr-P@mHTtdm=gTc; z<T>Hm%(Ns{^<BWvj6WMQKgGLtH`GZAu$gVE#gCJA()H=YbzZaxh7!r@S&a)Pt7!<f zsi?3i-z(*sHd!yZesN!KXz)3oneANW%SsGD9@dUq0otDLN>2hlKthBd({zaoVHkyi zmWWo14ivzt?md6BgzbQFgWqHW;(OvNda{cjJsQRUynXYDjARaxC$<7E@+RouG~MNI zkxPKQev6u+sl0-r`x5GoEat`(D=Rjz4Lhpo3?KD^TN~d;FDaLFD{nNz4`}cJFR~*I z)EnXVGnwZz{K;%{mMTashmpQ9Vw3%4yZHVz?TOq)yjrYHk|`_r04`T<G1a8*ibv?O z21GSrHK+)&NX-Y7hu&>**Nc_c_IMyA6!Xyt<0*qITNHU8f@BS_7qx=Ql<y3KEAfwD zFiXi7sR8fI+~pB*!wgWpcF;|CC8N`79WXE!qahm_vB(c;A|>zxHqi(upZ0jMY+SJv zH&mzA<@I@w<;E%t&3NBohA!n>T6ibR=&D`rXqIK!Qlh35{`(m`OI?r__&0m!V<xe{ z?oMa0&-;u15SU#$hODz`PsmCT#r(GMY)2p)Y?q`Xg-3I#d1mV-3Be%jC>4&8PJ({_ zff5%cH}P@$Ad3lswr4T8QWC7Xdrice&*cSb)Du@1F|{bhLOTd?0>W}S6tgen*bJ2E z?2CR<G}}@nw&fGzMFz4q=I^wa!34bXJ(MDaQYL}9w!{z8lp(flCb&Py`lh)0BJQA8 zaWx2qLZrz7FEFYU^hMk(1T~1PZBy&pbecbsc?w6vK29(3$<X<HnP{m4Rk-qZG(-ok zLo7N6o0OvrF7+Kt2^p$y%mf&(J~m5KALbT+D#qX`#6j8RmIA5B6~(NXBDIUEI}(6n zi|N4a(!M@Y@=7b)D&f#&PM6)}av20+a&r!(6&mh~a1qA587nULgX5%n2_>YBebK@% z&rYe-en2zGs6Z7yPAut`H$aB|k~WPMe>gKFDd#z&9n~9CO(Tq?y0gP6Lst}`5Ix&+ z-w=_MHnJ>L$htOg+uO`u(%reLRd#s!`<D@BXlt=`h;A@3Ew5fZc=(-HuiWuNlDnV9 zJat0zG&`T>7ic>6a5~MW^%@Cu_{Nz$xc6z3VA`hHSvFR%cIUl<j=@{C=rheS;p_t} z@D2f>>;+1e@?cOgdysS0>BQMF`=OESCUrDY)4?NzlpZ`{USC?L{=MPQX1{P>fz5LU z$0(?0gnX8rjRnINQb#tLkGOEq8xNoo^fD1Shm<iJ%gYZ0dd-LP(bsc`>l67>zGsOk z*bys-s<K@68~*af21~8_Ef&ZO$UdlJOR=V`h-RP`Q;Iz9gqS0&sn6|}0r~9^R-DGl zR!HhvrK|SWxCnwW6OAUNAKMGvsluMyGWxuNEDqnk7x2_+U5c*0zKl!9@>Ka=nPmJq z0Nf;>_U1*gbC_mu>1Jw*k&wai0h46Se!>T=`a-Wp<7-)gcr8F|OQ{he0de&@O0^Y} zZ{?R20<Kq)(%@A`#=0%VA*mP`rHp%c)w30dLtRPLt+|~<CGoYd!_2H03*BExO2%`o z;5q?#C9Ib`j!7lPz$RRNu9~XUV^h6X^i$NZutfPbBd@gP`=~dm)IL4M2DEb~wz8fp zHC6WDV^gOieHHoeO?r?IhZ(BM>uzy9)l@;l71Ddd$$1ZDZobYRp){a>@9a2OhV9mG z{05!V>E#5JLO_8?P~v7Z6`dXz;QxyXFTB#Qy7N;Do(+-H3OF{3QBNG6;t#RCi|k~W zn)f&A<?XxJ@IJda411S&n7qs%r>8S-^jNOJ3#>n1R%6i0%bcBGUqfTdh!R0dLW_tt z;cMZB_}<z2Q2tY1=SLqc9r{&F$Tt#$CSkp0v(%ZBUO{hCisf@*qV;!^Ni+U=eYU{3 z=<CHj$7qEM0IVuo5-2=TK;M}{c4WnTWZ%)MN*O3ri^AJ?BTpN_dypI%2<>u(c0|=E zsDpW;nuT4c+7yygL6@=D3nr9o@#GaYEXu${w05#@d6rP8+F-#(RUvHf73aKc0x`~6 zxsbc)CRzA8uOWUGNo>wRxLdSWC=M3VeQgntqur^MgGpDZ4m6+;^le+Y%2Rx_hTAJl zc6vmG%cRa1#EzwTi{!~D-{@U8APF-m5ix&7+2M7B#G7J<jFGK>^abuHYp^Iw=Yig` z3;Q>2&i4Kqj4fl2o0JRLgBBAXNUO>%E2JUUQF?k4RTWc7+FNY^)GxZa<8RM}50@-* ze-ze0sX6(6XrlvEOvsrwz(}x;Ff*~WRye)Emb{Mx^;N8X(EU*eg^!5P2vT^I7ZRW3 zEEgL<)KaLI)f0FW6?_HwIw;#udi~eQe6kguPuLebiHm?1pUD-oxZ};@dNUZAvwa7u zR}vMRaeF{mA0dJ5>|~*ZFQqO$BkM1eXnfHQ>qp~Ms5(@6{;oEU;V4j*W_MYt06H+B z&P?KF&slJ>CBreKQTR+2ZAhSszy9i+9;*%yx@DProYp$^24BqO0IBLlM8j9{LRQA? zTLqZMiM5)h_`C^L1y_`oLdxkXdP99^gx{hskb|Uym#Ed3!e+$>>&hIu4jV)qHDVd$ z@ERZo;r!hk?_S!HlAb<$h?cY_rC{AP^YjA!b0oLxZYMyb|L=S^t=2ePS#-M6-m%|? zDs3HYkD<uw5FOmCowLej<8Rr<p%GTwIGt4+hv|Sk4Y)Q1BIweu)5gcMQCjm|!DhX- zG);`=f#a!U5u9CsCYTpcOR~;0N3rm)1+zs|p;7r2+`XX|g06~1n5YVbw{bx>TU<Ee z3J~5My=m6#4Fn~aMS3%<-W!+pLyKuCQIrD3$3{hQ@Fes-(ga)ncoUsS6P>aqfFnr{ zj8m>ovlLxu9-W3gEM0$0%L7tm44S=x*5kAVmY}L}<v0i`AN#g)O9ykGr;Uh8&DEf> zmw)Ag1qw1gaGPh^^I7@EfT*Lv6)RaQf0e3`K(H>-&GG#FJPGmRFyr00*KFKtHtsd0 z?lm%uJx0}n8lm0m2GF4LvgV*~4Rfoxu2;=fvHwe5Ms#4sh=7c)^x0T>ygwSBg8F&k zYwAb6OO<ISoNFENo%dZ;yXx7+9TJuMP<KD3^I^l&#j2=m>~=oVGZ1aZ%uwZaTv)qn zPv}T+5Fl;BKqJb1Lf;}NgA%bwhMkX$3@dnomM}aLR18({p$zkKq~^Y<XXiLv>J9cZ z;N>HcGq+-ZfU#M?#$M(a|BE09U<fUfBB43MRM&`K&1^`|rrTDaBx#Tf2#Kq}Sj9FK zrzEf&7vg$t#9<TppqS+&HC_iw*fbo4k_K|;bx2&@GEHh|I#?C!8J9YKRvU?DBk^n` zo*3qw<W}7GSL_@oc0HF~HrQyJO|{un;Y~%Nz7ag0WS1G}Qr=aK76ubDK67G$fr9?t zWmY`MMzNss;TX@WLbH1ij#9?>E;!<y<Uo9)S76wfTtWwMA{O+QSm+uGI5icSN-Qm} zWGtwJ=;S127%V4<O*w5P&y+KnE)OolCn>Mvi}~P;%3Pdh{qv*;O=kc~GfU6%>7r%3 zgi|2lp^z?nj<Yy+Uk4=WYk9`tRMs#{t*N6*%P;5?Q)@UkrN!#{7G8aeczxKE1WY%5 zrDCuKwNU#q|Dr;E!4RL(<k;~rK6&)LClC3Dpa1SZ`S~CJtFQj(KmWHs`pcjH<S%X5 zB-Tra(5+U%i_$Ga)9a`hHE~tW-U?3N8#=hyY{k5hKQn2rq-uuaA#yuNO3-aHS?l&& z*%_7gdU5l;F7KB8`v*UW%<t0P0vKmoun=^FtX&GqtSxE|=ojNO%Bjq0{I0#45>cTO ztwu!>d}V*rojG!wbb5p?r=fBXd1*!2o>~_ivLUV}Te8Rm$gO2+@cS9xY`V{WEx}&L zYm!juat$a%J>RV#fBZ3RVIdQ|hM+dZ483G?IKB|m4r?HYyJ<dZ@xo6&KYS_i(M3tP z<U{5r0d2zZChlYu(7pa{*%0Tx5I9=4b&<rXH-sIuG)gb18W~gZ=s2kDp~lS-1sBaG zd0R$xKIsJncnIG>p}e&H6kW^;d`xFw8*vXutW{opDYLTO2%Gh=eDkr8Bu{5`>US08 zkY-c7i&Z<fx?5N5P?grJRAw!{bS$PyO3?5a(~~>EswT?fWT+NYqC8NjjfG-C;Zz?n zlD5QSA*3FH5V^1e+CWvd;wca?OmZpNL^nB#OlNPDb~!(2mgv>s;ZaoyjO9Kuu{!5i zk?0!ixa#sBk=($&fW^iFE@7AQ9Q^l$NZAwA5)aP-Wbzb8*$xNeh-m&q^AFNfF>y5* zU+p*$Dk&+OQ+{k*VNxv)-dNGcFkPvw>GwRKx6}}$#eujq&!TloV59A%6S3ZK0%))s z!lTo~oZC$#IxS9La%hJ|YvrZlzNEQsBvuIS#qim`zZF0;Yy~A~s9`&)xneZ?tYqmH z3`9dKY_xtG1;s`|5mr#Z&b*&rPKNo69u>tNJ!B6h6#Lu_d5#%cCsa;_J|CnLK=B&) z5fb!B-=Foxw{|9YN9|a#qTS@>vj@-A-=Z=JhciuKN?<cdgGE39Yl_t}Trnxm^Z9U) zocG>9AWo59Yxyb=gnb8sDg;HP<JLv?I-8_}tcNrOzjnpYU%?nYQiWhUjnW=WD5^PX zqikHm>8y=<mo+&^AOcWYG*vOkAdSzGL5}-nENSlbIKL3bo?)V3uJ~*`Tv$vr%-_W{ zYWDb!4l?XeQwO0_$1dC++1aTw|5m4Z-VsdAI(6S!qwd~iEHmak4rs7Q0VYjeNe}kX za>XpNnOjFMCObwFB^Ptv4gtRo!ZG>hy&&43{?+gP>_>n4<zM{Xmw)glrc5{4YevK$ zDD$Hq`ejf+6k^ycJzNw*M1ogSK}=~OR%CC$o<oP}nV>(6?Dseuzot24h`$)(@16>Q z<t2;ujS|a>G9^+Lc8UXdC}-3kkahhRoXRLkbPZy2f0qFAj()wFe9%5_n&R+~i*LBc zQr`!R3@o%@`<=kXLbkv(d-}!E6-e=+P)yygot~aLPsk?-pDa7k34$f7Fqdwv(dN8* z10j%$^WGr8xIdhWeti&2es+2)uGZfxsep2Pza+<j9Q*X_q*re@@&8)yH)=7fUN&$Y zG3{Xw;3`BVDFCo!{b%zTn?{}O!F(#I>s#%%^5ceApb==d>(+77^t9jF7IPz$ZDg{I zOct^|+f6>lI9sreBQdtg6cAKr0L=>W+S6w*p4@x<>e0)GPhK6q{Ql#Iub$s~`59_) zO@!X#ea!pt$@9-(GJ?4k#{=2SD#^t{fKnB?4?wsHi-V3FNLa4jur-=~VY0AT9rb2O zBuHb$29lw?PvQ?p<vJWl?V^b>X{$<KVth0Vd<MCxZ48x$u#>0Rw3x}Uz)FJ2ABKoW z1HfrM;&lm1OnW0l)g{y@u)x8eO{h(@BPi-kmd}eMr4UJl5@E%8N3k;ptyuKWaCA>9 zb#G`{?RYBwaWNxBc?9FQ)(ENaJ4siA94f=B)*w4Qt;>0}wHO#Um>H3!7mo%(9j($4 zw*=Xd6|&45({3trC5=Hokdb5`>5r<4{b&WnVsw%ZF?uJd@}A=Q2>Py@x|>qjO|>=k z)I}XJ^}P5&k!2OC-AG{*bGam=Yt>}WJB8!(roIUT9a#crLgad?DK&$TH8>%LB)vZz zO=b%meQ=3yt+mFSoa-y*jC4eyY1+C`(!o*azC=2HExNj{=AD*aw}?EFx2ig4x8JBV zbwSG9x)I`cDOfH$Gejt*+_W0a`tt}+J{F;+t9q7RrhOq?STOolyyAg=d06U`5326^ z#@xOQcKPWw@Q<!w7vM&=Z*gfD=U{cPbI)&T#RM&5ftbg6KG`DaUkMEm09y17{wb9g zWL70MsJO(ciIaIY96$y>pZyt-7Uc9GRmKC*T~WmENuG%#){PHfJG+UhS}@R;c^%3g zWyeQwFI9hcIL>Xhy}fUvUl8!c`$6Cfs2S{-tJJ)-`qLkZNmT)~Lk&V5F|5*c2jvay zYJHb?KR3d5882i(Sj{mDs)uaG{m|r+n({69vTx!grYaz}B&Ag`xrr>gvMG;Cd`$1+ zkcNY|dZ#<#Kj3t+rvY>0ttyN<9R{XFPKF&gJ005oUe~FayZf==5b~5f&kM2$H-3K9 z7}@D7kC3c?MAeC@tLd2IwL}LBrr*cbOi&edX5Yfpg=*RKO4)0_WU57esjyfe4phZb z*a{iFb4h><-*q_#b4618BXuuQg)Q@UDjmL%v8qT*qzveJ^U|J{El^FH(JR&X!^{3~ z4$%)xEiG$Y*grJp_j{}w!Y}os8mpwHHnTC|7Z;iQHB`m2h4Vbk2{o1*E{WFWMM^E{ z{2Cu?*m?`G3p(vKTNcz;s{RM2Hg<n)*yEA|5z@$Ky23ipzp3AG;Wb;GXsrp#V{4z= z&XWLysdBQ=*YJfiVf-M5g8%x~82I@}v~+AUHrPDyhzhLNdlAJ#4$jv`bGFf(Z8T>= zb8E)BehXsAJBqPpV)MX#RZ42R;trWoVWoN3*)Tup4Y8WSw)(9*Oq}~}zUW=p?weYD zRxv6XJyxm1gm>bID|zT|vfBLnRyHX>9`CQAd)snvee&S41uS}<I>f6VyhQ*9g1Ab~ zV+;i&LCYL<+zD}ih8xpb9HbShRP0zF5QL4lt0MotMET}U^AQ=Z;9f?{5kWlSP=lVo z0AQY0=+Vg4kGWLT0J~Z?_2D>VqC4;?34H=sUs)?+`6F}*PVz~r`ivgM>A+U}DPqYA zqLWW#C^L&FT)|)8`Pelti{GQmrJ*c%iRSlxx%y!%Lvj5NCcKkVZ95RU6D<{PzA|KG zv|L<?jj_+>c-$P1abq7cuD%2375-%(fALtK_Q?l|q8Di~AI|VDD1NCk4b3H084DWs zPMsCwhaG-K3t$(s$S}M@wetwAoLPbs$@>;hD-DGnd^Hhwn*Mw!uBjl6vz~b&&8@(K zMKku=72v@#q@P&DVM?>+^U>ht)>6;nJcv~z%K$J=J`!ymugHyt3Oe&vguN~!p()84 zi;gtdd}66vPUyubDKLe@R1pr3vjvqw$K>Y~kQWtXrjQqhFW)H3Rrh^SOb^`9WauQ- zxu&kk4ImHsKlH&tsTx(>L*GTS3Ymy20yl5jf*a}^=1k>z*F$4lmDMt`0Hd+vWsta8 zCDs-qGkiXO4z{(th*EhAuuW|j!Q+7rkrx?LK8@KgEe0L1wa8xMDnLYgV2Tv8kcO^} zvF{p8!_JOY);4t*tYoIfF&oIL+DYJaZEaDvkd<PW5-i-^4m1Jd!FNr>U?4p;C#_kz zBc3kGh>W&?{9bSHuvyOAlLTsk`+%A(4>_(9Pjt74Q>l(p$-g(l*OFEr66=jd1V0Xm z#~Cf*hw#{}*kbQQuqsSC>KrFKvg}d&7@!+@SFC`2R~$B{C5(0(dY@MrYCa|!xdmA@ zcozb<{v+!{(@sAQJxFL8B=&G*tI~VZB7IJVdhd1YzTk_2rZ&7dwVTyTcl^@2@UhF8 z@aTBc%Z4BW8tPV*emiNmzJ++wd_z)naHrU=#R{O{oqccTLo^1b+>Wa8wpwqh0RlBN z>{@L;hFaE3)%cz$;Pq&4e{DMRL=KD1&{9I{jH<9R+jrGCwsp7I8OJ#sRbnkD?b>Wy z*V|VWXc{`gg9o;h_pNi>@H|!;;d6#`u*op*_w2AR!6POhYguzer<U0b{Om!S+{1+{ zG`Oa^W>HsLFQLY}H$2sZ%GTfH=z}9D3Jz--?J&Pv1Y6X#fRCxHbAPLf_pj=NQVxuI z6K#`THy*dL&f|vNXtAQ0?AWm}1l1Tp*d{$|!@kGbl#kPg$p?Ojl5qG`{hC4{3e3+B zsblikU@7)Xs**=V^WW)l6$$o`J*T-L=*fg0PWg2990;{;s%g@2j`oi23Y<smPI>8e zdFj3K(w*|s@0XXpQ(pRm^3v}gmrR^|>gArmy}{sqK3F^)59DJk46i9f?D8z{H%%l< zWS#J0jtmPXSJeXDrR=OavAG@sR~o0Ly3UI956aSs975VtW`o3@{+zo5dlTx)y3FRW z%{N4I?kjY|-Wv=g)L)?iR?64MM{ecYz|U_}!^Bz3iRKmZHbf2c3~x+^H#`NaGY??; zzJ<WBrYe*ZG+L}D4XJ0jBaxw*i2pgR2(_RJs>1;Nk6-3Ag%d|5Nw0f)sNzVa^Ci?) z;BC)YDUZ4_ZxdYlr!#kfFs&1Rc+`3JRy<C2tp4l6%E`57a_t0jVJEk2>k6|KsU<n0 zJ=>z9>*m{&`8pAb4sFW=MEG?l3Eu|pn)L8A&GPa*P|K>}&+=8%Xa))OiL)@bW8!Tz z*c%P@MuQy#sgv(d)}t*$sgp;mrPSVd9BsDMW?RJ{h7Lq-F^#jV|9Wjt@V+T~Rc~<S zqI*pT>0C5i-7^_YZmVY><`-g|)$^Z=ty)sxZ;A7>?c4mf(QCQfPk9a3;{M*95AJ|h zy{PfO{hR;yXFvL{2}P)RlllePP~uMK{cnEoO;zGAp~P6Qb0~p1S)Dp_iSM#!N@GLz z$&YD&@27wDXFvVPfBo6N{trL<-~Z`X|K>lzHIm^pCtv<AKTMo&?Le~!?!aSt_*lO# z|LO|P%qP9+lb-T6r)|KKvT-cQ`p&3mdX_4Jv_8H(7cBcc9}c?7H`|=>Ce!>3xOoPy zAa~L`%}@#}-AUgMW;r;Yk6#1t1^k43Pz!l%lb@)Ey5xIwd${TWZ|*zFo7?9cpQba0 zzJc)%(CZw|Qn(TScCH*EkvrklR$-U2g1{7A?4U!e2%${F;6buF;_J2>%E?q*pbpbv z+Mnf?$0<{)kOh1pGkF13SGkCVR2;HLtmrqsVOnTS#lOrDzlFU7GdOdBW$yCcxw~<h z-w3c90d{=>HtdD*US~bWc$q)y8V_X;fAi7vSI=KOdwz&{ReS>aqwQK4+dtcAaqLRm ztDWovBK8#>?a70XoN*pZdl!()G5&D!X2oMT@gTFK(xY_h2<EXWa`bvUGkGnAY)<6h z0AWC$zp`<EioB>dd_GMlg1%o|XSn^LIR3a6ufi-uy5si)gAm$$dsTm8Q>y3GYmlZl z(3Inl){Rvlr#w`HJyvH{y44IC*od5$%SkrDM~nk;<Otesq4;F0^Sw#o&w%{%|KQJ` ztLqQc#jDs4WcH|IX-^2J*^1Lq9m*mMRk4n{a8@8NX?j1uWI~J-U}`M2*7)xW1LK#9 zTagX}PV+YcYLNyY2j1&gzMskszXZHOJ8Yt(Tm{!lo4@HEhOrS+@b5lA{F-_?bWso( zO~z_4AOz{~O7I)$FAPs3{Z&NLNPi_TG}0(~Mr9(t8KjJxp!5nec0IaZLGx?U``>A- z4K8$6IFcjhyoC0KN(Aj$t8NZkS3HVHRx2dJs|yHMJKilrC{v+~(Oc&>Qq<elSO{lz z!CWHY*@9=<RaGbzIY6vvWSdzy2hp7dzIA2^z0ez)Tq3)1xq=!zl3YOym1xj9$=AZ0 z2~fW7JARGn-Pjxi<*W!2%}R(Ez1Ay%Vn~K$*JPmaUj$r?xstppG!?CYT6v!#rMw@2 zT5*w8zRB``Gl~imIM>{U+pMB?g@!vUf2TtJJ(hp3LjF4}|D8zwFwo6SOzQ_M{|Ax$ zy#BIf2-W}VEdQ^U0pi5)aAF*89RwVvga-H<Ye(H22#)9}8C0zUe#71h_qqV~!L7MX z==rtyH=B`PJdDeGod&m>UJt_MN&qlid5Ct6eS%?8craAWXfE#NC#b>(bQpPc7RmS1 zeh;+Vgun(bN^i0OxT4RfU^X6P;)`fi-1Egv9o)7~v*8f6tpx6JMRXaX7iFL?K|~mt zR;&h;p)A<HyJ{i=rCrDxm4`8KR0C<Ex&aItK^ZrOLL>H?LYMi4K+trq2S7t7Im#?m z4sz7^-S{~!XdM)Kpp1fUW8@Ni+e%MQvwjA?U$gVxI2lkTUalwP;2fS-L^)7v$t(#x z-4!k0YSxz(EO0ghFNY{?lt=jwdOo3CxHuc5D+iT0%C@(UW7o0E#LDJhyx7Th*|cg5 z=ar{gY2M{lg-dn@Ca!m41<MY_pwKJjT_#ua1E89d4HDdQwQ}y2iKW&W7M|R52`I-Y zJ8+<?Gn7@t4nA5}1v9S<@%e4yIqPaVe0r0O?!;Sts>TY=U{DEiBr*Nq7BPJ8XgyHt zx*yEHg9V<33uteizycBxJukg}iHf7?OIL`nx&;$JsCRz9INse{um|+6g5CE~(gyUp z=ZISOw6^NVRx!yfl$vc>r;&~TE5<3&ck=$y&vR!Bt&o9k<fNC!xVbE@IK|}*JcZCN zr>E&uP=xxXO9C5H{&cMmHt=X0D~XMjM2VHe1i~xjebEi%Yi<N+#VApEPoIF9X{U1; zg^_qiV}(N|yfA`*i;las*ELub%aEbPyqoQ+eeY%$Acnlao}GLlL^dr#P$sm-Qa>3i z!fP+Uub0j4UkG7p12DB=FdGI_!eFE|^!;^V7%6}+8Ah*FxUEX7rpwCpL(Q!$(AGGS zeQvZRu_E6ou^O1k%c#B9L`-v6-hAk(;JNrBHXopoD2DloMm!|uDC0J3)JV%X9^&N9 zR#`;(0FrCGJfVP1ovmiobE80!IQP#nDl0A#+*J50N+9=BmV2i(JEI_Kf)QQ4YRRWw zNw?9j4Jh(TIFTjLXHwa7%U*PGmcCO)>0ND}4u_yofhh7*srtn$WVsW0m%QHF<ki%} zUR)GZ$CN)|wjk4rXc%Sam`2eX#>k9DPL>`hnz-q<s|VbO$6U4?IUH(rYY7KsUWvsS zq9+bHz#AKdP@t5GQ$wBjmKEl<9^muc056Zi+lBk+Ps`2q)H~0*(W7ofuQ&0GHxlSZ z0xgw5@%R$gRW#*?Yn@n}PlkDKc4rSSvEmRB_dKZJRLCy_z)rG~y9xg53w+wh<;DcQ zG6Bw$+tvc4T3^_s0Vq|P24_4lpX)INv5#EUwi6f_)xJNb2n^NLp{T9}M`hV&Ptq~9 zuHcuPu7Mo`&(Lu)kiRg`vFGHF9>P4!o#TKUEhQ1h7Q`%0m;dmbM1ifo0UJ`-{$i7g zg#`XC_CHCO!-b8C&R$Bbijxn;61MJyh1v=jUhl6jkUHiIS{7Y-841`n(A$Zu0uEt( z(^el$C-ws(f}QslBjX0e)T+>Ap|U{GPC-fItIHy>yRFI%u(~wu1gE&(9;?gCed1JL zc25Ld%o=?EaekpOMze8U&PG!YEjDZY&qO;MoitQ3-sW@pB(K4@@N1K;WNE{J;_$gb zd759Zyk3h6Rmd6k>M-l!R1!8O_5t3aC~j=fHr`uF2{p+M`kRlo6!un_pFGbl(;;9W zjIy_>HA4Imxn6|}vH`4Bj;+?3?Wy56LN~S2yXq<wI)16a+vB15qwbk&dHbQM&&J45 zY<N4xmp;-JM6a_Sa{@8Aaa~3Q>`)hHAJi?aVZxpW8a*%EQ|-Uq6@vfk^uGGZw^3v_ z_$~w9&Dr|t!}PszYK$m8CXvmx5_xYm0-tjnuY}&)3NM<0-V0{vR)g4!%~xfxymdhH zs(|PD6X~Gn-SswYm<M_2dzRR>o9qeJ)+C^ZRqB`!Oy64F;P8IIZh)v<iPiWxfa~G` zR>lQfMI!6&-5Ajb!QrZB=|qSQS35(YRSR^`S(N|*h_=d0#CCZ201)>8>_q!G%q15x zy%R~lpi7Fn34Uz#r%T;!1HF~Da-M?5h*yIJJGx*8P6Af7&w;B^OZcSqj4dP3pMl+G z=O8&HvH%X=>1qwDb*(AAnTX@?P;B15Xh)p7N2KQz=l9|q1<J(`#M1EBR;zWq6=aJA zH(*1>i|hj-Eho2=51hfGY)cU%EL}ka@l``}jwX-Bfs;<AJ)6%WiR?0V!!Hh-%h(kz zV=EARb??|W(_+;9RhqF9U2Si}E)*rhPOy^rw(lnIhckd$JR7@yVG*y-K+9K>lmk<R zBp(yvBDt9)r>8O^A;h4Kv7)8~Pou3B6Ef^^Q>`CMhS&yf99)EzMLW@=-XINa{BlMa z?y5s4jvmi4LRKc&AzvbHHGL(b;-;_ocByutf9K*mOFo9~biAN2yzGZ%WjiJDWY}9P zG2V}owtG@NI;GmtdJ9@?;_D1Nap1!YCFZB%{6n0IzF1-hpr&5N95F@*Xf!o5{W$3) zU_;$-yYe)b^+R(C$fAk1wzC`_>VqJFT{8vTk%N|jn=)6_wzH+I9@2`(QS##m@$fi- z076@4DkCw2w#;Dd8%4$NJMf>?A$WM)hAsEPK?Bmbe{_cP05e>rEavJ>x>xt(?U)K` z4IY7}=|@o7VwWz}xI`AbdgHPJXuMOgQPpCoJ{>%WQ=Tp(r5d)pZcHATlg|XVUU@EL zEx64HUX~(edO9wIObIP$qZV;dDkd2Q2TR~tZ`hl(7`bR=s@BIEs>F*XTareTPx2-T z_T~+I^9H^OB>g!v^{#WfZ-$gEO_e;WMjuSwdk5d(QEs;2W($V5U{&Ds^z=0C&klvS zB{o_NIvs)1n@Mewi#vlxOa}wSv6%GU5R5sxo+pQ8|LZ82r1zzm{!ga)h&($8?n7KK z^7#~0+k`&SC<WZD;kCu|I|3wL87F)t;`k~cahgwQku%K%&8D>&G;`ZV82>IH-hunv zd47QlN_D~AipEnT#G%>`3^*wB(abL%V*Y0=r`^B{?2fD!_}yt{e3GfJRE3AwAZR5Y zbd&czs}Ay*7n`1n+paB;CMK`-fmaN*;7Ey}DTUh$I_3eqpK%woUccmwLbfotH@GpX zC1vZK6u98mLvjac6G*?jUfdnw(x0YzdD*ix50@;Yg*s^n%=a(<?O%WSlmGK)fAL?w z{CEG{5CLXB%-*H|d|}Nv<^S^k`qMA}{15)-$3Oh?U;IyB{y#tYn;-u^{PEZS^lyIr zKYsZKzxUPu_UDlFlmC@6|MahZ^wl5!e_#H~fA!Vx|KZR7;4h%~@Bi^vzx!WA!7qRG z??tL<F1gL1(RHt1<TJzumwng0`09`T`OkmyAHVva|Mbh>|IgN7CDyrvB`y-~skoE` z3yJxFe_O9Wsse^=zSnL$^BKf?7vE7OCl01;worc4GG%E&W^d$;jl8juH+*?RhDjxd z8d|<7KW-rL+oOCihcA6VnJ#wmpWX9xC|ca5lZVP<2vq{f{^XN~2QOc}c=Y`F<A<-F ze*WbC!xsr+J#0B<ae@mSYJLRnnEHq1QL5ZXS+b=!G%W3Ia<pxJHWT*an5z|)N=>KQ ziZud%q@x#c6=+&MC5#E0oP*OdjkID?G3xxmc{bz_u~S`<B~|IKEg{HF9UDy{!RU5c zZ|%ca2|O$Vez9{EvFI3dT=U}kv?e_sWdI9jlZ7yh+z1%@O;H^2B^9Cs5UnouWNF3p zm9+Y8!GQ~Wip;0@8{gfMcSNOKMWvwl+XYE=DN#~Q&hdP7l1`Tp@EAXnpk3%H-jW!$ zdq$v@ySS`NJ3ug}d#P4u@so)VgdjDnOJUfk(rK&F!zYzL7`_#hZz?gWI!0Eq1pciw zv?zK5Mh8{uer2V#I*-xmNh%miN|8V;k8Tgl4~di7KuI4YL>)bS$y${F;9w-qhqENE zkg_>@KFu*+BA>_B1U`azDSGQ=ZWXh9LfLi1pJ2DKCw<s}_h$7@!v-N-MyeJxQ&zXP z;muMKjWfbFpMCr<hx}tJ?F?bxiBrrVgF>8Eq}XwZg*ar|kf2L+m6HVQid1F@&19!7 zZUXXuJNW<DbzX!$Khf(8+HCBS%|!x7EWLM#OOjyuLouDLvzC4Y=``R_&GMqtwxE{8 z88+(mpB*NLSt^)+6J&>M+6Sjc0{u8ih43MS2Si_L0v7oQ@54gc?9F&paO~l=1`c!4 zYD>s`$p!Vw?rI@KAv}M7?fuT3Z`y!P6{gRdyAJ(#5C7kuHy#(J^c+~h#U=h(*SD=& zI%mdSH~Ed<a83vz%#CMmoFaA&Ji>Js|8pER-A5ydbl3w2=$$Ot4Illt8R65dG}&gK z=&xr^%v<n2c=q5~a)3A9`4nY3x1Qh};ucQpwVL$Jut9_2E>d^v37M~|DKL4d5xPC& zOG7m2xD>Y-XRMC@>!ctjsz+#p#zj~;*BO|;F}1JTOQ)NkYSbtu@K`UIRply$mw`vV zJfoxrq%gv!&&jF&wOP5ic0N?!bwCB3b3HaK==RAR-<31cvw>JD`!0mp(|kD0FX%=m z37ejB&xK4cUA3X92ai7a<k7+Bk6*HgF^0FGUJn--{$j+ZoS;I7g;S*hnsbi}f_up) zPkSRc*_={G*|8migU{WODtC;|a;g747<D6Xw7d4SGM|4=*E!LYdk9^Z4#9eShzCU} z4W8?4QSn4vC(q8(Y2By<?Uo*hJN^W?YH33Qm1}i7bla*0_mu$%n?Pj4v|z&W8gjKO zSjV@g3|nG{U9$ve6t9dfTp5d<=LO-7$*pE>z;+`he^%YT)zAQJ5#1630|2cVK<vwn zTl31vD{J^JyrMS9RcllOnWb_XUe>z{px9Bv15fZ1cFPXrolSdh(rJ-i^Lk4cMq4K0 z7d~gEo++zO3uyK5ya(L0UgMe6Gy`+u-#s3egB1)P8X4o{V~%<X&YQk*2Co-^oz0wq z<%wNEXH^9qy8;akz4Ru3n$OgcRxg_gQsNQ}aJwNkDcVXre<Wm+&bQk5l>=C^v+td9 zVq`ZO_DT`58sX_`^23smvwZa$f4^uE{dpBIRYGZTozJgA3Z3QU<#`IT)oHieZXH}o zg_;JJj(w3^;BAyz-^zvYN}v)aUJR2XWi3YJ-a%cp%Uuf_8W~}JdRniI@_CVhO0m}9 zALcXl+niVQ+ng(U%f;vh)Ijoq%a1dl3xxv31%*0x?uX*VtrQhv9pJb05<5h+?VBa9 z({zF%u)@!Ce%*v&xwVe?W2udtBhPU=A3v1q6IJM#E2@!GTv@AR6>mjW@#<pQax36r zL4zTD`YJ<FlF-eMWTjvl>_6?OG2c*4wmR~S+`d$q?DHAsrr}5PvQU#1YL*+-tJk`n zm2QQw>g=>PNXdVK!ET>eLg;ll3z`C)0HRd?MCtId@wwpEv!c!wh|NSRJ2wx0n+Lzm zgP;H4M{gY%FBW3QI@U!&vm(%9l*ambMNC+R%rx&B@WI-jUKpY)1!i3jorZHP*+aL} z`;Hlq$?RSz-6%#3CEYC<iU3BnA+#-Q`LAK*q3#W`>1<JVm9~NkbzlH#sR>UdLbeS= zvsFi_NN*`yC?Al;q}AV%125RcfctINl9R=JxFA5wttd&!HDGuH;jpvF`d7`ZJDY1m zBOz3cDg-Bzat{)V@FMSxbO(ZZt}}IkraTFHkc`v!_Uh4k^gCN<W#It?f@QJXv3O(A zm|u}V!)#BBVS0-qBlJPhNcb*`VJtUhIGa;>b1JX0yqDTKg4U9ci|(PE)aVryRez4H zy~WO*f{o1v+-$(j28_c$elGS7LOB}rNBs%jSUm7Yh5E>H5j;4eLVojot19!Yv@V{_ zihBh9tFwoF<pcO^GK)qx5@{_H_*TUrhhrT61$DOh)B8oTj~g)I)vE^&zw_#q7t2yi zYCcR`f_%pH+G7l+g>BhSn}AMzlBW8NQ_x_|)3<CVwd5ViQ$_dasMFj#ZXWG5?;IZ| z%UUqTr9E0Pd<b+#?><KO08J{JEKm4DbTJ=jfJ*84XzDK=`Nb*{f|UT9X2SgRAp&rW z^53lzkP*Z?FkKn<Mrlx0g>AJ?r};>}**b;Ff^+dUIxE|l<xUHo)h#IG;}lRnhQs<1 z)zxIZ<nwDq#%!<vPKeP8G)7)Bq7zl!WiZU!dTugw1|z)ky*{|VQEa&yRD~88q)Crm zlI^G{3`{c{Pv$e)Byb#@q^J?z)y%-y9LcyQlD7G;AN&BpN?cv^yg>fP1GSvU7*II( z<Y1#uvh&^>g&&U|+|2Dp@ftY_|LQm&&h$lEw)V-eH#<Ozwj#cSuFbDbbzXRY!|Gb* zTRgXZeDTV-#zXS9YG-ok+MZ!hTyQ*JRUU7x;kzoM##S*GC(k``>XJ*8ASj>-L0E#= z=O`38Hzl?vzck7zTWW%9FpKCT0%0Tqx_y&}2a=SG{)6oaVFQQR^7!L*h-iI6x*joA zCa9|uRTQhKoWvLnl~9_H1qH`*-Ter!$km8cTNjCS<g81jIYN7WcP*k1Fl(*w^;fx4 z+{!@5guElJS<E4lB{%)18*B8ttZK^CjE$`{C?{LOt1&<2`1zuDLF&hrp|b#iXmuTi zb%0KS52-e*;grb?fkGxZs$tn`#5l*3@|eAZWKr3;n8A%ri03%yhV%IB73fAD=BbUE z%RM7fGwy)8?3ddItyI+D*ANjxe*}5m>vnkeO!Es|)`!z+KCRatjo<W!*+9()M3npo zhtHlu1Vte>WTy++qXtOgE#f;AToSqZo-WzLZf26h!-TYIjq)h2+=ZC!+of?yevBa8 zkaPePS3(UY46aA+;fNdI%tv6qaXZ-)qvhD^%dL{lZ&es3W9+Rmtc<8)t>HQ&Z6+*! z^LoRzu<^<V9k{QEF0U-+%vH?HR8-~Jl<L!QE@}gFDEWsJNW$63^2+Vgk-}gTjrn6? zr8^Z$2Zj{9yug^M5sAffR+7r<*|eC!P0p)iDEPB{4o%KVb7l89vI!!RMc1(kb<Y8O zR(cjdfDG*u&sfAN?B<SiSfgL&pjqn){)d;#0rA0B@@SlpqSE#|M|ex*W%a#A@`L13 z{CC0rwQ}51Ijk)5Uweq8O;U;+R3wqvZ7swPXjkLon>#u_F2y%cUnYu(7BHGvk)DlI z>|CF|X(sQD2anS+R0DcAk|eZ7tS)K`KzLGlyNuC%l@>afPbmUvJBAEemIG!2r`%7D zak9{E)75NmM^H9p8@Nv4u<LMt!v03|LxI^n;sYc=L2FXBIfVyX6m?y*x%oIyv!1)x zG<UC&Z$Z}Nb(mkNiMlMGB$aKkI-5mPM|@tW>z7w6wg{kQYPFe=&45-*qOX;Rft4jT zl(UG(c#>9}8OOga%it!XSkA6c(6x7ZPsxt~LTa7NAqsaBtN}Pp1rYvCD_whOngO~+ zK~e9;m?CvmWSGFfJP&8yEkBj@M6y}eCUAKj@SPGGg1vEIY#0t4yM-scv6#B4L<mN` zglpOmFqpihYOHjx_<a02zX)Kr;0>c%qd~<79$!LCeqb)B;C50!s$o2$+OcK8h#)^Q zck8@|p_!$=^DZHiuzjpEf`$%nkxXgR6oOOJkwT!hW-`c7y>0=hif@Eg>}$tVL3BEW zSFJ@z<FB4)D5ra~3oL-7;Q(xG1=U4#iol&Pe3Vi2r@MMME&Q+_#Ac?vCCJxo05YnS zd;R^G5{}fw0z_`4#bpU>fV<_@!0qiwO!Z}+4`<oL6+OLmWe;t(3SvL1s;CxA6hjJ| zXBFn30AFj4hAs3$BS&e!#4N1_oYx`Nh)StBU9#SKSbqBM=02Z|h7O9lZc<VNs4*ZL z1!GXD{B<CYXQ#Bl(o&4u&t5)xT*usB2+6u$6GyXlj#A4F_`5=!eKhV*(M+K?jM+7+ zn6|gnLMv+uv>~rGJg)wnBZP(Plx~$Oo1!AgdRU6R+*XnB&f<CrSsh_5eVlaC_mxKk zj)K(|epFSV1l;a~$I3vPDh*oakB?qwiB1EnWbOIbi_eFyw(7(<JzZV_&h9MDZxY7t z98$EWg6q~_5o;|1v=&2IQ&49|wQ)X1zhwNE#o^%iW=9<%19o_nj+HoTVUV>n2zdv) z(?cRF$HFsS;^^t#N{abpl22!Vtvx*H^<R7EI%Kn^#sFV{QKZBe&+%lNfvrk9NG6xN zMcQ{uNVl{LK+!u9hvC^6l?>S_nHWir+yzJwAGr;x1`eTquRCg0l(ASSl~&}Aoixnz zNeB;uE{~v(2Aid6FB=MR9)Qs8H#SJ1e4<OOJx|*J>>cOFc}I6MI)0&S;jf1_w;F0r ztRk8VAa2PdA1>gR0~m<k@DW`T%X})17Qq*qqKOl<s#SEwTtTUz?mX+&3GDl-v@E?; z!C-$psCo36kx11|d;~`lcxGUA|J9%Tv!DIhUw`$7|Lm*(<3E1&CqMr3$A9qUAO8mc z68x7xlmbyp=N6xT`d9zrtAG8UzWU)m{_@Aa_tl^M-(UXQfA{l0|0m%EQY+i_p4%1d zMC$`TUctsZabupiF;6Uo=@Ww2n{1%LL{4+MAy)+HdrVnPbsmyhWgxWV+dV-{g$E8{ zwF>P8QPUuyt}bMV(a@B3NQZ*z(iI?T8s3aNVI?AQd5u=tSKOUg8d+OqUBoh|-Nq|} zF9EbNoso6Ra*SL(Xmyc8ZO0f;AWF(`pG?zsV0`gTa3fNFan*`~66gzRSe39YiIiR5 znJm}~0=!^FC4>NjwAe30So6wov<HI|=^;c)Y{&vZAqy7`(#L3H?MT=RcvEwyB@C}o z?zG+E&hp%`2FD3*$>yhH2KEBIZgd<O+Z02(<Y+8FNB*u3TDAi4jopr<_w`$dZ`o<L zy@bBFoB`8Q`XvWe&_ym>Y5*lkw$jdxMuu`Rh^N5oO*~6ncUg^hgZJt^?+x+`xzwPS z)AFeNG*;KQEjElIoe}6(t-$gJWcf*DWZ&Ja4i!C80LJwrNhimeE6Jh`1`9)9F?D0h z^+3Dv!XAa$=nxUUXx!ZmyI@1od~y~431e`T)Tx4(m+znT7M{?AhNrS727IE!5V{*% z`p`J|K^jKH;}JpZ5Q><WPeKLYd(8sxVb{4Z7h)NBNxY9f6cP#=xlyQ~x>p=?L5!fN zVU0X`2-if<hw|CHtp>jfFuvS28;_3S0o4DAsN1+au#O=FtZcYuaMB*(g_rJYNHv04 zaH^&YvCTdhB8Vm~dQ6whgat+0GA^5Zc0U4095Zmes!A;cv`m*+#h;R0XMy-KFHJkL zDq!N$ev&@G(E)^D65yvMcD~7H`NYDS2tqCDskN14Y#Cggm{-y<KUrE8$<DlbHFGD6 z*R>-@cRMlpgN_=eHtX3P<6z=g@!(agjKMeJECo;w<Jg9xk*=eZsE%tmn1d}`Jq|ZQ zZYRT2Nq`avL*B>j!_0MI&@4->JkO+Np*0ZK*edP2hkdL?vk1Bg3u4j&{?HqN{$Rkq zuOu6Tf5Kef+BO!mw^_9GRVebL*YAUaP|D@rI^5w5^-VfWLp=Qn3$M4G*g5-F*2!KY zaySJUN1(f!iO6oVE@`)UZ8yc*HHjTJvCoU{k%^WbPhD3DW<A@c5*f#iDS=tmj-9nb zS+}H1QhfX#0N?71NeR?m=?!JQYge?#_D(CIFFd9@hMT~OnR5ykh%Fa8f9*njUTVfu zW~?>@kdrAkb{r)C!+CE29&r78v-jSE+S!Ldt_Nb?-t-_Aq?ey3QAv$UXE#!xbkLis zFaMqF;XlfPTZ7U0r8=@yhe~y1DYa)`g5#dFvA`+0jP-AIFR=V#MftM+$Qfr?csmpc zQk>6w_1QvX6_U*k!@S$GOKQ17S_S~!MF@`s!POV&@cxiuq)X?KD|GzQ9lcXuOLBKW zlwjx^2&IiOcB71~qKqxoxc;Jbt<UAtlA~``pWoZNroQzRsg6{AE0mI?JXOzKN_A>F zW2sK9Y;Hqq3Mn$sfsGt&Y@Q5y@D=a>vP+<y)l<QAjOV?H_vl3}bmhP9vzMpThAKna z>VteV%EyPZ;c9)bJ)u_?_^M5$J2gRg%7{OF>3o$eh&ze<3|vbLdQ#x%nu&5Vx3IO? zir&cly5+Ah%d4iYs$O0fV7}{tA|;T}syC>q)OZruVKByGKU+GR>F2q$OQ}-a&dW44 zw|F70aknfM`MsETIP?gi(`yZNOC?P#yC!>G558tdgv!>c8i_6;S4)ThlqA*4h0(ja zzA0WXk7fWbTN>GHg`zpJW#0<K0MWgsfZ(#P*h?I~8hUVPigfmw&ZN$V7`Le^GxJj- zwgFT+YSw{a)G2r<z@C=y2v@>2htEdB-AK3_3HMjg++amz*A<4TrYa(=WKZm^UrWV? z>8#Lp4SNtIne3<A!2}r#fYL34gXfOqZ1>!fp23SutThmDx)msWBbEr&t`Rb{$f^!q zRRb$k)G9muVT6xfzyCNL6Xcdw%t{wX(x$ZofpI$I=SP*5#=~K{+YHPekL_m+uKDEw za%Ah<cS&CjTI$Ij6FhXc$;h3uTVezVMQRLp@7j+sfw#_(8>49?GD4jJT!(k>%3kwc z(Cm}*7EHe`VUe~{{;Tqp2%_rCf#rR#yjj;ExwTZtah0#6KTeJ&*-Vf%VF7BiNsh_C zvWR2(@tI(Ha(dgVp1L{fad?jD$SM6ahA4tg!VJpk$ss%+p=$>o9Am-7sWQv|`Jp)C zo_<RHsFd0C>SN!dTl5r_wWDlYHyO9V_(aZ_*m7*!AeEoWF=7q-)QRLHq<Z{&XD5Wb zA?No9vm7TMia83svYiON`Fb^~1skg<FdPc8NQxDMoFt=<nL7;iSC14wuo3PxN&-&k zjjgINiz+{TsP-NG_8o5n!~f`7qYsY=)+#tEx^Se^N!@)KR*xr&>C5ifKM|{ey@Sm} z<@Rvk`O6+5mhtm#Nkb<4J;Q4Zo>+G5E?H*_zGC>LI({kVHSh{g7rt0=YIbx~w3w}a z_;6kU6zgm<`Db%k+FX`4m!-&MNroxC-<$Q%Vfx5glF%wa1Bt2>&|H937hZWtk0EV; zJT0i_CZaull#hw!?Ng*@0AqP<`JkQ5v*CacD>>lX?7T_sd9W&?5;#dAtpz_E3@z2N z&ZECLkXMwdhTtA8A>kBSQ({o)DB^G$kT(JWK~`RnEnu)@Fwfwe66^gkuj{&+rrHR& zf(38UsS0nQ8-$ryufb(?U*|F?qN`5#WxIT?5s{-pp36>!dRFA&OLp0Aigp{3#n&`i zLIBt+xT=Y|#94jWL4z4_-qsi3%(m!&p(CU1C>{ycv4A=jrjAPxcP`r%>cCNH^M?b- z4CC7q;}ieA6ynpO(^%#4UgGEP(q6?Hml3e0(~MyKq#veXDVL&J%Zd@1iDY&ZK?{ED z|1y}3a@WUBSHt`HMe?F58?EYQyB?FOvQ^jFvi3BLL1;O|CyMtvatmt`UxkSy@BDfh zZvy-#h~|W~yJ$|!>WFV&1EKvYap7NS2D?>_`0g0uv-xZp5mqC><@GrAH8;xD`*^jj z;Cc+~XiXv7Gw9PnOTQQh%+lkY$q>w-UB>6Qy0IG>s$xq0ZPjCGzwNB8tauK$v0_Gd zU*C*c!FtejIWssQ@vzw9>H;y4P8Qf#C*<|&;MluvA4?)&`!giXya6=deWHIjRG>)K z9iz^b!+m<QbzhVF2)@-#YVu9GX1Q}v<>tBdopaMrkTxpH3_8n`7QfaAShc)Dw<WNS zs8iKC_?I%-xi=8kP6f2!#8smrc7<%+bU;<MeBXvKPqRT9ntoRH`7{-)n99|@(qc&4 zsA1ZhGEkX1_dKxzpM8{kkbdAod->EDj2-3<TP!_m^FdZX{8MpfuLnE^GI7+*x;7F* z+*80=0>67DTFUqeNe;38It3PJ)+=5=M}%ofOpY~8Y;*i#NxZ4>gPh6Rs<!g7mwFp} zC|xo`U*TQq{p@9V^$K<5N<cBwN6sM8sD^s?RbOu?Cy5a>NP0q`>y34(fOcGvmB+W< zYBG%N>7{?9n5FfePt7s|E{?Z^WD!-&EGRJ7axPAZMhm3NNKZqVP-_G=Lr!i6v!e32 zBrN-&EtQy26su~bG1V6H4OYX#hAqn`+n3KbR#RI~8mZYn)d(?XvIjN`^VG#wYfWCi zXP#x100S#4kom3Py2?ZA;TRR9GlEJ9y$3z%EeJY&l1@<{J??`lw3thWN4TGZYBar^ zK^wybNk0CN;E7#rU9%?aySLwUC}|+>8u$71ZppF)zrUD`61(BZLY7*fp0?<b<$KLU z{rUX>x}>Qma*co~l$IwZFDh`Ixh@%k`FlIW1NTdi0}Y3AS%J%Jf_w=tdRCr*u&Mnu z!{o);DK=_O_oD7F(aodG=22$zC=-h3hf<q1MU`%x$TVM4a4;(>nAl(Au0+Uqfvy<O z#TP-4^@fh1i{QXtPh4SgqGxUoPJm~A?z^Q>$aRWLvPn9`AQR)6IA93>kf}=aD0Il? ziIk_6g;x+xUWcu4kUotAI(8<e(&FYaZkiCi6*9XF9wSx(-qC}Cs@>@Ghzi(7Go67L zphJxKin^e}&T5{F#dPnY(HIP#snh1Rx3Es&lX_P9NyvChgyQ$;>D=~vaXZ<&_T$3p zhHoeD2U`iQejW(vU{TI2Kyf#>SSD6Nbb0DolhJ=<m8y}WnLr7#Pf+t#jFHuA9|GOS z&?~FnBxfpa0K^*yN$F*dm)p7--qCBoz{clik-r3UJ}?Xn=(ui)&ha(0mf8=X2;bQm zBFNf^**8aD72J3l`!`0N(TXOsBC?g%BVau-Ul93yp~&xxa`Gb*EXdw<6&ZeU+_-^& z2P=4)>=BEKQ_`dMaoKK|6)a*-NiCh@*b;?aK^^?<;GMqw8E#wWtgtiyP7w-<>;9)c z;eZtuS_M4TOf*Ktj!Ff93ifo<tlUJ0HPNw~&{le?GgcF&EgatrX>s<$-H?EF7Hhq^ zdx0vnc-GZ_>5vke3*hDgxVZpEE`VfccL2|F-^tPoCoHse^K(Nt3l6!|S3amca_7^r zTAE^QvPhr^=fGC+BK#;P@W^=Aa!J-Nr=(=&w@s%4!i^7I8Y#sK>|jv3Lxp6d1D31i zwFtUeF={CA+f(jIi$L6YHozqrOnYK~V+86m&|D^jpU5+R^5}a{9wzrwfSFD%AOMKv zZ19~=lR=&q<C=!rb}qk%ZvbBM?X)!!yKqLaZs2||mJw0siZ^F92Y?F;x#yr=gJ9v} z=1;TNARSzty<m7g00$WFUQq7>Mgh!Xlq12M4Cm88j5@H?{%u+{7VIM0vp!Z&opLJ( zfuK?2_eI-XhLl<U>c`MX&+`ki{kBycqKAwoLe2#xk*+YtNj`ftel#9rZ?eIh^rvKo z?g?vs8Pi>GN{W5VFwt^gFo$8?i|6g&<Ry4j_FIg}&13Hzq#{WOC8Co*v~Wb7$eku2 zCAc+W2-tCv3$afy_i?>O5nAbFf@M*Dnqv9p!vQ@#^dQKsuEOUAfeTf9iv)=AZIlFE zGV~qV4fwtETDUiyocFrYnWT4F*Ip%@U+pFxFbZn7exsRm8qK8LSUH<P2}?0u4rIpd z5^S%E-&P!!2JGcI6^BT1j=-H}-Iw}+acvG>{OX@8dVXRS6Oq|MUP;6Oy)T<7w)q27 z<<Aj+^$*Qg!+Vzw4MO%lQkj{|(yp@?bkI`Xy&G8(W%*%`lGfqnv^Oq5B>o!cz`F3; zs^D@(v14I-%Nh9(evkw;%b^4oDTmfF5F-seCm!T*yd%FNzd4#8kZP&&k?3hFc{Uy{ zAT^uO`zf&P6r*&Evf&WLLm3&hRV|_+H4`$6sTk^44d8Q;f=JTC{7lHO$dV8H7&!xk z&z4*0NpCzyUqLz0Azm0gZM&E}sVb7s7%hB)sM|Z%<=rBWp89b7IFnv~N6wSrP?Cr> zlBO@pTxqFIwc^K@v(YTrJEvfTL4-}t9cJYQXS4a1vo}1(r#?6l%X$TgIXYiN@+o<y zxpk}ZL(Q7|F!07B$F%BgXGQ3FGi)JJu$n`};z%608!0*t4}N1q5|&v{69BGU4J)@` zAf{smCRu))xp~<ln9Sy*pWRF#&#%84bo;=JsSY<{5fy>*B_eO>W{DCeDER`NQUCea zHfAGxS}#{uhmF7tVWBuYMRsG1L_T)FCqyF#4WbdPqZ_K@F_ovd7Jk_vw@~X3rZ1|( zP(Eu@njhh;d^53Mfy@CTv4AWYu$n`XI8#7F&QWBuBhB#)_o?v8tRoc0uJ55hg^c;~ zCLHlXLNvpzUEX5xyoJmB87O3OasSWrk-}<UtrNK3O&#x@ky~?>TfAGg^geGiKd|I{ zl48P`vyn|_<BY-E`?kdu=o6ra*6i!tS)t-#Y*jc|bx^{rnB;{Un{pF&YokQoD3PN| zWaG**2BI5gZvg^HTgD)Zs`vb;%@(u{Jf#V7wP(c}lH9weonB;Yyx*FqQ^1s9Z+tSP z)+)pd2=<O4;EjP38OoL$IIXf?D!*x3p=0<&cqfkv$mFno6Wgg;1r!C!sidObV<6w* zl>IP3&k*oWt;t6MaFqI&{iy3!G0Rt1&?&3H^Z`fK<P)N+fnU}7v8s~Nz9?$)lpb|X zftK<^lMK}LP_P|&0dvB~gv=ZUB@x6bk(l-JeRwV|&H06<GwD<ituH`vW%bE<jnygV z$9s;q=FNH3w@3_@X~3R|EgaSeo%-em7SWYf8KhgAI!uL<{3`a*Bf(fdB|%o|r(daW zB@wN}(6#(4EU7D9kRoNN@UXCD#eGF3!<9;iW}6rHjj*&4mR1N$g1o@<cFICtNVTQd ziYig=Sthw`?jM^iwb@ePEyW+D$)H6#2ud>+65(3sX>T^_O_V(g$XjDEkG&yC$6Vyk zCxo#VcrTL&qe6>?7ukG72Hh$u-eEqU_S1T!nGg`JE&83Mg6t6pKc5an-`@0w^R(uB zRw;LjY5GQNN#;$}O~PT%xI4uGbPxRm4;)X5C%v(laMb$f4ukigoy)pa5bA<mF+Q?e zpIU=V^bZ%#m3GyfMGK%sDX6xF<Fi_M-Doz7S$o`n*H%hN|6USPx*T=~R7Sn&EG@)d z-+KTAdzR+LJ=B>7u{?d9dr)Js+v#~5@x{!yE<_&-HpOZdavN05vt8c1%nAt^!~n}g z%EC_JNuQ>9Nv&d3fns1}0|H|=xx+uB(KmhH<KIWU%V#PSeTRR~#`=4E6PA8+K5fpY zYLSp|Q3Z3the3&jl6*#|Qi3*^1l>NLor}&qdy|PJPwJ!e+i%ZBPcG8&Flz})Xh5z< z<6@##1J<(;3wkDoJ3oOeyCZQ33HseFV8AJye4-FTq$k9AI5R$daqq#ShfiO=di?M^ z4<8?jGh^?AZyMYIw|j(8KkR|YI7f|_`7Hn5esBDySLlG+2l&&19xyrZ4-OWgn3YJp z!-3&7w}PIwc?rX>5ZQ|*Xof|OQw;jxY}y-Sf~P#sF4G}&<lPc=jdC~!MMrB6abDm* zw-YkgFiQvoL5E#|L_lV-VvT5Ys+a=BL9u}laFQPUt?V)c;lia_+_n<{j%y|;B)G-L z^U+B<T?%$EfVkW=llUW+^E^e)CbQBnnRj=KTY9Kfl^QIpv?&WTjiN|K_J%OJ1n%$x zq93|K$;otHoa>idA#dD=5AM5{S_oMQ&;O}RlD%PV)-uXni&XY(K6`e$PJOv9;8r<R zH5mHawh7g-D$}IR2;BkjLoj7Z0Xa<CDb#Cw1GjbZYC;{1LPFO<3za7-xJzs0rOK7R zE7x#;s|<7vy_2@Lvyj$uBD-OM_iI2iFuL%Z+7PA;Q#yeZByCLHJ9d;<Ldxm)hW+^v z1e_iiJ&N-Ym@wN8tR~9A^q6(b*YImaq$+)i_OoeU@MR)X{E9VMg~U>|&W8C(Z+K6( zf_e76Oi=ZskvKEzSYK1j$xbpAn;8BH>)P;n#9GB4{2;kyEnL7NjEu+s-sj_fZw^cQ z;MtRhC@!GL`$<n6HFz4QmuX)dsYwm4JJ2z>?9{{o>sDAJ_DnoY%(A4$y$7`}%0C5O zYZMO==XJaF_kv=+L+MLPY{kt6n+Io}wg@dMEgz8sFj8=H#nn)o*?uNhLxCLxi^E1& zZ#ThCi%)6O-UzM*=tOaUT`fAK*?TbLdaDaR#tlmKcv}>5S!a-QDmgj%G3Fd>&Rb7* zdTO$=aytpHT$i~x7gQl}-@zwSc09Dt)n=j*NiS5v@$MXhPZ<aZZVAnE)ij}5^660A zQR-CN?WFDs8xXAk{LtRtcggV(1(yV_;v=LNAy^V9J5WwKnuuW%cAR5`L~TVdQ+P+w zs6`$(RH~7D?43j1z+ti<!eY5MUL?A0LAk?Wa*~QgnM`OS9+@R+vb8$)>N1sxn{d6y z`Au@$TJvqT%mK@IYwgH`SdHb#UajNn6h<unYgVv#-3kO<-qv&E(Pt$OW<}$7U1|&& z=mF1}%o)$ooCA4JJ7CSk8KcrvFkup+K1zlt#K4}otoQn_?Zasf*J?PiWj?S1hNBD) z$f*(fFh;Zy7nMZ%?%Bx~X@9n~>$F5uk^;4i#stBjP<LR7IIs9OafH?VukKC2_J@Mm zr%n}O$FD7YS)5Vip8_SA&#WI>SQ><rwX`&FWjd7Dc-FYs1{8v(MlZljmX4%>_<v3r zV$kBYoKNxAn9KWubpFD_4=`EKK}_6@GqDtM?JOk`l0YC6RE>TuZ?YnToBBjhlwB0g zSx`Api*hq5s*>Hv#&lMvU@fLp3Y==>Sa}`av**?%gO7_^N`K|}U`*?{5t_QMw8>FI zpe#@ibXsXvJ#m8+DDa2i#(_>LOtsptwcG8Qy*$_-GoR42VR|}K%B{dWoTO*j7(xov z9b)KB`}G|m3Qn62DI;m9Kqi7_Ef7FMN_mlnss%VU{!MZlMx>=IN1uky40(*i@CJ2% z@@>u8RjQbYqAu6)Zrh<tctE-;4uym`Ob=%SaB1g1!lsUq<%ClRedTj8-QPMG_D14B zCXKx~ClGzbxoq_%Jsi=dh5tYHL_u2)3|*t(6bfNo=t+{@t7j-ueL%}DC($|1y;*=` zk<LWS?p?Z87U-;7U~k<5caB5uA(A}3(i_u(jUIWUM=sYRYjz8_U2%1Jo~8ZtA}dn5 z!=N<|Jb%ubVt<Jwc%K9VwxN(f(gD}ZLe|4cPbrnC6hV-%--@Z|%J7yssk6#i)ExL2 zcq(<=L_mso1Fx7qZVFY=QdtPD#Oe+Jny9WfSC;RTmbZ$VTbQz8YFM!d@g^(>ZC&qG z96=V-fE%uw>3QQJqrRLjfXo3LRErjQpE#P_aZs}$C_xV4lSa496nB9Whp;wjR`^Jc zvSU440gO7f4j<kH%?w;f;UDpfO>)rNhfPVgf7P&g*b98_9io;(d0gO(G!YA(Izs$6 z3P)vnvqO<gDfnUL2R^*oY~93+RhYHN%#}msIJ=R?jvj49Fcff}ID}T}(i@1&Zs4Mm zjpzBi@cGS@YyQ{gFjJ|cH%y_9pDObJnZ3f6S1qpCpfVj6Pt2I^j9E|BU~tB=;?p!g zkX8)Zdcv9?ZPH-DVCk>>TaJqn<bf>o7zHK}XK7wbPEx`R(MX!&_&!Nx05$3Rq5@yU z4KAVv7Ryx-F^*BqHIQHkfci;q^6d1b5M9Wq$B;V5x;PMGj1ct3;?k{4S@6yJtH%me z0@m{qT-s(Ha>k5(4((Nh0AYDtzxF7)U1)@2`Stge8=Jo%G^)F@-U_xH>gMcxDz4OU zU3xg3=F@sjy={)>1<@f&jb_%XU`Uk4h6uvYGh}@2_H{krSZ>9{_7J!4fg5Bni(r$3 z-n14DH$fEtY^;ra?upGJi`c|3XdZ8qr3eU(s82mX4hH#3dCx?Vdcb3u$~q7cK|;Z< zZ$*4imtPNtN10n`B@~QF2?9ot|6GftZiF^CY-W=|W_k)C2Lhn1ndro0i?S(f!vR^p zK2Edq6pc^<^7(n4Z5fhg(PWMvoMIorr+V$O7Vt?~M6)ky?)&fxd?s>c!}hKI&eF4d zy1>J95lf6lr;2jj9G(r75h1c*g8#V46IE-{yG(<)mdnz<=i~cu@6_F;-#6Mr=olRr zC#b8LE<P0nfRt+$&>pRyN?}iZhxZB5+3&(f7f3+s?iZz5ms^fvlHzO`uCsqtG$HVM zLXSl4qo}{soXr5*fJa{TbTm2d6`~)pa>L$9Iy4@T@GDgFV=J4kHIyF%koe=1u4q;d z8_G|OqJbRA$Ro#%Ko1UQ!&s$(u{$+40)tlma=|Liv@~L~QCi-aG*2l^tV25ASv*Tn zfJZG4vJvMvFN3UY%f^#93dWghiEZ{k$>+%6npN^GD&`{t^hQJ-LLe2DIyMu3UZ+j& zN~v$}1Goz-9BJ|6!-OED2bW<r#}sidJceGr43X$6kI3F2VryVfpr7`h)|CfmU9J7m z-Z8m;Mp<f~uG48{?00-Hih(AFVTk>1wPm-O74vswelL3vnR!YmL2ypsvuAkZUMO$( zKbKt^EM5PJ`R{^teXPJj6+i`mJOfHgV5MDY+8E76HFYgpNq4crrIDqUjS=4Mx|Zj! z<)|qGI>oz|D---^70TDMaYb~+N>&rs-Y1<K-6z!u@a-OYG?dV$v&XQmqxfz*hWpzX zR8AP5?C&s1T*;5!HST&wR$Zj)24+wAb)tCTKv?O}ke2Ilh*XpeV|krlQG(Ii-$*fm zYS)rsjE<MdA%RMRQjFD~$17@x%Q2A^oc1ohBdu^9!RUodiNFy^KdYC7(pKB41yJ@> z-QuF5{s!Fq2rd!x-jcPlLZt)2kQQRhPHaAlI+}Vxn`|AL?zH+FET*m(B|b@K{d3Sf z@XK{PJBtnvJ2HF-n+fRhAI%6-889cx>>)JzyV~82Q^deh!ToTWT!ey@;%ZV3$lna3 z0qEV*O_Uer(oA_H*s>i0&I|s=c!mrY7<i_N#)Fk5VSbGM68j?&s73i~Rx7MPa={}7 zqCS2`RI&&}7!A;)fjNWn&XjU^hEJ!x$$8d)C|R_VJEH0NG|jnU=Pb=*dc3&4OZraG z`CzG`Y5$XkTPC+;ZpRKro5WVEB@fupf)Sjhqn>2rGv}=|sDeQAZ+ba0iU%^@p}H)! zh^S?`bwy~{^O0V6LfezSjg=$&0zK5;P^==Eg*!HRz&<Li7AVIZp8{Z-GBH%rvOV{T zn$%!fZjJ7j)u|rzy_CcRX;Pfh^a6z_K$XkK-t~T(_eL7%*A#ofKigJrVpD?k$igIB zbvS00X!ixmsyCt|9z6b~GFJyUZLIo|Y<OKC7CY0z&vdz`b7f=7Mc0?@MAa*y|D;OF zZNx7xZ!@xjg|6T;{O;ADRb>$Q<uasx1?3ndE}Rt`kjmm{YsKvy9t|BSG?c41tB}jp z1RT4b87h97Dod7o&{h84C%Obj`b@gY1wEG(HCnf3RnV3GCUp0_n_PO|JNSL!ey2c9 z%H=5F7&Dng9`6({qBm=wg^IPNBp)l%c+0tLS1UTqi)UZI-@A&Z3J?5F{RENFqGx|c zTNJiV3hIR-wTl{_E3*p#QV2J$%od{ZjpAYC)@b*D2+Q?tbZnLQ(bmF~1-kZBIhbM0 z%W^qU*3pethQ`Nm==rtbl};a+UH`O=)Us8gp3o$-6?n=c$Eq`VfBtRqW3$H;y~CF4 zQ*1qopDx7VfG{j>vJ3w!dRlb#;yNbSfiV}^5UrIh>3G?QMspWaut5dgSgUTVRj-SB zu-O-zeX-dWp_tpxv%VnatT(*hn`$$#`@JI7zYUO80Lf~?iq|yg(FBwO<G#qyO^#}3 z(`-;Xjv*r1@RI;^gg#ESroJ$V8+8tzw_=5RQ&Nj>`Jj~q{Afz`#^CjORO__ce_vEa z{~k9fbk`{D!9<CD+;XaVk<So#0xR2c5})TqM*XI?z*!xi1Z%K{H8E=XgIv^VD;pyp zHPx7%_M|sG%f@C@;FbtYiTwl#xXKX8hJLoxfO`pHY#{9eSwLSBpy2UYYi0CK@E#WZ zRBebICDuy_cr$OB#2WWzT@`T{3gVx;(A{02H^7z|H09vO;8F-BDs@2)g`AMg>@f@m zsw{zrUZVH@e1^UCV#$;@p=PV8Hdk6$b(6E-AV(&6#WrfE*=0JYRT+t3GNq02xqpzs zEgXpv36H1|Nst->@K;TqqD@R|xg>os%qD6XouvD4A_}r0P&!TVa#-JN1BvatkN+Hr zf1BddvAba~q|TW3=lkt8Rv`WbXE*V`lS>8()|-CX6J4q8$Q`R6^~U1tEx;uiC=EE? zur~q5JQj>yuuMz4@)jH+p?lyznh^prK20<MbD)0?<=*Zkz5Wd2`PhXYWCb1_EDn-^ zCNtkGY&2Bj-Wz9hX3LqRm!)(p&WquKq5-JRa$$ZI?w_N2RNWIx+J9|`Lft{(s~4F- z-uQhk-zw&UIot!iRh`fQYj$_U3J4}JN5Q7CzX4a<h*KMJYPC3Z|K5vN_n*CZ@bJZ} z?>>6)^0QaJ_4&gW-+!+I+DvACCwAKjI@_b}wFbII^uWjGxb3X?44`Rpcm={*AK&}F zn2%TYUcP*BsP&@nE*FAZUe<uKi9b-^QERG71go9o#e=lyg9rwm;?OA4eC=4OC8&ml zs)1A@rizYL#Vnstw`W2c6IE;-%b*66-t7F7d<sE=zAH7pptLzaF|Mvc9|*<+ns=Ou zazBocNO=usj_VmzT5n9lfyDWtmlgu%aiF%80qQ#D$tU7uQ+C0s0<ssS@4mLx&<92| zQx&v$N<CsX_=288SW7}a$0rVa6>&zCqqf@CvZZ}G(BDZ_oBfW^)H*ijdB9bMnfWPs zvsS(Cnhu9EkODVkA$Y_`4(}fJ?_}HlfP*@2uBc|=RI_lap-Hgq7mr;Ps9CM9^{eST z8Vu*@gKX5b7{QUnC!DI4O}1aElk8YcSq`Um6beB2sY|N2b-AdWv@sXZmLO`UuAb@1 zh{NQMnOc$DQrRGpoBmi<KZFKh+S?Bnmp85yH#ay_>ECVzP16(vE|`T(4{1wJHO7qK zW3m7~K*7HnQJ~2h3l$DO$g}oE&4E!EoiU|HLT4W2qftJ7uLHS4-LWmM>?N0P7iQH3 zmzRAKG!k8YGaHhUlwpz?oh}~ecYu0SyHVod&N}t*eBC^a>0Vut#LR3~qcD9;qMhI2 zY%1%Ozf{c4*y^geg{Aq%Hv+Xm&_$8hdiBanyXL%yN!*Md&9Nd*$4E%_6{lp`<N#y+ zC5ndaSz$Yb%@QNFsHU$gSb*nHRWh1Y^A?_QcMUlmntp_V<OTzDZU1F(8%aeK&zK5K zrtA!mn}FJcwUV`1j6XV&t)9C6%U$a)ggZKkg&A-?mEx!)Tgq#^E5mxPg5x}&tQ`+= z4JnxmzI>A@muNJ_(bM6(nJFXMptU6|8~8%o>t_02vXjlq(Jq6vVoRq-9^N9$3UP1) z8@)8tDASj~)$TBzB?y<N^nOwgu3$z_0AGzZ2k9J5PKq^+s*IL}gs_H`!rc93b+(DL z3<2Zr5p!^n&e02{RpY5OuM{X3V`U)CFQGK-u~I6%)&K)HsonHCn@f1EaAz@<H$Bbi zZZAsItr|oVZ2$#TkZ8L}=UZ+3>h;?wI-^}TS*Z7Wrjo4CD#V9l(6<b%TKr_qIXv0o zoh8Fd3tvMSTgC_&mb@$fHQ#lsT}DKXT9={~25kEo1?t#>xKQd*XUoDKTUm$aXuy@$ z=I>_Yb%OtDuF|5HP`1wHcg50hd!I~hMPpt4mr1kFk8X$>K4#*l`(EU#paaDLWyKzz zU5JkhTvEbO_ui^td$<L*_?>Y=F7|>0KSoTVI%7cADkyr3-GyXDCcs?XqGyZAsjBP- z7+J9TTPN~0gZk&awn3K3<zaR<ZU&ao?d=vf@RD8D3NU}{Si5|x1Q3U&A%fUEctH{U znlxgi$*UocgTzd!it~{x6j?FybnDP|s<o9XV$?<YoSqnkl*jX;Kaw47uvxim=hzJ@ z$gMJ&bgX6`>EMw#AnQIG<5g8B8R|(h^8RbBE1uwb@ylqAC(*m#!F=Y@V;QAMF_4Sx zOB63o2psH;!Y{!4*El^B1okFnBEuE;sQ7C#w?qh~j{<RfGHa=yE-~`=!x%~OJp4$; zI;Bn&+TeHz&p_LcdQmsUC`?&ZZ_{c19PFxfovm5^DMIKYeo5VYCxcx2+U9i-XLy7@ zz@R|euG179sj;^%&Jk&=%?jD8FPG5Yb$kjM;ZVLRi?+)>a#WyW!OUl}=g-DC1$tD? zz;YlQ)sCE+=5;IUu*%$>>OUtN0Im<iDFkj+52dvr2$^6UmaVxx&ze;_wdy6b!a8d_ zn*hlMJj1-E)}JjiRVDqPjab?;r+qm@O^o<}bIgVuZ?mL@0Et`Nml#9KD;K5v*w|!6 z4oj@w0~)8-G9uT1EcR>HP52NKb|9r~!=(k+vxiG*+4HM#;669$xr_uq6maaf@X(W% z`9Q(MybtFS@B{H|l|0Vv3Po2Ch(c1(DzS%Vd26i`fW1E`S~Xw%Y*NO-dsgqHP~4T3 zfwhmyMwM<N+$YKB!jKw}d@SJ$ezXdBK-c(Bp^aonol1utOs)E9#Y2EwR<<K9%9y|H zO+iR~;x;0Uzu;w?)lwg3uT$AzLt7i=<06Ac?V*ul6rNuOF;-N~V7r7y3a~V22f$64 zdP8k-MtTh~6{>1@R>xg1FpacSwTEOxLS{J#x-a8aWM^mi)GmY?skp#IQLnB9j0$)@ zV02AYF&X_xnP`>|5tkiNPPHO0!SH9&5{QYNocM^L0tTlowg#3dP>$Vt8NF{Yp9fal zVdB-=bP9#<x`O3d`>kvCo6Qy)me47gY-B&|YodE}np}d8YXJ*_rX*%LlHxqSNaW!? zAREq>yO)7DfLU1W$&W{&QMVxkOv#<wj%Xgp%3(Og2tLW-o=a!InB;tEF@Y*MG=YG@ z0jW}KC!**UUqkrdE#mFFXwzlA&#M!t0~#jc!S-3S`d%5nOxglFS<q4bB0&?KY42i8 z=0ycnP~?gcj8nC%r%EeH(FM?AsW)R`-9*K?cI1QXvpi1<F)71Va$jpRDXPP4n!iq; z=CZ#RLVl;sF8(q5SkTCPI8b$;q=vN&TK37qZB6WJMa=%DA+>gz``h(!=Iq+Dv;@6O zUFRbhNSCjIIu~qV+SmF7-G00#>HQ?=Z|Y3I?p?pMm<afR{VFMX`>sW^{2-Tf8xpp> z1+YJaN!Yod-{9rky_mbVarX-D-n*kBPDKf3r6i<<Q%hK7lFWRZ8HrcB^_H9n+uk7g ztrMt$Vt|>7_Z`VVE4=ZLg?*o%o`P8rL4D&no1ZGCVMGD(UkJ>x(5Gu}JkzWN!p4x= z9AJlMg$&f93~y<7V`FIBEl3-;wmGRqr>SFLslM{kfU&_&iu>;EBX*`ac1_&K9>6`) z*)$W!Q$47qplr1Uh~^)F*tDJ0T%fyN@o+o<Si!qw1H2!Q2dSQxM%R9JTCd#_)gfxH zm4ikDLCGAkk+<VRKRBbZ>Ldo$Zbn;*i=Vo}pw^C3n<esyJNa|5Cf^n3kFHmfJ=+Z1 zcH<b1rtLV>e;0^G9yHQt!4f{&P3<lr$SxPPrsF}OW1<!F6G4cU=Pt>(>A09r<%uT_ zG-YC|NL_CmQ3vSJPeE*e3}=~;9N;iyM*A>e(ds7|D38qYeJt*vU2ll?@a{v8PcyJ& zCcgDjJ3P==t2i{v&P+5b9Ps#xaH?9HqUGQuKof`35dvSJil_6D5Z(LsF5C|kqn_P$ zD{<Vrc{Pr&_AGxirdsNCe_wCQDFhI8n|d6IxHtG>j?Mz=Rx*;*X;u|O+Df7!gJeK> zwrK$5ziB#LsCWppu#z?U>pOaoVIUsA<2%;;+_so<WRp>4yUCvTZ=Dkiuc>SOvbV3d zy-If#12(@Jm41%Giq#)-dB|z=$f?$wPFw}XEj#F_OL`CrfZtre7)kokxC}8we)@R# zp87ww=uDp#PO(NAy?J$ZdHf}2w_{FXhXm~9*^y1{hxK9h$nck!vxMziA{-ukf<MzL zOUdLmAXHON1<g5<1bdHH@{9fTNJVC0pTk$@uuccs4AkJ?f?fLnpa^>Y-(viQ2DfFF zCR7X@p;)04cgOm*I9Z_2=x!w){TyLMzN0yJ3OzP)ZQZ_`IIm^<;k+F`Z|B%s(-YCV zVd}4y_g$@)oltqbE*IhQ{%X0JTP(T7Otrv98tn;LZ|$!Pxr=I(q{*|{?=Os`wLqb# z)zvNXl8vTGE+xZlMH>ySy|H@a(szvT*>v>9-Nu;<{^{LPYbXwso(?4wE%+=fK}4QX z2-1TEb!F~iipqD&mN{IIMg_MWas=>4W|!qeV1m^J(yi&TmHw8F9!)AS0wH@hXIHn7 zNsjk?&XR4Gr;RpA-CnoAoAmq(>I7LL8=ZlO`5IhFPqH&4k5<UGz!=UL4Z)7zQ41+{ zRr*TRS4k3f3e9UcB~N<3zC*}SL&5qOYRQu4MtmPUpAilPapy5XL-{eCI@bd^74l~l zC?8t$XH$|jNGhQ9DT3CeO(EG)UQQUqwi3^<`96N%zmnmFrw@sm21HL*Zi2#6)=)Co zqJn2;KnY9(MyPu_P#9N5SlZo?QpnRk7@5+{ktZvH(2ZLbSBnS7@U?GzX|#!w4o8Ji z#-jOOtQMLGs}XAZkY{iOOVYvJgUtYqG^GbLY<7y)LzOflWVc_<h&0m5JE>vB$e+i{ za2rh<1;{sRMzU6>)Hu`o@hCn<aHT$dW?6{I-i4i4a3Z$1_wCJ$*y;O8V5;|330I+G z@n4t2@Bbo+M9v-9xXX#NI!a)Y7=_RwhkbV*acv#jCl{H@U%QEhnxLjy>Vxl?W|2x6 z{M5TxQP~8&2Kca}T8S<5dAjTn)Rm!E$LEb`cPj*w25&HrzW3xI|M2J(FOe#0#IAgJ z0SwOh**Ux-fcLw#)V8fXfcuT|d65D=*ThLNegeOqiC>La&iRaGoX`A4UA;Njp3=M2 zBNmtZ&6&Ut0{hKb&P$!pK;X0`q4y)ORR$c;l%lD~&mW4<T?{^GD-5s$yh1dq0+c+; z?Q9`SmF?L~I{vACai#+`hlFEX%kOmJT4shNE?{ghu1kS8vW^;Ehy_pLcNRSTZbP6) zTWJHDnC+z9`T*1dW!D4WVdLFacu$8nv-PUv+KjGxVB&|q_tq39N468J^P}onZDhbH zzQ5OXY?qo79<HqQ`Rs-oC(aOVIxb7f$j>C}-@GU}>QM}KKj#yf!X71WsoZ>^t81um zVzT2*w^8AwQhBSNRuNe?OugReRd)E45%@ZXUHSI9@iR?L;n#5}MNN>_TTk1a;Oko9 zb=caqR(_pjVvH$xu<Hp6NWLriD0<69d1FO>XjfwMxFs|HMwIKUfH&HKjAU_=4qGv{ zcb{}t#PL=!yJ=W0$1UBN3asI4`T~5C5{x<CEt%CadR<XE9$y8VSe%$UGM<VaOB|ZD zSq*5Gv>Dx`hL71`=P;htd^)CBDl0N+E10fytO@uca;^gNA^mS(7@Yo9yg=qQmrQ3$ zmZf*uvQreyGb)~*B-5kSA+zbw&qH)u#W&7rdNR)x_FPbcgl4_ync`dcygZO8`(FNX z;?_Bwm(NnQjJ8p*oV#q{*-rC4Zq;>`715vF(3Ns*VJ*h<X+9|ep;u)gLkfDR%Vy%b zHS4C!1F%LE9Z`L6dw(m`Cu?tey>k>9K_Lt@kZQ@z{FD|vFpc*$v3LOP`tq+d^O{#< zf;+$vB{}MC$FCTDpO4hW5qF^)TgIBW4%ISoSD|0WRhE@HcJ(z~dQsS;2rKN^C=bZw zIvZP-H~IvAkPdr`=NN#N04_o)ZUtd?TJNJ3e_faMBF=|ew5}t9qXBdr0(vR?(4sdI zOpN}1yMsv(7$r@9$G!VP&A-#y3f>we5?8sti#yfM;S4KLcZEa5``*Q7WWS?H=63)D zal!!>b2e?ZO*Kd)(yrRYFQ79p?$`{vi(9t{h=4htGE@P(`_&XOazHpW`ROSa$LP0_ ztjsfjG(IkuT=%)<IA*eaYt@6umL<~b=FJ_q9t_<~<4#}Z_2`Y}2>*q5<=aW8)oIdq zcss`5u1=7EIBO}Gp=Es`Z`xO8yPtAeZlIS%$u(<5mqKqrC6FosiQ}ZFcP5DR;($Vo zNfeaP9>@T#8Y~ewe?A3}2c>$0is;^N3EFv|78-FI1n+J6S^}>sEx=(8_R%}WK#pNb z1$C1Ld9J2zWi?wEw_fMfls7z2EKe23mv-G3w=xlQO^u6vL0b3TvL7l|MLv}UBcMms z;FYSP?QpIr%7i#t6qksdu<Ht!)db6`I<Bp#fJr5V{1H?egz0mobn-P5um#0*6J+dE zxDGMPg6k2oEW|0v#l>M>aUswm!!MtT>lym&fT07K^T`6^GX^Ddk`60e?@d1N>(#$n zc(ZQJD7>OX{j%Q3@p(?!EUoi`49N5l1c|+QF2g%i>rmw>tx86+HJHDX@|igmQW}az z>D1g_)!`2Z1e^)UB9*dG?8*Ui<LzfYD=-1?b?Vg1vKffp`6lvG;JhtIx1Fu0Sn=2_ zhDD+sjKutk<H0RGMVuPxN)SXjEsmfbXU?|Q?vV|1X*-UFSfYz&GtS2x%jVXt2s<jx z0t-(LXss{uOo&=tSF*J!zJJn0z-+Ny*hYPjYeZ?3FMbUQ9h_&wf#ty|Nwtu!#<V6a zPFCS7bRTLG%LuTp3`xxLW)*}Q01H$qIzbHmla`>kVO{pVDN3*v_fJ05RRJMpqft7@ z<d=dGs{9=`is+xH-r41$E8@<9l9Qcc#JdaQP;ekNEy#FHLUG4UjP?maZcpI;ZMq|} zsK-;7><jdC5qG4EG@A~jZ_NrV7T$VX!PNo>^2T7NlpS1t9oNz^AckCYDLgp5@Q&)A z_<DGs6v`n4xw{rd+q~;pw_Qc<;d%>}lW7RFIUqEOAwN$L$9*{0AphXLA@`ruaEc@1 zO*X)rGZhr)Mkc;sBm(eHfGag<i}4~s+GX7*x`!RcLrXJs@fC5U(OpT$(T&um?x(G2 zwXC-Od|Kq;>h%4c^3)n@+Jl*RyJp^`E18(`lk^ng2q;s-Teoi6Hb1IJ9cRF`Akr3! z5{%C|E#E~{`B+yVK%R<u&PYanD|@YC3u`t6>!}^|m`-rBdi+g*uL1}YI7a#i`b?AR z&coY1o6z6xIp;BZ$@z>Ej?#b1bS2S?`#V_4I%@Hj1d~77u16t~(1_)De~ss(EjdRR zG`sG;9JOS$ZLjmq5V##JEOy$0m$yMcol#m>6MM1rbBou!bL=snlo>ZgByd6qH!x7f zYG|j9-(*(Jj2;THZUXTi`eLbprKb>_n9Dud#(gF&Wq93<<in(s?!3<&BX}}%hQMn2 zX*Se7SZ;!XY=VMpf`SBN4<h^m;wKE!H|Y>>iK0DtK*9+_nIVA~47k!_FN|kff+)p| zV32pfWfdEGx~Oj%*v_UCCSwau3{^;8WGGav)K553HIf?cZD2~Z#wMoEX8UfoZ!C1^ z?XBc?@@+sdnoZ}hhY~^OgZVJ+rue{B>>>)=Zh`8+UD65yY#5d!gMuP?7c2wWmY8n> zuZqb#iqp4*0O<Vl?IpdQ@NWoS)%uX)*L}34;3EVC7pf6Z$iVw3l%|xlB5fCg^_W2b znt_2}&qhrJ8N-@u>dKqCDv)51Um>m{-u@}dSfmcESA+S6|J=rs7!yc+*hy;2)2zn6 zQQ&s=0i+WCdzhc;pWjAzB{g#Sb$81cT4A(uJs{NfPy>+;nz^Ho*nxaf<G*FhB>o8l zGVu?DGo-()>L<4pSARlZWmA#PiUR=2!!&!Y;fSo>00y355<_?1j^Ll;K!2!a9h+eb zaDfdKwZzqTmdm-7gu!-Hml0eu-18Ag;!bDEwjmTk>D}(@hya#Za8K6IKbQ~Bh_T4g zNG6N`e!6Y-Mt_p$!?ZWH>$fBNgcYWap})19Uf{lo<+zLhRAQO!ulAZR{egWOc;Hms zRa9Rw?)=N#4LyjT#oiqDMwV$6f5LaeS+!VQb_LqAInb>G!dfKInY<53YzUYrh@~%h z{{PS3yDdj@WC>#L_=>0=PG=@7DhdgbJ<|z-9Mp}3rY^7o$i84<Re{U^5UfN-c3uEv z6?1K0)=Y0QTa%gepck3RB)v$ceUYt3zq2#8`xo+aarfhwh)fj8p6OAx&9IOj?#J)P z&;8JIB_k<zI=ZQPt1d9+A~#WosjmiDB;)e7;KGjCvq3Q}FGds-W3dMI&b)*6j2Fi{ z_cH8b-I<belp}^2h&lh_Lwyc?iILI`El28&EoalVxPN%xHYDMOB;1gMjU*vmnZ%;P zX)+~bh-8$m_87IdY7eJP^(9rd-m`|U(hGVOYun;;_mI%kQfEPFsE@Q5EXV%g!4lHM z;8e`pKvQm;p2Nh8!OIgPW8e+V2d_rMMMy^|@{mRVK~ZVaF=A#g06hyv`hlH>h=ve; za5&S(H;F$4CYNa>U)^aasD##oISohicjHNUZTt$>B2O&7U1nj=Z*ro%nU=a!ckd}x zrs{4|Jk+s>fX|N*ZEq%4gh~aV@~Pe5-Ma1l2to|IyJ8)S=@2D}{IEqxMxA=zES^pe z3IGm)>?kH|MyL(>>qyP;rRLPf;PW3`ReMw2qeZvqW3Fs7fSP;T+$eH+qX&jI0JmDw zeXDM@QKO-~yL&@C=V*O=iyJ}MySf!%16{Lk3b_G{;iCoVpv;Io=b)IYn5j!)`{1Os zI*nC~>0Br3wnbTa9y7nmhm_evAi51FYDspiQH>tKOR^^$|N7T{=cx6_CyQ_Lv9xqV z2;~T)<jQ+Njrc>*!0=vPeJXFsS=k!ANAQmaE^;fK?>_O*r(xGiWEOM~;Q(0oj8)0l zHa}N)n6ix-HsH^CTOJCdwsn%H>C9)K&!o)i?P!wXSSGZl48eHHU?uC)-L03mSbEid z(nZ6V>?$8W(Kom4USu{ROI@K)UDh?b(H!4?J_18-6zDvgR983{Hat^MB8k^hnqv56 zq$n;#1_Z6`ca_S{@c`84aC16|oWj=y#uP`Z{eN!E-+U}5IMN!d?Hx?}!jt7HsS?oK zaD|o|WK%sKnV`Tb;-xvO#z9>WQ^XuPIV-eVnFL>v>Lk|ag{Tvy9gzk)8?{@X@}fto zn=I9Cea?d3xtnisJQH?(pKfOCdb2nmsbX|XnG-xF?$IKuyOD&P0lZFZCFMU%IM($a zr8n%*{T{q%qIh8aZamV$UjE?8c2c9~tCFG@I-`yknH^}1iOmL{^lS+y_Vz+vU}_-h zkHg$^>XB{l`30*JMrzdgiE4YA@<=E>_rMLAOS5I$IFL-6xZsqT#2fpB(wdWBXSV1x z2nN?dV}e(~2?UKv1;H8!NWtW8d}Q1{21{+*;6T84llKT0@WL!$bTg0US6tKP6S^;d zcm2Iv<IK2Q=!pKj!{bG~wG$<wWCVBc%_6zreY+HO4;oovtPj{O%Y&7jgfq30!=HDe z5B|9)T5~79DQ1quzYeRex+^|zjbXkhZf&HP_2^O%f37bB(PL-*O>#0Qru|7dhM}DL zBh^{de)?!lzbt*JRf2vMS*~K$08Z=(PFD}%)!7g5<Ru@@aC!j!<dh9}_0M1w$F!bn z3`T<0zKirupVptX15A&DLSEFG)RLLLvKMQwr;_3hP&^Xod3?Q;e0`Z7@R6*1fz2G< zDh@-+?5P_HO4k5RTBsny*v>Y~7SE#{pe33KWVCbXC^Uh@Pu<hxt37@V(a%Gdez}*l zx%j?(+&k+!wcllc-TDD;M+dllmjTwl?rR<%uh!bC!XPI@^ZC$s*NPHYZ5S?_7ds1< z#F2M+hlgX83wPH}XFcU3@zBIkV}dKKOl-W9v{FC%t9zXf@3gk0;0&&(0&~ZeUGx5q zXTqn-C12NBT`%m!HEQ3cGf-w#=Lt^Kzs1)`R;m9wVXkGMbfSTckgYkN-hEgaX~JxY zW}r}DCTi@E;4gZ0Fvz)@Nt?;!`-09F0nnumer8<wmK(k3MlZV2i{42u$|5w9@K=+l zdbCdNhP{`gA27BRoDuYru@cW_)#=Zn{#=iSb;y4}@KS9`s*O)Ri^`BGB?C0mzOGxo zSoyIw3vN5AFB_3T2muxP3pi+AT&a+0(DB)TSg3{@K^zmKi+$5l_)_%|R3pixFOJ-e zC>|o}1A^hhWJg^3VT2f+$O5e^clTxPDDU&f!|9mhQil(kUQ{FEh1gL%qCd@x$-?Z} zG!hU4B2XMhbeVoVj{Xu1*)~G2l$da{95lBZ_yW$3^Ei_)OOtjYSO7@b;uZz10-Dv& zYfk%)THwcC+ZXvr;iyTbjokHY)IInh+~j-aw$YkcCBD}DTE()^@NX?Q7Eha(ee<$6 z8^QCdsU<0u+S?Bp&EWvEVl20!@)jty0gpwpQfz9XKl5*s+fg-|mHl`A_t%(WFiqa? zKo#$$CFht=cH}#xMyc_4g}e{^_s1U{-$nC6<|}ZQV8dKh`mP9yf!SBcInrq)GCm+v zGY;}R#04i?9(Tu2uE*c$3aH=#QiAxKG>PyzT)5Exx*U>BO{2&70uv6}r|eRgIe$PM zpy~T$=QK6SJ6rnMsZgS6`*PKow2ijjwrb6qLR;8n(VSjVT4ZSjZ(}-02G+A<H^OQ$ ztxVTBk$ZIN389_wMY{?t>7$+5T5ERq*{M!aY<C%ULT<ozDi*Z6+?7jYQhl=P=-~mz zGgoiM35{Mt9_Y))+l?Fhpli3YYxYL{MLYMP>urjAtxZCo%(=~GzUDI!nz7GvOzxVA za6q087u`2hcUg&uspTYgj}6BrLUPNU*gepZ$rB1r!UFfDNn{A<lWfNj8APyF527D} zgkKgFa=x!I?{py}?wIdnN+_c5*p{`!CU7k+X_4ddnjeNf3SYxSWX+yCB=^Li|9RJ? z1?khqwRl68ZOF13vTREe7LVrTP}RUlET8O{$B-^_389J-gA(y_>w=d#c*+4HMJlKm zo(oXO^{Z)NF7X!Eu?o)b%i=~=(SK$-bn^P9x{rtXRIz0(3zI+Sx@5PqhLLKTjPu2? z$_Ih$;{swL8HqUj5CUxc&GD)BhpwLAA>|^3WhY|u%8SR6mVH|y$8B;MZh5wO;ZCL! zDnyHP3Od0|AfBXbp)fkfoa}gFdl&2b8-G7(Wf1($eK)lw%1H~QKwhI$XK5lre)r^L z)44kHkF8&5i#EF@9@4r!c6B;$%o*)PBw{r>6rXqx7KaTQ)mp0C`mWuHYbK);#jB*p z^ujl$6(M%)<?>WC5DXr}gqR>i4mbhA)Qo}93F%yLj#XUP2*c$}Yg$npA$gdBCj7(K z2`P#|eC;JC_SfmIe`U)72Ysn$$Lh3Oce3Sic4`_?i_swG$dYaQ8Nd`WouZU#Dh!j3 zZK)^tgZeMX{nXvgcz}OozPgbyjd!G+*yLH$d6%|#)jwa#(Q%6R-Q@oLGA7A{s@lFM zqJI;RPRdi-2+!6Q6Y7aYj+y9;yP(hBv%T%cs&t`>J^<MwQfFs1m>nOC!dB)7vA9hZ zM-er@oPdFJTR(&5(RpCx=x%JD$k>!>;4Xtb#fz$gowdy|hJ<^6EiR%y8m`>e+=vqk z=2T)K_rs4rI%l*V1j+N^X@pN<*!t=G>=4{{UyWyq{CSTFCfjk#a}H}C{|NuP?e=KL z(%LEus?u$!a=X)`4QqfxRlFeEHFm=*Q;I~=ftWw<)Pcxm5?bANI`JnuhDhvIHsKLV zUQvpvVsgRBsO(87Pt#};m4>Cz8CL9xJt<=cxMqK#-jjUFi|9UP&-q*1tZ%0t$jYsV zY(wo9EIYCE3LE{yhSA+Hx^YGqP?FIqe)73OPDZ`TO5pW)Ph!2GNe`lC+_ut>@o25H z@y*d>HXa6IZLq%Wrc3qKf{zCHxPai73V>?Mgy%|oUTf&oVTPYWW4=ODVH7U#DwFiL z^~GPa;u>Ye_9u&pZGjdcQ;FOtim$_EHekH=^x+RAt?oI3b|F(B22i9LSNyA=&C9$3 z{(HmTJ6^&teU7SOIcU|HTRyBec)=*H^by%k%0H3XP{U>a(j=1LR52Vuo9(zMUX6(- zi#cVkIH+!w+)xr0-XYTl!?puBHTR6S2EW9Y$C-|n60KZGe0F=uZ|<<TH7jT&&a3)F z(a<%hI9j=S*jf%0Aq4oyGr+q&P&7d?@Qg7`XxHs*Cw#hhy>vkwJBp=6AY(%<BuB*( zH;xL)sTdOX@^7?5{aUyfC+3n+tW6}Z+5#h5n+731q0q@M%G+`Tm)Vw+9hNYl5Rg)L z2C0AlH)P6&OxchrcQTWJ^bo~F`(aFz4`f)y0fj|uVe_Xnr?{(SV_<$UCd={@)xiSX z3>E&&vW&d|lHWnNaX6A^1=1Foi2(@1MtMAVa+8If6AX~1Wn{F{o{>OX(G@8d%%lMf zHqJz$UsFULux5MQoYk2MW!`IVMa<QNF&;!9#}AJd*jNH03%E|qnMW_$=`v8guJ*h4 zgUzEs;1gZI4)L@C9XmtO!p_eYewl1TK{-Wnsz{!9$KeOb_#*i=WMp?HAiWuf)-hW( z2A1qWbtvLOIxZdIQhF`Ku%xI-<T=3fmwKF#Zi4^Lglk2t-&j2_N(ryi_we{e@@HP< z<F<ujtO?f)pTN5n#$>1ome6sqMIcuYaZDN(%2kOdqVl_Gp|e3GIv6|JpTrzXXosW^ zdApPKhw4>#eSG?}4Bn1~^;A|ZXZnY9-q5JR)2>8aGt#h9#JR&%I&}`ecQ-gnA)v!z z2ni84gw2Mq*$_6h@)uH4gY1R=+TG&BACtu=pHX^=$$|>Ykve&w{EaHS%HI_S@T*OH z1JXy2@+pk1x+wd-L~UOGU6Mo26AER3TfWfwiU!3Ma?y&Bdw8ji^$?CW8i&pxQO~6! zlO7J#Ngof@;Za3FFg;BMX)FyMx(Dj+#OknqITj)Lgug*Ljma@3V?R|KnmR=9TFH+| z>k3l0gB=0>8W#CAgdnc>!88DGPm^2RiABm10XS?hYhcn;A?>C*vWzQdICeJ%3k^ux zRv<|04Zg-e7Jue}=v6lZ5R}<zqNz(_iSr>?s={WdSBSGO=V~XL0h-6sg1bAAoDa+z zFm!mb56-&4TBxU8vGBL8A6pCc|2eYVKPoCb4Qd{c%SZ4H*?%k-#mf{5PUZMb{8zCI z<#e3S`j`8Cwlr;+EpODTaZOdv+x5ptcUpjVnlK?}ZNJ6P>4fQ2!i2C2aP>;u;r`jY zyDXv@%{caRagBeR{Xkh_2@JS-k0_lNGfF5k<AcBFWHQ193B&1$tVt8wFoI!rLypRz z4Py?YF0QS|yrzLB7!qe$MStE0MLC`+AZ>_H<bIMaU6M7>DAnb<gwvY92CYu!H?s*9 z4-2F!ja*edaDVli?oKyL9?fSU?F57buL8c?>ZP6(<B8hiJ|<l=`4xf6z32B5a!G+{ zui}Ii88sv}fLz-{QW=jZJdj%IdRAQK*QGii>cG6^vjMrXdrS*qCh+mFkPNVd3Fy%v zsw~-8Kl9<VBB3z%#kUeI?ij^p0R<i5*FELA7(p+>fxFbTn_AElO(f^44+@>3_S_iz zWIlvv2fu&uw3mRmRxQ|!yg0uOSS)u)VM_X?l`>GIamm?`)z5+0Jn#Y!_tKs-3@8ul zjz~2`LYM;(QWgNg<lcey2No0Cpho&+FFTn?o~p>F9wdH2Vi>Z&r0Bm2RN}cJ%}8FK zU=kR$!EbShZ<Dss38-VFD876`dEpfKqha$|Km~w0wY2-tK<(5;sW4UwHwB}@=mSV~ z&e1PK(Y`h3F*u8Mbw}g*Ox$wbr`)~3gbGb1{{o8YM$m(4+`gquVGc3`J946-Q05Wa zOye>$pQ+J3(|FHux`A~=)}7rMmacr}(c-a{ZhROj@|{A$C|<m$DvR2*+i2tFY8QC( zdzuh#i^A0DUsxAF@v&CP$cD#yZ{5*#9M=~>loT10NPb!~&>#^VVhl<@ZwGsz3)Fa0 zKdzE0PR*|UeX;Ox-@&;d{P>uu^Q<!;vTT!hD>!m>0TjKb<1x!b&9!y!vD$khU6EmI z+#9{tjCH|@nBi&aSr$WuG<jDnVrFu}a+J@rjCtzal~Uf716kH~Zc}RDc>*6=@llm{ z)m4esC2BfUC!Cblc=yEJ5)v_Yy}=#io_o3Bw#m_U>Y|TQOb>Uq3Z7Fyng2pTmW~@D z+*0njJ6|U;yS7H1LB@%g#B3`D;GXT4L(IM!VJsDU1g?SM(3f7F67?d34o{$(`e>tm zE@SV$sz>FWb6MHW^c^F=sX$cvROe><?Rizq$G#b_`r+MJ4fPvs|8A>ird(VgzTt4R zAieEbp`JjCT9^(QPYOlq%%_QZ?l0&?<5ZliL9i_p9)NB#$FSNC2)0~e#}k^tslV}h z1x(8<wieS#->!xF@%P~kHc!H&ulhV-7j`)UYIho*B3c^Juuy$L9@=U?=?m4qo;yCx zFkqA*Y97%9l=EW%+p%L7WwBA{Qg6DgzZ3d4+PZZ&j}_p&l<J*>WORTA2!K2!!U$fm zQ`4gDw`<oLFXHV1(a#I4cnI8>oM$KeDthij;W{RZ{&e)!Igt}kX#AAI4y{5A%T6pX zfq(pTC#f5xDR%jMw8BphpYZ^_pn*aRyBHiob&&#AbSUNvZp*`)CiYrH;Ak3FN3+u) zTrwloGI7JWy0otc?A!9<@=0|wGSKW0;(ViH`5*?l>snCM;p9<4)0HbXQ198%2<Gq1 zTJYHMS9`0;)dTg4GNK#4F}nNC8l2=k(_J~bu7=kIv178Oo<k-G#>ixYU{p?D3NwAH zsN@AOD~hE+F>aO|Rf$>(K+Y6Q-Jc4{TorF)-yhy_rdiIwtLKo4rjHiPOWO7KNEQL$ z5$w8^E#MN!PlEPWyLMb5K(D^|Vqef_pr*cqXomA|FMv%~r_=I6=jCJy8VTH%ffM;n zJ$t!kjwlM;$VuBSCjvJ73UA6&mqk?6PM~<QQIt*6#Dm%Kx0h%@KtD(H+8}{N0nPPI zfyW0{p<gKqst<Y#Y+x8he1SlwTR^64wYuJ;o%caYqp3(dzxrP3%mrp+{AfDCH4(el z!S_q-^Sy9UFw{FAEO^1>-ure|TX(oO?#f1yqFS0`YcU7wkq>Y3#S~=$b{rfb^roZ( zq?Ygo&f;02fs~_uH9__0uMpXgP~qR|qlG_z1w7?gixY<Vf@vxlt<{+sk4(%=T#;0c z&&wnozq{Ao#a)RY-DDpWg0H-)yS{?jh#&)L1#+d1i6Wj<=}VL#XD{}D|K|Js=ifc` z>YSg0GkjMhizh-@pG9jj;5^7wZo**s`4XPsbf}WG+6a{IoCU%4yP{Sv71O2u&pV>R z;-l;rzCWSu4-M;RYoY5Ho2j@u5Dv*vdac?#lQa?A>QP5xFv%Xn%$yO1f<ZYo+h`P> zaAQzZxAS1NOZxQc{AG~?4;vDaJi(~n4b3@5q(f4uT-{Lx^RgPEDmTBb$^r7=i2QFR z6<onUz9@j8><^y<GI7<SH88!+VhxBl48GK5i-9nj*%t{X;d3b5(5LR6SV{JDsgHi$ z<PsL$;9z6G#ZxT3+(-L1c`ifte7n$viB>s%2DyfcNWHtd)eZ<R5Q=@U`brY2F=_9i zxtNC9y~h>Gv(@9NbM^F1{CaJd1wg*s)2J(!$AzjG<OZg^IMS~m45@kqHAed~*^UZS zELH?ayYcTha{wEDcd>EPsu&JMplCi><l@@k7RfkRoC?Rz$y#ZBXzmWZ0Biicq=tge zXRU@J&>)a*q9=@`n(OzXSKxJiW9{^WonRfuSkFN^W=C7GwdlEI%2s4Ud-8`C1j`p+ z5<)&tDCAi_O{BNUk%8nM^ZbF;&XM-+&?95gB#h5w){r#UL^6K(c$T7>lF3D+Mw>Kf z*9*{v%P6ZENb=jRN1t<wBT|?3IpO1Ip@?+#+>|3voG%<eD)n~q?PIEv^nU8;`T>&> ztLF%nY?`B1#5yv05muAsPnxC$%p1AoE4WuFoDY`4$l|@F6C!oC`B8th9WW8KG0WiG zwE<Gh5z+64DqUX~b~k{I3dd<a=($tR%0U{hNyx*k+}HZ<2<Fi>Ddwl!4xKilwO^Ph zp>7KuJv0r7u15<>+i+r?k(U-Rc?$#jF2cpm!aB!6e#vYPJ_<J`E}BtDw<0zzGMGbr zt#sCPS=U`31UHc1<t91U%6aDV`IMZ>uFK-)+hRDT=qQNz(D?}HyqqOjV7>P%s7P|| zU$H%u1UM+hikSyH%6x{_Yj`C<c79!u@SNDW0g7V+Il1Z{%r|vvJAw(!Wo9T6Kpg>2 zLgau<C@`88NPHj_n$a3x<`V~`!Xv6T9kUEj(XllpKt=I*Qh>`@f+jNs>Ns&6?waBf zy&BJapDES4Uruph{jqY^FbpMTs`-&>$%Yjbs7>unH4(H{cwEyf{>0KH?%R}2!7`MS zY%M*0`J*MP;-#W;p&)m}LP965Ibje@Nh3&lMOqkg$C#<6Nej#yTO{id%ag6t4b|#0 zakOI*x-I&=WmLtbrLW^!lXr-t{gePPeT99g)G7Wp9}R}6n$%8j>Z;A=Q;a!<k%x9Y z2Ry8FZ3PZ>Y7P(<RvaMDo-aDzXy9PXNV8ZE!C8X%8M-@%BtaAVjy_y5)>sYYcfd}v zTnYU$+eLPfrRt*M{NX-#z@iXvx@=de$GikPZ<;aMz~TaBO^i1YB$pVDkQyqi2mU>5 z*?fi$qbcUY1svlyMsrq0kX#faGJmfwjPvRl2*<OJ+fh8nasH8&YgAQrLv>S)FTpFR zLSuJ8UfN`B%ilEaX-}UXE1NZj01>XkdA6+5D@aZ2y<xWI)ykKjUnF^aqncugl71#_ z4WErTu0aA_QHd7Wz`8?;rb9I}DHo0y;vk(Fqbx#lv&NE&J8msk>N*Za>X}t+GO+0C zjmC$XPiGsn0HhNbnS3tnTHVQ#12B=&VAScqE=MJ~StsWOT;_-kGG4mClvo29loK## z8!n8##cCIPAl8YC9U8EjF}i~BSFB){2ONctsE%O7+iph|`egf5P-dW)z}Uu}2qq(p zWvVdR_P1rrcYmj&B0QptX+Iwqk4Zn``&ZxgO!gvMxagUjOSaIlH8xMSYl55#Ge;d4 zz&A8bw`wH;cKI^zTclCEx=&_=Rigq5cc*$W;=A$k-%-12FFTrC>L2E<(->A^Ebt7; zHJ3gg7N`OuN*B)O6(%Di&C=HzPTR`Ks?m8l?9cQ=#*YOYb3sOQ=*247ZM<Wd%lBZU z$JtN+IFTNcmpo(QBBjyr^L#q{R?lSGlA*Tc2ed~*&y)81N#{hsJN4szj}#NIRy$!( z2=>2}uG*}sbv@zb&HMd|{IF(~;{@Txalo*NU}tj)dLdjZ3PPC-=IEC+16sYW7965n zC>--=r}&y4Ry~e7ib;;^3=V3H8iaAZ!<{x&9OQdHK}Q<(ul;WB<gTwjw3~Utk}K0{ zx6v{S#HtqC&ME`Q(_77|Cwi;x2aen6p2FztgKfDN8MInj+YQkxcKLQAb}4NK$eJCy zqZK`y!uqZ`n1~r8i>^RP9C!<a4~f1kin@!vAhcyY0pFRj9N^vhHP>}z$EJrUYF^)z zlh->IPOTl-TLKfIBde7VpwGR$zCo$e{-iwJ4fOF2C5w00waR3&*H1;bnzXHf<?7OE zQaC!zBH_=(I{UU^bz1AFnAVp~mP9%^rr)Rph7Wov0w6}$ZE9&>ekeEr2ns>j1U#o+ ztWvpZ9-x<$PsxXak(gaD5D?!V#UM6>f!DBPw;#Rqhy~>e$LM$`FwMQOw!b!+D1}B3 zM*Grc-L%!Zwbi<(olPkBjfeHd!+J%8J5K{eHe+tEJ1@#z9)?Z#eIA^saZWs^p6la5 zakY}GA|J768)a5#6XBS4>ri8AK}eF7c`>&Lk|Tq!b(S8fx!Le)+|R2Kj~e5ii7034 z?9f8Nj4_h<4^t~ndOs|#3(SaOi+afy+v%216$~*hzT=6fz>b+-_h$=}1qU{@wIep7 zgBb#P07tQf18Azw&0BnjNYn5(a}>Kh-)6+s+-Zi|*J{un+Q_ItnTs_#7?m>?`f25a zx*}SC$nr*(h-8lZ?F8etZl@GPzN>wTZH1=_0dOFF@|E+BjSht}c4PIcH)WXy^(g3= znQQB64u4=6GCU>bHykb<qAY-NyU&Usa+LPIF7%69^F4Rc=do9{t>Z{=^}N_iu)G+l z*JqFgFp<Df3*#x>mqA66OE%R6>rM1TbGC`SG2t%oJq1OLG*7%hS7<f6lAbL-XcEYc z4);`?pM%L_KC|kDu~aY6G8sVb;WHne%qRFSF~+@QXItL1+E9BK6I$*4U*&o3McU(F zf!(ztF^ayXm$~9E8he{uoaODV!Ug*Ox3kYWacDz79${THK~ITgF&4&+P}og7$k(aO z7*Rr-SL%sO$gy56-Ma$PI;q>Z;~Y=AYLkmnwf!uOuj={vxwoogple1K>QH@=CV!JA z@L$ii?kw-WgF6n-4Z*P^W86#PZ`@Yu%mttxonpd`-Sc8Ub0FpI)LU8Dyhp?NB$yO^ zdMpo&ueESArc8B|!*aF&MF)gHq!`nzQt(@!6{sJAJAuku>X5R~1^&$P<L`rMcoqKO z#Jm)zi;!{rcty+!%RU~I7v1gbZ_;iz`|b6EZuZ%?zs)|oR{!=Ne4hOlj`D-Q&Hgt1 zJo_B~{cZMne>?pm{Y-uPZPrb>>=GKN`VUlnC{t}e$A8tg$KBs%U!>jNs4v|wvfrfL zoopvHeZEg#bU#y{c2tXRf0O+UjA7^UH`#B@hn;A#0{R>G10AU!6x|Gt%ZN^UaHQPD zDBr6E`uvMvf%ze$D}a{o;E6t6T%A?JL=jZ@cvl=u#^}Y>YYBuXId+#5@Ra~I;<|`m ztS`ciHJ7V<_P1wegI4YLo%7GX_~P?c{APak*=Mbva`a;r>Q1A76vY7)deW=v4EP8( zNI>?%jq5(CW-~afpKpf-`J15S8<uXv(lxMjq*wS`KN6OWr}c%1r{%{F)v>4E6^lDZ zwF#mD5#F4b2s~J!XFCz$7lJx|$S5Qf-NdUVE3+CbXKUgfwPXon500)s>1HFv8LeT4 z7}pf>ih`ylQ&bdY-vN8;SUHIOwA30b&?!{Va~LSxa#h!HP2@0#ln5sRk7VUFooT(p z2Q9Cr@{CtOec``6NnFFQ#KOrAp-Gt!)dM+L<%$?@1&+QG<6LJ<HzsZ7&{K*@(H>M! zDU1b|YY$x6!gBIqEBmcuU9N)0iXBpItI=}^_YvuVm>Rzp$=8h$m#vRR0B9YV^v~q_ zyq{#%NPf1AY7tXT4bYevuI&?7zaUPGYa0JW>|Drxs3`8ifyWLaHJouZg~w3Un?;>) zqbZ{zuD;K}hzM*)z-W`gD@|n_Cr2;VWQC#uxj=+O9>~|{1qPPlDj8c2I7x;`(>o}< zs%!*es#-xm>%R|WJS%iMq5kA*dUYd1InkqhkaXkWQF&}@g5_bK=o$H7Q6=LxZ-ATy zF}i?_vKtjqcKN_#JIS}kJ691?As1z}IRa10Ty1a;ozp_MzAc`SG`VYsPUB)lk2N<_ zIuP(K1wng`LGW}U_+Q>eV>rFsjapMMtEkAJNu_SQv5qh%GDsX4gC;F9a%71$krBP5 z5J1&YSe<i)dS@vq_H;XtI2sGCv$@UufFHPfi*k=JQv@=%z!?n&$*<1Qwveowp%4=a zC=v$z5v<`CI~#~NCBXp=qTTuGOWuU%<ldyW#Ks#`sMu3siWWYq6rV^*?Pi2r>6kdK zyJv2Ji((_UuCCi<ozIWkzUQ0pY<Uv|17`k9c>Mfq<e{M3=A(deyDP!A+Oo$GRqYz; zO%Y9ONNm$=`%h&9&1JFVa-(D1Fr*uXbS)ht=Wq5@j8M8-!x$!JCNkYuVa8*hnnbVI zh6&6_;sy~ylwUYMVXaXXLPE{x2*{1Z)N8rEoWRUQMxp5Nurz=Ktu2%DBQr^EOs&_9 zUA1mz$XuRPW7@q?hqf5OVU_?Ql|TzMA{`&wFdxe}60|>z)ScOSJLx@go>IdG2W+Ow zBHRqw^pjp!hrLA4NI<6$qy#T7uACaZuyFMKs_phdWGqin?3pjM8v;lgI1qcFxP5gl zD|gUMJM{6bi?>y4Zsz~5Hd1JPGEp(Cp8U~}p|qEv(}hBwBnNKDRO(gzLp-7A$~b!V zmzRlqWkNbKa+PSK4m}9EM35AzdxXVEy=y|*#rGit1*R9z-f-5m)<jDy^2x;<pYgj+ z0`_0g$#<NEd-psJeC^S5-?8Cur12Z#XG8p~A&viSOd5|VY%sGZ{zZil2OTqB!XHll z3idkE)<XSZ4q>>|@p^*c`47N1L|qfOD3PR}Ow~LD7!MD`<zHqlcLqI)&y=-O-E^<q zX8*I<IVBn!Ps(fc1UXpj4chb6<`a!J0n>5L7WMbV;%;rV&igKH29x~a0?ig!E580P zzn3;s>o+@+R#j`Z6M-q}8Xk<2@h#x&vvM|pnBHjclSz{vMc^jWtK3*ke2S5NwVe&z z&597H@qp8=pg67yoYAy9xz0zcTOaF?NWG-{MPynfAJ>`pSo<`-u`o^pZ*A83r~&qi z*M)SD7XHKNx*PZNHrXwmh+Eo$G~R|j`xN&h4)$~fc<?PC^0z6jGNABbHJwlVkZucO z6}9Eqg+O|NVcypP;nlk^F;U@-YZHJ4=p;ddciNJ&^mhBE>LRh7TPYHK#0@&)H5r#A zaB=4k!@5H2iMO<aZ;eYQ488zYqj8bXhKpn{N1GWU#9eC$5*rffKCW)a@oPH2!hj~{ z+FSsBnO;B%lBmAj$O{ExavfEHtqlgnbt$t2V0aI4c6`?any|UoNZz}?v_Zuq>$ybd zWQBu5OoAA6n|S`_VRziwt{b-MLI+{S`WF;>Syo`H7F~mWdT#ai_&O+lM!IE@Z*}Mh z&bXzoxS$DJ3L^bwPzp)2UB>G|2WQ4VP`%Oi_<>8~=gpSCu}bx8>h%CpY}q(~t}8f4 z+}vK_H;(RU&Z1((3X<=BSbCcV1i(}N-qsbJfO<`c&Ku8D<k}PUzK<?E$^aha%sUJE z0mXEB)N^J_U17MWjlrSKfwS+hzxP-Nx4rG@`6B1`8#x*|2xrWI8}`k?(Zldc!$BB> zX;Z7|3F-Lf9Z!fqyU0}n32<?fU~FptAkt!BL?-U*>9CEh(!_3i^QdazVN8^t22HTG znPQ9x)Vj(H)W=k0d3!ji##5bytv$D8pLAnK*x9+*3>iZGia8yxw`v5lcGcF0D56Jj z^cJ0?4BKkZ;j}rZr*{qL{UZAT3Y6L)5vU`Te7S}v2#DUv_2EZE4j<b=oKy^N>Y8+) zPvzwTOT?)*Q^TkBMEEwU?k3ovG(V3yOyj<-9E-B)HdEvc1~aZDB-KZsjHDMI#{|57 zHJ`E92gP#XSZ`3|kukb6N@^j;TjLptyiILvO|hUbLo)nVB!DcBMpbrp!*Bo^bB15S z=%e0hvx_L^e^r+SEx8p#`c<Tt`XHrjdE|-{gBUhQcB-pTO=dYsxG{s2oih^TxF6`w zV#9b+`bdnA<wMOe2E!k#>ME6xY`7D6#F^FyZtN-_E$AJe>WmLJm*ueV;VL3o10nJK z00}KN7Pu~_^L(h?EfDyy1dCb+beO<}k5O$J3*&VExSC_?9F7x=e#zzz$tWOLaW@JL z>Z77~rtg%3Mg{FoG$F=5*g)LEA{NOR2w~7~qi)kp09M-(xRgE+9fOBx@-UcJ>~u9A zpOu%2E4cT{p2`T$1dE9eW1Z6pT|-hqD=krR!|&J%JS)jgM}T~13e@$$Ix>+wN-KII zG2wK6_5kHm*&W{mk7{z1eRm;we1j1BW=L~G0`mvY7(~{Np}4UgpRw8eEt651`~(Cd zZ`p|hlPple5Y#LXZ2QCOG{tNto(3p6(|2eia>or|g6Zd2eoFt%^TBf*ThSqP7_O)N z0IP|)zgI6Cb>lBu&8l$^-l_`1QJwP}$Z4f(uAmd|w%#7m+qmMA#QvmPbH*DFW%Qgs z4R*wQP?&s%?rp)5%+S3lx@dZU7Jiz1m|o_fm<+){`SK?(;5rA^9o=fAvFc2^i>Z&1 zx0GBQSxAa9xyCY@V;5C=8!BX0+|G1dUzQ4#qvX1nptmqPC)pP$;+STIkQnk4E9GNf za%sp4rax|qaxw^2>HdcEbP-?}s@ufb^6Kjk&GyH?#AS^L-6hl3a}zSn3m@kZpQp76 z7_m-pqy*%6l8>e!)4XFu`iS5*F41*a5;T@Ga$MJBZiP@VtWqa22Cx(|phXoOCg)BP zc8A3gy>dN_*og~!2O*`E^}U~D#6q{JEG9m9W0u1;ie6)nfGRF$-XtW@Af`VyNcJM! zN_0~|@`8``LBAS>k7BT1;L+)a!iE3EZAtp`$rN1x$#NlXlmdqvn2(r)vI*)nGS*7H zCijQHO>pK4?iB+CnE-)Zn5uaLD>f|2fB>=5*?czBG0LM+{%6&=U1SKMCac@BaRv}c zs>kYCzTMS`?(q|~5HHjODMeBWKGfTtx-~1$XKR7!)Qtv~U16dIAWugFhOxq`##;z= zC4eFd?!zkK7d41+4agFCQVs$^{s37(roYi%)T#b(J|ORXzz-*`AsITfw$h{}oWAW( z6b-=7YMl4W*}^-sE#cS-wX6%Q{l!kLe!(BCg#Xl68rXN;yKfN0j6RSfgEO~Id_{uC z&SKl6@_k|4xg-))<pHWJr|3M_woN;6G{{g-?5|XOIgQDLdD{7GHc`Dp4m-760syes z50f1U2O>17qEk6(!d$N=Bz|oNnAh99H-pN!UDVpN1&gEoi0PH^Je6DL<?U<LcWW!g zB3NYuztofpL+7+2T-_+~jL;7OxPXW-kb|UsELd+x-l*W#x$%<uT``JEM-HFXzIpB! zwVr}xp<9o&-48&^v}>{_`I_mpX810G>a1h;7hP>1tIEY5+@{GO2wAy;_7P;r9q2WW z4s_fg`T8G%o!As5VPuR%$2Rk<jv+qMUQ$m)wpZ>L58mC{6IzVZwB~3<&eV#H>-frQ zH`61|WOpmTr0RjTI=etUODHFL4&hIksa3OUJlza*j!@N*asKASkW0J%ydCof4U(&3 zc3BOw6&6J?@LtTKU;Z4188?Hy2~{H@cTr~*k~LZ=uW6Nh+jBDR5Dj`51a{WJoolLg z{i7TW`Aq3+;$fdD{<@B1cJd*bXw3w1w~C`Miu;<`NL=>zH1v}F7^L?UXheI;T>Y!B z#*-MzlVks)M^am8#ZgL)ot6}PphBkNTxyeQ!GaDGvSmTx{AZMZfUqnm*Zd%C+N=>w zkT5DTLjV=fu)H89qqxocI^db6)=<CVq-jwrnSiKZkgZ2gc+}uCGDu}POV2o3YJm$d zzO0QpR~rU_)~X>IF{{DQs2!U!WQ@{;6ea{hvBm?)5rL_C8OX3WpXo{a%+%ekx%Nd} z=NKQElneDr1UO#P`4}{F$y*xX+j=`h<CI9DBbL%=tJY%?ZQUQ@nOoXhde=tbYpB|4 zzsy%>Kd50YL93&MT_@`0h1A??2CV<yUOM+Vq^|0$J%7=a)I*=?QP@e?!7u$*egqG- zD6`y<8-FPqk|yG9(KVJ45%iiH6~)_VM6t@!!Z8YT<xvrvK#$U?cb5IB_JZ;aP(5fX zyQqa&X#N$-)r_&870~%6N*^J}Ge%oMe=7xjF&fsbbyuCmpnB|YxTjmy#{97hJSref zLOxlnuUxIYleddiHEu5J@aoB}B7u;6*;7ovdbGOEBrz%UbBbwb=XtvTi-t5YZRNyG zp;}@4H}LL$mKN`DDbnh8VaF5Fit1}Od63lA-~f;}m$fi13vdp?DlQ;D>D_V*9P(?O zB_MD4RIz}4@NnAmoh?*LKTDWq{Eg-&W=;ocE|8C^sv;|gwUeyaK3k-4#L7?qG|z`^ z%`buJhUS$tw9p>q1WHprYL%XJF16el4feHX{~VDN@ilje4Ly_L)PNFENBX%2)^z zF+)AtDJE+_l<P!BNAwnOUIqTHP>c9r+WFjC0X<9uxxLMnz#ZE=P{wj3U>gmJ|4<`{ zO#(v@q!?m75>ZD+RKG`nf}k^gScSyEM%9TPbZk}crfcJ#xWY+OzCG6Ge65pyFd^AG zZF@mj>SX|KJoyiiG(K3*XccuHHG9?V!%sE!Z$v_|M7Vb|2A!6}!p6PFH@Q|1_P!;e zSx|`S`nvepXxcn`cQuvkVlpk-()K5`(IA^fbb7{if$r?R`bdHH!Sz`+fWg1_bqF+4 zzos5P{o%EN-N%&yUk3ammf2V>JK4HDhL;d6xCU(xfo{A}H{PflZ`8Oqsu#-VZoHH9 z5Jk%F>5$Z0btvDnQ#d9^(Kz}7#3QjCss>jZ82I4tCoLRP0Lq5=2}Xo58z3sbM0OOq zc~6W3I(@Dqi%ZT4t7PXOS8-zkIRW0H-I9)RjgI#xMPAdfI;+*YBGNU#fjs>%kdqD4 ziLdWrHBCOCoGUdZL;LhoKbFhLAz-sBc4^`{uVEm_o}0SsEqQ3};IoN(5iol~OJti@ zxxMA7o?J1l{H>!XILV$PMk#*2F=<KhFDE_mmQcSK6Sg%hb+DdXRgT?`f&}OYVt78D zl3rPxq=_MMbyl>>*rw+dzUpp+XO*?_)_Vx1owSdS;AvLS(AX0`r3ghrHL}+|bA}92 zXTc&@2ZT9;(OnH^}R#jnpq?lt1~WMeK7^|zhYJEu0o+y3B(`E-U)6kH-3%Z^0J zV$@hb-SRg;4fytB-n+J*7TT`w(VRL#0}4W3-vSiyV!@p&E{EfM;QDS|=<TeU&8jP} zw=VWZtJJA&dQ}d<Cak_Gk5sSZOGS>rvv)qMZjz#pB$=Wu*j*PBLyn4r(PLfQwt`8V zc*<adpu1-mXbTdY&34O6N}#U=a?QGxI_3s|agmXj+=92bhFp=<Pk2c(lc*x=%Whad z;@Uxa(InBb^204kCl~l%Ex?dd?wP48R1!=Qjb>iwgA#1*meG`_wOo?gm*ZDYUiFfR z%uqj#<-vgK)5HI!K{=p-9^UQ9H}#_Wqdr#UxT@_=*x=BNyH%oU$kQ#JBS793FK9hJ zqIGM;hX4a_AyWvc>qj#WJnSatnTUfS`=pp9ij2nZw-sheorXaD@n$^o#`yj5mf8}k z(-_^qsqG)+v*etd=SZ*HRNHX7!%XwYO78TMuH?F{hj|<&7~<rvctMgMWpVR6emGcG z&R%D`PMvS{1HqN(x2`2|@E*A$U6msTHQ(0*F+FyY2UO<4=*D5-<E3X|hXhclw0<c0 ztsF{<Pj+3GvTm2_hV-PTY^!B6FiqG);Mj@FSjmx4pz@^-(YF;*OI739Rw%)yuU{>b zfOZSV{iBX+sz6!FOnW|7Hb+hv3-w1!Nkd~pmeK97)SOE_yX2~%Qbq8>NRC_8gFUO3 zOwP~{FH_^1y57WsKo<3YmvPBt3ZD1Y%=|6pFDYhxS#(h0^YT`4#cj+J)aok6eEW;- zZG|K#fUtyiSq#ThV8aK+nR-e4oCXE|b5&gf4@+dMPpN+p<g>FG0c~qnde2>X9eiKC z*QP9RmVqsFgEWh*XYAJaI=>+;J#7pvtcMZJ9+^1KLKh(9z>Nuu%fW43x?;{M?}Vs4 z!m>vTR6yv)GLf+-UPGsSlMa3_(Jj2}<ncy_dZl<Iig2U9U?fjWg|-3abuM6lI2->G z4x$uN*;eud+FPz~@DW})v8|m5xd9d|x<ba`blR;Cl<%ySVx9VU2h@?i)N1F}@2ouz zrXWc=?ToBi#W3g{5M?d0)fjP@FRJ+rb(J45vxb&qTXvqgZ+fly$CFasHu3QVrX~Ua z%K&{DMRzgKq*o#@N-72+-&boxp#2xr8te2GFv_BBs-%hd(}FWnd7Y&hDh=0asb}AD zgJy#uabaep26W=c1MsFCSC3&!+CCa+3-Dq|i4%6t%l)vfS#hY|?WmOws?a6~aHnE& zo@xYzGLO~yDW+vUI>J1L5g83{kQLR~K39uv9AOO{=I7X0Z6_R7%rdX;9qI~?&DXZb zau;kPI!x5AjKupjYqQrVDWL>gn!k$3t?nYSiYb-ix1sF|ox*D&q)xyg_r!8$@Fz*& z?87D5>7erW@~c#ucz7mAtkZ4$y0f*W>R;jqa5+bDDX^+-Nbfn`iRk=S>H7mk-fdU0 zrQN8KenFq=wEVY<ml*HFThgb9T7S9D`rR(JR+vwG-1>pgiPo>yX5#MaS8FHHY$MTZ zAJJ?Zu?$ma92H>xK$Gj=rb%B-aH4R)Bn1b)$!s6+Rth$h_*bo7x3A`-+S}i17JZQx zce33Bxc0aD>14Czu6nXtOAc`NJ@c37X;}5&fk!O4zB#95qkY_HA2-^^SS(yanaKFE zfe}<j*#X)g){Kq)i^MlsGdR?R8jT5GqyFBl^V42i|Eb%e&%KF{1BnUr;<ce8nnDNK zV`M^DzqTnNp-C7_2U%am#1Frh(t}w=^@+ZX6TBSA%xB5`8FIWPS!AQ=$N1ZV)W{I; zxKXRTTNi}I#B|}`_^L1!dg6^G5^{w|GrK0KT=-NEugPiFjqIW|xZKdUa|t3Z+JTGE zFg2~l=EgWpYJDpN7r4hi6l(*gC%dxOz+c}rc?eH#^O3y7#|HI}8O8^`ly?Xa6kjUO zyC=GGX)NFe2~_-4=+Z*(j+_kpz`3kUtvT$^%9^-laS`^dnXmma*-pMDQS#wI(vv*# z@{XHcV`p#oUGV(qY;dO|@Uvk1AfTCpi8&VJp9ReiENh@$(@0f$+fw_nt#+d8xd%WT z&qJ$NH;d_M)^*AdUG+rwbei1Xqjk4ME1L+#h7*@9t!dC%8)AOzMt*C6=r6;xn&4{d zSF$a3iPSE#U>k$T?d(RN;CTZNdmm^TbmK0Sab}eBijUuQ9($pPA>%PNu*$L_gpu^p z0G8y`Mk;wtC?k?{J&&c6B*ta<;7KC1R)3kY5mC=rBrN6lRv;@mzdHP5Po<F_ZG~}5 z*jY#XXmkm6XK0r;wC$&SCsGa?y{|$-R*h#O7PR_xVy@%;q_wYoLtCf%qGGlnhkwT{ zak>IM5OSM>5R!zCP00XyX+Ny$YI?`Vjfy)4y#w^Xi7c#i$8{#Jfvhfx=TK2wv+LJn zZH$&G5c-Qbn@{IwhX7PZqlYni9*S%`A?D+o0-z0pPxdWWy}0c82tBsa6+PCyf22PD z>6>+?1Eoq-$nnm+K&pQ3gK-X+-@|qfyp3FMDL{M`UkX>a6;R~jV5qL`WH72o<B`JF zra_9+iBxGmPk5%{PCfG4hY(yLRsEZ*ZY?y%oJ%@Wli+^QxV_zqvC6G9%0X{z-ZxUG zjnt{e=KWz@=)}nZ(HEL;4CY?pb%topS@LMkQ3D`52&5Gu)oeCJ2kYzy8b>vPH<s9D zlUbQlDywe`4Hcj9BW#-1j?0=w;SQ@|nK4bPtKtR+wx!X=;iMQ(D)0uaCc?R=ast<a zIV!~uzs%K$byCP6h9K<1pg7OxLre|?r^vbsRzWP>_B|@gBvtw2k4ad{`PC5<dKyu% z0*!zHddVlt)gr$mOOF7&`r^cfc&ROxF?a(gWblvcN^x%$YREBjPC242R`UZ85`sP+ zpc$VOS8%bx!2TheGB7L~$e5TMi(9tW>?;M@2Hp;b?<}hc91343a65(Vf`Y)-pl04c zjl;jEq0Iqh=6k3xD5M6VW1`QO`biQ24grD22IUCDvMtnrucoY<9{>b6<!t={azPCY z?($KUjA0397%dd8<5V#Qx&|gKf_&fd$m;WY`1;`0>x1JzWQVU`J$`z0^y+nXbi99j zaHO7<bVZ&+NV$afEs|yecUE6S=U82tbB<|)@QK#o^5JlwBff}BND>E*&u-H%aV8=i z;3J+r)=3(f;R+uurn(ceU5c%P?4<pfJJDUUe~%_rKIrFD3Q0d4qN(51uBa1<V@04H zjDFbgoyt{(URYymNhGAsV7j3?HdM!k>ZsLq{r(Stn-%4sCap#5l#)CC?prLp(XlE? za}HneGYQ-O)hNd_&eM_&`^p^QBeOyh>PR;=tTX`=1N9XL=yG69iZ0!rHCx!4O}UVz z{aN&O|ME3rpLG8v=*0e|DaCf$8%5Z9%abM_LIu}Guk{zM*SZ^`7Mi6v9&S*J)uVL{ zwX?fXN;wek`Zm@t<X@^<>tCwcD3T>Bt{2;iM_{+Y<<4%cD(92#zcyt~1Y>NpIcsTi zA{w0kpDJ*g&d{0~oCt`B3a6ZYTTROM;6^%ZcN{H_1h(o?6AIx81v)SciE53J4mys` z_XMh){QeIXAwpQnpiJRxEd1TKqVRNGB~!p}DxNeb+X#9#f}V|_CobqAVT=*_!gX^6 zu~WQFEf(f(ZqeozZEjI*U^3j)<Oyonu$KD&tKxNeT~Nq{)>NyZu1qL^d_KEWBYRT( z3A%q?w)4@b8eMFE_Ql^_T;(MO+V7xq6%yD__K)}9yxf2B^o?48r@vS4@D7vS$EL3% z?Q%_jaGWSd?5b}!IYQfEwwU-E6k`YgKkBQ`z2t<^06eO#(}+}HQsjeIqoIw(i;)<$ zNAP>fJNK}!ZvMmhtQ`K;xB2w)MLu?;P>=GfLKW7=osNng%27F!G-{~l_17hv&ebOG zgTri_vR$<Rh@u=6O*}{Z<HfT-oX_~u>TWn$vOZJE6pR+tZ8RbJ`wRLx;51R0g!gnr z7ps6QSn5O!St4T;d#I#@=%}*QcW}e)5XzD2Cm%pJ1C;3`c^@^TXGK2;G=o4U#km?P zgf9T>L0J_CZq#iW20Fq|s_T-B@8WTtr4u;k&Uu~RKvPM_*GrEMY@TU_4LJgYnt(!Q zithx(hWw+p>r`wLU0bjmAk|+Aj>)CYV4#rEwvPTD4FkQTRlrkHs#k#)mY`Q|>S4`E zP&?<0otL*1AVK8cQNMjgXF^NyoQ(yrGd3M?&l3hGRY(v=qmV5e{4GCh!K1}XRg7t4 zr;4_A_8@y#EZXj1V&NCWcIhe@<jYM(=|V2xT`njZf_DvYxD=UHEg>G%VZPu%Rzmy= zi-3IjxNRpQ72<=MGZl^=R;HH>V7?(21;C%H+XfZzJh;irmo<SHc$CHD<@}07#82c# zxz!YxJOv+Ryc7?*yI#6C5+cfSIIeB{s6K4(s(-#Tz3nFV@0Zc!!Ntgq<fJ^!^wfe; z8Ji2$;wxu-vCa3!uNsAU1N9`z-8v!9RyetLG`V-)<lY4-A=Oadq1{aBhe|hsD@6&G zqcFX_zeXdv4SJE@on}z7>qj1>@%=#K`vJ#i*8s-&LtS!sz&2X2Xto0RQL`N<Kb$(! z2X7DQ+KUl3Zli9f&h|m%AO&+8(wv4cCjzHtGpx%(DFabPMszZa&qQw;H-#kcdRdzC zU5YsjcWY~%DKg<*P3Fq2)g^eCOh<dLTy<lDX`VRv8054kH4~21rdU&E?(4V1xKrEf z*WZEq;Yl`_QP#eH-_tyX>$HqSg%MA{+Ik)Rj5;x@0D0rnsh?9Wn_cF}*-VlPMP>~G z5KV!4*=C5~l6@0fxG`;|>F1i~+Jg;~d<X|TNJDc#WA-2Niglelj*ga88-b)De03C3 zZ7lVtc`;cS&UxxdcERNCShCPaJG+lqNjbGNDb*G=$)&<m_LYO0$^#jzuErdI?Et*_ zxMl$IwO72%jCmbHj#|#tkZu$tOwn`3ve4<7pfE*1KeW9hKuwd?R7^<0p#6dAujZLo zQ~3JpuQAM{;%250zcVLWJ``M_I;9{|%Rg$w_bIyT>wqfL$zzx#Y>WB*_@hEFo;VvW zHk?Ke`RGrI+tC2+PqJHN4#}5~_p3Q7uC{l#8c7aGd&Z~^Jun-+N|7BW9&>rx2?>vT zJWxD1we31Jv>Y^?HZ)9Wf|2ybSPlqqC6U4!Ud5dQ)6Rwfw5U%^ahpz`J4%#j+d7u- zZFw?$3!ZrWo|oyjJ}Wg5v@Lj8YI0H&XAYssbSH3gA1#dIB>aq|MNaQF0t!RjG=$dq zu*zqxpWGAt)7%m1>W8frZ=1IXimO!^Om9Fq1lqcuAFNbF$?Jw+0L#6^aqrZfw9u{_ z@As&<N#I7c-LuDOtc86E+&Xwb5r6n>md<9PDm7&9EPyUxv<z}J;M&0(QX#ghIVgBh zY^Mlbl41F*+NYd<YMM-esD=#+xM+tR&c1Y`0(}*{u1H>!e5ENds6?S0eb2{m3TZuN zB!@^0FTP(1Urse9#;eWT7XysqK@CVDBbNtS)^NT*1G`?!3W=AF-etNv%sZ{ex9bT- zIbI_e{Ka|ml43-D1Zxhc@d>z{(K@J+8bqjR9*0zk^L%Eq;t>ouKT%C_b{UU3n^qH0 zfnGtF<Vie<yol3F)o9(jyjMF7Gz{)6Pm-&5A>wV#x1IO^Ox7bagIaX)O)=AQFPtAq z)Gn(V<7EvjxH>;gg0$>Q3Ksj72{a3?fsA9N_l3cJjma#@rfZ$NmJ~&j`gv$oyUXN^ z&5F$+@Q30;1`^4+Linsch2lU4HibJ}aH_%p)j>bUv~qz|5Vnm?_VoDtG)2ZsMpX{z zqyZg#_1~`((1)KUJ%@1g$(%LNsdMjjO@Xc>s1;91NU^#?Gyj6Q#I0DsRp@z@aO|oa zJ)tM|B_5&d#s2T#e82zvyQiT6@u*OjaXLE~#H1<4J}H<3h}`t;kBMqxI7UNimML8t zk&?OJYFp86F5bUFM4h;tXh4gAW_bA-WUnu@iHeMv>=W$R?8`m9jCB$dxnp=xngkzq zO9qBe2?2_&sGaNX+VTwXsu0s+J7`3a@@Drm1ow*f+zWqaA&J3lHbyavRY5tU%3N&% z>ZKWj_&S9kqvV>`{Bm|RWCBDVH24_}YOL#rCo_C-Ia^Jd!~jvG;g|W#wgHFf0R(W$ z>*F6f*?a3jYqwr#MMVC$$1k3@%@pq^m|G8G$D3~5J!3D>(9DsNw>dn)dqwJ}_SE>6 z!@m5+(c|Q(34yn)1<L2yWp#nZ2bDVLqnVpO@(j%)CW~)C!+Fx`ZvQp-&%i&YE>zOT zeG6ypc{zGV@fk%GPe_E5v0+$sipi%r)ay}hsC*(vKBSbUzPt(y*n7$6zQG)r0MZEJ z#;YwzyY2CJeM;)k`m62jZ9j{JqBV}n_rQI1Wqt)4wDM}KIFoYPi-o0%@_A;6jgrvi z#)M^K!m=@8S<i$84io-0=UXxWfrDqwBF$IUvR`3iGa&5Q&`jE*ghnX7ZAUDjI0`u| zt*S8zS)9nmQ)>$&QdC6z0{OKS_2r{mpK+WMjyF)>9!QS}ulHio4>U(2Z`qH2%uP1U zmA*i##H}M9BDbpeAVxzOSTR*`OJjZYa-D3GHE*_1@33eIHqj1yt~cOau~3{S$p6cF zAwPWb^t#JnbDosv=cvyHk=qkf(2iznhx5T3fC74l?slIhGs4vVDed|_4(A5<Z~6_a z&y*u%ZAn!h4a*hNDD>VwQ?y~50}POOP!R&^L#yM-bjYnLUZ1`NO*oHyv<ZC+niRK1 zUm>)1bk`V08zLjj6_9dpn<mw8091E`SF0d0y|XHEA3|*cf#sBOJiN#gPiK(l=Jj!+ zh7@C&=tQluDnKr7x*bst+ppc4uSn&D#g>6~xE?i1&G)QkE<I*6`QiTkIu>)NlNV?# z0ZKB)6f1ekTY~|z+jxz|wym<*uBjucL^RaA#>BOqsPnVfj*W*GTUJx3W#M2Ghrsma z{Czp4T=06%>c~5Z=^{L$-RR-sq8f#pNx4p9rO($`_h6oQK2$xeOO|aZlcgEHV(YuH z=1xXT1FJ3-rXxtvo~(Y_v(R}pc0UnA)gQuQ@(sU+9%{s+&)6DE+R@F&4d7~r^y`yu zJ1(ry2?T2`P3SE3^wCReE2;_h-xY&bqeG`fx1q&VRY59&?d<b4z#gqt8!J6l^x15Z zqXVBCc6WvL4Y}Bz9;bJAl?35RbIu=FX2@<*x5BYhi1L58PWp~pbz12Z)z5O_w7|<P ze}i|`x~4&qY1tEqZ!Dju)fK&5N*>jtD%kp+C~m`kK&kzBSdI_#*=3t_&EHJQ0TiK+ z*(aar5oLaU*iM=_q-nk7t=}iTho;-eES8;4(*ua<qSm<3{)<cR|7p`L7OUL9EQf>r zS$n(wFh**3f5N8JARyZ)(uU}%!$~!s>a9wXe=h8^?mcjhPG`leC=u~r;&u0@x#BUu z1Wp)U)FYXNJ@!;;SyNW(+O3)gdnG6bf|p?r^S)9L6j%ZZCz6V1IJPa6cQ(vW3JKSv z3-`6pUq0isZj>y_qbyPg-~v(RYM{aY6vN~QlRerb+D?0K#HRE8I?m<(@(Bz}OK2Qf z0!vv;kc%YWmUn*KEz}ej!8>6p@wC&4Y#qvBsiHv(kpt#}?8G$^5uS7}RN+RX8y-UQ zgx%#7LO^<g5*t2G;Y%wP))G&Y-&ien^u+@9-g}(-XTBrw(;*WR_?U$`p0_+Kf-(cZ zA6*YGE_zy?5PswAO<t+a+B9*Jo9}G<f?u8fdQ{E`6VkZTWW{K?*NIHLzVne|2-nfg z-$z5*<X_rIs5cVowItNvO(_L0GU55~qEd@>c_or_&ZL!`T2QVkj%@ZZ{+CutZ3F=I zkv^T^nqY;e6W@XjXWNl@$0gN)Ir<%h(`**wRt^Ir)r*}Sfu?#$=vuMu&Y9q0aMwvA z5Xz!y7&1siG?OM(CTVqpxZ0aI<fb>DTb+p6yE6i`p{*H#+fQ5;uEXPHq~ImF$fXId z5r{`zxj004g9O)y#RPIoe9~>Z-&6UDcyy?&*<Ast+Xx9MWS#n5K3fm`;Xd$s-Sq_Q z?nO|8Ae(CEp$mrKB`f|J)(fBJpJTaVfMB(5ICza91b&gV^7~)9>I9&GBN`wlINYvH zo4RW-CcL{L_Dk}!3jLbZ&?Ydnt)wZNvvsUtms;scOVem*O)fu#{g!gp5x*aLZ?&Q^ z1g(v2_}H>Rp;lDF8?PQe@D`pdw6{G~bu*OS>HP9JMf*Kzl`Jp3R5&cRB9ZBu@h~G< z>u)1nY!i6<6?viP`1jh<JJ)H<w?10i$o-Mj!R^sPUDF`faXPH6&-O&S?wCpZ!FI_~ zKPO*B4qxfHx-$I?4MmNtjOM71sjSAcy5Oo2i(Cc54-`5h1Y;`e`BUxPn3i)q+YLf_ z8NQc7W=$#NE1qQtpbJ(!ZLwBj1)(wo`hr(W{b{r`=vxY^8NMhF>GM^7Yj+>K=_9DY z1R_9vtbsOau>3>?gQxS_j$2jgLH~gV8dHFUW|h=}CkgXC`QcPyg?EeH080u@Onf+~ z9E#Y2TZ1Z(YZWW6z>piT$G&d&c!&X88#eCJ$fNPx92?m#*~pHf#<9F2_xGG0N)*nB zUfd(NVvWkCHS*V~48=U&T9whYYFe+znw8Nt^ViK-d6{?bF+T->;>;ysZccFqWSIGB zaxj{XHAnVbu``brlWNqODw095DajFuXp?Usw(nG}?KeerRm{}e^6O;3m?~JavOjg- zPS<PZEB#{Dq1vs8LAv`^`G`P9pYSZR2YxIA&*~XH@6=83t4!xt(vHTcer16|9oD&- z^q^PcT_0;1wjpNiEv=@V1MMP#6hV6q9d*XmSoJ<nO`VkT)FHr@4*8Cizk;cB0t-l( zot=`~7S@MU(@>*h(y7&jMUWG9!XhlTPu{_U(T4sWAY4@-B9$(;>}a<Ar4&H`WDh~i z+$nB00v|$*J=N>*)V17&Dh&&vK8Ke}qn!-ThJI=EyMhn+tt;4qZyT}JMy$0FYpo;J zA{!R6dIyM}WBNx~UAj^$?ja(z(rDnP%B$8FS4Dy+g_R=#ri}3wyVeInp}_11U!lQm zjf1^QK*GG+jcfx!GLGy#N(#dY)qT?6(P{BS{ca`<AjYC_=o{TqtK&?Q8q+k&%tNbm zB6lg1KK$@E_#bvV$zR+0Odp(j3Nbx|sbg}b2VxAaQUc_w(|8v^gGwt1{fk)y=0{NZ zUfhMmr)9PE*B~~EdQWawT(WtgHZRoXh4No09e$bFMPG2HZjY|Pm(YK0L=Brg4KD99 z3J4<~md?gWXLA!bH!*$_*Nx{oosZ7ulj*D#@nLl$vpUlKW3}-A_N4;uy1c&us`GVK z&78ojcZ#Sbl!%X!_)-V!x}3~_5}hc>Zn}0T0XYIknBZ_xBMel5=7E!9WQvi(l!{6` z;l-?g*`ROeC*3wc3_NVW6Le}5a`JC<64~_}GNUzt?wma#Pt!J)*-86BE!1F4Rx3xZ zYQI>x^oKi$7Z71~I#=gEr(CExTHQc%IP;wB(#!LhIw?U%39QLgJ_hHjG`UgO@v`W@ zgEn}&tKk4DpjK1ChQDQdP_A57)f7U>j>qZ@PvQ1XD$GQArI-%@K$bLgq+xvYGxNpu z06U{G!=Jc8+E2x<NGA(p*3lk(M`<k^ox{{kEzr*l&TczMOSLj96-LAbdERs_Cv6n{ z`9YV}^2{o@ahU@!%SH6zXw+dO`yqO;@AjR+@*oSKzCOaZj>LGx9JFan*aS?3S+9RH z$;Zc{s0|&NI7R+e5saVBzgiun|N8&_kN@TW{9pd@-~aFb_#gk>KmNym|DXTU|6wn0 z0SOzxKl%&ukN$%Eqb>h2DCZEEYg>K$n=hPi2J(OXpa0>X{)hkjzy62+)`A^Y{dbV+ z)^}x|&J_CFr#Ml+-F9I8)Bp7E{_+3%@BYjG_8<Q7AO6>W`tSdr|NNi+!5Vd4m7{$V zT*|ICsh1BY3hPgCVZ4bSoU0DY;gF)Q;8lfmsEESe7n3Rz<5Ja*RINX%;-mRh-~<j) zsVntz;@f<w=!_xI8u+l31$ZAJbTm|iHxP&-(Ny8ZazL88X^%7cC2e@PfOZ%tie)?m zA^_0BRI#(IK`~WR8{{MD>8${@fRdQbkl9j?&+yzDbDBZXIC~xt2MS#O;|fkRz=3qY z>R&Y)*9`)W>0<@!UC(VHk1V{KXzu!~n!wue;{<S4dBCfI^f_%Vbf8XJK7`@SAZGSx zM!(dcXt}~PO|sQmKJ=9$nabHBh(iV|f==~1!gx6vfhHW%F{|A!F>_stD7J+prm3i? z@tNmw2ueO^NN}bG&*^vpY>G=4uT|^hPfc5X7(8`<)B)%vUwAWCL?^hhgmV_&{mZS0 zPm3|s?FFVG6ScL!Ba=*T!RXs#4mxmiserWBTWUER&#+S;-<Var1-I4Uo1^bhBZTej zw{_wP_mb>e6JDU;`uXS#2>Wr4n)Ni9_H&UT${74|3{q23ER3o1WIo|6W8LlT?S=~9 zadzb|qP0xOiT?bo?7x~j*L;8%@kGYDATq}*G^8rM&PUZmaZs?mnJAVuJX{7y25xPR z{~*B%msTy#@GMuvj(*7{IBrEZ3L0`Mc|=!OnrqBOW7(CBp^rr4PKX_*7Qv}d+~z=% zVnP6a7(H207vh7wpCZD0<Ose#l`k{a0#X3U+%^dDu!Sgc#vwc_n99Mssz$8W&3WW6 zEcH}JXUSXuhE1pspVMGjWO<L|L<2f?C^Cnfb5ewInM06q*_P`d(RN3wXd%;h%XMOC zi#l#2pGupEN>W@+gxUlb#0>xz9h~AjY@ZO{7UBN-*U3F(kU);181ku|tw=fN>qGrX zPRy<Z;ZUspfj377M1x&{{RkD&K69mOiq!Up70?98!cKB^$&scvnd%i8WWoo-Tl!#F z<mW`~VqS<DFfggEt*%UeJ_MezoPoq(I==!kXFhi05Cb8lnZs<$RfB3RDu~?0fHPfR zDl@RmF}sb;nQD0_0SisKX81v|4~5#5L%-RY9oXV_*b;w`|FBd+gPPlZk5~@D-pja7 zI8QMO3fV-XFm*dV?_{HZ@!uv^JZrpBlWr@Lh#t-`g@alR*=U!STb3qOUlgqbBp4h5 zloib`^O4T+;dc6EvRwy!+a0Tpx92Q}y*^(j-Y1UzZsxEh(1KgjskYH_ZzPu+$z_e? z5^xjTn{QpN5HrKV)q45r<x|axrhpD2j3`!o^7Ke;%@Z~CUW6^(fBE?7(ebO-J;|Bk zm!qf8pY=44y5y8uPo6&8|L*zmo1>?XRiih5q-<L9%kk6SA7lCF)}H!^rK^2>c=Ru| z>HXmxZ_tr?L90ocAS25Efbki=vwd{)pF<7&O>*36kSvRn$v;GwKhGXa_jw4sK8tT+ z@r}$o#=h0+k!(vb4?dANSa#y0kqb9Ih%4Z)lH*lJ%`@s<=KztqX7NS7Q?*eDWRJA^ zLR`aqCCoUCc%joGKppmK)uTj`2pq?0xPB=I0kDPSH;sfG@~{c5v38lQS#4`qi(aE7 zF$L)XXGy@@Vh@9iv!l2tW<^~=Cb$bL4jmqZJ^Dq?r&uIkPyy*B4ssP7no0-==MSdZ znl}cihZ&uH46%+`58bQx{i;&vydr~<S|C&j*hLElA5%Ce&QU)EaVm&dWuX<as`U@6 zi@kKLUO2Ots!J*fI%T-eTPzyXg>ti{iOiN>V#?q^;#&A;*TBk99LID5pAYH&;M^4; zpon-Eg}bsxn|{RB<$~Ci#tMG?1-`L1Rw<3y76?c(R*ie<ToZnBgwr)xQQWa4=RK+; zk0jv1YFK2$>Z0v8?D$?3G-jRgTdTg7+V{no8P>|^#t~sECUlJo>Bnpy!(w#&*@Q*~ z06Os~qFNmZ!1D?h*0xY!mj}-pd6Q|UeCeFbor$jH`gnd+1Rfkq>c>d^-A`IF@PQi@ zEH-jEn5$xPQM7GGsT`iOf4T)L4W>3un`eQqkm7$+K@8H?8Ayiwz@g~fPstSFZ@2(r zH)F!YsY#lycMuj^+<9k}^+U#4!Np;c)8|@v#wIrI)kK8Gl0i4TZ~{mdY&ECOXbdkh z>6so^MNalavOW%zQgwUxqj~IU&I(D>X_y9Ej7JdJGlhk#bGb`+sL8Xd1-!2PltJY! zA^*^gd5Iff_%$pjPuu*YoFav8;~xNxdjVp4@ZX%4kQs9X1pBO*jH@BlxhiIt)xgo6 zP8G*G9#<2f%q58Ert>~~Tgdw=&ehh+2q$YU{fD144DX<j^xfW_+5s*F!SseYrbr_W z4i$GaCB!7rX<t3o)g+3l)Yyi@>ZaYII@+95wy<Y`;!|?XR90H!>Z40+z?gVerDix@ zO=)IIO96o<o?c^4Fuetlx5Wb!Thosr6danMkz82D$t6psIpmT*T;Y9!>EASk<B&s& zSe?#}wHy>pUg5nJX0IbZJ;I16rdT3L=!dB+kT^wiOi^n|zmx7S87b=BP_(O~VsU75 z$*~rL_9#uvAi^DN8jvNzGR5IvT!7V^X}{)p{38ld;s{Tj0WW>mv1nGieke=FRyKNY zh<1-=5B>#?MDt#2I%@YW6EG`TKZme4Gd0z#v!%7&JkfHEkL*QmR!t`oA3NQw!p-7d zOXA<|UyK8w#a=roWe~<Pq<;ZliBfZOh16DbDkQXx)NXtf$gHmwCd{<=<rtF!vM*g1 z?X3vC6^X?a>T6swOo|#vhe`kCb+lAkx)nk(`Kbg0hRl^}x{vQ9MG?cL#pC6R3Lq^* z%XyF-KF>J}F0*I1mQ7@0;YRsWON`HJ6WaXyK*jFIq0)7ak467}m~{VkJNcAysvI8J zDdeU)(%OpKqy`Uki8UOmn*;kT0F7c&wjkIJ`ZJ2E9?kj^B%kFJE;tAiaX-jb2;r)C zc~(`)RLy?4)~21=3oL^xGRI8Ef~ZS(v7In=Bz7XIOI=N1y~Pfs{zXb_cs%9-k0Y_| z41L9i^J|(^ES_9GpH*z_Au*U!N0H12XtToBBu;*arNb0blA(b<BJE&{74Gm3f^gSF zH>X>jn5SP&+ZvX*5`%@VpjZxB!NyYa?$06H-jI|+++7oc-M?{%pxaRg#&4jlbXu63 z#qr*~ona`xpb1(91=rIK3Hh=43{8R@djP=@<D%JN?K)>wcWajYD}4uHVb$Ji!zP_y zq=Dr@`H}?+gs$xYM#{ELLCATr*Au(NlWnoNu`z3SwJ~kT&Da?N&LK7c(`oH;=_$sS zs#6m=(hQc?ad%~s=(>?p`=+5IQv3x*F7~}Xr;A1M%mO0PYNg(TMzKiK@C^3spYB&L zR;7DCuH{F%S2~!bg<?#++_qdS6co;d{5?<;>Pb>4#T?20t$S(zpzAC|9gg!L*FvUi zK-eiYKXnif+AeZ-Xm_aeNg^65u_|`hUI_qC4B0?BctJONpwEKqiq7A^Odd2G5UzB8 z&wZ|a_jGfR{c#C9&gj@A0(y`%4z%$gbDamZ<BW{*Cr>>P!TGbNs7djei@KkRnJL;R zAf@<ZVGBB0)L5S=!)Q1siF`~WGHUo5QixdH3szuj$NfQ#O`J;>dY~Gkk1+_-Rm5bf zhS{<bpHRglg}y?&<cniH=H955SiV)ApG$38M;6Ry`nMHu&~M8G*9&VfZAV<@<J#Bc zGa(yl*NCqq%m#6QfT*>V5de*RvH+p$MS(Q)^a6^hD8N_^jbP`>sj<a<Is)<XzzqaO zTjr`$)=`EwDn!FtEA+GL=x9wHBT-1jvPbG!`9><2*05Z#Waa2mE!J$>c5X_Vm~icE zMge(gQJTjQn;kPmkPwkMC{_V`68fV8%wn3{J>J}!q3XUFR%iKeX~d`e)hMxCdyIAU zh}J@qG?3?$>WW#I7x}nGNvRoacCK}U8`$bEidoL_5d0Rlf~4v1dF_loO_y*C0DM2T zJtp-#Fc$)8`UCZ*7GxdHQ3n)kNG(39yqS?*t}`>#%?d(J0X`~*=M1P~Cp{6;TgEo< zj6giKtG7-tVTuM2nlFnyJ{}1nhU>dA;vm=&&Ic%(MZuD+rx@3)?f1en5@#7C#pDPb z?2m}!7Z#e4=S@L<7TqmB^*Zi%w1XfquHJ{}XuuL$4gX+(lZDU{CZL2Jq`Ur02Q!%b zskjQ|2<_CtEDp?yn~_C-KAC`akCslv*3yw93ATbcK`U(UCOhN)AVflBPv)3-++2c@ zVq1UXP5lajX?ze45~ii82uZ_7h%^F;4LioN?Y2JU``mKc?wGCCNz-6Dug=?|p)hUM zU6M(SnP^10fp{xdpRaK>QwY5;R6THV$E+M%Q}e(BL>XiBCai!5Mtc!>Mh9dE`!Ue9 zvEX_=0Di>Hfajl<RIR!F-lUaX3+fYN%ovBeu`b?N7jLYKYpsi4zj}52=J?f{m#>~Y zeY5`<h6_?89SY&Kbr{`sEepY?NY%u&q%~0$yl@J2c}YJa`KUs&`C?e*1D`#1_%v6^ zQ)?FB86qg~@Z^k3uRJgg*xmZbpk3}$h2fZDUQe7aldE}frHB6AlB>qOePi*!;x${5 zoSu*Q-SkpE^5~=LYC$K6>KYK|s<(*Tk6X%VGeyT_ry<MypcDhO=*Q?;)fQc)5{~Q1 z57U2L4Ts;2C6$osd38J&H9nJ|yW&4H!}&!E;~M&(&8~)G8ASVBEt9AbyhY|X9~lVI zNYTQSH{)eQ-Zm6@-=n$;c8n-vQaUC9*L}pALD<%D*xxefJ-QhNdLVO&N!RO5nmRr@ zdgGp6aUf#}W!E{n5!)Ymqa<4jODvk!vaGQn?KLUHysW|kdYU*xR)_cRi-rC-Oov5@ z2r1wdQgUGp&hXn@iSyn9TeFZ=$ta)`X%S25>q}?VkfXTEqgT-oc+hUny5^?~Mii;m z>R`ahg6r~zsyZ*(Y#wSGPr|S1pPpRs6RdI?PeH4CVL;el2uN%r<u5#qq{|yruMt)1 z@zW|Z>~(I7J?4#&A_x3l&1<I4w_YT02Ijwoi+5~k*@}Qb(tD0HEjcZ2#}X#$Z7?F4 znyu!`h}FRWO_Bg~7h|7dg9J#rx^0=&A}_D^PD8dr5K!UGs;%MlCe5vCTj2JxeVN|R z_56WqM)(Zq;i?+W%5iNq8R7C9atM1m)GHv(h1}KKT{E*{jUvPw=xfA3wKWJm;X#kz zl!nZXThY<1vC9w;V=#z*l20}Iv^malwbRg>TA!@5&Vt?<f8RAolmDw(7Ms;nZ{F5N zo|v^yOWi41-T}jjZ6DR)wC49^HJ)k22ToG>QPbgf9I;{;u6dqy#B(h0gdV#7W+Z~! zHF%nyi70YJy_BRg8!kfwx(mRph3**DITK!q?$*5DcfQiW6z+Dl<s|+YuXnhgu@#FR z1#_I}y?RrP`Va^UN%Fc=;k7}9Ft%!?Nh7><_7RY5ag909WF+yrvEbC-*q~ivLPiiC z>o-E|HH;i28t`u<&vbAHK%1#oqliqq#s+__J6Zo`Iyh^c^AJ7xjTp>{(-%z*TOXfi zQeGP@qN9IW)~_xKP`$Wn%~OH^@(G$r&qsq~PihQYd6NjrqZXz?loUNPYl?5IRiPbJ z^jHINZr>K?m+-PcZnVe<SOBN?`f>zFjCdEi-;!X<RA|*;AN`Cn6tvH>lF%j^I=Hf< zyHIw4zEcbU<NGyry_V;3T|<EG+wr%#&-#{V<f`g44NLZLjGGzuLz~=6(cZYz2#UQP zTW`*Wxf<MVW96H2G^lQ}YFvzPoT(T^!?c!n*e>@5!uVGbh*HAli4d*Sw)wRZ^_&-~ zwtY;fCxJBJ^*WgDyRkNAw0A>dMjxT*3xF)KFTZ!OR&;IhahU-g&u9J1eF_g3F`Pw3 zMMMP>k}_a((qk{9au9y!cpZaYIM`TqIyJNij;%s)Kx!8kR7R+Gbe5MRo?#9!xxSe8 z$aP2c-=axT#B~iZ9Y$#qq2Z~grrQ0Tom;j&Yed^7_LQMF01lHfgWB50lGmxeFx9($ z^+i~nLf{&Af<H}WZPg(g3@cb*793AI$SuFzlU+>U+2Su>xnH(J14vFPzfnVP)X*C> zbaN^v6BjB+#AS0aMX>ZI-Fj8E&YZ!xA1~sET73UWH{}=ry`)8d!28nTXb=L8lFlm( z6(!hQq?aL!qPn!Bnaf{)xKao3SY{mnvB3Q7*jJe+f0`GQMNcc){4l#}afgMSv5Y?v z%3}Q5?JJT%ly#Yt=yl?_=h{j0*c94TIEk+1X-cVyW4Vbe=sM*_r4URx`rh&^SF0Em zBNlgB*3qO|Z8<0*Gd1~&<!9;$8}KfiR4fO&Z`RYN;DCh^FZ93~Ov>R9tb$wXhz4ku zZuEV><5g}w7@8E;@Y{oLzJ0F#|2SgOVeGk9ToWJ0U*Zihb6w|xSWEVw?|%4;`0-aG zv?$o~59Zp(<GYtl2jn}e&tGvwLO6ekheXVGons=ZHy)ITc|^b<%AMJeha2*6Lmr0Y zAyI$(PY(8p;PX7~wkTjVU3kNh`Zk1s7*?1N)+X?j5Y|fHNuJKp44dpz?I-bM-ZZqp z!!Ir0(CnTL&P?9}35Wp*318?(ZDwZ!i^dkfGLt!>zfvx706NpTfov0GLJ70L<P*O5 z;Id$R$d$e=qzjpGb}Zi;7t^b9)JDiDH}*4|qWB=6Op8NGC<F1vaiow)od)GMS=2TG z8aCR^WIJp_D~#RXh`|-rYgOB*>o)RzJ#{FBz2re~IPB+ENAXYkinu*r*&rSP02}+m zY2IL~8Wjvl<JI*9N-;uSCk1#y4n9_<gsNbFWgx#rWJXZl@_k^TZcRE=(9&r8CbcKJ z&lEf8)SmEbNS*<cf2^M4nf2>NG(yqx&F~we<;$_$qag4U0bd#_fjOkp;r;tHNpfxM zekqX)l3IYjn5qR&-kG#(g64CzBCo*}edM58OnVNlZq7j9-0Vcni$U=}AG39oyOp5T z-;L*#GZh&<JV@FBxUZ83UBz8>{iCC9)^l`w+f$8HOA1KQw)yG0LE-_O-YSZz^~Y9t zE8Qeh(R1k4aezQBhY`MW{akfEt*#0kd)CCN!8kSe8mf)Z_tZ5vFELZGnZwr!EXxCV zf4!tIWHX`2o0&{eCp^8%5#*Kw>N9t`lX*|<7W3x1BK%Y!t)JVr1=XS>6L3bx655KI zha?cTJZc`Zj-j0bgL(aQh7GO`xB+r%460%}YR!@n6K?7z4JP@`C@Ry?X%9xO5n{w< zNrq9vOK0qL{WBF8Lwqf7FeGHbo<9|(HNq3>^h<Nt>cl5{aJpVxi}urOTGp}eh@J$H z<(ClSBafU5b94BG5&onP?9&q+(3*(Ixg<w0Dv%FAkQ$4gK27*Ri#B?STEw79n}&Jc zMPeVV_|?i7Noj5?Dxe{0INnh`C6APefQnK=^=BbApf$!rtF>Y@D+d!de4CmWZ4LLJ zNB_hvpJbLq`**yqKFvMzSG=A`$!Pwpsd=la+}3<ssBeq-x5;*oH#)5gr3~vHu4A*U zyG6>HAd1^9>aWHuWDV~RNOwfe%dxj1c3Y<9*-$a0y83oli^;fAUBaVLgO#lV{r;YK zFM~HyU1?c6c0QZeRr|KvP<yetFJ1B@aFs{?9Yoj3eC$T<@vvS@8Y(bdMDH5IXuILV zuAdc6a(?Q^5|geyO?R{TUaos5?R|9iss`$Mx3ca=*4@UYn;5%=%Q(X#PM_d!ES0wF z1bAg-93-jcumJi(o-HVf07`C1xXU3Mn&S${fDE?MSyc^-e6++wQ`0^iHbrBB^v%r~ z=*AiF_%*ss2tdXh=nJ<h2d7AfK=;cYa(ticwC!Cdur@gfE{SO{DIi#OsSfkPM#`v1 zRjbfRlq2+Ji*@X{{B2)~P!O2^(To*(oz`s9$?4KRj=GuoqdGTHWX=kXC?R2i<Z*P7 z{AlO%Bfi^9;?wazIyn5N$?E@sa8c`lNfMX+Fy-Wuv%DNaVr+RTf~|vsS8#e{5C$D5 zUw<R3It`>1i*Ta%6WX*b&=qMU=s@rJJwb-d-R3UrdC1e`ENUcEo}U9}kh=*i&m4il zr<klxjY0E-al;mZ1?<IE$VI3gY^oFJKxFV1@R<Y-0Q3-g?IGQ0IyRb)ji$rbbZAX0 z2cRO))d33IFx0r!YeK3YU7IN(s_iO5>Y5yqziBlQeLO3NDBX8kZ0_pju5RvX<gQwm zWp#IstH+h1R*%Z}1>Pn2BgHRZ4J+c;=_1V7TfiO6Ckt5JVRez@x8;;lwwh{t_D`T) zx6{N6Vs({|+b6ACNZq|?ol1&wP+qAalvf9XTVFp39f{n_`|2lD_oI|x5K7(u34uEG z)Oh*u{D_ovdfvLC8x5L=i&LDL=&F6iLtIpoMaxS#jn&l19;xkM^`Vz&+Qx>5s$vg7 z;Hl^pJuo1SqE+tODw;GQ>v@|)PaQCDvwEyJrDCcs>dwFsclUA27gNc3fJGTd<@r-~ zF)2}(^IDZ_L7Wb&CL+R7Z9jPx2%sT=V}6Ah>nldU3ZDRtndHNpd@+SZG~;U}>Z&2q zX+h7eY%8>Ocj~*0rQ%Ov0-497F1XlZQBkAHpGYz5+SZ^7hriR0ShBHvT>A6I^^msf zuy-|bpFxGw9Z#z3QgJB1QjgxR5@bv2qBEGip%a0I^3=m_V<IqhQhLc*IU2OR8=o4G z9pA1;v(%d>bn}F6p3rrlP|h_Ue?;&2G^*mR|13sc#Gm!8!?&aBg~GzZ9j|cQH4yd^ z_u&$icDzdWW0krmUDeuFRIS_sGdWQlywB!YMcP1O$Z@x0hVdW?Kkt~&E1uJDit6sq zs3HXbKdPhlQ7<XKd>2Lauk^)(J2$FcSNRn^erc>F*wU&y3E0WL0`sZ5$-P*0j@_Ki zXXP-1%LIzG3_Y%<XhE0ZuseUYhZdYPHc##5sogxaKi^Zk^Rw`)bxfs<w(h*J3It_W zQU?UBPZiT=9;oe85Fhg|3qicUX3%wT@NqV9h!Hez^t!xgGavf1^PuiCc~pXOZvWQH zEwScnsb9&DdM2l)>%WlKQmy4L%N{}pANy$SY#y!6qqTXoe$Gehv!CVBawMp)$<ZQB zT4WLb5u((S7KAWC3&bl(n~DhZwEas;Rnfp773<)?N6W+`2&}TF^C9|M{2~(A6B@;7 z&CBO}c3(Zm+6Yz-ho#*T{7h3k3H~FRbt|xbp&$;}g1f6@O%JPKK3V<T;!)w3*?Dx$ z2TAzk;vJW@_jS3fY#euNCs6k(gjct0uXZ;{zDkT2iH%2*O$v4Gro~6U|6^DN@99U| zB|UoIhzSjt%twz5081s~>arEsH|e?D?d`{xb~U?Px1@AaXuq(r8bFO1ueM7w+sKV^ z`>1WVt}PB$Zae;=iHZ{%P)eX<Ft9pBLU-!=2S3tOQZpXq(pj5y`D{bFY)F?4>GF}8 zHH`Xj2=<JVpTfpjTsFEWIP8G?@^JY_<NQ94^3TlidGAOu9R7}A$k{#C#qCa5|62y? zH_#5H-jkyjsuy`J&?dG3OhB{0XX{WZ>!@w8tfhX2b#98{-Bi}Xg0S8oU!W(QteOvp zPx3`wEQh-bk`)#o=2zo}i1oFiTHSO-WQomVuz3tNk3rL8aB%$e#hat!KRkc>=H;u` zFZQ3mIov<~7Sw?v1EXRCy}D0d9DWOPx3xw3(y-<8{YOuqa|c)(GX%R|HOK&(smpmP z)uNr3x3H!8byW^H{U6zY!yKnzmy%DDVwi!6N($|6F3bL<I-$d1($C>E-xQ@Hf#-uU zcnjn@|7(Wh`R4Vj?+)KQIe7N$&Ee~(&ki7mcdPg}+y7>}WgQWYD|PY)^FCOg&(zIT z2lgH833_y?6Ap&;guluW^f6sb)v8QW93tf?ohEPfTRfl6s;jpEx4vlt$905xAnb{+ zt4l$ohKm#|Zvd`rWQUNv?Niqoo8j|-0N+2WCNwTGbx%G#W9+@`C6pWzJuDF4nw*TU z&VEq+E|U-9UC**?nVMJO({&#O)kf_c14i{8+~Et%<eEu1#3{I70wK&&0CV;TB_*YJ zYc%NP60P|q$%M-RJR7}O!eXfxvC5(s@uH}DLdVScqKzoK7Yf#?3Ua$WM+A^^uS62{ zd`gZUyNAgG{2%;9(amkq7Ue@bvTosiYBcg{phKbaqYa8Nxay4h>Qhf$PBh_44L{EM zYgaxmD7RAs26OGc!lTpkNkBZlM|gUDTQJlS=Ogs-C}wcATO;)@ThY*abf)hm+m;4- z-%EDvuVHba#_}zo%jf0jT@RxjIi6=`+rrBvtKGuv(A&W2O?_FoU*sne-!#I-rHr=* zyM)HJYW3qS5pk-8Udlp)o6QFu!xbZTsRuG2LL3Eoq3E^;d5<NbHYwELAj|NxNp(eW zTeQaQsG3jug`#-1aEtvdI^wi$q4QsHV+;7GVj4gA;vH1?gx1IQP5usLihfpTKnxFI zxJx$%@Bn8HK0*=5aD3F!cf$sU$pQNUX}Y0(d?9T$9B_&|%De@=@5XZXNsx7cZ)5rO z!r%yOqI8wND_)xdZ^(p(oq_vF!erq4{o&Aw7=UR@z{{r1^YapqL+%9OuL@b9Zeu(E zovBw7%7yVsH=Ymz_lnX@-KJua8gQDplf#kI9Jf}ad{}w|=j>ko*f}TGZJnSGUEg^r zbRc4z&V}3Ve&qCvKiA|r$$>x$zr>_fvtR$(O{)-OBJoES%Z_I66YDD6Sl}2?1bDW5 zct~&P>yNy~b+;ip5Ro7~97s3<)CW)fJ#0cKcR&|E5gi0E2q90Aoy@*|ZSzGjX&1w2 z$Q1}dKK%yPE_RCGs|8pa!d_KV^t|mXT5%bPF$RoP8{HxY9HC1sHi=etvFuA-rWOWE z?%$7jKH^CaE-Rs>(z}*r<WAZXL`&_Rb~V2l<W~g6Ny8ei6`4KyfSIHsqpBLyt86u# zG%s~yiy_f%QZRTy_xTu=c8RWmN<1qXG*0!f<xUIGrz!U9vgM!R>1FOh!~zk?YRE_S zP_=f^BG$|RDx7&&tVOT76Rk5iO^S#j5Vv5wyB*5K7P`WsrUJ_vsS-t;i&xZAN2<wz zrJ!n)J%<j|w-v$K>ZH7RLuc!d7eFqeUX*BR^<ZNZLww;XIw^unag+S<0KSO`2g~>% zuo{fS*-9WiGlah0KxT>#jF013eOWyUs1*(Xpsw(iems1y+VOZ!#JDn`Au$t7HmklH zkBiCU9JHFreR(6YDG09G-Oj0}OMdg_$<y!Oyzx;<K2^LIgo#o80!u}Zklamv)pB8j z7XMd@4;-O5;0%OB^U)w{#p5iP1yhjQhWy_0*6ADPGK<c3bxrj55i1G5U8z3Y^`*cb zL@*)tU|yW^)oBnZOI|==$FB=LHo!@hGl^>`qVVCQ8YBC?ln91^AyX6VG~B2UI?9NP zP=L~C3%HraJN=>JF57Np?TlrwQ#D1QZ2-l5*b6K3p$LFYfmsg6gQa_3wK^CS96SKR z#e06mIxv%p<c0wt^I<Qn+z~h)9xM-y04#S~f*c>%k={aQ5xDHbG6-d8{0r585YxgR zgh*XGnX!TtL_ub$3xGeK<RjW3teVQ<r0xNOpEM?ON@KwU;;VtU?3Z4Qf7Y4TSoEtd zughva?ImZG`Z=AC$JJyeTfovh1Mw_Kug^;$o}lPxHmTkfSU9CW)mi3sEGWy2^(DOL zj5oW?r>|~Cuy6{oF4`^KMXMvXfa*ezc;Y?UOV%+%+>11hJ;-Z}hvpX>5l?rGG4UGh zMFIHZiX2S{IoLu1)O%-vutr#I2XYWHvYbf?x)VCh!Q%oly~5Qv@0YVh80gC0f>)-B zJ3DUbHuIWr&S;CsEHFRv2t>5OD~3<ihbarlxR;&_dAY24xF`%sB+X9!dZ@L?XS0dK zv`t}L=tZ?770uQd)6&EYdcTugsb^o)53o)TK}&RAjtWTf4f-jJ-ia}C6xRS6P*CLc z`}0Y*B}e|@{Z7v!GzA#R-DFx03s4_hREGs7EUb$HpR&FO4<lv^#K@Ax3^^Qq2-BKY z9hdC*XarXc2TzAb4vG_TdYsB90PR!<0>oV2;pU3IxW0FcsZ`RfVHbO1ShD`one$ya zc*nj&NCJG(LAzx?w}i!q)|U89d|AG2G1h_>wv{wg8Ahn`>`vAtmhIqDqrBiW>7`W- zXMU<c(>`w623jCb<)aR@TXJG*0unt9`McIJD9p_|L0DG2Zv6Q1vT=ys%(Zik6Y~BF z){ND&n60T5*v&Rh&u)-|NiZ<8n!*0z0m#`%!7~+1nGUnwbAqm?^1C*aaRRP8HU2m; zU;j99zC2N6MZY*KZ;Rn;cz#Sh|3fMWtl?atcKpYdGQubF#x2!Irsw_?5HTuFkN>sh zXE}$!>DfQ+R}KtG*G3^}HC)w2tTYuOE6kl&acVvF3^_*vatji_qmiuMpF<R68NH>> z$ESz~&;p4Gn`D8`rIv{Tsme>m`+1c}*X}_gy_8c=d`Tl#VD5}`dFp5v4iris6wfi3 z9eGlzit~|URaK1on8ff#ak5YG?<d81J1!aRY{^)Z>Un%pxmPt;DE_Tl-M0#JEJppy zNi|Z`>~Mk9EhKg@FD(sC(G%nO%=)0gwmxyI?7APz3DPB2bg91_=%}%7@pI7ay~O<8 zbzk*KjeMs-P8hw(<=|Z<x)`p+z>(Q#*8zWirg|_x#|GX!KwvCxUoi(mMX-x|CQR2o zzaXt|!N&(}6>qR4n7Jp96Bo)e;$uu`Np3BCh@UPFRoO?YEOmOzAz&{&Z0gB!6BAM0 z$56FtXZ&L*N#NjHY#+T81!n7l<Qwv2^5$zb57`wAY60u^{t@O89mp`r1WTF^)d6x& z`zlb{)+ho@Tn%qt9R18cTS==Am0NxQY<cXx{MQa&;OMUBXT!2@e^MCB(fsPHnEXi5 zESKO!6R)vMPQ1bGMYi~K%Zsk>!^fx5Q4yG9h@aT)=+AQsbx26whqnIXNvU{$uy;e> z9AG&*;h1)7*7?ywW0N#_OV9ROj9fHED?G3zBS}je{^Cb~>b=OvolL{wwizA(2SPqe z-hx=*ZI&FIQ)HwY2ptRG7l~{JHid7ASAUyoz!1=t3|>q!T>v`mnVx~p!7;W!P-7x} z2y$B=$rME?WYDneyxm=K(6sT^i6RUp`RUJb%De+aLq_m_wj<PpJ3VhSV;obDK;j0I z9gQT2Rh4jkq#{_xw&{-qP<wu5PiJf8C2Qd&t}dA$4Iw@V3!ndz^H9wAF-n_Yf~HLx zMdc}*Wq4fMd{*JKdj34!ceI>>f59<Qr)a1Z%_(DtJtGxQY#?ZVbg5p{>ZaYAURF1) zj>jJ9EQvc2UeF^JpP^~Cx{26JWWh(+ajO&38~-1B@7^8Paovgjk56&vDDG~t(F7<d zaT=x=ilih?D3ME~CHrD<$%F0#pu<KVq)+3~qOg`SV>@<iN6NiP>^RPhotrqG$wW>j zxrv_6TKB75fs+36SGctwRkiDNx&gvYatE4;i9V;QPCa(*+O;3QjaL%nIJR!M0o*&F zcRwTN0W06a9zwMt`bo(Z!B-&<H6>P#cl`X4xPm^w|Np`r92e;t{xEZ2Ig(9$XQg*c z8-LHYZ=4U!zjK~Cg`H#ky(4?)Y#RzN^FtOMz%u&_*oiDZ*l+x633_!0o9$g|<s_2y zA-J!T#vr?mmf1bHu}_NeW-;z0XB8@~=VR1ht<5U+QhqRB!58wKnPskWFuYSX@VMtB zgyqJDVk!FHtLQIsh>!zTqtVvWZFK&fI6WA}75D)A%2@{nEw9k?JLVy^&hLEWG=AKS zqrh+KTpG7V1O#jD|2ewN>sA$ugTDEWY4hH(^faQ+a_5UQ_0Jy0rz57GYew9mb;?eN z`HNOL;SsC`nqmt`E1()g-cnCeQ0z6-v(7FDffQ>qKl*&WJs3_y;?xD9Oh!NAGYbWL z8ncA(JioOr=rJ3JtLl@n_mrWH-w69T+s@fznQxSp2eARVPGW=V(s{$rs7%QZwmJAU zxSnG0D>vdPSI%*@&Y-#uM+L^W$Mz3ynrj1umgFk>QD`>he!^xmBVN_T*Ah=T|A?<4 zgLYQ^PvQ({;70vB*mo`xqWPw4s0+L%=l2tm4wE`hE-IqRt4^aQY*IVLz)^;4TKO)_ zPMfWIKd4jclq6=Zk@meLi=|l>;a_l98~x+nU$ROws6!r`Krn%0q2H!<LTt@wk$r?@ zlfp~TZ`F7e&T5vNM8Z~4>h&50$(h=d`!DT=PA+xUo7<>%?>j4jDj{>kX8T*kD7$a< z+xMAX@Mzvrtg#c=n%NIB$TlalQVLrfnV?nQ&S{PRIilgF@KToEyga7Ib<}g*znq>& zT}wFj<*H3`q}D=boN2avb_B&o#lBOVXE~Zd$?pmVqv+btO_3Fckml;5Q;Z>y79+4n zy}|`4hc?hxT{jf5Lx?eT<&W?pB8JnIKW17gJiD1qF6JyxH(0OmDg<Kz_l)=_yJ3*X zVJnuZJCZF^P3C$rnbgfD5-Y~-2EIS&m%qYqzbGe%(^v7k&>J87?z7rN)C^J1l}QuZ zYQ<9u)=ap!h^yGlT04=EamHG3AWyOnGh=n?CQ#7fJQFC2^PuSL(0nj_KMRC`qYIIl zLhRS<<1*N4Y^>J(h47~A8j2qq8^yTk8?`&py{BJBx0{mLeyf<Ke{*FzBka+G1KOdi zHCOt5qB-%JL&j=K@U(J?SMZm3ErOfm6jAq3+kjCfQZ`^e?E%|U5gnO)wZ)ucA*}_z zOh3Dk$oKQmy6;})4hDnG=)8cqE-4_B^g3ci6Gpo5&lNW*9x-b2Q>WBkwr`PjTh+zZ zj7G+3j+~}a4M`H##nxQaPMVESvb%t&BCJ9TEG(bo3Az9Ye$nqNFbjw*$}47*o@^cP zie58IRGf+`+HyLpNtsdxuAC)QJ40SMLtcp^uNXvzMT^w{fv7tDSy(`%NVCP7eu#b~ zI?r%cD$(J`)*Iz&IZ|Vp=${X{KsQ@`I4m|M-E4WOZKCc6<KD1n9JaGgr?Ymb>!=O~ zwbPYNwMiNKD7*Dn^K^i_K(5t<I^Ybu<*O{uIj;e#Qe7N^haKGqUqEu_5Rhs_cb!%a z*X9?NZ;ggiV0XF&10HUi0Py!@pbjEMsLj{Z-qAjQq8W5Bm~7?hf67vA{t-AD6#Il5 zLsvfl%Q5*A?!jB|XP7ZW_lcUGwNT3%i{WF+1J`KhNpyB=XLi-8zjnA5#gK?2o*<wP zRoAXTj4YuzsG9WAB!+{+A8e$cOJo29D(~O`hPVy@$^piK&@yHOqPPRlp~(9J9xfLq z<<5omaxy8myIFHMcu-`^7u#9m;>BM@EES6SZ0n9#r9w-#hyUH!Fzu>SL9tP^25?mC z1^TylaKVJBAt(~Z0jSfa--)$oyXUny)h$ks(;~V?Zv!EY1{F4`%5CfpNkszZ9}#nz znMQNEL0sTD4Vuh1bJ!-xYw5g3vlH>~j3$uIKlI8T!LewpJ;BPLE#-m^(QU#$EMb?b z5$%9eG5Zgj^;inm;TD(QWzmNYktu##9o*{LvPq%u6+#uMjWbf`C2a63B7e4SO$2)? zGK1m3F@(KfdTBiM)UP&L9dnGS4PRkqYCOdJ_J(L$$@1Z5sgCBYZPoCw+)qu%Iw!eN zQ&Eg|0iY)z4jY-a$+WUJvc@=<CSv`aJ3Q*Gavvt4mk)cpLvVXs7kP7N*@tB>pBOEe zYy`iiZYPBzd_@c33Z+ik350fl&;}BSXf3FYm*TM^T?{@OOsZnIfi0*%)e7po-c=`B zlV}yvOjjf;Ao-}x2d6(%C4x!uX6G3<U5YkJg4h6HeAQ77q-jV}O>t+l18%19fyS6f zaH-LX%nQtUmne+{MQ>i!XT)&ViwzK^#k|cLG3<3E&j5T8ES{2>){CutZvaVO2~sWG zy3r=d`E8^piP73nTvUI8Ftwq`4;RGl&8(?p6WGP$Xq$P4;iqc#Nh-koQ*qNsOmyCX z>^p|`S`OQOxttVTv1%r9p&H_ViGx<B9P^?MDqB8Bd!abl&0!_9K;X$fnt(q&+$~eM z40rOq0#wR$23A_|%&PoBp+$C~NmIfeE;zXlt94SMsTwICS(SB9gi8wMs)xZzWW32% zSz#n4pSoF7lVO!DJ}b8bZ|GU*N^CqOGo@!dy{FZ%)!mXV)5il?+6J?{K6z6DuSVJe zh;c<;nk{2ppa{J@3odd8uO(lJOIJMcKwP}H#sFYSNhzaK?Wz^K0^Xj8gQd=JF%ET* z=i|*?5`uixn(#Yrhvo+MpoVD59hkjQv9HzoVaytaUaEeWdxPjypppj!El7LAc8ANd zChE0W43EqyF2I4R&u!S6a_FYvRZ!4G%6KkX8$<96QYQqrD$NK4#lt0<-21j$#drDI zR`*(DrW|s`zwegUq3htQ#v=&Z(ak_)-i^LG)4}f0bQ<&`X|E0oVcIj>#iLp8tpN{< zy>Uz;Z0vS=AWhwrihyG22ELhFEc*4Kp$%KbP)GptlL+Cf55ps;HsU9MrenW~)*<m- zT!Faiym5VdXEHUnD(Yc|f-}mLjoEtj5VXkYN(#8RwwYj|2uWWy>`h~Z+Fr22-z{IZ z#hewZsg9gS)MM(E#5*AUZG9ie9f!K%wV>@EsTOQz3!mUe5kMxqqjAe@v&a^+<rVej zS+EyngT=)dqLk>)TFh!{o%VF&)efRy4BA0N_@TFE!Nr}&@I=l&tXt*o5M-=uuT-31 zfbqm8jGAe0vji4_!f33m`xs*mCGRs<Ey+Uax>p=1K^g=a{$3}vd?}VVDKa?+9WFe> zKocG)QYWN-u0GU%+50irbWOZMHc$sl<KRF%=^69p>cc>J^U!AWm~N_#cxXI_>|d-M zg3p^qAG)76pFL~`MfhWFA%i7K>P`ejb;-3^LJ)gJc~THBI-W$l{zLWmtXiByhW}CG zA0I3!pD^k)vt;_gpL4}9ZYGqWhy#rIJdn*fKm~Mq$SQThnBkY@<FHC-A=M#IbL33J zC1)75pP+FQ3ofIa&lpF@_n>q=4_1N>m(~G9IzXVkge%3y;fg1^q+J-(xipu8*h1g} zaB&1~`XBDxdO1@pduMmjCSVoy5VQ#S#)hIDC`Q*;)D8w*g*i%cz=tlPYul)lpTF_t zm#*s{x78^RA~<Lp`BJ-+PlsjRzYK>8uh^ElmgMHe0*6yx53dfE=zOVF@#wTLv=Rzh z20)wv1NysY!k82g*9(`~*UNI-(MO~OEo*~x?Ap~a!EUumG6Hz(X(VS#{~+VY+49jJ z?0o2!V$3auq5C?`*9CQ}E-qja-WT&~>!o~05aW{<f=N>aj0+N1aN;12-4BiB%QJI9 z-oNU)GR&)qEPKprRS5XIDH;o5HYDM_nC}7o16=hu-vqr?G1)H^se$&UmxCb@wyD+1 zp_xw|>658yFH^OqvN=>p6<U|)>r?wu?TpF*&@?usYO|#+41KlH$J^+owm#K5Be0IC zTNs}yO~p7IAZZbqI4!^ddwq9e^^{Xm=4j88ta-QGS?rhlqYU9Jhb_Nzr2bP<?ZJg< zqF++KMQLe_f=jlB>e|7mH{8X7o|Z2o9@rus;+941w_|nGV$J7J@4cwlr0%(V{Te#; zAt`oxz*m~B`|t^VWH?-tVel~==e{-BqE1EvET}e-RiXg64tiWyhb}BEWY7R##yDmB z#|)L?UdHTG@n$R@AnzBiy!IZX8@aa~T(5kpFfK?vmn<6DjLd5FWlrD!J9ElrT3T{u zPB*rVMkB9=$7L|p9hiBq+`e&$f%=7hl9`}?Eo-?mlI9f=2;bQ0A}e)b$70h@Sa>dI zCd^srN?(TyUN?we3-0aV2bbmKg$U%hv#rIJA0dP-9=cUE*c_S3S33kG5tI=et69gF zJ%cex5wu8L%Av3NjwT#Oqc<Z$1D3@G{jdbyu&xsfoSGI4OCR)GVL^SJa8X$4Sqks$ z`tUZf+e@~(^<c6e)Gu3E*Dggw`{MW`ClFO*<QGTN^gdt^;G}&JHWPvOy$bfwUOv1s zg!SeNvakzk8v<rzi8VYJ<$yOvB3Wo2ijH$@&jDE6+JiKRk-^5X^xQ6Aij;t;rJ*{I z0--N)znFoDsL9_&M#QjvI-nSIupMi(vgn8w2r!(VQ^!So9DKxts_hqsm-x82iSwxj z)nbtAUA8;2seN}4uGZW$c1p;WI)G$B<5E$=cGX!(?LSnF6~H<mhKzm~y<d^g(ZSVA zi5?^twsn$mO;aq#fsnZAD5u7Su@bQf`Z!8l%?{Pf*XwhA26yR_uFG68p~bxl9j0p| zR&+xd0p0B+dR%=byzz!T9)LTdvb0e%&}b(wo1q{kqPL2zXq~Q!$51n-BtUP1+CD9` ziT%&kQ^NS1F^!9zVcv_6ikvnf^n(Tv|B6jW@yqBf^yo1<d$<q>>90Ai=?F=rA-H$1 z=&?MEF}?Cw#M{)$j9P?gC#%u*E2)=Fi@`ThaQ=5925UM0WCE}+_$JM>b>iqunO4fH z&P`7Vtl%Q6&NE|=gg6BBM^Kl1(92;aamC(glo7$zHEHO9&1=$-vmxuR4%Sv?QMiy` zTM@DFT%6d^H)#}R&q#>2ECe(AUWo**vMUEi$J$zIpPLn12$^YIT-y(kB%6uIovj$C zWV00!)<UlQ5J=%Bx>RZJvu?g#mBZah16{AHN;rOX>bj~29I}vjP6*lcSlt&BSt2CB zobf&3zVj`#8R1bfz|UE$b|hH_{P%EcuPbHiwo%8tgkX#2m41AfhBZx@o=`U{x7`fh z#=Hi#8ujYonj0-`9JpsT<&`qLH0$#xa`YSqdXA*h^H>T;lb|I&wun-P_02&Rml-Fw z9@4xiUKVPkLn8``7W}jpFMa9GT~6xP2ytakJO9S4jz;os_!%}Ly>yam2)R5Icx~*P zCAbP@5sn}a<pxw8fC@rJ`lMta868e<j3z;d=&r;qLd9hj$L_}!V&*LKPA4cjmAyk# zL&YJ;O@GCi7+GF+-Gpn?Lx~e{;yap*x=UWg3<!ZeuL%(d@|b#r!TKySg4G5m)MTX& z{LLaUrnK0D|J5wDu?DeQO5kYTymj>oM7i9%edU!aFWnJGq44#J1UqX_0q)c)lnH$L zJphNHHl<2Z98`CTiIPa0<@#^8X(lBZ;%jHbI|Njp&QGBl3X#?2Lq&f8BiA70I`{yi z%IcMN`^{aDoj$HJO}MXO?oas22Gu~n2JEH`8z<iYA76Na%1?d87T@Wh;!(8tfI4YZ zkka#rcB9>aHq@dSl)B^=!iO!lr}|>uM=x}^TT{SO(Kq}-Hf!~op^J_25xec$<HP#C zZQgw4c8$S5-i`2!j^fsfzY*;2SRZkxF;wIpdRP!B$t=VhwDW>GL<h<LMBZ9F1W1uh zRs$>!S`+pvZsTP{dKhgep<s7hSd?nr-c<+{boiI+)s@-~zBiZvA-5WMITu0)!+IBc zAk9$9L>KWmYAYTvOE&(lSvjV!;yK+E;Ee>^4F|y`5=ySyidZVjZ_Fd_W}jod&F9eh z9@Tc)eZ&=M9A7>88i_ONs=f;`01zhTtT(VKcR@MbxZjX5T9&9wXlGTK-NyyGZzF%W zxAF^}&?nJd!M0PpExEc>vko=~5bx2SA`*9|xM>N=vtKVFA0UrK1naK<)<fG2At)Y( zUw(}ZvKY`a(6Ht1S0Tz)e6*5$v+d6Byl5K!t`gJ=eV-AFH&YKdSM&9a2I@LBS$KA9 z6Lyc4*%0_6CM-O>Vx55lCWiKvc1TU0;iUP{MbdaWrgL}@Z|!*u0w1g{B#071Ga)m) z+N-DqxGzliT3&LfVzmMBdLZJBDRo(^JxAN5CYYn~Nx4JfBj~nN<5+>kJxDJO;D=h9 zLEd1X*Xm@qjD3LpOQKnT3?Ig+n$&>)*iw`gQ-VbX@0|J8&z5|lpO%M}tI_84OLzVB z!zJf>aE4WIhE;HeRS;qoob8LVeQ~xgf_(uOh?~Wx5(1BbD=@?g9VLbhMiyLP2PDZ+ zZvYvfRymDXV~t<a=}Y=`q4lNq)=Lv}p&<qE1JcP81^I2pBfg;iU@L+W;&$`laO%|G zS5vEQA`m@}>5W7)5I3*GxBJGy6A*xWkI6ga(;_iIIE;CD>Ck3EgUC1~#;F-~W1H`k znK86s@V>ekIlip-g;ymFSm2E)$^HI<dtVvFYuG+{Re&=X2c7%S@O=^AgQ|9#0e0TW z?%V5wl*qh0g`@WO{j*CJ*hoL%`Vt4~e!Sc;lKGWUU-fspFfCY!TpwMdDuxt9bSZcu zGZk?U=MKCTyMW?euPU;NhrK#M4EjUKK-JL9L5`J}wF@6a#tQqAmY6f3Q_Vi6K6etA zZe)7+FPUKX(I$A#OvY1$Y{1ueib<`4Z5;q)l)y;_XGoSP8&uLSio(=rBWB&*%9YS= z*2K#aWV?yM5u>T;t_a=Mk3s}MZFUCRa`r_rB^CuRjsPey<itn^YcxW5(};M7z{KD@ z49t*7`J8gTBWI-^x`ghI^i%_Duj1}Q&^Q&NhF9X|Q)f!ud}H#zb;aQxtjsV72jMk$ z$9ffzGi?mU)dYqfCnTr#IoUH!G&~-MqU1a$Ev8~8M4~)=jjXY1@Rsn=Rr9@kFoc62 zVw9^OaF`u1K#BiKzE4o*!q!6vR@CDh8n+n(Rl}mJ03|d^Hm4sHlx3?&Tx<u`Z9TMz zmxKJ6o#NZ$au3dy6z%tEj_NBnBjl$yPNjjsxAPqWrP8qAJc{V%Ij5%?HV}OJ`N43a z4&%Nvzp336te`iQY%;>`wdQhKMSVQhC4Q0mvQJyi@7doCy%M64wxr=Oi=EushsO`% zoz-l_dr(#Zh)pEVJKAV6bHUsx5>#&YMXSy?EEzN9pm7k~{<DWOqN@Dxs2P+LoS`gn z;;wOQNA{E=O|93kI@1tC+Lb;TQ$~@^o|2HjDg}obCQzfypw^_(aUH<&eR<v^4~6y{ z2pHhZc%87IwrrD|YWvwRJ)NO8^H8J`%{B%XVG4zSW?*g9-A%W|vH{jYnDXd*YAfms zX$vN{%LsF{>S8f}q4ZYKD6z$UCek^gUX|oJPx`8h^RJ^(&$|#k5HDb($EI6m+jce6 zZZ=-dkJ+8zk8#4-l!(gBN_jKY122yTES2*mk_);uhI~3%t)L^IWAx*dXkiplE+u7F z*C6Xwnjy{hLwVa_zc$&%JX_07L(yN=g`{k>78jZ0Fy*Etbars~{7KelcXVgw3K@ww zb~89vGncWoH2sdJ5<S5XCgrC3xRyvyjnps(ovaCfIwg~lp_HR*_~9MVyF$&Xg@KE! zUg^tOLoZV!>t?(HjWv0DILXA>3(l!c8gq_w&Dz;PC{1^eu170~B49VWwb6{7<?W1` zdDdX=AExjv#cF>1?wg;y|JO%<|DTTD`k{ILI)pF}yV8dhioXBtNYQTgw8#s-Rqm5E zr0ob2NALdUqrZRi(Vx6`^x<1S|M1(Neek_c-}%dr-+lkl-~Hp!d;dUh)$^mbe)`#) z-&D_k{^9p!^~P2?9=r}NtiuL?5$<sumo=2D_XT86mnB6PNPA>}Hf7taCbI7=)s;K` z6le@jfpErecqBi4@3W8IcDhdfOmAdl21F=Dv;)dQW<I!hJA3rQ_a1%co$Mg{<ojR! z_@nQ9^3gj--}uW%fAY7FzW39kfBrFj=F@-q9{haE|7s4=ZC%~eg2-6kdjN(zP-0@5 z&c=9iJ#Q|x@&C2lX*v3{pMCtZZ+-f+_a6P|>!1C_4?g|o|FrF3JdtkWS9-mks7fzi z$@_!d%AY;i<|ps}%h5X@!J2>PkJSKo4kTGD{rtmkJo@erspQW;{HE9XYvg_%Yy9Zz zUsJU{{pUZAwS4sUSAhiI{zFqred`(Z+F8gy_^YG0zWeBp|L&6yzIybHuOEHmZ$5qJ zXGiaR|KoRmUrqJL?|w_ozx~A9-|khF00it4j^;CN*WUi>$M61kK<fYay>ET?-G5YT zs{Z%0@BdL^_{&RvpMLV+q1UvDzWYyR<Cs=HdH?_R3eXcO;3S89A>TorZDj8L>}N+G z{e@bUqxXO8RN?u)_)N0WXMgiOztW5B=)U~4#|o(0*Hq{KR(190%|C_da48HTLm_RS zM`Lzp>WrG*P++I_AN|Si9sTWhy=KXUgPVNnsizu3u$5ih;1rZl&fOJ?J3ac=e|z+k zA4xuT^x>OFZ~v6XrT+ffKLm0K>Gz2*%I3ZXJDXZT#`m|M{Qf^Zdh>Ug6@KkIM{j@Q z=Jgk@zkIE8=lad-SMOfG_VN4Q`uKx?I{Mx3AN~GMR7pjricfs{(MLyL`zr@K!kl5Q ztH0bRNAJ9+_SvUD{qd)N{k!6tr#?>9ue$T-r*EkP;<F#U_wfh+*QY=FiTaxfSvE)s zWmebPUUYaloD6odPyXy(SZo}rV6FJlUp_iMPzDP8UI=65%vyP7tvs_<2G&X=sM0<r z3HAy;dQmkpEXK|4VzO2CDcd0fF$ESV=OT%*E!t{C+St3|QUTf&(<DO=ICqZ5isLFS zg<|W+3Xwq6XQV*1tkQWZ)zZf3+GG=JLtZh5)<ET7(7Z0AGS6t~&&44GjpYKZ6}op| zq(Q$(BlTBmRd%ZY?SCvy2NmDLh*v50k4s7o1IdcFF4q&-3v43A6aum{B_PXyhDcw7 z9Lo{FjKdVjLHMnMsdm(uU~}-90c(JYDf#y0Rke#BAyjz2yEv_gxnC7id)eH_;A&>> zX=_cUJYNY~>mn(?VM#98mV1daIwPxnXY<v}t_0dc*$^v>q@jQ{AhwDm((RP}gl%!# zy4AQ14jfd+YDfC`_)?WmoA5u5P~T`DH0DR=3+*qM)O_Yt##TV8m-3yt^Z}YRjI1Se z11+OW_Ly!lY7%v1t$fEQ6vAi70_3PpfD0P?(tM2`dT}fmw8Uyfbs8hOwK_}G$v2n` zr!v&V_JS0@l6u>LyxEm~Tws0h;R5PGp3HueK18!B8RUZ1;BqMW0%>Py)vVS8%QV6U z8j13&fQh=6c!{J+Mlt%kWMw0AH&W23Lr$m2p<|64^<!OV>!&mY<g4CiIUZ6xPn*e8 zvK<^^tp$=h!-;#0DXX8X$Dfb*OdMkpn0coM|E1Am3}09N#Z7?uf|&x#IOd)Nb8P8p zIJ<kC-966k9-#*@vImORKn&yzGu9Y+z5}msOgLVoJTMUl00#$K8uM?MOe?0IhHxC& zG(qt3{jG9XaB)t?0*H!$7PJr|n`k&wN-u<n6o*uKAq|5<HbQgjIJAAD1XObZs34cJ zS2G;-6Hhfc>9^aa1C|1^mzpRUYJ{m9Wd)EGpL5GJMf4u4BBRxs4Sw4Y74#f}LnB=L z;&2=(=#4`W4LGLT;iit@fm}6Bp~7|gY-JbOfwr$w)j`V(+=NUD8xD`G0Sysp6Xe?r zE3tA^)`F3cv#s}xX2I!H5|G3D^y7`+2_?-R6weu*eshfBdhW<1L0O6z!Qn7epSfC5 zT0I%}SW7N4b{v%jj3XFULTMP@Hdh;{bA_Y0RQz}_nKpD%;mV@W#p%>DSx9<iDgz$| zB(R6V2$k;yn&E>kt=vJjsAppJDKDe*l*>#-nI*3bZwpHq*?CiTc}@KA8`m30(2pp+ zB&%NZs*bzy$q}X&k(*2CvMbV&<3Hl5I(@-b=BlG#zu3(dm;Kv`gY|vC+Fid5`O(0V zxUJ|1CjLGi&FknMgF1;#bxqa4$3=e=!FQ3ibDM?|^HrI(rL{y*ZtZf7C&+y=+b!L1 zXZOh%$L`mv1xE7d#JYrA!OKDokIs_To{4d1Vq8tY3*L#Icp8{7{I!A)Nv-v35CMaK zt#Hy!b*eq_lzOVMX>G&|;M<1*GZEDLSiFp4=m5ZaZBW6=_1PSBQe6Dg!op|tEEXWs zerl8|8?b;FxQPO2G<F@FRy=df)?>lr>#ni5QHO|c8SV8NG<<app9sa8^@+PGhA@|J zoE-CGqwfoiV-5H|epqcEC3lQQ<i73tC3&jbW&=!(4Mrh2CU`aoiW)&UXcwI?d_TK$ zw#plC$odBGCP=O#z7b+l1Ybqp5)Mf5+)IS_P*6?F$y71)szGTFl=;+V)@3i2=+y8U zzyi`Dm@%}o^eVaz$G0gDBHxudUX%j~*o-#l4JL6FI<?!43y-KJ>0n01#mdVxcfg-^ zuSIfDZTAYGKjV#LTQQ<nNcP1UA2Lb;%(yenV*2^({$vAM1h)4A-ALE-ijFn1IhkO< z`}&*r-4z*{aip(%!vCyl>S@>Q@!iTyyLnCz4%^P6dti|9`;vcW^3YQxlLjbXg8`{{ z!Kxh(UK31j4%%X<csnq!rfc4$zCzh%gm6pXP^_=00@C)5jYviZ$-mKu-MRMZt~i^l z<&S-Sj&HeWZLFSmFf>~X&30utYz9b)&In9I9gdj+-NJGw=(u4$vgdPgA<whZJGJ8j zUWpkB$NB!K1{KmZva_#tcs6-1+g?^p$b3?edK{6fWVqL31aqB}K`MNzK*wH$lltah z^nh{M-S3C-Ee`s!6VJkuWHV|<ZF_6RtAnoL$#j)uJ2k~!`>Ah0{gM)(3(Og5qdETL zD8tlLEOqjm5KtFMz!Oagkj>gzU9;<dR8l|+gjW+0?szE^CPF>vyIt4c+D>sK@@kIk zYsjqN&H<q_;BCh-ah*hnpNWI-nYkt+cy5ZhPtl~iy0jLF)N?lnu2P)=_(jN=ybk(< zzN!*2_0Bgswjf1(AH3+nV}uGu%>FLp7%HOT_&`<m)j_qJ51Xt3Yb6qFY;ZkDQVr+s z5cr_k4)IuA3Mb<40ln$sjhcwuFL4%e@=k$HMoa2Z;J?kt@L9%MYPIG~knyF;Bz3B$ z+w0{}3kAbzbRyX<hea90&7V_Qgu=iYcyz#F*oZGrRo7m{EkzbdOa0D)aE~}VC_0<T z2ra?D+L>T$@+gW{_9vh%Iv=kg4mw=8cqx1G#6ad2VvQ23Do2WphlAb&B`L9<pb6N; z`J}fc?Wb)XHyo?+%m~=jcDY*>aI!?2dr=90Ll6LUi-H6hyBeBr`)ASY@9j<^pSxD> zk9L$;cI>Z3=F8)B6?3{M+}*r6XwmzKU0~Fn-x*M5q)`zjt9Xp#-}O2}kF)JvaMB&> zgTea1Q8cKDoQd$K<8b^su3p1cP96q+D&gP`Z|EOrhQbj#_C!qAL<dDx^NZP1T`y-% zP0jSAjwRq(%=T0V+F8x{G=nKSEVq7+j?F($g^#BBX&eLp_#AZ(&RWM|rQ0bOTe=n< zr$5-(C=k0>Y(O%Yy9owihB^y%!#Hgo?)N&oWAlHJYMSynR@RHBww=d46LfdyJrhpn zY^eEa%}O8VjHub*ZhqbxID;CPT%jACpH~BYmcyd6pN~g$|2dyE%u1INLT{`(Yz-h5 zYXO#!Vv&BUh>I7Ja-%gr^g}#Nv0yGz8L)6-o-&_27H|xoEBKlQ6J8b51DKZ$PkmtH zt5VhIZBS3fRYj}H0)A~8@NX5x&K20=(Qo@@0`<i_p4r~H>7O2s5yflXM26|xs-qhq zu!Dvv6!uP)zR^P@Yfq^#=#`_OIEOLSev67UqUxd-hUI!byz90i8|?_ZFjvnAS2@JZ z*i_3k%Ak96txHlYcMylCE=&IFm4)!U0QCfIBr4Zjs6A4hw@bA@4QYpuiFDg3fBwrX z&2(LAZu__YfLb*QE{0)%AvK~H2ua)|=frB=poCSldWvAQdjjS+R;V1s`}LQv-FW$h z&_sl5^ZCyU*5Z%q3OL~A>hccuD+~#tvTcC>ZeT8x96`EAg&#ZKY>MkI02KJ^hj(as zMFxZt)sXNli2^{8T|@AsC$pu_7b4*RvT4(H%)j1|Fnfb>Z&)-|>Y=-C?;6blI|Wie z_d;9}s;6wX6QS7Gv}}7ZqdZ|3vWtmwJSnvWtH6eletO)!@HqS7G53Vt7YRcu@Zm2r z=?H@;1<GF*XXE+o8TFaPXI6sh+D2-c@Hn&y<&7Oy=B3Y_Sw{<JjRRsPG;g9|iS(oP znR(-rwr$lE=`dz{v+)qVbl4!FQse~2pAd)Ks?B&2?^RMK80ktgh=WQT2ypz~Ra5UN ztF^CLF}bUcS4=M9p2+RUc83yO-KCIr54uDs;hSk!a-HbL(phV}?zV9|1=IkY#?8}g z&E8Ii^1AlVcqu32uv*6LLBFq<nFndJ;OO$@QE{c;&vMnBy+MW9g;9fw{!75USe>h6 zgd8+Oc#p}p;0EQ8^VUEcX(Qf}!ei2|GaA$>ArTh$Os}Rtz7wGn+wBN4*6E^!=~OBC zNXk0W&D^-A0Di{OZBRx;@28|JfBW;*3(mi|$ukC?6~G&M&X+-dNNe6r-m2J7>aO&S zYSd|m@#@lb_?l^jt~E8tVetuu|DI4ZgHXk2NL!nA6KlH*tpQ{Sc_5ks%;hIcosP?n zDS*+xTZ3U=C^38RJK$*WutTn`A(D`6oWEzwp0jtfm4#VWZs@V;o@`bzKD3k)=ZhAx z!@76RDj9L5SUHD(iyAu5m9BVPo49ZeNjg<U{6tP>4i9}xOmK%|^pvjf&4pUOrqGe! zH=(xc8;Cgd!+$(b-?v}B5-$F}>Q2lF^Hpbj0rOm0h#P+c2b4w8DtMhZzg<@o>2bGN z_gQt0yXhih3cse+_wm|;2b3<!WdeBeSn%aS$YqRA`C+6No?fr%DA-_2yqs3D*{oPM zHgse(9e)&SgxLTg_a8mHnNM|o8k5_R9licHb?kSlNjc6p3p8@7-l@F<xoVnZ(>C|C zW<i-2haGj;zG&KYv}LuECnj)958h+*78JJ|K<c_BEehnz!8>ody8eSODml7Bt_t*j ztp)1y*#8Z!&sqG!S^UCT{6ai_fes`>)`q)n3^;wkRl(x(O1L#`3`ERACD;NuTDr2i z6D(z|-rS_?a2><hwx5I!CyezGcpAk_f&MHoh7FlTn;Qbtz-ps4E{fZtT6wPM<(Ohm zqXubv47ed7@=M=>-C%GQ0l`3{tYRBl15anp6a~&?B$E{QKKm6UC=eC`_Ef7iQ?Y~; z!H}&pCrQ~VxI<`p>I@Cwj18Z$;V2u1Jlxkx$`VRZQ(4s;m%|}VAZ}?&R$D=SAkbOD z@?%m$tju1U#KaB8$L(<mDZNV_<3O+BUgIWY>gWo0cGrPfGgxskjv|K%0ac?KHz*j5 z7~ZHP+!6zN-;p7uTy*6On(&MvoH2wtx$KVN0B%Y(nOe%Igd+i>#6cQqG;d0zaLBC2 zXw^K>{mC8owN#0DHG_B;4esq01J6PC$(+dBmEV&k3Hh*DJhwZUl%pFOulJeQTYTes zvDufmS*@fdk+>dUQ7g%CJZS(aG>rVJt35A3Zy$mi6hxI?csMC1`S6hHE4dRscL7#f ziOEGDQr41?3D#(6rQ@^-_Uu66Z4tUb$NbV#d+Fx##rEPd{<FOFIsirB(?x!~$j?1g z1RbtuTDgc#EwvXfibnK9c(xY9NYMQ>Si=`Lo_^+;ryF638$K#=p68Kblo4+EnYKtD zvI<G^o?2^j3Y4*qyQs2NCj@TIY3*(b<~RvrY!w`%0WtV%yW`yEU+ZRHSXw$>NbYem z*?|UVGR_sb2YybYo!yD1NrPx(Vg@;&z~qlJb)%dkOhX5qH2LRd_D!^p`RlHX`Y&rp z6sJGbx^6WxhSo9Tn`@Kq#b<BM8Hgp~JNb|W%S&YSQ%iS?G52SOgwGvpd^vkKAbz;q zX5E=B>0Z*hrs$F>D!~5_UG2A(N@X%fII)Wnp5#?sQp=72-Km{D$FQQ9tr~b6au-P) z9-4>HAAzP*VmR5JLX@AHk!7vtG%r@EwT?-s&Z!@;o1$w?(V2E4(WsNr(*7;g_h&-x znUH%X<R&rj?m!ANfVF1D7}O7Lzc7Ppl6QNBI;VOM;Olhz&9t~o&aF>-*eb8R_{1{s zfd)zpAmEV9&{!ixmM?#W-@{gJOyO}<_-1q#`{Nj*cL2^JQoYnduf#f$IL1!~i=uA; zN{r3!Q>O)5K?sV%60VlwmsbAOVPddm=;Qo!vlYbCyTxrgfl<EouRknUiS)P<y*p-d zIJkaXHQzcm=FBX>gZYTpw&Rd+bSCP+61>Hwl2?a=o!dEpl*}l8?;f~_vCIIswG$!m zoC=D<woXJBMaa-Di0C8IIrdzeUN#&LmbrjtwEu=nn$d;wYRNlZ9R9_=Zv+87<mXM0 zi%nTHuwi)LS(U%r&fB%9$0oTp-!|F+>e=mav8Q^q)QXJit{*tzjg7+@oT3fSvqchk zji)FJ>$)l5wjR6ix~`mIe?1S*m=hk{RN@t%FGrJDof`kmT9;6rN^GIVF;HSKCcHo6 zYxpwGShg%nnr#|XA-5g~4!O~fB4|L9MhnGBoOMW-dESU*W~Lw+j<V`$`0ZL>ETa+9 zJ7YC*146sr+A4Q@Eu8FR<T4GrVyNMQ`-gck5N(+FMqA0O*?yswSEC{VF~JQgSxsFo z#!4Pu2gu@luN>elVi)lYME|n~EXY?%Fi!+ymLm+l>}Kogx|WW4-7Y%!V6I*$+u1g6 zcV~?}HmA5-w5`@W-l_4aRJZCy$z=eaH0oc?ZrE<&<(k5b0Od6vFRNjpyvAqPa{WXU zs$yqkDSIVwCG^=A)M(9<gEM-7{!(2o{VI+O8IuoIPT>$FmBS5;c~9-&fz^fUYWoo5 z2$z^u(}0(!ersQsSk4x+RH-R^7cM(NseeZfsORh?UZzlwZk<zVP3amx)nIsnL-L%^ zDq}7pMrF^3`}wpITKeJC<z{Y*&6>?LV`c&~hdvfg+2__JbWvIE`x*7!3x?Sz!DG?G z)%~rt>{-1`@GCx=+a+kiXSx2axDqt@BFP2_I~hf1tNI632IO5)W9s-G$f}aqhW>17 zpXAll?qaZi!&?~M&HxB5b>ggv2fL(%(6!VG$qBJ*X68gZny#$`a;!0psW!&NMD>5K zxY(SR5(O2u(|fs&P7Ukv*l~_-S}wcQ&qBt8;gSw<rGz)v+LyYMxTP9Vr~%b;!4U?P z27(-ObQR^k?F3<+v0i|NA1sV105r4Gk_gXVlDkFmc6YgH3)KdJM*9y6{R||zoz6Uf zJCatt-i7@^&~`yQ$-GZ)P#3XSgo>4YR>G#f73Y<?YjhUkGv}Uux__GcZ0(~E7S1BS zkQa^Gpajb>yxX2sK*cKQNvyjh#_E|7`T^A%kW}E2l7_XIWcPclAQ4JGRmXs(Ru-OQ z-N80ppJw;#f++5LiD8Y~5|9=MfE&Ydzf+6Qx;f7YBPu;4o0bx*mkw9lka7lw(Nu!S z`?ed%GZ<w9=3}Smw>pmhs-fFU{*iXs*?V38BwGoa0YbWzy`<*6qpCJN;%i6fuH}s8 zz9ABPKLr|gcb`k)_hC;jMaDBdupJqUnoGf_ZPTgU)AF`MN}=YQ=Eq~!upoCJ&N8{e z_;Fo|SIJE8EY652D+DJZHBY>0S~<Cp;iX8-fZAV1{b&P7IcC(f8o*H25bO|)kzhv2 zNA_caYhajbz})kZ-oIo7Q@a<$8$n13S?+$PZg|cDJM%wheoAXwCS5IBq0oFP)~S<0 zd^~WCZDd%A!DHmN610bEhN@2OwRG+<NE-@?y!D|Usp}}74t?yPc=$IhB(C3NoR2Ex z!A8pLgbGpu=q3?aEyitr<|Jxeas6i0>kj<^_81-h{`t>myXdz9c_XXloOiH?JI43P zv~5o@d~+DUg}jCm^!{Md+ajv^9Qribh4>sC&!02SPT~dOc3XraziApmKO1as7yW_y zb2vo{FW$EFG`1;I>;9mE<7pR6(EG(;+|P=QjSUcXgGAX5^Ol+@KZAB?jo?Y;$-%@7 zj($Q<TO{C6a}5t}iS$)c;V~&gHI=XB2)*g*iDq?D%8Q6!U69SZ0bY!OqK%x+9Q!VM z-h<fn7NWQuP@_l?m!7h45t8~MvmOyG(ed;*oTGMC+5@a!c}+S;V{k?6Aj?PpVRsuo zrn|KoYK+(PVx(2a9*aY+l?F~kutZSI#iB((#Ru-47<wI5B{m?*R3ez32b9#uUQVmB zuX1K9_de+V*G)Iz_!K4^iol`an0ve9ijaDFO)jg&EC*<P0MHP2KW)^dqm5dEW~`63 z-L%3R`15s;D^7t}ZOsV6Q^C_0kp142l>7g(cy>NpRx`2WA;*AItN)R!N@kdd`7m># z*oiwXegH2MWQP!AjR3<6L1LOtW8q?7cE2VdVzgH-;}ohtTjH(p)Wtu-cDru7P2F5q zH^w!)^v~gZIRt9*C*ranN*XZLbW&r^8LRj7lTts$M>twbJ6|OKj%NwBlk{C8C9FD? zH$dd;n05>WfQvL#JyuPm1zVGKq5!UCp7qGHcgd{?EL9vC;ipGRQUszB&eB{JIPk2h zJF59Xxm&r_4;=%9JUtU9ie#dwj{rpk>Pf&ws@#EFF+ynZCNt0!onQ~j!#hL+bWhAs z@AMd^j*}~b&7G5F{uzE0|F*0j2UBhRNR@E(%2Bm$rvgvFW{mkqIBh`I;cJI<eT+nO zJiXx}m>4jvh#EbCRds@k5PX3yLlL}{OP5^wO@)zq{f9Y)CTB*Jw&uJ&M%tGH#*bZ@ zG?&saYKCEPU6;NulMbO*42DhLJaHi`-=fpfT_v}RF`*Ecsn&V9rR#R2tbMcWMJh)u z5$Z_SUt2wxMpPFu^Twk7#G<3w3hGM{1m|sISeD~ZrnGbZBsoVx+iu6CHp{HWh3sOB zr(G;Wo&8$&C|E$2M6f3@Ny4a)mfBW9X8XPfZuaH_t(eTPxa=VrBQu+!t0Y6e)HVh) z5id-dDNmIcFA6h!$(YH!1&^$9h+7H4P^xrDj=1O4!57_&>Uq;gcb<<$K?F&H(Rf>k zw*YPz;%>3j3>!pwXbMA_zk>2SKgqCoJ!}Kx2+*MRA@^}5nHvBx004P*aRcVNKLk-B zC**-4Ad{k81uT8UFafEiv~;0*+%NZ`S*pd2trwdE^vEtZNMxdNao3vQ6w-V;Wc~A| zEV;4ajmdNn66TDH;j|r-=KK}1rwvmNV;{igiw;GthsQ?DPuNReyyR?w^Kzqw7smt< z#HK5}t;bKb0FqW(vz!!iAW>cbadNxlIYiH^;FaGZ%{H}RBwkA;;IBo22<rt20GdE$ zzwg;rF)l*Oq@ilQ7^Zd}m4lDkRa(`R*H+SXBHPup71=^A>oP6yI@;f)&KK*tQb(Ya z%%_GzW0!{1OeyMGLIh%`bI&?7S4UKipg1Q{)fi)O*0vy0#&+>p>S4em<)XpnT5BDH zD@x9|xR}D=pLf(D5zWVjW*U$6y*VNC@Riv<Xval~uKhDC!FONtXIR3!<OYwz8s6PD zcx1;Kb8D4L9VV{v&Q6^UR7#wk-mn}MzU1k0S*#g#e2GBA=&FI2;KCUg#95r&S)AOA zIJw^}_CWBH#+L;fe#A<_1%@?MADT?FhlH?wNPsM^-6l~o0E19H(C{#96T(gF8G-cg zN*aZ%D8G|Whh^S3(IvBOT3n+OAVth$$dVbo4AhN#AAJ}ilPNii@Nd*3J&x>mc8l?} ztGnZwKxgU+W8QNiq(*?Fkup6PG_5msdB!f!*kvudyy>I-ss9^KajCyRQNw2&=xhU> zZJ=-iQDnOd5$DCZ>jX^(v1tcl#74bAff)Gt!JxX$CiS&hs7|jBm0&YOFem%0n|(q2 zg!{P@Hg5vWup1x0`@zQ_{hvo)|Ju<z?=AS=KE`p&t=dqFx48)>|8fMbMQYQb^K-8( zVQYc6Ry9>Z&$i<li{9*w?2QbEh<{*09_uPZt#-Mj_f1M82(>Wl1o*wB+qi|Hle*j+ zoPtoG6`>00jvOYsFo`040(^!Q1er!r1cYG{sulgfzHr9U=cZR-@OP$F!|C?NAARSO zkKV~1qEY!!)p+<k%RPs(m~|j?au`UDMjn~=K@?<?Z7K2`D(<r<V@E{-ydVjPYB#6Q zQ5VfiJ>PTVPwBlZ@aTI#J$n1cpS=I$M}Pibjhp4s4}O9^X?P|6_}#z#f8YF1pMCJX zPv7}VnpUXv@w@MT{QlREzV@Law2wddtD|pz=aX-K<IxZPhbk&PVK*@ExW5?cyF{Xo ze)!?hhi@JI=}&(C;rF%N{qqmMako&LUD4goKm2C)|NJ;H$s$h&&ay-9*9x`R?nY8o zKKuULpMLkPqYwV+(|`G|KmYLCN8kBlwV>OTNbS%sxaRVbSNG`mfAYy6eQ@;F_a1%c zFCKmOpFaEUKbjUQL9h9UmR{p#sXla`7A;|DZ;lR?ky&~4*4v-_<@=xh=Wjpy)1Q9! z7eDy)oBvaNgr;6i_-Ajv_2_$laP<C<)!$2<U;pI$U;XTZKU8IGz*gRSu!$K}HOAO@ zb3Jc9v(%>luPU_~(J%h&y+=R#I(<=ue~lHTUX@s3>AFWh`1+@R{ePG#**TCMf7)yF zmApULRqXNUbbFt?|1U@He3WQ!Nzuro@BWZVDkAZke~n^9mtw6ex>MCY{pUZAHGTB< zS0DY!dq;2op(&+4_KbS%wDSjlb@bMEAN}#)ee%IqkG}Esqi_7pr|<mi=$-F>{O<1` zz4Z?tzx%DDfBv!k#M|HQRh94w>VvR?fPAve>wvSBsgf86ZixjRU#+UUnBl15P5;rK zzy0WkzxU}!|M=+JzXv0OUG#19@YBEk@zGm<_~-}UeDufPu#D2OnQrKXZ07fqKl?{D z|NiTvw|@HBo8MHg)n;t~j0>{NYAf%T`}n82x>Z#p>Lv-L+kxsI@8YV#4Blsop4G-W zdh<`I(`qnkU}|FZ*+!)vee+Glo>W;iMi?)4D&Ezsae)1r(lKSY{20lP9x6e#5uXQs zslM^?hu>GNJ^I#v`{eIGIQlQ&f)4i-ciJqK5N$j1)Av4p{|}Dd`nIBsqc=aKhoAh9 zKRf!)kB<KCk7!vw`G*gnEo`1z%nmYD((k~d|MI)Z3OJ0Q5-e<&d+g1#aS^ufqpy9W zzl%#tiIUfII5Ks)h7!_HIvV7|TaX0Tvuy%V+)05l7$m~q_>JF)xL0zt_i_X;ffFp` z)mG8>zsb{h_tv#rHHn@k0v_?OE(xw`3P=yjQp6C_JpFbfgACFynv?=BaqFW!m=MSS zyN2mda3z9b(nn|-g)qhq6&tq`L!q3^gnHcA*zhJ8FfABt^65YieWr#!yB3~Z3u`cm z$rJtyU@^kK2t;jCUd^|Q;nln<5KT?|W;nGybv-P{7^2(&W%1&EvHoB%S;W7$%h&0T za?#+gZL$CWxlGN)B44k{p_<thzSnfuhh^`<3dui<gn^?<4EihkTk86?SShk7x}$P` zobRl>zDUTIzd`@4G*+x;-2+7K^P#XHy>3}h$7cfosz4=@(E#U_x~C~hx@&~trfx>! zSXx>6>h5@tQnl``4|<F1#p{D&++6Bhe5wr&MoXQiE&^grV<l2o&kTB>HnQ`k#}H3Y z;S>Ku>P5SewBnwJEB(%VO|2|Aku5t-UR)UlL62^ai;clS1m9G?#&4T1blnfaKw0PA z>io7k3Yv|ThDOzN)=oP`n=|1gi-({_ZkkKEcs)attJ=GO(xr}!S8RZj1Q`?QbwhxZ z_BfY#ZAwl41eN{#=k@11JG<3Zvq5KE10CknU#7HE2oaocN)rH1x|$io=Ra?6vQASV z3@kFZ477-zad_=&n#xaRPm!~pTGO2agXqRwqq*AX7rm0m3pPC7-|ORNka=L(L1b!! zl;^{6nxNVu^jC-5VCPj)ZA;OeWKz+!=OZ?e!|^2a#!Rj$+i}wEBq%Ptar-IIk@CV~ zk_NqdbF>AojI16cjrVKE^2S^5Tf7oRzsc_m^?<jOLFceT>gf1UlF$os_m9ks4S<fk zOp$wporkr}?g4KgZ>l5_!|P(S_r!9imyh=H>dx-YPB~T*Lg2OSkgjcU@v7PE{%7V7 zw*}E)P^7;X91dXzeg#=c`C@Sp47bi3*W*c;g`}Ggcee6osgCHuWP0h>ms(-6=0igO z&*2eIHw2HR7+}{PM}z5`?o7Tyas%VHHCT$!tilTq(DIBc-8`|}w2gQ{6U?=I@-{7b zjLTZD(^DrpEEt*k-zGtI0e}e20>rdoFdJ}TpVPr55txdd%_!-|4nxtzZQ7;_7SV*Z zbi{4YU4N|(!kN~9;EEHXdRfgVzt`ve&Oz1?2a2GJ6vu|bAl?bSt-g_0nHO+nOoJDA zl`e3)W7el*O@Q8;jCXtL4(IZ4w`@~H<cpYHyYu%C@`xZLutpc$6psC}w+q+A4x#Z~ zr#z6&Mt`s;8R_d5R|)?VnICzn@Fg}`4CSMH2evrs4x254II$(BwgjaM*F_c_L;!XD z0`m{KZ)24DLIi15`m;MFFf#m-PB|9I(JO##Ia-S<g5vt_V7n-HC*o|Zis6QVP$h2I zDMx5WK{d3K;?9fd>J5vWZax!g7p{TunVUJ(gsaj603?7e1FbXNxS$s5`<;76;~lVg z_yqTw%ZhP$jFaB;1bLa&7TiLE(N&Y4-j+P{rvRZAoFsovZatt9Na)R8<LGhZL9xyl zA265kR9kv7hC|NCcL}nV0vIGET@O5%M>xYU?TC{B)0=I;g<aJhP6Pi%G8w^wzCP~o z4|o0yd%3>n?a?BN=ERMdAo!-R)2TY)0p(AxT3l~_eK}yp^w}b?>M>U$d~0Y@kPzB% zT4^w)G`)yye}~96UEbD#G}$GptuJZeRItUa#|qoC_ONzYTUXVJeB=dU3R{t|+KSdl z1<T?dE6E2Hqm+87ymwh$o80lw-}v%N*X4tkFuN`&uZHF3pohsWdI;cfIUW-k#zJ~1 zc$1-IeH{+qxML1q{h!))hUv4h9C4g6taEz@G)fdSZQAlAj()jK+FAKIJmlRitjih4 zU3F$F$w6yZ8sy48OuhDrGHmV=U`-Em2+?oEIF_2`7fJ0~1S}LJi|a36yYcc1j-elB z7>K;-g;kShfCSKRZ&FdV8yp|rMACJJ&P@peF{Ih-*jt%VQ=PBB)A_89b(hsdNzn!m zOUWY_6tAmL4|n0>^76%Jp83MBUr=9rYSCUk7S)|+5tPB|09qW37JFOca=Tc}M^n%_ zFL+v=70k?nVmlxDC`qkM${q1^%1;|!^=5cGlh!#!3W{hO4syGhB-YW9b2;9DU%dO$ zO(mErQ5)2DD4wF@Lx8jr9C&86O@y;tb2i`y*~gskny54r!o?yoKMp>0UD&McX&K|& z)M@hyMy&r1(*Ka@A<m9M((|OnRW+jC5Pa-kqx@IqH;HF!?&sjxy6Z%<AGEWn#{dte z!pXt}BGElH8<*vz1L&uEo9Z)TP`SGkvT>{rIquA<e5W**ef3JQQp1{L3j%_TeMJgC zJ}HoPz3Y}@m2jzkMSb<w#)euzm+8HZDl{c1?BwKd0ug*+B@!mM3{d>5L6K%F2#7g= zNQkhpPKp2AR9nzJmZ!Dl@0L5su;q#wye4puz0=l1weY2k_j<#B4VvCd+0?xC2pR4L z2Y$i?*vC_synuhENZIM0U<G=^NB6rFL&P^w&T)ABz`e`6G4Zgl=lHi3a@0d_o3>)2 zm*2G8Pa|c)0t~hz36e1tD}!B;*N_o;2cy06K_PAv+q>v>g)LQyFNQM{?-ie85Fn@M zhmSb~OgASd<tJ;k@q4X0OwdGFS#SoYgiO7719VQCC)F8_Q{RKn5=EccV9#u@X&WqT z>nEO4TOIyb5oXz6_sp_8`M4@>7h}k*@x(=psSyvB+0v>mcL!4r1GGSuEL<a6CBPLd zE+bw6{KM`k7uzP)z(w|)@EnH`BCpnO*w22IN{nOGXe0IBXVAn+ViyfEPCJqd4boHI zv6Aarx!r8(#5XRJ4O(#@xTh9fMN`+3bp9WAm>^q6b%*gWyIAMy7>H$=axy5LJjvBe z4Jx5n)g+&i6XL1KPoramrS-zFT+eH}!7Bk9r*~=}zYf~~Huja<H|jpFR-Y8C>5twK z(8NU!;H{|kAOh>m**yjW<A2C@`RucGJp=d#h(@y>;U+5m1k>Z{dE!&y`?5zZgF&f= zkH!>k)5z`>d)w7>k+#Um7UmX^*TUG{SiftuLikYNbwrRiA(&E$1kJDzXqRDpzM3Oa zyY3e0@2+6WdB}b`;2>c|=C=(O*_2{JJqSODdbn$td?>6cYIh&gX(mx$cE{tp^hs3H zx`3oH;haz%=xPCJVi4}4oLDeM6f{sjODKJQat<T?n|VNu7dDu}K5)ttcG;~B+4&X# zKrGckC-Ab2r?}$bP>%zsfHFHmciA40K@e5ajoJM`$^L{r@El3`s*!?1G*o_yBy1VE z!`R(I#BdEEx=8tGwJ6EHBNUT#mt(HGp@hFJZS-`np1?A{tc{-w9yE<D@|9>24W$eS zK|sCWBun-sO~j@<Ou(E=OPw%*yDjSXxAW01l!Ix$JJ@MH1l7-BE8E5!31TIiCh>OY zw?aABc_%5cSDhI}zY`3sj$4Rbw2;EqiCXMxl(xJEWCMsB&C&(k>v5d+<V_w{9wrFU ziY9~JgDl^Gn>#u*XLQ<Q79iL5;ISsqrd4q9-`pDF?C12^tz0eixKyjCI=VZY#45Yy z3CDutuW(w#Y^U>;ku3;mH<_l)mibD!@oT}*6ZofQUiA<Zd)Dvb@Y7F9@ArxZtdEx` z^;njdoF^F0WWYXkzn;u)jpzAR?Z?!Vj0Z(^LuXQV-Wk|WxFnh%H&CkykHA$U?3QT) z-S?k^ZaIc5Z?)&UTeLN7fq%)+;0hRp2d4z?ncYF(-Z|#GXu0+$XFf4m!UM>9EFPkJ z2SY)4`9<}$1vi?1d$~ssL4(+E>%2x@U#Yl4SAX31Wm-KE?h6meQ5Vwu67d7+k%Ky+ zA5K%ySw_Kc?%XS$;!WDnR?SD+w&}H?MkuuM3*B8iN`4Y#oOns^Lp<wrJ%W%zlzu)2 z=*%%D{UPhn7ScjZ$aqM_{pGHm!giv}S8SPSBoqcQFS}VW^kt8v4C6V-p()f^cYnQp zS!0o@7pRba5|%|r3W(haU%7+nCWt#Sm9*eGGTWmTdi*$(Y@l2$*OWUXRKnx5YmRs2 zfb__-&N$8LVu!iUxFX?Bs0ss~!HGCFlt_;}<axzW?qJVD6q^VNCSup<b~^ai>e5=I z;51Tjc`d~6?>RiCH?70vn?<k=(e@77H3byK_NMUy$01j_RqbetVZ5Xv?nn~W`rFar zJOp?=ZXFfBtgRA)O8g^lICxNG_r>vZVbi&@-_I_)!G*IDZU{+)`1}=ttPsxOK`kqq z3MNz!Q2B3>@o6d&9*!N@q%VR-y%{?zTOF!X!$gnC){JGHdDDw%dV3sc>=;Tb*9|YF zH#4`*lqXC?t!2H*!m4zuGnUUrD-NkGFTt0b`);5(3<S_~LI8~)!Kj;<Els8`9~ZLc z3N(G?6UggChA#v0*)J+gD~yo5gR1TLmUU2xsU#qV{K!Xr-KMwu&1Hd_m&Y9#c<jXh zV_>z1B($1w{t?|U6xW|8l}Y3@d`zm7-4k$Y_UTF>I{StDad7({OBz=Wpd~y_H6R=N zvJoDe0~6Eg_|-g;ar(<_99-rEIK6oo_8`vUXIyCLlb(eD#z6AGb5lldvps7C&a$S3 z<6fp9+r}l?1+-A9r+#(@PgAzOI~ew*8K$|q;7f@e1_!10W(vJ@%i`Pai>B<A1<bjF zcsVft4-Z?N?XaF3F2(;jX#`RHOX-xfMhW-fF{X3gv{tiDSm)L+ezb%6<ud&Qwrld# zi{}{9o)UpOoIar)6Kb8t++08lJ{nh!t8?`Zp_((M-a>f?{G>@Gua0c`V~XBl`vqo+ znFw{Pakodu{2ll<D&NTM7xjEX_vRi&1v^!Jc_mWdE26+xRu<}Y1x27GaGYx0;_4W7 zpD=)V{CtA}0^RYp^%{$Lp1UyOcyC8AYvT~T!INrJ`tp694yS$qB5b7Pf*>@9mc6GW z<eA38_(+L+-msP;AX+%C=D1XXqMnDiGcNZAfN9<zK-QU|BA=Tee-qYbr)FS0NvAX% zbD*7UM6v89$L~nJ^~RNku-CW7;OU;0A$secqo@Ix;#3BG0-IMqK)u~H@{09?1z>fd z$OE~iLN3<HzJ!JjPLEllr>dsc5qNv?5@W7!z&&$1Qf?O$u)=h*`=(R(QQ265^{>dQ zDdmNxcpuEkq$9d)Gwar?HS1F(DRx67ob;53+Vd|spG+@g2xD)ZU38kgbvB5t)VZUR z@VM>TGw7SoW=qbJU(SL$u4x0lh*iDpB<fDT9+;Lr<|9cW<U{^pGLPAf?!b4CXV625 z7_^{<fwwKI_L4UdmfbaqnP6}4)o7X95Wii)bv#+*?(xK_!qt<xCw(~bxY)z~TfuzW zl>p|RQd0uroff-sfRXX}<<gVomptZtsH!ukh0Dk>%~3phhj7}^V*g7F?cC0yuVb<< zf1_r>xYSxJI#mK`5kn2Ui6cHC3N_-*>`3}_+62K@V>Vt6skv(b0(_!!=71;+w!2SV zsXQMbZAY#^?h+tW)3w1i_>@EA4Vrp<d?S$?M>qazKHP;#!wP%wBau7=#fFe@qplq1 zY`4{YM0_T#JWVNzBg$eC<Gowl%-3;pAXvcsjwe(#{b<{1#W}Kf_PDbNObw5pgt9@e zsA|gEj;Re5%ZwVT#3;vY;!BcN`Uf`><l?SW-IbXe>BO(jetS~)plf=T)%wb`QOtE3 z1KjX0eW#`Z;wBt#&$eX<{!%9Cf39j~D9#R<tLj|}!ZbDE_k7>%J0I-NRY~tmHA%3k zU&;6JNz<oYQ?@mKvwGK9N{tYuyj)QOwW(-4rbu`LqV7t%s?S@fE)xkk_{+-~-RdcX zcz!RbRy-vUf7VE&zOXveA4I)qF1J8JCtp#U;0U!y<jMo?Cg6K;Ia>W<3u<i_uMGCU z?+$C*)CvP|a~bE;HcI5wG~!aiRbVtK6pN_xam1?*;gO*DO(^ZIc6|AQHHc1b(>8ip ziTOQ6j8MZqMi7WEu8*?|&tjlqBc5pbd}QSbM}q6lOe^hpycjuu!F2$_R9<jRYE!IS zp_aH$nqQNBYIkP`FDv;-te-kz?WBeiG%ofaRg=^R#$@5Jq8y_hsh`-CbyC+4cE+gv z&<|qKTXdUjh7xo;OS@TFTQ6ze*c|b4Ik~E4VYBGp8Ufq!jr3{5CntyJe#R*$(#2XM zCk#JTf^56(OdD?#=Ff;Vr@b%_1Di>EbBArwP0<Z{n0I<Y@@WS><wTid#U3z*V%`aJ zrg{G19(r4hk)X6m1<iXEfsrbH$li{is#sS&RJ;%&-xZ@o1%Xf<0!k8Cq+CTxC%i8Q zDlAV08`1q7_vWnn@+H-6Abu)27#S6w+Bs_CAmq02%5#7K>QcZkit$gT9@?k3^YH^z zaDz8m(cdgQW<|$^<yMsUn>>I32Z0}qv<OvWRl;mH34_v!j4KXw19bl&-`)Y(_|0*? zvju0;gV5v4e1lY)=2jqjkhXP6J!n{p<uNYgN@K!`V?HZwIKLbtj`?)bwnMp0PiWBz zv^a4EhZv%9PS0u#Ju5Mbkgh45ID$8qIPt<Ut!+E{f)K2fe=}&Cb@$OXm_JUohfX_5 z;gOK=Q_bbobkw_RydGgt_Yj`bG^_y)&0{}7R&YE|<~*3^KQi1F#T2x8O51WE5l4)O za<469jkd8=rSRqaqaXlu>F;8IDa3-ph_rFU^{35Hjg6rq$pZj)(;Q|*&t=#*3(|cx zX&m&-hd_qv-bK8y-cUQsFbM<e8b^x-Ux0Pax0p@i*hidI=@E+z+)r_Dt4V|CVo?@V zT?nArh<VWV{0K2sX=Neq(1?IVKGF3wgh($Xi~$`D4uBYvIO-x1N9?|Km<mUQ6mu@G zhj>)t;kMuH2xo1(l0q%}@xDUbwP%Co(wxST<DyblZ>#7%05JojAnr5IzK<?480_H* zUZ#X>D@?jGaI@}!B(jnB)J*Ib>h8K%;I}DpF~}w^{zyL2LFH(3f{=01GgWg70Z2w7 z9oV#(bZU5|H-o3cE`vrLju~AvLuYgl5#&zH`&aVWdHCvZUXFTW1E*f^^^Eyjn?pEI zklsQ#C*y?=asBG%b{c&1I9$t}e#x&EPIzE}bHdcUrI@Mn?4!pHUI;uWtTEAqx58p4 z$~0QXlyQ#hW=PQ1Onp&t&AgQ?#nT%&Kh<a=c)wi2=Sy2GN!c~>CeL;bBtbeyM2BmR z5pJ4Avz?)B%94Qx4;XPPj(<`UUHt4)G6o>$vT4{2d|lT>2i=QlInW(^U9;*-mmKm+ zX-2~kX3d`PGb=SZi+S`Z;ihso3vD1z`(Y;8<3fpxe>%i8<_ckUo7l)J>E)lG_i$wE z>$OTayv{qVenIf4cKoISiM?*xPi3k--svDUBEY!@Fn>emAbW$s11Lknvu|hs^iX{x z+R*6~4wQI<j$X+UQ!X(LN@(l=omLIvy(s#Ue|t)E&`V&*61W6)g662-Z+KV;hdfC^ zaRzqah^Gq-!g~llbaX4xnw3<|C?o_pB$^5uG2WeE4-?a+h_usAj2?O+Ap`*XYQhjv zPDV!yT;LFCjqv9D;u<9Qln#T1h}6${7Wh|(5%v5oVq$>=gao7<@JDndS>8z{=+_$) zYL4+MQ#GCg0afiBMA2z=dP5~_%HB~~Bu+p+nj*eDFrp@0ko1qhC6-PacQ$Je8_2q- z&l*t^T`SiipA#8$5N|1?&CX~=Q&jo|9;q`{v$+b?wq~hJuMm(W3^x{p43tEGh^vMK z+k(C#3UxsSUHPL^0q9h-RTGWu%;<pN#+z~s5m-MDGwGsJ9#z?<<1HWJufFc`njC4p zpfRY3Q9-;zU4P}v&OUEwF-bunnp0s*?`c_MITE@y%%|n<gdw98&EGV?n+vsOl<Xm6 zM~T(e7*cjF4(n10z>?VScMify7jLKTTg??hA4(lZ><~CW02dnoZM1U%f!r>vmy=1k z9XJkAyI>i0lb2$c2V9-tp6l914aaf&;`q7V(c4k`yXrlxZdbfxA!$zoQWrqK8k7%6 z{e!)2s2z^CWmJt1dhSsbkz+&d!qPKwx0pDqssO#@!yaF~(z2pU2*eQtq0L%zRXw2I zDL<DqTI*M9yNsEKX7<@RK#`M0*;Jb;;4-PDA&FpHudsM_dP7`rDH`<m2if8!MX^`W zqJ^Js;>(umfy)5^!C&=<Hv=p)lS@#rn=Q!$?~3`@H2fI7^}n{PzozN^(j`l+K~ehN zj93ts`@-9=phqflTFd(jSU3GmLg*z}-W5M$&1$j<iv)vC0c&L2K$L?IGeOSd&q;|0 zGMA;$m@ulRy?lM)5Zus(1A59geI+KX*{`aa=g!Hdd?Xq9j$<W|T%u7FE5THXF9Ek= z*GJi?)ZoGM8^SHJogsiz%E4Ao!!_ePiRX;lhH$MU6<v66!raL!nLoT$ryFZ^?Kpk$ z8}|C*yZ1)s?2<P?xdiU#!X=n%8LmYgPxU170>JB(AF3W>=67h-RE<uUTtIeb6ss5d zI>shUw=pXAZ4<gf=_XRrt26OY1&Hb19(%2d&*7tJE#5{qq<5fOS3jMrI`|Cwm2dQG ztJ3%-@z^Pg6V6=36LCYu$K(sz&VIYj8x?v$1vA;5)!$x=>%Qh*B(qSVGpiYT_$t|y zo<rZk)o&}}jxZM-Q>bW)Mi?cba9C4u?p!cIo+{o422WcFtx-wGa0z_unEOt#mG2Dz z+L_D_5Wx*Xh~vQn9x85NHoC-A*3zqA1EATwwqrusc5KHl>PPe0j^~c*n#Wke-8q@D z1U^t!#qp7Mj|oXz=K&WWiSLdKq@;@?De!n1XV_22=xFoah(f{Q=$<{y@YmJ6>g9dR z5DMrn835ud*@*<x4kBygRs{D;k(wY34uNjToM55bj{KfXB}$NQ+5{|1b#}@fJud{o z<TMhABMofrspdSXS{07DWRkEAUg^~YaKdHrsPCoxwEe*zJ!Tan>6Q-toAiwlvVHb2 zlku#qx2gbjdy1&wMc1z#Xu!zbSRliRR}<~j(72=H2@yYi#Mt8xM&*9PuXPyuuO7>N zA#_d<ZUpwlVcj&jloNLz5M`VnozQncXIc~-UR1zrP=>r`BXIC|xgmoS;j&}JL@+Kg zjLX-1U4ArrRi~?4&5e9B-+2-L_f@&;D$*V+%DlC!<{VYWW;URJR+>RU(xBOQMn8rx z>6gg=315r_O2a$I#6eA;$DU=+3cX>VbX1pXS$Iz62Ie4%l|PhSd^OcYNC(0r#LvFU zePsQl_c7D}IK}7e<&=B*YApqlGTEhr#I1e?CHyj0|3JIVY!60usikT-Tg*grQ(4~5 zyW8!>On<}uM1BB6){2>_d_HYk1xn3C`r{Wfq$j}5GZdKwFY%Dg3VM~(_hjqia=$`5 z9f9r)hJy(QhybI%{)Mbx7UWc1Q99hrPjuEXgd59?h7b$$<Vy>HZzfKD&DvCJ4y!~I znn|Dt<-N-4{u`r76O*S=(j&<I(^dx%#G}OCzd|do3M_=NDNY4S{tE3ekw+S(GT5dq z<k`M?)5g1dx7?}g?Q^66pTE1Ry;;4bHe=mAj3j&27KDA*dO-gkdK@F7m$nX2feKn~ zgg*BuVL#y_FV<O1F!DVI_|0eR1K7t)_UF|730=~kMH8XNgW#F@CKix9qS_yTdzKlZ zll~46h#Ldkn~iRu!o;?KbJ-q%-geQ>gUJjlHJn&&%GJ1Irk?%nR$Lz!`GXa&XJE%T z?QY3lEW%RE(GS*5|3YWz{G5G3V@|Rs;>(f2o$l(8fncslIe!X$nJEfH?HrEeDXbek zEZV>@aQk$7(C-fmoh14!+0<FGsk3BLezGa85zC${(7ka#M@X(6@F~$TV7_tLW?b)) z`v_)+Db@EUQ|(oDh)OK)m39SlG^NoJ0=g>te)V82^=7(;`WmfhVg(yA4w1Vs<&Mm# zp^-N_&9GK?biMGBhE~6^_&X{~%6RKIl^-sE^gdVTLiL~ST=*v0Io4kur*mhl@{CoU zvC5ED%F8vyuik;w&Nuo`EH@(<pe&_$;GWF}=7ScP1CU+$-o2uC4_{!QpRD7=)_PZb zu!sIuF;(Bsg;7<DM_|Y816;{rpiI|1ni{`rI5oYk%d@6~cx%c>{9qmZc|Im*vfJe_ zA2)3m!kl@5&LZZr>gX&2C)EXM8picPlMEPSz=&*Kt6pKNS4Mr4Bv{=oU&;G}eE3{0 zQede)9i+sHL^i{S#NfPWKFfA%&|{@RPJdxg(FdN#UKD+&e#&fH7x;UUIs})DGWHHE zVk4!?rXJ~K&|?7ge`1>2vu6erP#B%YI6t;?ZNT^=*FfY0*f)$qi+~K*jqIEq*)I&y zmpXT;cAniDkhq(DL9jBqBJ;B#*1RItM5@p_Zsq&*40pFjv_An<*%|w#aF?t)TuAq@ zwYJLNUyC(wH<<S|j$(_|v6>pMicp_8h+Y0n-GVa&r^@uw_dX{m$x9*2=IbR!YOOY& zS^CvRJHvnc;RVjb%T20_Zp8bZ3$aZR5v>B=!&};O*rSB;OM{Wo5(WL0@2S^IE0G4S z0KP}MKE5{97o<0YV5DZH+2JPo%J-Eqt3>Ep7zDkY@2FpNax~2n!U@(2_d%+jUfW1D z><l`oA&M7OxI+)oJ+5uLbm7Ui{>+mXTCt8JM*9Tti7(j)Fnf6VsiOz=hzlZ;IBP=X zK_AtF?QB?#^ay%NmWIO$Uw#qZ;GgHu$9&Y-S;z#AH+84mP$!bD1jg~IUx^2&>jWmx zLG^O}GBq8w2ZLlk82KoEk#s8+xj<8|Az5N}S+Q1xYZ^7;okil2(~9%#brRA3$!mn= zV@dRFjWBJc@q+s>7zMdLfCgScd#Irci#P0-z6C+e#HNRY?xfAuL`t1tF8M_&*za6w z*Q}bATT8h<%~3TP9d8`AyWT9fVThzi-{T=AE06rjI6p6|OW2IchqEI8Tz}YnSYe7p zvN`?A(-)t9Dkv@KW{yc&1+rY5Nxb8wkV41dqY4I(+%kMujQae>C!{fomVgtcuEzn< zI1G?oxK)MSs*&=Yq}O+L@{z-m5PGD11z+-p&K85c6~*o3<H7P&Yzl|dG;`TXfODe7 zGGDKnwqGs9+~h7z0(8oei2ABJu#d%M#XXi=>H;Dgn+wl#yu{-{(g>@J<!jJnn{P*; z?98gey#xPUbOfBRiY5j)b8YQKDdI$CQy*O5l|MIagFb$iC(Z;M`xGCKQ(*#X3^SLg zZlip)y<1Hvadp1E<MTd;juLc9#I#3nspvg4Cvnosgw)A|K0kSy-dXCzPNj%bj>c9_ zkY<D_)KMl6>ii5c0xDJI&%1O}OP@6~FNji-z8P8^&vHPAu1T+hgoqfD6G}ud>g$7f zj5?$k9rYD+&nSRtQmP|&V?$kOfgmRZfV`upWjP*fdS^CQNA`NaI0uF%r3|)`s#cjT zq^qtZ2HBKF6&I!tLgb9vjx5#0Ge9%iwDT#hy}TCvT=Wn$5nS<(EQ^kO@z@<%nzth- z<w2UbTD4~_ilr4Hozc|}z=LDaq`iZ9PP^VTp2}{#)K&i%d9EHuY0~(%Al}T5mV}7E z19>a*T<i_Y-h=%?RYaR0hfY%!&-oE-24b@4N~{~G*|ptlQEcHS$pz^4jqF0U{DsJf z^h~R2W=DIK()r+cJp{I?)fryRhrQh)Y{_+_iOX?!<1HR;HZ01(d(r{A8b3#mrV5cd z!f__VnFnT8p-vw($LJ&qe%YJln4xB}-zqRO1?f&ql3lAMs9r*645Qg&z-#f%sCtR6 zL7ofIX{&NhuFHY3U)PMzoOe+^M{SS#T3upFTaBHb(uS9ALN@%IZldYumJkQ0=@l@c zMbS&eR$7YU<lQ!m^vC6*I5nfzf#pkSlrZeabz{(-?Akxup0W<GEQ=YX^4&>^kFP>s zZLVkI9zpZ<LJp3^7eV>s=6}HFPX*7BEmlqf!o!G0LX4hfqeG8{f5z;&@tQcfF3`(t zhCMM1-alO2ZoAWX{(Q_?)N7FBVCPA&%Ipi~Ey{L&z>B&hXV+J9>22UC*itB&M*D^J z8lKMHkk3LSP*iKxxL+surmlLD&%S_cFV?Dh(+JC7wKScmCrUJYx-b)~qye8sNFUn@ zwyIeQ;}q*skF!<Vrh+FoL_a3<(knIe>3jiPo5M;%ERk!8*s0!^x9viUqN2M^UKZnu z4XwC6BF{l8=hc)8RMSGwSx2{?4yVCj8aE^*azt7tBhN_ZYi*Nq@nv=LI$52m*;V;| zO@8E<9M3<++|uTar%89_!dI!Mrmby16x~+b#H<!Kp`~U2lygb$QXN5h*ftI?4Qjft z6ID@n;?lgFBllpxpzgBnH_r!87R}Ap&Wo5c`C;R(ZXUMXxPJuSR6?X;C;4cKb<vd< z1<gK6lHfK`K<YQu&U3s~y<|$fD?^HH6Q#xU=VIehS+kYHwA|Z*1DL<RXh#~mZHe{` ztJBZgE=5G{r-=SW-P%umVfI&?7Uog52D~voCzh!i&YLdiQqSVzyg2W#6owG=ZDTVR z8i0Qv1a7<*?(A+`2XGf}0VZ-~ev<a?C`L+~MK9ipnI6|^2W<z<K3NIHG8o(WOYR4r z%$mz;Zc~$Z=*3#t4@E;R;0ueFM0d<roDU@J@ufC3FPi2Ycj)=}$c=vJ1`r;2Qmn0i z9|*bdA9c0M|ArTQ7KG(w`)I@qVS6WCpF=Omhz4}#N`2-Zc;+8C%Ri885U9$j)LEuz zgB1Iu9WjD4i=x9JCdg?U1D|3#ky<MOjwh;4CI;w3E%{=g-Jyr59(JBg2HWm~VYz93 z|0XJnw3DENQi)Oiq)QUtLbhN>-PswJlafpEV8MPn8SjDuv@0ekf=&vHFdp;^=ew9p z=57hvH;HI~kK1H^k}O(h(}v!XeoZvs)>_3vzL7P%oGpPVXUzju5H_Z6=8lyOP^c8= z;?$V#wpX0<N5Z=W;N63fBI3cMYKqy(w4c%$&pqS0XFRut=U&nFKh1K{V&idK@l4zO z_!l^+Ew!_!e$9Ao1>6~nTjng=|2NN@&Fsu%&8FnPOU}#|u$hcGrvzxn<I8qx&e-x9 zTRvmUby0;JZbFeEnT`y>t#tvn{RNEvKs&JwCsYew1>qz?r9&(%xK=E(g^a_hb<hIb zW&^EdPa~<pmOO3-d&PWQm#}pV+-ZcY|A4T#hsLAaYnuZV!?t@29N;%NJ#mB6c!ON8 zW}dAGdT3Ga$Adj}sDz)nH#VgitVmpdS||Cu;k5I7-Fl<Z$E_rwzwP(3qYd_61J3gm zWd675hzbu)j?ttb5q+wtHZbX8F}^+mR?+XGPg^^3&SJyK+zcA+jOg&$Ly<`!@82>3 zEj$l>?X|4#B&+ro$r8(2`&cW09Yb57OHmjF)<sKH*x-!~Jizh+rFrTnhNBZ7kkAmM zN6>j7obPhGIIn?#;rnd#*u9Cx3luEy+~?veQ8`4C27j)JErBD0k74W6j9X!OEuD8m zOcF>Wv*yStGtU(HA{aD~61^frMga`!9AnhBPTjzL-mK^~7}z}A;EiK(ESekkm~f#g zw-eK{%6S%*$ay|%K)uFVdQ@Ikk7(zhjb|f0Dx4lgy0hvpQ`=vIbkANWCW;p+p-ssx zxYNP+3~nu{1;Lkh#ck!6vn&w*cLzQ#=fd>G-`hB%OAc(W@h%n+$zq1QL>}^#@@H3A zc?^wXPpspV=@{$>=nSPUH{~UBv72kYMr?&v2*wJ<W>evDj#Ik^`ppb#j85zcds9Oa z_SIbd@t3cL_0-LdBWKJrow2T)@Iu-1+=IHFn_fi-H<FF5bUBo{y4mc70pCJu4ii?a z7jW^yTL&7Y6c^BWlpcE~v>W3*OX#wJW`pCZ8W26_96^vrC{_V=CAFocG&tw^w5kq( zHLGw?*CZCD=udS=$G<=nx&Rj-fGq3>^QO~hJtRLp;P|U+?W`n1p`XFzF_f8qKzK)% z=RpduWx{0od5OE)^87sQJgP~-hP&pObV2pj%XjE9W6~Y*68Xq+>gFRcxNE+1WMqA= zmLo{I0!fT8CA|Y3n^9&35-CkGFifObKsc|?Y;Lk4QR;KJvTh8<)x_pouXOwcTyx=l zRVXp1Pn9>r)3a7!<1!|-*(&O^E@3|CwPPg)Bkffn|5C(it$vL)Sy<J}EglGgPV@{* zfx7uvI&gbT%0M0#1$9LyPx#Eml?#dSAae-G?nUDCCjFRN%@f@{W~_)b9+~UNd`lwK zo912;uE`0OgasAWezzXyvNy-<<Lu46^Ytk|%YdSC7PT(L%bYwlg_doh=?qaac7B+^ z&N(BG(C5s?+8b{z6M@sVp*()I{J^c2AIz#oNv#!UgT&U{#leWQM_0#1E`$66Fnl|b z0T6%}opL#AigB2}ErQV`h!PN8H<iv~N#8|M$MN9^tKS(<nrcCxgjGEctET>%it(w( z7j&GQcsi9&gZ432kKz_4`RHPEu|I8R;7oPF#K$}d@iDF+8fD-qrJ=_qslk{-_Ava< z4D)gZL4b?PwtI~59u`${3O{_-OlaU~L<P=Y!Vf+Pa~Sn@(o99~P^vfACXa1u|74xD z$z4t`&nB0rQ`hmlQqTQOZpcJ4!j<?cYi>sYPc{I`EpCvOdu7GT0*-$s{4!u62wRU^ z0tJJq(;BdrMIv9duanJ9!<(JPz2v1lJhLdBS(MH!N>PiFG2_7bq!S|mj<+KEkxqO7 zOuFBUXy{Ru*M1yJ#7UG~Io^Wf8uPd@9kI#DW%MP|x6i&qYgDb@*)7IXGb5FkQU=_l z@47Y%$B`KD<@g?0?qE(EEQYvqUeSK6oJ>Sx*fa1nIPkZN@n+F<m(Lni+Bi}8P<4O1 z9KAF+7>uBv39f`%*9gNMPvU;jzlC2n=q5Q?{vDVwI|3(u%)C(pX=tkOV{d<BNxU%O zx{f^utEjCoc^QwlZnk_;yn!*@%-3NJy#u|RAXF#bN_-sjw(uK!+|kIcJ)=|Wtb_=H zKo(Ctg~}>~1fq2nk-0qcT7NXzGM8#6JXg94Gi~7hQc_Nne`CGN!aD_UfXD-eGJ;r2 zAYrv>+-_XzX}g_o&ma@J5vfmv?HhC1<9&ddIr9lQJHgLR@c0Q%r?Y!xH*2iv{bC0; z*r+!^9ilwQSszOVx|1C1+K<G)j);K$<iYJJi`{IC^XttcCiV?=3Y%BH9U*2C+W;<N zYIypIo|clNlpyXP5{=WWiuqLA`+O9j6ask6%Z@L+D2YX<mW+iZxt#|^N;nWNQp~_p zcydr|9*kokv1?+}T^Y3c`mor8d6p;r>+VnTx9NJIkD`D+sT*HVFJ$_<vs2*g6gWEt zqWK2y-nw>+9Hhx9LHqx`Qeg5fNYq!VnbojR2s6dbg7esOg##1SdrZ9QF?Nf<s<FMc zXx0I-aX@5k85cu#<+MPp$$R=3kh5IjIDoT(--H3Hab5hp>}y8J?PPFj+0aWzrRR0V zpEwPB*v8iRW5Q12>#8q1?iWTSua%raSKW=5T+)$OEeW0eCCsp3C{Yjy<z7GnA**yO z&#J@;BKN|W)xk_}V0JjpN?;H*#C}?*AK$CRj`jv*+#5`$?QBv18P4&1l@cJ|&6$wi zvrxHFj=%xOBKqe8Y7)`DA#AX{1tJDvJ8gPTy7=slRB@Uf$Ty3hkB07(;TDj12vg1W zg5JOfgNijdpX&#vug~+2%O{k7wP78)VaOwOh~VyG3iSHf79HOfxaNK}f7#k{A-5$6 z5?j*PhNi>^tLs49jnR0Z5Ntjk!P!EX99yCs0lJni${)v^2tbLd<Ws-4lwAlGOoK_M zt$JX|v*>|nSlZYCFA(u`k)KBW;!MA4jFE?eb>2~|sE3+8QXz5D9<^KNJkpP^g`L~; zOJBoOg~4c4c&xo*H<=tAFoSzgZdW{W?m^84Jk^JNZdL~@RG@ewntX0b_axh{C{JV( zHjHvn&cICMMHnYL(UxBLpfP@75T4u%oz@vs!}iK8Y1e80e-A!jG^dRaja{JUx|QrZ zSu1yG&lYOS#?I3K1g$T^KIx+E+0dp*Q91%2EuzW+r@}VVMm-`QJbWN#bUVDWs#dMS zn$?RoUO@WjdqD*q`%Xs+AdSqEy4`&6rn)hB-m&ouzE-k0ZWUIXjev|u(FFo5NE8mi z=Iwlv$c&c)5{_7?cZ!n$!|yKzQq)QWj(bk|C*{)-m#%6)qcsykBz1H&T5h0SQS<TH z4T;_5bxHFe=?d<3(ML(sT+0S5x;^nfF~=3ht6^x4{Fg~Ki<L<Ubo6#5LJ`}+T*c92 zEV%`(t6L*UgVDV(uT&b7Oo^#^-)ppFE}RrTyB!bU;?8BXo6~sb8S#StTFa4-Ehuez ziE8~uD7GDX*)8O3-Me?~`m6WurGTptvB*wEt0p<YWNTdRBgeTu9+%^0vLO7|pcuc; zH8B6^L=9!HsIL*lVVpfxb5!roQ+KJh1msa}d=B+ssN8HMOGog%;uv2MQ0Lk!SKa=d z3(Jd@vxZfy2pi;8ufdn{QNCG>J329<J*MPwdZt)CQ>>mTR?`kL?8*+C?TKZO1{>&w zFc=kRGt(Xk`p4Zt?*aUco&vfQ{<xy{8-%_Ez5-C{&Q`utXgOg_;<#}h<P?M!82VZB zgD~@(V*|j!e|0LLie^h~ew5jpEvZrD980XcbUfN^!~FR*QL(_wQ(d)XS#2R2>Ts~! zr5?aH%+slPx-6a^T<pR}-IDxlnY_;rgA9%&yx!;^G#&NUaim=h&=zP!HBts?F+nFt zF0ESy;^}1*wfr0nfk8n)f5Uu7ghoIK+ue-;d8po^a?PP4GudIRbA!$fcxT*zG~%Ir z2mjL<7NbpsZPaKUARU-y7DW81t}dS$By#hIsY)xZ8rJnX>{UwM%GnpQ<zn$^N=_)2 z8#}dA?lh$m1E%!VL9riqFSBxc7zBP*eI0Cr#<PT<>!M?@Z;u^AuOp_LgqX6A<d{A# zcXt3lR;}5U;jrm}DxP!O;al}qx!-6VGoPWnK6#DiL4>8gBzgh$u`o=-1EPfOs=l1+ zK#~=bVdX2!fSpy8lfu`S4T0@d=(fJobSlBhB2!d#<eeC60OiDP!{#OEbB0Q)5XDzK z98G@S>B(#(B5;O6L~J=2pw3(qNd#&NuEd3|V3Xq5L|c9VF`=>@)+jqCN;?9e5x4_{ zl!ss$=Nla&z=cSzQ9-b*#T-=6se|!B6SEHz=mzSb^l|1k6T3x-cy6e_7VIrPz{L1n z#JzSF%w3&3LNu;00$OoTkD+eg&+4160vf`xJedv)<4X}NgVr<f*E^<4BgoA#823;u z2UoAF_`|!GRv-a%6X{vBT{51eMH?aGDOto2S0ksR8|8WE=UbS9<EA?mF!G!FNz=QQ zy{=B@Wv>w>5<@rwm`kEs2b!D?eyp<r$0o&Hia8V<T3rU3RO2L60u1dmsRRnnMIa~` z#yIayOj_AA4QVYhq|9lwoCH{289M5HEwHfx&s=%0GqB2<pF88XvjvawX^e|AHw6j@ z@`&hNn8s6buM=lOQ64luYqTKd%Pe`M?Oft-k8;p$`nD2oTtx<sJ(e7acK~}lRdMx) zvo5^mf)~_o82w*bXQOUc<%6P|#RQO$^{BZSmg7ciP7OvYm1X)wESP+=Prkd%`4EIE z?dvQI*T^y*P6ihMH6$8lgX}n9EW;ko$I$Us=eL60dnq4p4k$9pZIjky8(%j(2=*_j z%LB{iaJ?5I*E;819ZXOaFpga*AZBi_9Q5^tVn^L+eYt|BE-G*(Z4g5_AO3Jc<+~B2 zFePXpUd0su^D&}8v75SQDyAUTpzRBTYY~e9x%2P|8hJgnucwg_;1}+yi^`QD<=r(` zqa6y4?P1j87*fS`!Yr!bnNMy?U=7A9&q9~f^I@?uL2vyrC6!)DfBRLi?J6lQ(g%#a z?M-L&VSCW;1KI-i0aXZU-0JzHq{PAN<z!NBH)45<{mrL@OYhODp@6mex1EU^3$m%0 zc<B%$93!+H=V`7T5O4TI`|Gx5=BR~cuj@|0^fw<$A;$L<@s1d(9omoX>dtZr5_sBT z*s%i$q(4XhVe}yIVma~xT7O<iQC-n8-sRNut8h5b4d8gkN&GWivHwUfJ1P1&<MHxH zzFlui#fv%=-%ad<v;=UndxX*2ou-Ir8l8FWSf!zV*Y@usZkutjBWwa!ze079FVKSp z4i`FBi}K|-3G4mV_=h(5t0NBMlog8+Z@by5{pE|FW=I;5Dw60Od!hdMqMUtJd8y~| z?Cv-)v_FBIZAJuze^vBOH{)(w)2UV4%$i&P_XS`cug%j0*?3PbE4xyYn2puJT3kGC zMHNzz5*&2v1%{Vx4_+tJig^88KIv_N3LPa9T%W-PO=<@A0Yr7tX(Ln1WhbF-wUV;B zn8U%^JYsrWn%0uEUG&vKj0V<1Ltnf85**==^27+=z8;t7UvJbd+wqwhSRGD_nV}jq z+<3=Sf0}O1#}3hK;&CNKc6rDSO`B4Z*Ck_37zXCHcLH`8w3cRv;;mwb_E(f0!jJ-X z2yb7xa_z>Im$e|MlhJyr<8iU4y}=eGhgf0`0r3IYj;BCalJ4e?@D5fX=Rtt4GG3O* zDsxnJFKODfElL)i>sy@RET8WAU>7KTKHw_F&WG?t>U;=F+VkNKW;jlt5OG#luQi;l zImC^eNc5~Vi_7f<m$f0^h6dwBMS|tn5oQQ9F#;Pxo=*OJSkIZ$+!np3Qd?+{-a`LM zhbvOh$q!c|z{fdUH}J|~_X{4a!S;zBts(!tqMyt>T4x@YXR(84E-q&-F6pcSXZzx8 zU!3iWnClm4!=Bq63{`<ElgYSx;wcct@l*+%z`(rcID$cX%Ep3{^-!2Eh8s>x%eJM2 zrx;Y7;U^;;<xj&=#&du_xu=ZR(D7VllEDdnt7%^uKPyEVkun_{>iEWx1B}~py>kq7 z&P3wGqR*mmd%}mu{ZhhlXP7HSG(lSo{DJ*<^h07XO^+fyWzy8iKJ1f_Cg@A8AlqxW zSK6{^5ILO(X$!5arH1|jyg>KGAi->~spfH}i4mvkO@pz8K`g5Ao|(%rCYU!~7PAUb z4Ia_bX*<V6mD-Qh!C4CK$Q++(xKE_vrV0OduHlaQJN<Gr7+pDy=GK0CN`f;@`V38a zyGB<4K3=D-Y5&D)&rgeMT1~pM!5>$XK7;R`snTPrbkOm=qJ8Ehx6o?xmD!5sQ()8o zt1FuAG8~JQ&sIS%%~CyEyz+~uuRV@Z)*zs)Go|srO{MXZDHMxi-MDlFmmdnXQ&t0l z&|5WI$ZQpHbRxVhmb3Rt4~*RwMo*b*gK^QLDvQEQ14Nj31@{*5YT0Y>6-L-iA2Gsd zl0l}higX=Pv<o2;R)#@+j3K23$BA4-cbzFI&y<vBO3E|k{n@@a+ZV@9Y`}VNCHd$~ zZ2ZJis?SU$u$@0Bt`9Znt-ulDXYCA8*9E3kTPoz!U_$~9NvgINd`MsbH4?Z{ji|7e zj|Q~O?ry0y*eZv8&r2wIoiw4Q3B`G-GtEiGxlKQpyZJgz4WrUF^=mZRC>C=pfw@1J zXWY5f28DToy0xd~bCM6AhbUz;Nv*Z!9*27d6V0n}*CLF`^$CH-<O0aLj1ndvVSd0- zISN;XfCNxBRUcgkrS*0C+4Or5i2~T6*Csmy|3-gMR)9Zoan<Y1S{SNCh-)ma+F5PO zb!zK=F4O>`I2|H4cEI1EiXMt0Zw_^d$al5|z27RPb_BO<MuSAH9kY3zDoGl4<8$Jx zi)A`CN++m)y95#kwG;osL##Q^?&irA-4GwZb;mX}8xg!?7Sm{(z6FSD*GfFgs@<KP zay-cZUO=J0wiKTPP1NoLLMijn6i&IZK2FqKanj)&A`&&>RK_Zh3ldDt&+M1`QQLbW zPTRMn#mse4qncxWOI?|K5ZL3y&)cm@6DIl#aS8V4o(xy;5CJVe*Lb{saOpT7RUkJR zjKe3Eoiw6&!)lsh?M(a`Gx*`_VY*K28Y-&m(IS5G&Tx8H*HqnFC3Q@;DCl8LG#-tl zdxbByK3?IhD<!D6mLfa%rZ$KQ8)gS@?+`jdZ(Y79G`DV#o^)Mn)xee)BJ42dfGqL( zj)`;;J@n$Y{Nk^=WMVZD#ZZY#4`G*k5UI%kyXCd$g3T387sSxj#Lq=y=ln^rQEJ?e zSpjoiu$-thJ7#V#86u~fnGq@HMahX;>0mj*h-<Vv`meS-LtXl(9Uns1{VCKT3qmMx zg#e3<IrM{=j&t@$(qhHrPjB`jW^wXUA?KEqS{cM@8{QJt62@p(^qX?HnlY^<BCKb% zvh1}ocdRtwo+pP-=Fjv5{6fv2c0e=0>%3Ias&D;r|5PZ5GHZ|euQ4{ii4It%LyD4Q z^ZRD2wNjI8)J8g-CV`UWqn<>m%xoeRM`wIde8TleFj@z3IkW3m5pOx0!tH%jY^sB5 zuK;O+js`%1Mn<z&L>p-?iksA;Sdt6bMV(tSAGK%KJ)f$3T07>Kx*q9CnOXk)Jmr<> zP-kIkMRy?rIvVdkjo^62bMI?Ly!!&h$C>y0nWFGaQJBn}^Lz<c<Nj_B8bOF{wK$Ay z4*_s(wa3RKsS_OTz@2bnE(>~#@*ShMJ04G)Zq2q590AK1H{=D{r`ev`-+mf5*z;^J zb&|N9MY5dj<+Ht9r}TfJD36oJc(W*vnZa1qxS&3Aj5LSjC;*+ni{pX*ASC#a;<cM0 z7XI@_U~?P%f9$<$cO1!eAov}>BH3z9RjCsR6!_>S&}18YscDl0PlIYnuECOpssvEY zLS;>5fj~7Idu)$o%U;>m?8>(M9M2rvbI#0I_Kdx@Bun-=`%`>Gs`bf#VecazHy)W) zU{fCN9#CpBD>LH8jT;d+Zrr#JteTMmris%SO(FJ=Xw7;thjfxzI^!q#;rO6i!W?*l zcFs>sL1m(GTYXlT0Jj<{e})bl@9%hq$6StcIQ6TtD$_N9R$Pk|$6n@&e7I+lIGHah z!7Z{@oC&CsEmYKMJTqX7lf3@{e{H&jb;e!H++&{6#NmE--16hfJ?8I3X84W@72FVV z4<_4GrNNl#dTGK1x5m?`;ko{p#Z1#}e>FJF%i&c@WmFvfB_-;$Dy_!F8Od$HiI&3Z z#rM1A0eo@I?TJR5N@6=7g4mt+v5ZTc)@#fViL))p3XO`Nb)y~<AEw3Fc`p|L<w{$3 z3{W_4n){CSBKd+9JPxQ$WLVRLvNf~3&yX@WnGL4Qly`HSqCZ>0+}MSso^+{>gz^Zt z9m=AU<Fy9-IKo{V*&-*ip?%4#$3H292M{WI`*JEVgFlJVd(xhzvgMIw4Tv*NZihYE z2amg>#uV`#A7RL`aYCEf-rywXDhc9Fuy~W^_Th{NgBf&YdR&O)L$p6?;o?~i+&p*s z&)o2)P62v(_48>0f9-^2wgHj#q`kT-MpT<{QJQau2nnv+sYw}2x3yz0c{ejev^v7M zv<&km<qj_Ma5En-kuW3~6+@QJM12$%^OG)G=K)(xI;0rBil_L_GAoJUM`C+JiG^TC zW4k|RU+`EoOc^zBAWs19LAq40>c>TKNLE^wI5<D<;Z7NAr_?K#HX_cG?pk>H=W$+z ziq!4_cvt{JjnA#Ft~LY@5f|3532w9f-*Z2mjjH|Po4@?x2fyS3-UTA%6FN@gJii?K zdQ&%k>C&Y}1zvfc$MMoTppRCx|2`)Q^#I)5WPi5_(=>(uwHkH7R4b|CLF+cxE?-X9 z+LsYz_KpuU+B3z4VM*;&nYn*4hs9395zH_y@8w^%37AL5dbB$EGQnDjq+G^}GXfvv zT=q9U1v$0}8^0`$R&2ICn%N19Ju(S%wNum`I)d;RS0$V#2QWt3?Ymd5Q-T<JR9<V0 z5a_V6ljtWDdmDOwH3Hfx06v}WI5E?FQc)5vXfB9`X{oD)DwpO=xD79_H8(}~MYgEC z5=VOqZV@x3n1F79={^yqq`L+=GqKTiK|ZU_(jpKtXqbEg71Y)0P6t*K+)k!Yx~6c8 zhVV8Zn_Q_Cb19{}v}!zfj2abTZB1d2c*esnNQaH*-BXZ`Y3^L$h{ef!{1bPcO4k#R z>wccNw;gTd=7F2760q<abRPfN@Zso<)I#Fzq6(JDq{|N*(%AWMa55M*^$99fI|iOU z@8g$q)x){!;av3)S3Sh_cNLlj|KMMjh7j}4PJsR@94h~6k~NTuaqJ#sZF%)n9YS3d z;5Xjx8O8?KH*7(on*xiT4U4Xmc@<>52gOvuKz2KzQ&SiA`C@;6sLqf{S0zB10C&R! ztg}%luxMnb9z`}zz~zyE<cde427$&Je1IKTx6d>B*;%SORCf0^O`*DI2b$)69K|Y< zvTUOXTe*)#Og|qxV;T?8a2lNue6V5-i|hrxZun>WK{+nUyh`Ka&O{gw7dOVrW`j9b zYM<{c=Q~T)&SI7rUU_fQW0Ui~riz2!h3RN=C!04m2W*3%a8GLJ<W}l7nZemgPX1cv zKhYpCN@Gj<1Uv<t%Geyy1i22cdM<Ns(#Duj%FcDo^t^L(xC_OUr}|rm$+M$-ka=ez z*$Jp4d0u@+MiF@gYFI_H@D8U}Rp~c1#X4M!@Y<2h4@#|GZHgjv{v|EUMkHrwmC`qo zGt$%UsHWD<QyMwUNgDcxI&2)+x0sj>xxwfChIR|JGLW-xbA$OaQt9DW#-w)uYX@r6 z#vq}Ws#*ZG9$pO8(P+C0*q26C;EqNv!1GP(eA7DLv?^|5Z{5DL`K5c09zWXJx_4vi zE01qH0(3EZ=7g6Wnl#MzixECP&GRw-+Z*QH38lzXaT&&wq6Zx*CKNBtzjsT4iVyN* z>2$C=IV$b8gE}L1_XuLBQh`trn;G%KprmjTO|PmWyN6)?H}54K@6`^*q}XvRgsDBR zSS0d?JdLQDVc)iS(DMF`>BtFdp|&Wm8M#f-C-0JyybX3u&+x+Wpj&Poj~?>X&J3A* zF~s}pmS<IIDyRag->%|sHw@t6@00cYtN9B1_NdpLVk4o>O>czML4{ysR;W+HK|{|A z^~ISF7La-}jwh#fpmoJ)z2|#*7e*Pc0#1dJ)WrseRXy$m(?NZ>!*D2r7{AFBXp|d* zcPOpNRIuv%4WzE^jsnVSMZ$4E5U>q*f}&VgT1W(#&+Y<@c#AVvkC6pHK}nQ}gMFLU z%>tWm7SETrj)-ATb5XtJj4p5v3iKu#4VU74jADGQC5<@Ey7Lk1PMp-Va6W#M*xYk9 zA9P^7$wV&RXI)47<yswhyF(#qmZVq+RdqVpYua5#LFIZ9@ZPYyPadoiJVK!OF!<gP z`_5&bbJ^!y_KAgL;E*vis2>i>Bbb0?F+5^{1sjI>UgG(CG}YUXMuK2x6laE0kJDPc zimtWvB)JLf&OevW%4V_qkzTOK*ThdJ@DJTe!D!+4&@>6&`rADnJ!3~%eP=s4$}8hk z+C<Nq9O@o*Yxg4%|4voM<rms)vv>Ip?)oX+_2rl%R~EXXdXE>eM=&jkMKF=s(r9N% zUb^bmo>7VWoHegZ-X+*+@-DweMxG|#<u-p>`B2upe%%cL#3oZt5o<hW@K2LCs*?A6 z2nv;ongUG$&a!NJ8M!jhP+YKdcTE}xM%<trhE~0*x}mB#`wzjyJZx!V=@+wiyWmhJ z8<Zb*hl4(rZi<T4Q>@OOO?1?F#aDTgh*1ueK=e(Q!Cu9@F^tY6I*=$u#J@Bh6xE#Y zR5p6JIu^|xb=~98&xPfu=|gjJI4&XY?Izvf_@GNmzW|Oun9i8*lm)PWUYB;A?o@yC z!Juc6^(D{yIDLBuNw-uNI>;E0O8k2teSVOOk?BenjKA#=U)!h#8?h1h$C49(`(3WB zrNv2(Hn@p2XjE1yv&WAQ2K|0Mf(N44ono@Z2rfkZ3dSd7B<U0CE=2Xs<0E!CdJCE? zUg^@_xo;73lg!_q<}gw){@g7PD)M0;Z54+@8qnPwu^>am-I=Ue5R*jXq=}N$Nak?2 zg9HSJ-cvxYWye|JCG3(lP0{+=|L6q<+5Jf8!sddGSGzJ+-Ti1|?nZ(F)K;*W=&#Vg z*4&-uDQu%IV^;<q&Qi7wr50>TmGyuDG1Z3Oohs?3OekVrWL1&ZA7wfkOm*$u2{CRI zKv)RGb3$K%7#913UPhwK=hoi2d=VZ&{@T-Z4Nf?681w-akP-@^4MZ~q#xQhWEg3Ue z_yRKoB&U3uC0iOdu7V};^a9dmX0|M7#W_%L3wDOWZ$IFvLD82rs4Q?%Ez_8S9r&^n zY!L?($I}%+PMw1fmH>GF@~GKaLf;K1^QtX)soT$o`84-|#yTA?kcH%_IRX-Y&R$7Q zGHrMjFx1Bi;&BS{bd_|spHIobavSkrGq80IuC&EbOH;)p*12Dq1XHL^bxJrG!DhOR z|IiNTfL)52_w@&`hoi*5liVyuz?i3am{IRioGNIp%_2IioA=&(?}7@q!m5JzEE6GB z0n<fFZ!W3Rq)(ERgBfhOh;nLM4rN8sKCrKXr!QDsQWTH?j4Q2;S(^CJ7HLMMNog7A zAZDda@qQ!J$zlI#Nc~+ANy60g)~nhcup(M1VD4E}(7+<T>_%rWa7zhSh3t~x32s>f zSJw$tyJomR-XUwi04xqs6aPZstuV|-q_milX%bX*yQV)k-K8?Xe|%hY7~%lw<UMDl zCF@+@i{3Kn9;393tsxLK79ZHRmS`<UP`QbxUpzSje<igH>N(u}3>GrylGZ;nGXqJW zq&v|wTJk)zT;-a(=&~McbxpPKBmq3z*XrYyh3#ebaMzi)Oq^O30ee$S9Pd`OF?*AD z@oQzwX(bhls-3}3#SvsmhYujS`zDjDEOL)7=bBlysa<GQk;JOi1l4;+pN?q%3b(n} zw0Vt=4tMhj??gLdal(ACKWIT_uFN{X-3kw&-Qnh9JCC>LVA#C>e{M4dKRAr+qjFH$ zi1X&_i-H(J<U+{5+3-y=yIXoZuu9y*ZvJNW3L9Eg8}l}{SJ>Pl98~Pr`t|Vv>N=ZE zxvePE{ZW20#f&)>1U>ss;;Soax0BbirBrLAg1$UcK`O-@3P8PQ`iS!;O$7bPq&KLr z9>_?G?PyJZBwuk0`wZLI>)XoCu$`TGOH;89V_R2io{HOv{H6KJy5ThE;mgnO%Fge~ zYND@TI9N3tdl<quA@6YPwz*_qPo7{fyC-S#1Z{`#Uu8S=B=bO&IV_OAg+bCAoULei zsOx|y6gba7BM{i<!{W$`_n@o{Ru1wZbZ_Mb+a8c(@GzfXJu6v|l!vd_!c|M0=<=z2 zv-k38?||JM<W8^R#n?SA1j1H_nC0d<;l6I(pd{IIerH*B8bZKS8Oier+EuP69gJas z|798cwF}*b0sH{VIbBjRss*-N6vMm=0`8X&a+*Ga5fOcV@C;Zw4Og~gO@oVxxs$=+ z`^tKv^Em15G*?xiKK%aG$oIDT&YhHj6^RN~?zCi1Ewwm9NQJN^1_lE;L%~e@Y9lGo zqzE~NfK0L4#Lu>)#uK?Z2-%+|ZWPrErutOCjyW5uAZWN!ernVUcHUQ~W(<_7NM<kq zlxDC~@25W~Cf26TN5xopQVyFE+JXDz6IDqY;JkY+Y1dq*M-03p@+C^vwvp^46w+pH ziCI|USVdtJrRY^ylH*&rMfqJMM7fU8U6LtWKpQ)dTq;dK-kpVG4s?qYP2OU(&rk)5 zLM=x36`HB9d&8OBbb}?=qM7ewnxEt7>;^E%_wMS&{E$~_6ESyjNfl+!3`6$g6@WM> zM2Yiin2G9VfcjZ&QT%Y{&Q5bOyDOEXwAN;1u6%-q$+O0eHFG>ZpbvyLeq^K@I~$c@ zfM1>8lBuGdSQUpNVn`l$ij^BXYq_I39XUQ}Ha|iteSiR)7%K%IYLe5w4sQE;JIs+} zK2W7QQMVk2AciItaabz~!_*aDjt}gY07`_~0!s`w{jT$3l}@kXO*R4P7S>d=wa~b^ zu=F5CI|pmFs%HC4H7BMu0pkoc+g{B%Yn#s4LJ=C7v~B`6jUR5xWAYfrC*8ISF3QD* zz{ZBa6o+g0ux2^5YRA`kjMwb;=!yl)2{cHW59fWL1M&7)sq?@k<6s#>&um194F6ce zZK*=Qi(Rf0FQbk~vkX+h^>aSgysHk-yTf8X>y`acHp-_flR@w4aBy@o=oTwo3}`;g zSNb{ZkHd21%G%|t7uVLV^Vyv&l=cQE=1fKaOMsY<KuCEy80Y;#mk#ClYXt}T^S9SN z|IX^?uU<qFJT{^+4BhpLL2P#0K$dPB$kIgub&){3_-+^9?c%%LwVB)t`uT9$MZF#d z?K&Kcx+8$Hb^@c<<$CzItANp40y(3%T5rpC2HnZe=aZsI5Rv+*#KhAh94UuO)k5K^ z!37O7M|~d~M#0C1QSh)yR=7U`D+Ti1WR-&LsGrweiM0-?!@<!!@-WqX^1x#RAq1z8 z!N&y=aptaE!-nd@x?Njlb%(h2o9%r03K@Ffi|f~tWq#wrk^OttPLpSA@ZUxF?~)I- zoqPe_LjRtv;nT%)HQ>1#@LUa8<1R?IifgOF)Sb3Z6r#5F$Sp=a^9KsA{N`n}ufiwg zF?e%p>w{a5p}!yA{@@XN8**kLiiFNihw$*I!0R6p*fFHv-LKrgjSmOKF^<oEKI%>e z-66(7gr91?X~*!SB+u}YHC=Zf+`RXtTelzI0dn5{;PL&<yAK{e`s%~m+eX@K>`w;h z2;Dfri0pKh&=2hS-k`i#%Gp@Oc}{ggAYHVp(;eZD-NWv<v9x2;({_{_0WE|P%#tG% zuy@w++jIO2|ByVoa<{+o06hU<>O=Ez{@SFZ4m17-ab2g8$J9|A;O%p;IhFYxr2d3% zs)5&jf&ZU$rrimuF@af7YxoX$0TQe`LVLo)qv3QgrmQuXcM4Y?nhs-_OH(tmcX&86 z&_EgC0ESNxpC^e?#KQI=>Y<e;+AE@Brc0>fMP%<lAMDG7EFhU<BE%jDA9;znByeVm zkAz*8Y{J`~j|$?Uw`Vo>DFWlB(9ST@$6&e;;chZb%!rJ;qkMQ52%cqGs$Wvo?OC~= zyxX-sq?`_-1JDX}xXC(m`vG{5ioDvo9>C1Yb+YF)#mh_=L1-#k-@63a5dFF?0#gM6 z^oj}KG)6T$#mUs56K$8E%g@eG{**?1vN&xpa06!$0|H-<b+qG^*)d&J;T8-O*-<&U z35Tum)J$!%u_i%R&fdEtjG_vC^X>;SXZb}t#OGvq<2Q}xTGQ+o^AVb6^UmTmf<&X_ zZUe-kqRB5QabsAZJu%aSR#2bPJr8FY28PvO#&}8}6}q~aBH}(q%R#y3nH1}Ff>c-` z`cM;1cJ-#fh}zkke$aKm%2yk$?6or|qAFi=j0Y#MWa&rdOpp)wyT7<-rm$k6X|JP{ z6}7Ecwj$7QN|GhgbqNQMrr^G?S`CwM)-VFcZkh34nd2~Jd0Rj+BGwAgih`6QT#YFF zx!pz1s5lTC8GWK`r})?P(+qa&r|6JOpr`>@Mj+l^+BvN;&f+kjUmO;@-QlSY{}Ss0 zZc{sTwp&;r8;p9xqkg`VsE3f5(mh`3nLp9Gctp$ces=^y$;5bKndn-Db$OT3-p7-{ zGqMMEqQ5KT82RgN;7&3`Ff0I#piF46;B`l64pFKWmQ);-6NI9hW4c@rlljedQ=%<A zew3ipv<<1`U#^Qkze|Z$zJ=2TfQUz{3xeLPh*8p3Q+&`M;7qg{c<gg4P1A|gBTGtM zZdF*UbC8E(T2S7ya0I3E$dW3E#!FjA)3H(wm5x^ovduDxSVRK@XPMrCtmqX^Jus<Q z-Kp7FBmwwFO7H-3a1UORe|w9asO@{#Cf2Kj(!St8d;a&*9Zm16KS)0CYoccxOJS0! z25u7j#bnk{`C^%)VYG1KsLGXvwUC2d41`@4$uY}(@Wlr?$!VG>)(Tsgz@^*k;m(G- zDi)~lkValGaEdRE@ceXqkdJ(jv=w2YVl<o)7e(zWIm7@Scu0Kwn3~(#+k^RnxGOBM z5`76kO1xMWq=V*Q%8h77&Vdh%(12a%@P?zp2RX`3Q21`YJ60j$#V}@}EnHq=EO0eM zH+fg>@O`S@es`Lyc0$T&>ZwVomP?12k7PlgU{4?H?LE}tR)QuOv5YLGl;&Pv#&+6i z(vGFvJDJ@djP7?&)>XGM{i4dnQZNUx;DeQ0v*dvsyL$d>MyX1;Rf5nb_E@1f`5th? zN9L{K2{zWW8{Nd##&C!B7bb)zqdt%D%7!*{ShaGcm1RT9ifF$P#`J2Fsx2p#9pA_$ z1BpJniXz^`upr#9+|{1E5yJ%<0B;tc&FbhZT>oEi_#Z#Mb^F7|j|0YAf<!%y4f6%j z9&8%2bv0q|wa2)_Y0way^zf)8AJ0;UL?OnhcsFhA_EXlV%kBLtXkYNro>X8wsX!JF zv?M_)JEBJQ99eQ0TzC`6Sz6pYIQo1d2!@&-ZjozIx(wiv_So}T7C51!K;e|K>sq}G zcHU;YB|A|b6i2927#??LCDN+b9rlheb8})(Slp9cIDYmEAr<KT2X<+UtOXks>h=cv z1Jvv)V^^ilOG-S`Dn%&j$}li_Quas(R-``2V^Z$;5(T@4mI*8|4&6s6iO$fjo+s*S z7Ib~Bm2BZAs}q>3;o==W_eM>e>&%86=9p0XGsy&fPLFPMJ5R(O{3OKYVk_C)MH?Px z^TeBLMCFi73A?++v-~sc-w{Ti`gDz0Zo8X#xWh*z0KGs&shCN6?d~7XE$eXpcoExX z#&Sly9FT&N+muaDQb-*T`t7{Lylgb@;J4T&gApPhDy@&V$6#P)^!Z@r+6_$`@80LI zJ8s6#fpY(`U&6Ewy{XGA;9tTA?TjKG@_x1irSA#3P3pN7yPa5%^$ZzZ<h4ZK%f2!k zj30I}a|@CYF(%Y+s@F~IomXX0@)mnzcJpXbV)_$Z^{)4&88LO}O?ANRa4{(*gq$L7 z)5-#<JE5L!*%Z7sA9eVR`w)$TDrS+&9kiWK1`$aG`3Qb+Lw}190yi<z0&-fqn<2|x zw1&nbHf#8yhpF1Gs0GE|cJpC@=ca<gdr-M-$tHeM#rg#wY$%{Z%2)1usA;15hi!FR z91%eEWJp?LQj#ydvcx1WXyfvZ9b<R9wQ7mDcq|DTgz#m>#gdXDPVJ@1-93#Ct9Vka zw`Y}1X388*)tz#x1qNHd1WG{C(uvf3i)p}+CV>L%)YF+nA{c$5O|MDkrRSMT@W@2- z=GMYmt21e*NSxM=c8=K#o3*&0>&#o+Ddkji>|L-dw))VBS5n$??P5f^n59|BDQQO5 z)QV2ydi$h`;12b~x{s&cd{Su-6z_$u1@ww5<yut-#W{V7q>Hb0g;F*c(&my43U~)^ z9`Z)6kl|lwkab-@x7lfne)tw|db6dEu7yUu3f0}LMcJkwzFb#HljlkgdS8VsFW0MY zeNPRaVdZA1qa_v0lD=`1Hj<S(RDYR}cAk)=%|%zs#CvzG%ql9(sw$YvK)1Yo?I<rl zps<!nU&pl+^1TC$y@<UulN)~5^78#|DRktb6Y`U*0hJ`dke)N|x5fMn;R3V*K>&Bu z2>NZzU%)ho%t;r_@QJ9H(VdCA!X%w2^QU={4f?75?41fU$vU$5P8c3XRMQ=s{j2WS z?A1GFhg<f`Hstl|r%U-W_GKxG6-5GBpeuTa&=uG;RiD*>tZ9rvfD9xZBP*UrZkp1~ zmL#x&5{WqCn0Fg_&RJTfI<|oynvIi2i)WOO;-Ut`8sKaWz}XytRlB3GnBa>X{d=x@ z)6dZ0i9-Y}Y||X&$b4vd858q4vog$nVGTIUV=QH*I3CrO1jhcQGEdx#@Gjp=#cs|4 zXja+Wx*#Ch9#<C3ouZLmiu3R~Qwbl{?n*2uau0!He=F||L97Fk#@B6FZRS>sui?tE zKJ{`Y?dQdrcYD3?#1^b<S6s$ckrahiwj%7}Sx(M8LGwb*Pm{(ZHa(5ejmdg7cXG}x zxNff-YG+hO|JXVEjLM7oLrik6EAMGRoa_MgA)HMzoco)&kX|YARS0}l@?M3wS0U}i zg*~wuSUC!%DuEUJYDzHnlP?+w^10Av)zD^j(0rAc15`k{=IYgK@0_HuD~TTPGY*lS ztS$}J%Rp~uN|TPQh@<FKK3y_dF}x{SeWLJk@{wGiF7F>rfW6XzY<DQs*fJfj;p%$Z zXB}k5@eJ#^n@=6Vg&f!$G4-cyIG;*COTTS9V9BKD9+F0kQl(CH=Nx}Dj`(3Z4qS6; zf0%33P{)dO{dF$2`<DL7%Uzi!lN_zeqzQVuOIP=3p?1rpUv&NFriHv&WtI5kX4K+? z_ywGdXYijOX2&&+?o5lFon|M11e>#U5_3MZ@xzXPUOVib%;3LQYp7k-P&;UdmH2@R zpQBRf=x$RFG-`x(x=5|Itc55nMO^l@UXBq`VZG3G*w{Mon^Sjv7%%)+A5+x;(x3wj z0+Wc&(qvgbVn~PB>zxWh;!Q=+XzKZFMqT0O4fepsC-f~rczOW<*d7luAbQjN!hUL1 zmD`n-+dJ0Jy1M1ItqcS2ewo{HMdh}x9JH*JO!1@Y{CT9GPNTU*1m7SYf>xk9h}2>e ztHN+0e*15DvQ5Hj#Pqd(!(Cs>zLz+ix>~^Wug|)JA$i1*Jr&+$SP0_2zZE39!Tx#s z0-ffpZ+6Ea!H!5tW9GZ7eT2#1Sw*uYXU4}e(-&T{Ba%P}74{+_>Sxp9UeW6giOS)! z>I`;T?hWO7qN=gkEZ3t~?5|P>NMAaMUP|Vm7QC6EE@?1ymbehL^B7(6{F0pq-3Ms` zfBCNM3(Z=k19fhe{fIDf8@we8*6)~J(aL>O<2T9o&=$6&JLbqJySoa<GAk9cT2|HY z`3nq5Gb>xJU0JT}dy;GDZ5Mjm)@nP@+b(psTw6Gp@66qD79|HR4_(&X5YlAOKdEpT z?qGo`ib1s<6RV}FLsY0Ox2)4vCHHgYfX@SKdm0S78Apqiw-)SxrhcvV{90`uBz7zZ zk@d@Ya?pLo#w^?e1^^t9%uLaVN1Ngtc1K6u;c%8>#qMx=P#o<apvmbWd13C-%_G{; z9!)5es0?wTY%27cym^F~r1Y;XG6<4)gXQ4k9LsPV!EN~ER2BRNOLF~4Sp`^>CNz+r z=oXOFD*_754D+$=eKa!yiTj{wCKtKu+Mk&Isud~Nb_=#;K{XZllY5iocgveSfi3HM zNyig5mJ?sP@dS!xPqwjZdEMc?=dQ!&uEXc9!<DYX+mALM-F|%U?)D?{_#KSMYzIZd z;%K_H$G>*iZ}`^T?T4F>ZodEc{%z>*Eld~l_;KE&GAiw_SMbig%`fU=cSoY&ZA=WT zN<aMI?$!r)AAR-ljSs%G{XP`eFR~BsZhvX>UPkY&@re!zSm>y#DRpf;859%DKyv`= zgu2@uaiS0v4u$Q0cJn=4$t+rPefEaZiM>@!K^H5zms{%%w4YK*o{i;nG=ukZk+Yjx zZkz@=MU5KT#tUK46k|oDlD0>PY4>Ta1Yk1qYG5%72=C%<sNA9$W!W=!V`xwF83SXS zfDP*}yS6Iu)91o{kpf4=Q)SyUmeLVPrypgsqTex<O~eOHRP)@?WUC=W&)!|a@yy+Y z4O+`iun*KsplQWZB*{m;f;jPDk2xVb@>%xdP9hZ?_Z23Qn-Fx{CW@E7aMOcHF`W+c zM<zFre0wX039migKHGd$NkdJ1FW2S>=y1csGLn@RZ#u*f_%|H3fpzg5Df57mstZUM zY9$SfcJXF|RGt2?dzvhp!@aY!6mh5lkrBAmWEOZW<shg|$yuG!n<qLRIvHM%FsYY> zv8SDkVGBZ|Gu)<h2zuE&O+&sk3P>AWXC~uUuu?X{!uJNFry@hK$>xmj-QsX)e46*! z1d|O<I-Vv>)9#iIyn3gYDENL+I){@L&&(Kg`ehEf+}YbqSxUF+8mTz55Xnj=@AiUK zPkr=4Ak%jguDnZCxoA8>gzL$#L~E*|mRfHSGZ;X0v)@l-I8SAKs)N#^cb)RG_AK<Y zqA}!N)$TY##@>ZVrbG0F2EfXSxr|$<KbHuvJLqd$tia5jP&tj8sI%#2t=W02!jdDJ z;4zvzGGrL;)?p<bNkKO?-Mr*_nfi4<hqENIyT;z&B=0w>Y#1G9Cz&c87fVZI*)lJk zgb=h|?#9ePyd~NZMMWy(fSNL<*Hf~;E$dp*Q^~Rq6c*q_-B2MaD{-h=4R`l2I)cgM zrg$r`NO-HBM=BUK0!tl7-{DYAg_1pdP?)1g0NOoAX9V$kOOSJ=6O0)Ph|XTP;FQuP zq|yFpKX~?izlS;Ih~ML&svfK-&AWWup%io!^n~47L4aWQEi?}4cV{VDmk%f&NxpY9 z9L_F?72-71)E!Fx>0AFDClUPPuu%Qpjxt*3T)UoZPxJBSI)0wyJu-#IlKA!py=C&= zn0-KBGuddOl6~j>fBM$9@zp<l>ks`#|1_!j^H1OUma_9s6$AyPwoxC%1*c5`Xt6&Q ziOi*_?p*RJ^wb9IX|gCS|E0R+O_bQ53!+yGcZ&Qh>gUI2`?J_UeYXB2krq}Qc7+9# zP2awmglXn`O`lsUskw%!Izo|hBnX5gpP>hKh0<-KJleI1Vs*TwM#NFAL`pnV1u79v zUG!q^VFbw8Kjwp(w<Rrx+#EZtI&YQ@KM$sqIX@A1Wbg^^$Zn`z!%v)3wRcj)bp--v z$Yu{M{5YFTKtqWrdWzv~SgX!iy=$R~v^P~Ym!h=VwCP2ImAMttd&hv4YTgCC&npJ> zjFTiXx<*#MF|+=4tT~T-ku7;0po2sd8VEC1V0=(ab%-eEAS}oF6|)>EVQ(QZ-X2k1 zWPQOqI{dCGD54>8-0bRH>#D%JLK2->l{1rHI9zCPacm>76%0nNX640UR)xUEiSBU= zvk1c;*nE<9$mXs<irbI7<lPa6Q;rR$H~n=&QwzKbx>R7yS;p}g6sO_Zu89;K?1?vC z|DMR7>-9;NbD~m74qwb}Ry4ToFrA8$tYDH*Lk*Lj4?4ovPF>1-qe4>7rf1L`RcVhD zq}`e9P!^<7cF35Oj&3PJ=vE{*+H2#xXBT)P*et$c*`ictk-S#5Wk*D$GpulZ|2cmd zRxaW9lGtcurX~-VNb5&$1!}D{F?Tkt%4XJ`+njmZI@dTmAwD~|`&Un=Fooh=g+}V= zE%3&%Mq@#t(W-X2_x!DNy=vEs<`t?-LyLc;er$m}+o3)$BH){c{-7MARsSZ<DUJvs zm9D9)XiZ(6xV<1z7d1Ah_-le|BM3ag%N=IV<i^j@0g@?<7zj=}G|&@_q&J2ppQL=p zNPg`7yxYe>p-=JBTLbiJ_6t=R5q@I#0?g-*u}XC?x8qy~9YDUXftB6qpxo=?%9<s| z-5Kr+Wifn~C$pU5wH)RqR135?$>HM>T?4Oc5KRy@(f)_;>&KJ)Sur>&4I5)l+a0OU zZ3=r$5ekbWBhdiB8%I-^$9SoVzy<{XQ!x5uz=p4TKpueB9AtTxQm+WQGS*Q?fnAjm zi*$WuL6K5>Q<WE#Tcyp@LA9lgc_wTpaX22rHanf+8r++7_Xk7xVQ_8kw#YRL@6x9O zSb!W%fPyzXDF;L7<P)MPENHr$=YA_H7+rzx^$`rzQ{0w|z2sRjguxlAq{TXH&v8DW z7*cZ3Gh;(~!JB{nIYJn6evB8TFu#$({rsdU(jt63={OheJ9D5>!?F@z=R4IRpD{&2 zaZ9bY0KL7D(aUd5zBKORq4#5$%pR0rJ<7#uA|a@Syz7Z5PBsC9O029f)4hN+LyNa^ zT$Fg4_l?8jg!PF)gbkcdv6{z%+%0k{?pT$Hgm<%vRo7kgqejm$WSk@pk~*J#E3U}J z!ue;T8uH2vwE9BJuNdTES>(9eT#8EKx&u_&%aUYoW6qGT<utHon<w-NV?Z&QWVS1% zR_B{t#Dj91BKbC*@4;j(Ij(@bK-DS5O%_Xe{4zM-<}{u>_Pc%rCUK-JJC@i^Sd@U) zbCOY+xV<*7-?jSWos}t>;{E72q}r)Xl(kVAHZ$}qC{2(Co(dFxgvUtdsn<7lmE*K4 zMqfr_s2{AFkud<>;fc(qieBxyrJSTM9uztA&!!iX2C@3}phtK9!HsMtD!K-xPE9`( zIEb=-0d*%Si!{AZS$y^CRBU<93Ca=PE#!6YUC-^^Q7aH8PHlM)>=0Gn&C9jpoV#^w z9{EDgC2t=2T+*9YchGWb=uayUVr~`2ywgFBf(NQZA+!gG1o8H?Vi4;vaF<_HC!(|K z?9OPxRV$)}2?$uo_)5gA6axRkQBjOt*9h^(_ki%ZnsGpNTr2NPibLfZ6GVQk@h6By zQq@6u0?kQP^3<B`d7;GchuZT+Jz(_DS9Fjw`0i^Ag52_xeM%c=BNnOre9c4G!Hvqb zVs)>Jx^2I1yQXeiwA=REZQFL+@wy_ilGkqAw(F+P4V<eLi8(T0#RO83oi-}cZr0aw zZS2XWQhER{xr46E>ixIv=v!@*Kd-7RM36*Gr*kX(b1VFFEBv?>{;k`0HotW5(PKdW z@zx!-7Jhtl>mJ~bR{5Xn_xlYU!{CMyq%hwXhSuyG!(MvbR9l`rdp6WY)X&FIJ|FeS zG^u0LXjSFeGUf#E%(6{mM+bax(ts3GaduUyK9rRqt3B3T(L-rt*Gal_?7XZB*8eyy zis5c?qFy_CSQTnjDT^@L@E9ZQC>J-+))v+C9uUfzNmnZaC0BM)WJHO)==OWv5|<y2 zvDG;*&9h;_zD!s)H7Oc$j1z?#VJ2plG)6FTl-dXJQ3X(?%-@%ymstv?RtgFkRAJ4t z)LcC2Sfso@iHCSr&9)(!5~>xK$}1~NPEa6OXvvBD<9zY#^m$HFZlg39yj`oFz!3~{ zLiyI60E$zhF)$w#7D-JJ8VsFF$etFaGMvY{3Rda@o5mx4@Udw+!)niy=ybG2+|yh! z0bcNBOoF|hw7pQk#Snw}HYWSK-DZ1jHEmyl|K3?mSF?*PUwcGwZdTWLr`3=-rk7&2 z(CcKy`ayRJR3rtsGNm4jJRbzog=V%i5wxG9;N8m`3#|vdE}>a9Dhv);@?m#4=o{B| zYt`+|(WR(S_Bsl_HtrV4rRxb^s;;WFl+z8Y(CABTe&$?lb2dZq;?uwU?VtSDZ@m2N zufP1`KNRvD#%$ag-Goi<shThr%*QaGtMJE-jU!kk$nkx&UOz+1B<0r7iEv(Y`lOiZ zXy4PdH&6&P(}fJxO+bOchz)}JrVK7PFFBPV{K`Q-guQLWTafd*#JQ>5t_Ut5_(P;a z>LP7C{b^#TVhe{Dnl0-!ji5;zhl)=zlB^10eYq2V2*md-Ww?$Ebr3`{MJ8_iKPWJe z_WZCxqPQlR>*V8Mx2H_zV=iG9T$+fsD?I`$9l%t1g_JUzuYC!J&gZV*%_b*q*v9~Q zeZ8?OS3i@8z}%;R=&DS{dz2_~a42}RXwRbW;vwE6DvJMBi)29rRn-x+8{9e`J)9IU z6Q{FgV>sBG{(K|QI^*RLU#gLdBBG8ii$gkCe4Jn{d8s&HwiV=Df)l{r9y8|MSpbD@ z>Np*Us|r)N5^g|;%VBW;V8UZ0Z*}=r(yCoSQFd=I!W&eTaf1vkIG2T9uvR#9GS=z! zk#Jz6a>rRHFshr(?YtZ{ejc`Yd1JKBk1Knp`m-A18K|zF4c5e6U^Dx0WF%0Hh!I<* zAH*w=RNPP_zblPtkbei|i2kQ7J`}>1OIS)+m<t2*jeLYjWsdRImy-DMg6cV}n3Z#! zhL5tSbdx9a<%tpu!o+H4i5N^QO!_^Y#o1|JW%-mIuYxCr>O_;lqGHN_mc7P{TQBw# zf2QA%TaD*_8G0m9hg`qEx&4-)HX@LeQI`+eel!=ouH8kf;aHnqhL3!*FKnSBzM?D{ z6dn?3+_%duNW#9mr@4~7D(t+CKvn`h>d*K%EgPYaEq#MUzkIW8Pdrq$owsg<k4>SE zrL68CrS@ZSXgSKyb!+FkwR7ECt!~Xzk9|1EkL$E!13Em$o%9{=chB?BI}tdig1Usi zj^B~PoK?%H;p_R4WM92;O2mUC+<bVqrg7*ko5Z}9M(w^yv|h3L%Ni68=k(c0JG@xy z@m)KPgUUm->*Wg<kt*!lrm!9IOfNIo74;0GdsPLuU?E%yAzqzBVAIoPwP^A)xFjZU z1ahQ_395A`>y<%8Lh3qq@`1U)5gkc|@{R0A34fHP_K#>kI4hP6)r5{+51Kg}AY9MY zFjfp0cnl!XyA}P&F!&z&bwcC=_pA4_&t_{?@qwe$G*gx8=8&7Vo7>XUay?8BDw2Pj zyK0;^oS)H5scg{SSc*)wEFPmJmQh-Azm}Vak`FgJ3bQ`)@SfG5boUcj0<g?-3IxYF z8P!_}B|pTBj-0*mP#J5Mc4r@=rl0CjVir2tP~ad512=pMLPrU}`V<<14%~c2FfGt7 zblmOR#LQ1~=h)R94Oj%Cu9Sxb9QTu^0HL+2EqkhJa>nuUHf(;Md_tNrN2nw>D9yhY zw@PfJ@rW&Id~4#X#Dc24i6=u-ITDJ{J4g8I!m%u>4YVYzR|tl^<CrKz>q+<680;EL zTO^$hazx0I)s7RM#uCzBS*AZYdnxk06I>`V%blc%xKjvjpXDQz<7mwVVAT1^7S@!) zWKKa$kgP-*ve`O64V<3_&QAkXrvVk-OD%u8kN!d!gKBhixQlKW1#HspcXT<VD~-rU z<vYlq%_q)z$UEG6LJCRzcIw0mQ!Lu5MO^mGdyx4J+jy#29=x-1Py;|Jt%2RXRab*- zhG&TkmL~u1D4)#MHQj0=*HuK|(K=m?jta*Wi&QJ3uvHC{!4+@BmSi-I=SzNU4K;3Q z#RugK8vFKuJwLw?^Aq*kt#04<Sxx7ah+`DGsaBVnkn<Z_FaVls?KHV~DNV90+lkgV zjRS)6!Fv~gS5a2jIpY-9ei80O*SF3MG26*hBADbb^Yp|y-}lb<z4Lv~-}lIDY%lM^ z!9F)RAkF&GYxK=_lib}Ca%j;0KdM#-KcSs#=pg{ouBz&3``x<dlIi&hJzt?UHlS>o z2mmo&0sNCGYezm0$`#8e#>4QCtQVl8<P%v%t5nOCn%`=bQJsyCI6Lzd;_HEh$PyP} z3kJuy)I<s?4~k=LlVw#M9c^*gP@Wk0NG>7z;j8%YG|$KQZ*Q1)Ck<ucKIpl&tL!Dx zxc_!`F}-*xdpo(mnq5lUs~;|}W@`smvv-pF?_ABUm^aJx3d>wseb#o%=r>%Zy#^rH z*0M_<!pqAC?TcAExqtB@!Ghm!W0^}=v$pv8_S@NIQDwP(QGvPG&f3r3$=0aI+u|pE zz4Uf=<ypI(U6qYozDiK9s7CN-0>9r@t=Kxy3Q%cfCHV-r-w4>x{s>s|I+D@GuGSte zjr*4`XKP5QtGza0vYKAR9soJ;U-++FRzH^2i=@OSe7mgPZeP9#2q1{m0Q)$(e;J8- zxg7`FTZLb5`>=b<RM>AIxp@hP^D+=Jz4Q*0xD5Sg=-AF>pw7j&v-Yr^U0x=-Us=W0 z04sQPWf^J=@qKy;3SUjzSBJ|`KZCJYgPCy!Dqcar*;V`(+Jg_!%H<TOc_kSxUxt3s zFtllK*Rpr+T}2$I!FEbR0Bv1L*I=3q@x?^|1hWFi3Sp$}cd|?H;R=oA8X^MY1g&GK zOVAH^#QwqK8q{oaO&H~?*yT22a0T$cGF%26fi7!vhgZ2%HSV`*JXQ(!w^R6a<wI!t z{WWMEM(Ldte=r6>#f!GUrOSvQRl0Nurtjr<vbL>7zeF`Gl5iPSaSiAFDi8ve&ZQLA z(h%1ZEh8LipcKsQD=>raUok~h$$M95fn24T4Y*L@_o1Cj3w8Ue*zJq&0G2c`KtSmC z8ZM-@XMoui98DzrhZon>*GpHji~M~V2L-2bd+mJ~xOcDu{%b4HSFFI_u>wq$HJS|2 z)r-qlb&sJiU~v_u)71~#Yr5D)CdtK=%PpI7Dfaq9fIPpK$Of^Kmx$4P*gk-Na4xT6 zPY-yKUDQuVH&qVD1`$cyFxj46!8t}t$Nq%1h$SzrN|2XU69W{!Sg5M30t;tZnC4dx zpdVMCL1(YLzt;W`-+Vl`L&VRqM{8?o8(8)bAj6Vt)A(GaSNGr(v;zZr343`Zd*{PT z*_vXHYp{yo2Qy$?Z|2wAt2n7u>Gv<cP5lP|YcLCd-(FEA>`(l738w<g;42n9^!FVB z-~OcPrUJFlsOhab97BO8xKBMvlP8K3<0GwF{qR+Mz@f%}i9%0!#~e)2{zb%4zemyt zzHXT;j_B}Fym=A!UEYo9_mp>gXq|p$@>b394OK^j`*9IQ!Or+jGr4A7SZ&uCpt+d| zoPha4tT5)QI_%@?iJvdEV$$F$xHWJBkDITNl3Sk16JBU&4+jxWL3hK%+mp8iGN!TC zy?H{LZrLK{Nn#Q;O)Ivll*54+<IM)n3s|Hml{rbzr=CZ$QxlUofarz6hK{`G-qXM) zEDUL6Gi8ue7YX$xx`M?*&k*b7Ei(6!Xc&QJC|+0HkkpN%3Dq0<;rO6i4$4MCiY_>M z4#T{Dc)tV0*6U%PNmM$kLC$%729P!tCM1W>DX2jl+5tnER}Yw28>*n^gnoGTfkq2a zxBU(l+3}Ug1N#ZjC6O9|`LgRFP5@k@6{8+rmpU|aZyF`G4(HI6d|by%+(Ke`V5j|w z<oV-2Qqh*Q*B!Za0D|NWBaCepz2U{2YN&dThMs}_BcD9$4of!!hP-wEEH}x$;_wg- z!0WoJsc*r46JL`r9Gm?Xd-TI|`tg!D7+09c<$(#-@%+pk2(sz8*gnl?b@%0=gJZ;~ zbsj?!Oex?HmX$QcWW=1;`0ySF0#b}75=B^8%r1sSvx+w&r_%0p>*9T@0$l^ADzvEM z>n>E0=JJWS>bZ9RTz7b`JFLCczTsynf;m2;OE|Nv9tw}>rgV>fvwgn6&KKDE0;^bH zD@k+h(ig6*;{VaNx24h+ZhhtMeT<p9_2Bm7Tbo}6!S9_bm(cfj)mky!?80HI-<>Qa z^z&y>9tH6juhH}?&tIsgYOt2x`4ua!)%lK5N30;~_JtfZ9uRXdGO$Lp>9kmLzwlTe zE}ROapx3ahR=@^g5(HQ`ji!!Gz6NN5Rtyf=Y@I?@pnoSS=_%5K4Mwq&e4uAIt~iQB ziO#kdCkI0_FL7*x=`8~c-Epf7Yjv9A=OeP~(T!?p5r3Up99%nFia@O59L|BygfvkR z12{y|g<y!ooy5b7XjP2@6bx$L%!fl2qhJ9L<#80i`#JLC#ULC65Vj@*vI$wBc0ole zO`ZYR9Xv(d>dv<IzMSVzeJ|Dgq>Hg*mqd=9RZ4ZzolMcicpEpqnf%<ApYIpqvv3vX zr0;B0=3Z?D7%kMzJ*P@tcM~#;#jP^#kgG4;K2gYV`M$iD)9AZ?@)|W|?=!Pzal-=E zZi3mXk{KNCfP3s`uuR%lFRkixld5#+S2_fl;UHzt(#C4Lk-&c1Xs>zI`hK-O<wLQx zU<YelgnyfG+U9WkEe`@ljJP{BX5<)un<B~2nypNI;B;L*7IV}#+=IEC(B^y$bXQHT zVtZHI29P<d)88;R4#)0C7F#G-yfqh0X7FeE{{7{C-^Ue8nPA~GJ_QYh35pO*DTM5E z9<1p2FZDSrKFotM#|m7+^W>j#yiOv|9T?KD!iYBgLWiQzeH=oVxo^p&6IkFdc{gdV z;@NSv0bdVc-5h#w`T`DNB+LWpn+u{3Ao@Ot?#ux)bCBh)_q)@Bth-w_oA~>!<n3gc z*Hy3>F;MX5leZ-Zy&9aeEX<~vd*Vj>clQm<TF;Q4W+5hhbCnS^b#xCN!7tyr)SW-r zgT^wGR6hj`O%=!>mZIgd5Au`ggIkD_J7?0waX`jf_7UovSKYY1BT^EqRz=rU<kb^X z&$WmTxSE#eWJPlzUNu89$?1XgD%G@c=Md0i6dA!flr&ki(cuE#fHB4l-FQpv%$eTI zn++KCd)?i9*l4lNRM%_x4%%u*Gx|iKXXP(p4ZPQ(9XqU~S|4b)<%aLYoY~4e#C`{j zm|}oSNk_T1p$jFwQ%>PB@&YbWWS*q~U_fU49vW_Y<;fD4Vjee+5jhn74oIeGcv)nT zLvIg0&SM1A-=NpZRl-YoOLtTc*%>IPf1^0LCkptL5%>ezLv39>cBnl&fFB<NZ|n|H zf7YR{rpenoz{5Ikr%V!=^F-;@JF98Zc0#!h`aup3N;9N7x6LP?yl>v5308?kw2&R{ zC?a>D@D3UIsp|9sHW|@DdbLrb&GSZ&m8wA^pJNs)mFpzUI-k`YD8W&cVL7tdilu6% zK~RSV%CUP*h_#%vhR2TrVal$j2F2EA7=R0}G6F7<uQ?s?Mr7sHM!<%HpMzeUak~hr zILwsg&ijDzmyf1JqdKk!91i5PTHWy(7scc;-`nCu6~u?aTuCT$({4%O_?q~Xa_GMn z#T!Slta$>0RVx`60~4F1(%I6A#N?wPCE_mq6_nd8iecUzohF^$5Tv|oc;&T&p$k!7 zB(@d^(FFRG5ptb8p@B!mLwxV&-ANMy@7$fKz&4!x0z=WN+(`J38~m2)0uM4H*Hmxx z&7LnmN$&3LkKI;0E^+h-E3!7_gc(83r1awYb`JJP8VC8B;p+4EgYJVgfxmVffrEPi z{kh<$1K@UOW?a{Skm-m<@0PrrI8OO@RdHB^{Nk-p#WOdRfJHdE81xP(XwsLd!|^-F z&`N-aY_c7{OB9Sh-)Uv4nircY+>CJX41m`(s(KLKq#IV6od8h?|1a2e{g!=PN!HT3 z>L{=3?tQ_o{I~2QKyU!aZ7~d~+*zu@GiazDRS(VM#c<U4MNZ(BQAtijdUegX7UoLI zGFE|*9K^C0UB+g{aF`5LdQ_k)OfngI?MSm?-BOor#axvR1!^i!3ksxf?B2$Fs%R?Y zKF8iGjwTgs+u_oRJrfKJ;5{f^<wZTKuIJTSX{wD`<1E`(uT^ktvX`QfQzR7(->Eb2 ztcmw3u#mS8x~PT>MT(PkZU?EctQS8__GSNg(26hBnXccK^$!-VucW%_cEc)K%ByZ` z$@5opDUzcRgF@T;HXW`<xS1eOJ>L?PsAf-olatye-})&ux%--$eCrHNz9z!fHMvx! zt~e8i&F3(XI)3W1fW99sL$JjtKlQfsuW04d-moYp&1OI?-nVdJY3g~3GzI9ZQ9x}E z&`bb2hybdP-hu=ZuO>qn!3C*vV}{#sxjE{iN)CIFGC`J;wu*IFn>V2z*jG{}N&qYt z^<*$Q$R~s8t)k}zXQg=r9C>hp*DaLxq}eaj{CaaOO&Wq_H(F-~jh9e0z{TDi18#IG z!EE;2XuOj~hs4AbBcQlJHhnEk)x|?NQ-n%|J~aG8giZh9%_4nlne5Y{WwNiVP-#ZB zgNXoYK$X9=uXA}srv?IC`QQF+|M{iUH&?Q0UQQ8i07RkQ0cfZmU2Vhv8)>3`w%3*~ zwi|OB==|H2PnLJ!v7N5@t%XT*={hKKf`STRt`x2M!xUj8(f8?K<S2Yq5ma!pe%-ur zHSVz#zA*3t7p>(r5YlAXPx5X^#`wqs8_gr<&Dls-N5_g$!=b7^NKN@98y=E08*sVU z;aD7-lIvLAob{qOWD^V>UOKwMkUgonUcqv>GtoOZZ|!<JlR5^|-<`(VYWr<7ebq1c z|2sMk^A{2mQI^x>@FOa(rU&`V$z-Z}Wg~xA?0CiQM=sN-y4PlM%lk?_g5d$nSrQ7} zR=P;J_D*Xlb}A&Mqq^i?OKA9dz%`ush$|35ipNE#!!x#Jy=AYNc!PFYg-tooDY&MS z%VFKsn!3EROHIm69Ur^bE%S9Jx;+~aQ_SCTR??vh;C@_;@}yfPZ{U4X^7HU(J=r{j z&8*j5c~ne*!xV2g`8l3Ec_M!rMka4=+Lzvb=Tdu(jA2%xQx~tmKVP88`0&qKcDc3T z!%*S7tAK<RnA)XFZUto}F%)tr%7}`uj${;ejusByr5^(!_A#F>Wpz+7#^CsPYx@zV z-Nkgh<w0>Y>;o-M;6$6n&eNu6&cJ$#HDXd&>cP=r&84W~@3x?sXqDHf@}A6T<t;sP zmy@<jXEdGL9l-49bvafUswhC<R=4$K!I7iUz>TcLoNU&(2)+9_R2EyT{Y6OKAMB4r zxA_tj5Odej^#t#N(Eww)?XK111GK%XZ&zzgYg%Yw5NJf@dU&x(_EU;r*QivOx$?}! z_VoBm(OWYq_$w%H8MdGCmG%`B{oig?DHRQ)doNjLu&@NyRSU}wH!(#~Uh`RCy{3YS zud5L6h?^@(7*adpgu4$A(bi4x+>bdr7MM+LDIA$~^{@MldZ{`a_#@mQiw@V_K+$bo zKX|wC$Mj7OfLmZF3((S>EpV<iwmZ8s-7cFel2Q^!S?kFc6)N<7hMop!&~j{Tpu&RK zNMed5!tg0BsC4>p{OYgm%&{D@l0<NrbCO>uVv~hL637?kSW<l%9Tfp}@2@A`y|XiB zpL}9Vl3jzkDbN=Le3OCoTDA53yKMzUHa>KrRGg+omgfj-fF@byFpVQ$fgyNXvown^ znuqw;4biQMs#s~cY7_Cx_F3%?_?*?~g4{oh*{C)61k94qnp6~!)dK6zirPUr34|?2 zE4{;{UzonJMKe>Cl)1)dRG762*pBh6Kgsn+H9iZO=!)AvfnGMokRkd_q!43FX=(-| zAiy>Yi1u3AdLRaU<iu&suv7fOcl>j|D*Ftt;YLe&$!VHJlBnDrA!|u&RVCHB3Szgh znhsJ*@+fZV9R+6tM9?~Bp5LJay5Z*W6sn)*VLm-5`V`R3j^Z9>BA%H0>~Oy6_$^#8 z^X#u}9$}Mo+?EwD)j$$pq{=pl(w@D!@d&G*Crf@pWWT!1fL>D>@2NMI96}n@t}&xW zT-3XcCErd{QA@)>D|D|N9g|hN!#FGQrd=B6jxgtrFz1di6;Y~gdOXNYJ(_XC1uw^f z@6RFi<`qHvVdbvqYAd?UNJ=%ayq$z{m6=CB9>Ni3h&cmg#y)XNHO%+m)bY-$%sM(= zPp+(rOE7Jy1Qq3L*psZOU!pHb%;!S+GDv$sw>F)sfmfo44ci%Bfx<CJCXXy(*r)df zqu~12k9#E}*60+Kp$VEw9QnD`)zwDjb#6P223Nq`o5gU@Z&V#&-M*129(4w)=P+p| z-N|4$gSmEuTvmrau#$qdOkEEy!4=YbdwbDznDMllZmP`B^?JQV6{;jEPhl#1#MhR) zb+q?|6m}O-3Nm^8lgfRXj($zPN|4d(`P#7@@SJW?0gnQQ-O2s{KVDw_Jcq@B2V|gn z%DSgp*g5ZaG1gB$YQ(dU($uIT6wlWPrRc+%Y4w?Ud^v>2#sSDKaZ!6pg26sQ<RXno z-4P%n!wk%!7jMI4i{NI&U6`2YFcYICzCSZ5foH*tpH7QI>U%=6Km}Ptd^JrkuD(hq zacTMWM$<dpLs;%Oh}}`SjPl@Kq|}#{IY?u-820l?q=e?X^V1f_GivxbestC{)L*Jy zOvvIe9Fy)=nEhff8Xrv`DiRvAabst!?8FP5c+J#xw$H3Qf_->XBvxr4b`3Ydid|Hg zJ#BN;e?Y-ufDE#&H`}Hs5!}w2r-hmd?}l{?F{;e#nE?5!9dt6=6*8&ash3t_E+k6Q zfU2cqkx#;ucDbeRTR?R){YC_LxuEa3^*85kvl;~I4y-}8e%cAbnn+v!%G+~cL>)7^ zKDDPljvb~Dz>JHbz5BtlyRLaSr>>;5lbir0pC(U8PI!WRb{F%QJVB20gv81x#CM*g z;r65NR(3(2hvN|*VL(<=w^QiEM;7HW4=N>eVX@B3V2Lui+~XKBrrt2P=~8$&!E=;* zNl`*2n7_RviZ0ZIS&=5(bzkjZ=t-ZE!lCJVl^MON5;LSXpImrG+d}hM%wai!Q<)D) zh2tqsfOK|z*Tu69Bz1n!JwNE4A9Sk@y7#vpJbM4}quXD3WSp07Kah5hji2pO7~wnl zF8*`h331if98dV|4FCDrBPlP!&mq3uJle;9wlV0i{kX+}iXRlu@Sj_`I;W^xuA43n zKl<)3y!^wjW5FMN{~P-0yT3+Hw$zJ1_ybewTk7e>*Z#sQ^`r0pd-LtT>GI$EBOlgp z{Gu-P8^36q#~+LVV`~CMe);z8pNo*Ou}$Q`zaHUVUp7y7h$ao$-^R<|{WI>_FQ~4n zep1VS@CT}As#^_ie17i78odO_&nqN2(;1xX^GaiC6VIMD9dfa%#P%$XuQ0P(9PI8K zu;yfm+=I?ta{yXDRk9wN50{N(&j|fth;*2ua89TZN8;X}6i3G1i+%{nk$$UmXq&@f z;H6%r;0|=rt}Tsky(RA+Z?V&rhMYOqkKXOOapaYyIkbg?sy5(7IspyIThXJDX*=ak zdpYt{Wz-Or$sw9%fPjU974T>nuY$6L?-j#gfw|GlP((2xAT{lCuOfIzAQ&{@5iG^e z3Ww%u4A4Tg@m}<dSUBgU6*YNjJ)kCwC%ZFJH4{4+H2<D&@#*OtLg5XzOlq?Gv1mLC zIevTQN5|egHBn%Kk_VBJ+D%uwp~9?d6296>2}vQYmt7;6LGrFFrcE^cLT=N>wsinU zn3n787d6z?{x}AR_2_AK26za<TX%po+z6B_XapmsfoqA_({^wKD%81_Rn9w}15X+) zAUt&91(eRVJdS_X?l$GYQY;meuOFsZn6Oi-b5}%1T(XKboQkei*tbq*h7Iz46Dby2 zRE8_h(TdCEM{H`b#pkYZe}^ga;hx%HUc>f5Q3bT}ecs|UYW>Vq;bnSH{|pyjaU26E zVPToTKwpN4aPhMNAObF`WgBJX;C|e#`{+p<wPhYkFfP`@Qr_brRg7kJ!`jZXe{Ynl zB!jo!@(=kiEg2PSYcK88{JBit4e<~tQpxXeEZ4kQa6}u_#s6{`m<tB{M_Kb2yhDcq zZNS5>1Ch`@t+)e175dfDTr3%*oH`r~V%=4gHtXAh4Z<36j=bSsFzuB2OC|nZpIsQ- zng>E|7vzC0c8r)ShFKyETP<w{y|uRm3lC!sd8~_L@G#f%fifJuFc~|3c4Gk8vb(Xe z>Xp(aE+_4spdsWm|K{H)AedEm8#xRz3k4+g7>O%HsafIP1@gID9<rAF_Lw)g?HS_T z?(gTNng%W<Qp@2C>8cToU=^IxJ}YLsua2462GJ-~O``6U6|I18X$&ewyMaGqv}xa< zk{GX<K{`xMnp92{UBnB+Gw7cHr0V!L7*x;mSunlP8ZbH@qY{b_@yS6Kw&u_yc!HSf z_$lJYve@NTlC=$4p)D)uA8+{;0xzGk>O?@>tq@9_X;C#2;eh+X$heph5m=UdSPbc> zCr^I7#uf+*$(LG<Ahiy0(ND>AE~4=eGggjM2v?q*_^z1x1cQt|Cv-6`u&H2*HKLuv zAAJhG!l6p-o^|`&Qk1E8c51{BIM5_-8$l!38K#HhTUDnS6Hg&c1`+?k+CvP&rMhNo z@))~X*lVcn!m@C-#bv>f7pB9Fd4*9}Fcmu03%;>Cq+s#WNrkheT4UUV$N3(cJ7;wV zF4Df}FLZf}x15r^I@<zFHdBzX<3Je=<mBc{mFYEoe>5I$qaHesG+F5a8E;!-->7X6 zjT7tOYl2acOj#xPgqtbNi@pg~Y3wBh(c0klP_cM>Jkq8CsWJp`=&I)&Pm^dcH8QT? zkZsz&0`H`7TW#!kHu<_OCXXuQ6URmjxTa9r2(3B%20^-L?8NTn%w4M6HcBEDEu))$ z*z#P6Btle!e0`mHu1r4SM2n*C?)}A-IiDBUF+w1;eqN-P1|+#GJ-qAg!>9AyhYG%< zSyyn<3ey!8_9L=+h5H{)_DweXVG>7`ELiG8Wx3~;ZtqkXx>ap?xB{i7LhC|bQCZ={ zX4OVPHA)3jrr|rnTri)M%77FFah6m$X?RXS`yMcU-|%<>j9FMz4`hfSd<oZ0Y30fb zk!=Ro2<|g9Pb<;3d$z0E@P0}`H}w=9FmXJY_oRmoIOZz{UQs{W__O8Ce;PusPTQ^1 z)^$FUaIHvhG%H^68?<cgob-&4kHRptyyKfrB3E`xwt+J7(riH6@yo$tgD!hzC#;R^ z$mUf+xx8G5C)n;HisYF$h2C=Y3+Q<DR#3;EV+uC?6KY`yPUXZBJH0>8&8I*cH`b<O z&ntZ&CB9WokQTi(Zm@_Cl@wKBrHm(?D{@7Jo`4x4UsHz_x@dWhXOoMor-BWX`4m5~ zI#bulh+n6cVrlYxN<30wbt=LGm`Z@oM8&145OYiesh$5Y&B`4|%rO#9{7j=^c!!$D zhx#(AMz&Hi)u6mdn|Qr+6-ZCXwSbS|w`ZIBBQiUW2N_X()#FYx^QG;JUlp9hUl#}g z<$Wzjg!)g_&A6+y!dZzkwMxuT>|mqc7+^~cB{x=kQ@i4lQw-^L@~VBaC>##@eJ2Iu zXY8Dz8p~G;IEqIlsgw2OB%Kqm+?R~PubxE2y`C=s@tGgZZj5oWl!wfnZjC@xD+O6I z^BOV877E1-`|UFbLW;>!21OT~`r^w%Mso7Y*NIMkSt&ck*oR-9-Us^+OzXpk6%vsz z_Ur@^own&D-BjId#dcFBj5Vg}sF&Ha_|kZsPi}TGoWKqqD>~Joepu`wLfBPf#T}>r zCxdbk5y`c6k3wHo-`0ck6K9HLwt!NcBKkGU<XUqSLYD9(^$2mZR#Sv~v|F<?*a=VJ zk!!Q)bsSVaE5j2|&BTda;}PiKbagoH-~gf8sOgpG_ixGmp+1+iO#IOkqARYzq#Wii z0!I+@D+=KcCTQm^bBT6Hr+|q1EiSwflZ8L)_8M*$iM0ve?foKM`kCPLYmpp|_wNgM zhmr5=$y;^b<D#H14!#bN(BaMt$c3~ov)^E7ULa*g15gW%c6jTgM)$J0N_N8lVHM(< zk<{F*y_F^nris=@g_p|XV`Y#uUx2I<8?8-!r2rYoTdoKhNGxZOB3(|nt-{{Lgqv5B zI9;g>9-6up9rmZC5)&x*hLAUCI@pRzmWnC~Y9vHg`kjkQJA#X$x<Ez=t)v=vr1^i< zGMx>W;@Q@{2CbHMu&j~hZ1xmimeXH8gCzHgc6cnHx$RepXI3V1%g+-P-O_PEF~~q8 z@09%PMz1c+8H?^$ljU@X%;<$z7(~jm5NVpQHuS-dprcF$tMbBhDhwObN;}4#n52kl zvmWLX<gb|j+~dccIkM+YE4%}#I}I*QFqddDNx(ADO{%gY@rzm!GfUIu<(eCW*LdHl z0@l8UyUvU^zm1566teSyZxrPw2ScgTT}?U}m=8{G<P|c`*@YYpP|G-a;Ts7@%cpo< zTP@~P2pAEmA|g=ua!y>#(M^O>4trysdzYPimz{f;RVM8I85&eAXJj9h^s;+2g)JlL zpB!-R?(;=-zKG5jQ8Xzxo27Yfetb-D{rskbDV%fFNrtn(VX<}CQLFr=F{;MtyjVhj z!;ilE3qSt;e|hmge(A+;{YhPnAuRg+Z$yf&oAj|&5j}X<Z!{cWpZ@LFe)50)!^_|N zvrqr-uRs0af0v(zgV9qzJ_k1c_g{PYt-pNvjb9`;hfk7S7>TF05%MQTQs8URR(Z5* z5m*odsPjrlU|T*OvbI)eB>&H!YiksI;zPYG2yb;H(|`WK*H2#j(KlcI$*=zN55Do@ zH-7s^Km3jH$v^+#*SvU7?ohEQ0m9a2bbMB=S2r}PZHO-0y>L-4|LSjEeDAMc{N?w4 z^22XB2v86JAdoh?F{+DCqImq|@4x-&cmDL{pM3A-Z+wRXzWn(2e;F|N@ejZA;_H9< z@^}8?<+uOx#ozroH}vU0ej9)OR-|2_HNdeGpJb^QfBZ{7{)4}%!<y*#i6!4BM%z@0 zHAbxQF#geZe_dkyqwoG7ag1-kxs$DJ32F0rx7&M);wrKSj!iS!-|aS6Q~F=an_Vz+ zKl#t!{`4Qd_wqme%1{3DAAb64|8uD(c2srUAAkQJUwr3>&LsE-_w+~K{r)OUlb65y zCtOm_4kvWgY7F{|U-=qT`}FVrC<gk)H-Gu%?|kpYH~)hv1&v*X&kmg5{IeIo^}8>B z`>%fd_rLt&>%a2i>;LW3@BG7y@BBW}`M3TW$@_PIZkzb#H+rQt6CUG6KiYTWED;0z z`xn3VmyF?$zyE&&20!`Tzxm1Uf2*SZ?Nx~rdX0S%b<%AaZcQJBd?PL!{iprTStAFT z;6xWMUUVWbd3>%u;#jxaZB(3fRuXhDU%=_y*^EM$X!=~?5A9}1sBw8FeVB#x88l+G zUf0jmov!2J<~FOecBYiCvXW%4g&+$?ZZQ?x3TkuHoBHn4ucSFgMLqpF+TiV>bLNj3 zAvy>9=clPht+c{QaXpGmqZPMSyfYYrtl>hYxc2adSXQ&;8T%*CK`ul=^G0!^L>&({ zDlpos)p>ofHJxaeNWoc>fztwyAeD??1IACONrHLFBO93+k6w|=!KA7tv}&b}vH>)Y zxY0Cvnm`#l+~T#S*KNi7sz%k*&eM+i+J_OPw8)6y>&S3alvZDyHKHa(2`4U6+FigB z8<N>R@=GW%9v8z`KFd<Ti&3-DgA>zJC!Tif&iZ&T>KDgZG0sN>Fijed8<8Pl;j`g; z1D>{G_e2yoig6AUwx)ZphNA*og{Bdc=U^H!Xk*f~f{{R92wTeF@8$xzi#dADib>#9 ziKl<tTgo*w$!%P(5k~c#&dBK}i|i|kgK)zU2I5RrI=1l{ESQ8f`PpT?>{$6do7VYF zMQOEkWpREL!|a1trg7IUR=`f9Ghl8?bm_rgl@?v`27l5h`K=-DN}R#n>{B8aia*I0 zr@P&fwFdes%M&m3z8Z<l&U-PPL!d07g4&2;#Lj*2KGVTD@xaf@At+G#rU`W$yYkog z<dfiw@<`YS3|j=aYxV-XRp%^FW4GvcnkmS`j0zn~%Xx^zT`26N`9S3~z9xTrQ#ZuP zc%^u)X$z%SXf9@e6K9PVr2G`);B}%G>~+zB)$T#@k+l%#^wMj-%5-yn8x`(K9wlcU zC4D9`XXM-_Yv%0SCg++@`Qsvge)36;nS$Co&??*Be5XlA&ZpEta3^NANHSLFrC^m3 z=5ek$gT&o8YLF62uH;7Bek&@cM9WDA`hoHuH#!IT@r(IXY<b;%R4D5tVs>>NbW3=f zkCNU2Uexwo@}6b4RNOvsCPB=Iu~ZaySDFnD)M?P+7hTYbakn>^&Kh#$sCu@C8-BQq zJ@tz(QPzjbDQj|E+x_??S=N2+T-=FD;<oTi6pp!msSVf@4$vt_RbmgFn&$N0><bK{ z+Ny-H7J)HYkFY(|4Smq<501)4YXQ$~zB+clkf6=Sgr%6g2y>k>)S`fLIQTfHF;T&J zmTJTHoL~2z-&CF7R8`(oc^NWv_L*(iTV~_@7GEx5HX1Z&`S}9miP%{YHW5`cX_P}u z@YzU?4{}V(NSZ~Bx6bRT3<q`Djq^2nzDCd2XkEbH&9B_uethfh{cUo+#|z;G#qRwW z|C;dT3s2A@>hED?4d`iS1C{^VN8@oZLBf!ITA6XOoUN@7ZZW)G7rvG-LDu>W%J@E{ zv{MSo=E<O>&<NT#gp({j=TH@=3>4YLlFY5RTNJ~*J31vx5yLVDB_+Nx7&T30%}Z2$ z%m{X}wbx`U(?pcJPN4u!4L&zHDc&2H?d^?(({9mB0>*_O&?XJ~oG9dvb_c`WQjjb% zdzbrj{gf-zl(=@9;Ax_C`g=!p(d#g0?87Wzw*fseU@cRwu6s=Hly67ry3254wK2?* z;R96)W8o_(>I)gqstN>{oPOwmj9pumFgI0cgh>?wm~u!Q3+f>X&?$Q~oH+5Ca2Vcf zYaB)1OiCn2;~Gn?i=Vf4Kf(hRKC&sH!DrneLx-U3_`V^=*7GB__53J#mkFXAnBYwq zPfw2kwB4b?osV{Qtedr@6nv>Yp=z>V(z{_(ktWs9rTS9~r*azKRnryemzW%qR9jA7 z7)rSa&9pPE({@8&bJSr0Ya9-qVzTWoBsG7Y&-t#&v~HNp0u{{QH8vNngU(dC5#l_H zR-z1ursm*ev6=%}i<2nMsdXyJud~vt!KSrO$**A$5&K(%!#CS#80@kE!_HISz6N>X z;M8TzwW3}O`gEu@vjjHf;yBUb7>R8q9nNvzKpiDJ8TQzuc9{25O8*VJ`}CkY#Zog0 zUPc!wdB1^k%Lj*B6MZimoT=hyOhK`<e6>I6jt>SsVyZCRP~gzZ98)<mE~*d;f)m~= z%i?I#%iYFsehx+pO>kJ=NW2G7Eup`d!55RPwmin3!;K@!^@FY#uZG3$_P>~um);i# z&p0zjKPRea7^!B8UHCt44k#_*$7ImY;`>5!7gOJ?D=J_I(q!vsO7HH$3I)Cg?_lnC zc2Zpb@bvsNx|`gikwXaO9m<^96r@T0ey2{4jMaO<)Gb~?^gT{2@2kEny56OI4}}cG z9uEdj^Vzx~TgFVC(qXPAym*qPDFVbZAC>&j%A%1WygrKbuDYqvmH<1EDeO89M#%4< zpKiqOB1vH!CytE4N8sb3Mt93%vfGs7&ZYeu&m0!+w7losM)nJ@JzEGvsk+&h1!b_E z=6F){KyuwCF^-UrT^6dO^cHY5vS|RTIf_t2Wg5coo7n9>h<GE}WxUKAlstpoFVQ#y zOuCUvG{2NX64W6r9*;l{o1R}nSgq;Db03tJSk*+M)sZGlr0XVn)oIX1j27Mk1oj>u z@Ut%iC7nr@pqjQdNNSX#8<&m^Q0=PfaJ?NI^QP?sj!@m*uy|IaRdwSOjLi{ebnI|& zaM_W&5dJ?x!|2S8$&}~0lg?Es=c<%yRSK=%wKZ5!ypA{MZMW=^pbr09VS8)LM>5uf zkYG*1-PTA;*&zNEqah41m!u&n^jChV<kMS&y}cZ>IQqgi&X!%u9yb{AxG7++L{C7P zgA67a91hAsKW`AE<YNHE61!Ht+Sfg;-Yr{LeY@}*FAs1=XpA3Dijx^m8#*fVx}`mN z_J&<FxK+oSO;h-qU~wR{a<+JLqDkHMjMb=-LS?c?H)W5`zO1xNP9h%_<C>d8|6_jI zm<LnVHaOy->*tL{u~G^lHm|=P!;Zw*FO%WaYlJ#x$KKZt7l-LKng>rqpwABnqwR5* zf;*h3hr#GW?4NmUex1%iMID$UC;-g+3_sE@IQR6oV4=lRb0<1C_aRQMl`js9-R>~b zhMIl2^!aIF3i=J1g|(t5_{uFg)2nD~&%M{&rLkc`8E9nSG3dE^Cvl`#EBcXI0&!_O zpA2%0=FkJ#a)VNinKhe%C_gQzU)S_Hgl!%c+EH(cw&bQ{n0V{U2RSivWKDu&l*vI+ zD)#4eOP$^XdDQ`5|K!v6naS(6BBqJ2d={g?DBhS!i*^T0M5vFB+_hlroM;rzv}Js} z1(?usvAYMb{|DU%xGU~qj@_Kkz?p+Rhx_h+XxYkoh1I5mx?n@D8u$$8#_)J38PP(R zIIL?vF7b(?{FyArj^losl(YbNm-F#|L<XwcqC`~(IP;Dz=Vgc?al-Hv$zsF_TD{3o z+Tb?D5kmlv9i@Zo5>cMbFZ|#ijaI8FGM3#ho&9qoS{MoJG0W`V9p#gmxiK!A@ib9~ zAoo5ZcM{#;TS-G}a;r74e$TwhtRQVwfauS!-}j7D_{`)45_0V6d?Dc)UaA<Pz=_uU z$PBllqEY&DBn3N>_#`SvKSblSN{hj<?^<CZ2-$+WvVbC+8s9}$s~&O;IHG&kbj2<+ zs=h$g3Yy-+J!5YBdfMF@99GZKx+PaNf7w4sP{6lHgJq^~K$SE|IG{=62?Z5*Ud_Cy zRE6#xl-P)d>>;wa{ZOl0HyfmK_G_Xk=>BBT=XKyt7KuOv|Mw7O4CHjOXiTYS>vSu8 z*5>)Hh@xBZC3RvhkYc!Sh&(vFxie-X%1rIVbTF{<Qsjnrz{NPNSA<wdKn7CltcHBV zWe$tijb`KuyN?kgE9l{IhER1@Nlmdl?;FW`4r}NQf!<ADT(925QEtV1Nz7diQVj@) z`-5lsNTn{tGpm34NKxU9`WLn`g)%cJGTIO2NcaA&7*DH2g${h<a6>z_Me<R9XFd#) zzvcpRO0nEw$biyQC^kXGFyNS`ie-o5nD)xtuEek&YN7IkCH(@u-UxHaf`~uHVh$2k zz}Kl|b+N$Om&HEQk<MzGv{(K3eU5O5rCbi9sh<X~b79Nu!4#sep9M$hfSR3#9aOw* z)kD{CRJU+m8iyteR<5SK9FXZ?!JXv7HFEU^rbi^rC?c2r-b&aNyj5}E1gE$Ms1Y4v zRIpuKzFCMj64AkN(2rVGP<=jaT$4Ccbk>b{aV6SgEHODMs*3Mf@}QW4B)@J>M0glv z?;NG`1MHqCKsZO9Buy1cjOpEICB?)CiggHEr$#tTt&B9ns6l4UH96`W4W_6N^?{;Z z5p`N6tGBuqWh21pYjaFbJe&^3r1XOdr0DHy4W1A92+nMHc*_+FW5$LGS-L~^&|(F6 zuXjW`K2p;GV;rM-vk$nLXZso2%otR+^C8+cXAXJr9LbrKnZxvxy$L{dsGj<;(L-)P zj!oU;r^nq%pQ+*w6+%XC4A5DjZD8BxeZabF!1|loji3w5q1fXIsL79d$7lIuZwSj1 zsrAG%w<qML7hvpkaa!o<nKXc(d>-e*c7e7I2i<2meujp95KlB6BW&vl);a7>p5ldQ z?*K16$4DLkBUYdW<gmskRBqhwvc?>GPS&qwu6+VAXwsk@cc;CB%^v&M(T;vR2yui# zndEqgD&Y}T<%9hJUX&=EKp?p|n5gt|D0(UCM7?pap1anWXH^|t;(UPzE5b^`(~Iic zmtZakrpOeBrA3YyYJpDk{bDjhl2K+<rTdN{r1_d;v*=ROo!sw^n{zvoy8TEKDTX+% z2u5CO&2@}=9_#i^HEr?ULNBl<av?p@w*a`<^a4t?7fuW$S>5R6K&ByfsSZZ4u1d80 zsa}6EnDdw9yfwHqXW}d}Iy9>8V0hycADdd!Jm{Uj`(c_EY_Dls^<Y4ya0hg&sjdaF z7lWp3BVOvdSOXGtg_IDDz57fm2kAzuDPDQXld-G8<KoWCR%O6lE8^?zf06^Y!x&LV z!@iz}Xpx9I;d~Eol36*CLBT2fL@5}K7+fUP(8@yXNq8B4cnBLQ&oT=P_QE%mDGJ6O z-Ot~koeW!i<B$!?U^h1Ks6^G_;q_>pSClzbnNJteEF<rA70Q?|Dk55+F&fHLXf?$# zAXIiXUFYhXNBVq5_lE52PcjVsmO>4iC?IP%%)B(&&SAwl>+oATHKwjsCv|Z4WZ>vc zMrZ+p8Sl}eQbLk)G0(b)8@N7UQPyLcnM$+W47q?V%L)#B$_~5ZTiQm~RgA@}m)rqU zN5eq{o8{t^%(LN_ZG<2xz=IDG^B@P!sLKj?(~56SRfG=BO`!0pBz!~>sVQZST?9RH z_H~y)R*;<33Ua%<XE+NvbFNq2I{sNw)QVl7svx&k3DWdCg@OwScYLi6g=r^;WiZMl z2z%mI5GwCBek%M2+3No?4ip=%_;8?{xlv8FRN9CA3lVQ`fKF~$ypn!FoU5M}8(&BR z?%hc(#_Kr>JN8tma{@(9vthsc9?`L(4Q(7WWn?>e7#S6#ym1Cfz>>Rj_bc~r%NLJ| zVz^tJkf@9X?^fe5LM0&D5^cgJHP}<3UQnD>{4m)?Z9GmC36M_pc=6h&=>Pbng<QrT zD&n?BK+LD(Nn!Mn42O@MBV~03!cLEEcTgTt(hCYl6mQ0<cz2ZS0p_U^dPw+Bb_e@O zKZgS!9g~$hwB#E=F@DQxtel{QbnHATi90d1KBuXaCP!230luFO#^${N{f4k|asp<O z$^lly8z7z?qLeU8)e-rS?DMGOZ*=?J@f3S2qy`mKMM5)*>^C$JHaJ7g2$>Ja9umbG z4#{qSum{H@RKpAb4;~s5n_zEnq69`AABLu=5fSOG(TS#67HsCH$&VJf<q;{K$pF%6 z+_~-X^{uXw-4n6`Zo$j#O*{jtc`fcI(WV3bz<%zwHn%{qkINb@H#)3ke2N_?ayxjt zOY+gytu6UmRBs&T-KTeWMzS>;L(_yUl;=L5@(+&omAE;}r<v2nLoM91Ad7_p^`~Ti zp|BU_x|VC+l0u&ui<smm#J<whxD`l$iesCNE6~vR%utXjCX<PFxaM{~+-th~(%qOF zofG&e-<xh7O*bkFkZo;k37AWf18ZGk1x+mDZ#Rhh+XefIOI^CYSD-qB9o7ZNtK}+K zxD?-4SYz0>K?yvakH8DmyvHQdigM_WJjcfj1$+n}D4H4&*Bub;8W7s%z@QIn`+~$u z|JH5P(N*5&PpSqmuB4OloW!MhVCfn$;P<NvteZna*99sX5@OAXrDsjmcqcd}+%E7( zj`f9cuWURo_+_pdd68vHHB>whlo;BsRj;AbSJ4z|_NM24>e|*;jd+a3F!QaOBa;7> zivQJ4D3|>qLJ~h-WOL@Epy&lO7Ewn*RrfuTz}9)mY}5ieZB>3g(<G@Fh~N&?^A8L9 zgk?HFksbGz&D#sS>4`R%#W1JTFmUK6F{@FtJj4KSVY<Lz{eMk0uch0g{=CLc7nsgV zpK;<kotbWq$CKh@a0q8?r7jXwByY$$4nv{8S~$O=etU{fU-Ni9u5PspT&v{aCde|h zZ(TGax-VlXn<hqBkTQ(MEx7gX+#QicC{$e5kNOVw6@{U*3PPl5GUcPLPzH&4ve5$b z!lGx0;7SJJR0(H?onY#U3I_CDL0L7xP4~?;zs@|U?H$<Q1&nq8wH-ih@5~M0YUZ;( zG+1C>CnN#gc>|o34zxRt&m8WFbkZCg;*qaAq5~TcHF*PB1cv?@P2bRmH#$s`6Buf` zl#@t~N2MjpSCo@Exgy!?)hFV96KWTwxkrZ+sJa~}XQSQ$oTc$luq4l~cqNV|KXlgP zlQCYs4|?c?4ER1B6~|DrOJ5}76pjKtW6)zngQRxpO4!`rb4((<ut#Gg`}#2NqH9r^ zH1E)De)n*UNv@{Hg)y(^8%cnO%7r84T!*SBa;(AyrChzpZ-;b-1K9+onl6=3Giwgu zq>7ONht_aDp-`QC-(Kp$0QxF5HMP=2S2TT9YEJB^4Cms?B*4A2r>j(~ZV`9@B$xoc z=vS6vhbB}N)fF%XD~H{a6*d<_KQQb!-Pk_O%>jRpUW*B#1|w67wG*C`H)eQ7m5k8N zS1-(nv~fBWjCC<sf|E+4C{s9U8AZtq2P4NOitXZ>@=S+HDS1VWg;QLmE~#)Tkj^Ft z8B@^-=P-ujIK<J=z;<VLNXT=7V`ybd(k_+T+T_I1u8m;>=P?L*98y%3Y-~6LK(=`= z=j5IaFvo(KZXxI+ny0t)`OUH+q>i?0f|~pjT1C`>ObvXA*c5yAn;yAFoJ}#yJ=8%T znfICCqAs>|5M(c}C#x!vA@Dwj^>Mz+lVFIuCrxp*psqqG*;V?fyV^Z*x~jj;>niO7 zQ2N!o+KzWszFDSxuYSkLBj1}hG*269Q?8~hHWAw<SH+g)?@z1IEpWBv??bqdSio9j z6&>fy6xl1+av#Os#DWrPBcr8c(~52~9859Tv*pIb6$LzD+OTUJuAU%*@8`oYoDosG zj@T)i2;QO)fQ3nTcK1-PTPoON#A(z66f{hQiM!ox)8)6^B3YezG@1^Etb0WUZTx?+ zbU8(B^l+9f#6q3R7QsK^*v;2RXJ?;FRTiAKitn@-zfln7!xI!uV%Ihyuuk@87}`i) zUR~W;hpDtXm`=LDv7fPR$^H>)80j*PN8YmB@g(mJ)CDc{m7<P5)bHF=iEcp6ZCR6& zb;77N&C4`d(~AJr!J6RY30>aN>5LEq7~?In`68aJ%YE`m;u>erQUu;Z3(o!0<}dBl zRXsp<{g=w_&7Spbd+#yRTTk9{4@23sxPvp%_C}bJ%&XpxRbNskb#HQtJ6JOv<dn2F z=kA1Y-s^+9K1@lMOHn80eQC{t0U{cj0y}a|fw?6)`E1)AenbZZ{Mp!vUa@(FynANp zSWD_E>03+p90!Aaw5lCX2C!LADXP;bQ69Rw20n+EcZxoBD4C{$4AvIHg}A9;lnxf2 z(TuQzZ(y|)464g$go(N`^fR?$8uz)_Mo-(`?C=fk7aQ?8CT{Lt`j+jyYw@P7<QFw| z3r~>eQ9#b4fSgAGnG*%1?L`3*Vf)k<6U1+W>)rBplm#+;+R({5W#<^f@sD}~3ZG`y zZsSDxtu<!);bZ;4-gEkw2#)9kX~kb8|FTiQPRx2{QcTHM!ZCoU%pw}e7W(meaw(1L zncwHViMFH>`LGDriY8QC6XD!A%eTtI>B7;$q%mcqJ|)xrUzR*9V6<_bt1xjghdp%v znM$-Ej0R3NZE#50mS_iO2xU}HEHw9+Z^6yZ0#2jj1GDOCb8iD(Q3f5Ux(IiATH5cp zZuIRsK8ow)Z0_|7X2Mi(*k_0G9G2>+L>Ayjq}EY(pxWw%bNTf%Haur@y+jy_)U;=# zxmhknCm+TGmoc;nY+wRA32ELa0;<L>HK(H8{7lUm8y=7dD0(Hc-$@R08daYr#wuBV zsBU8kmF{XGS_<NSW_q5fcj&nDzlfgX;Q~ZOuYx+Nir#CL=$RTsRqm^d39pSa4F@Vb zf!BB@T8kj*u7_YuNTn*w;z#*DUcH^E2_3jq+qAJ2mg$?*qs1sh=6LJLt@#(=zS~Ln zDb6oSx<mGKNw=h2YFb%NUo=&BC&kkoBO@*Xnz^Q$V&h@}f~B0+CR(f-DmBWK>TMD5 zyClVqXzw%bSp;ZL^G;#R3cKWVnERU(@_6OOm2~+;h^e#=w5Eo=cDm1s0czYqK7&nu zvFW5XV3heYJuDgvGm!|J6%=YHRM<j*@4_-24Op@!tpJ`UNK`VfZ=tsl{Htu7uglGT z0hC#b2Ll7R%WI#tRbd>B?wcq@gkZMulU874$!hYyBOq(?HR`W3<e=tl=tN~b>o6K@ z)7&Dv(;<CqQJbeC<+pTKMw!>86RvXPiOdc}$pY2|CD<G-R3kvu2|f^q0I1)!L+z`- zKvAJikmbpNELXM-z&orbto0%*57FaBNpr}8GKs+}gB_xcauh06V^N3{NupmA)F;)q zS`8vG3qRV+F{`u}$Fsr&b`nS6#hY}`{hpL`c#o%~_%K+V1DT;e&1V!|Jvn&{Q*`#Y zEkC-k#Hz!f3A|i~n!A`K4mx{7-~T+9F_1k}BCW+??iF(&owZYbGg^<rj!3mQyK&uO z(A@O4pQ-zJoOq;}s&;Uxf@fwHO*5WxXKc?8pU^QdQwx5_^PZV>k4+-cNe(A)IDmc7 zJ#JQb$Q<UdoYcW%bJU0BcbJ>mtS7KvsbAcM`QJ26)p%P(R}VF+4~rthL$2ZZ0mLi% zWGgsY&^vd(l6-FM@>M(Us6lqK(tR^^L%Z9v_OaqjOaNs6EG(~o*r3h+YO!>6ySLcN z9VpNpk|DvfL4K^<#!;LG?)I!}EYV9H^DA>Bk>{glZ?-coYvO_hIV=rAnQ1L>oeR8o z&<v1gl3pba`K-#HP^N2yFO|9S+KHA_T9#&~V`DyuP!2no{s3b@IH5Oo{H!5mMcNQF z-$!68xT(f;<2ZT6_P$~^WcCr61rY|&T9hsv(P047Ca~a677rxuX2z$#`P|9@u;s3L zCW&Z@L6?AoXBd{cJ2i@tIdD=Id2k0jZDmXGxMZHsKV?H<GXQ2((Zr%=PIQQ<omI|r z;<#gl=6}$UEhE#h#ViKoArVqv$I|lDajfg<nnY@StGjS;Ks9g#Li!X3K6)&G0Km z7uvL&Pi=U?NMKmM{=7hCc8?48Js&k(2#hw_t^_f2%LRkx)`jU~wx^VfOw6*Q;nM}m zPRBG7iR6M3D@D>zRajsf;FDC`B-(ocgtI6{IyA7oc6|J}|FI1kjF*{J;UTQ@%)Pu* z8BQ=TM#7HXWP7A<Y{Jw56>W1;PxHItmPS);<i|5+W~W9Zyq8(3xupqw+VnvRj+AI2 z=iup%j+j{;2RFQWqCD(&VC6;DMr1LbX+?<jR<{}!*Z^s6fB@!%lKSYVzn^caw@rWN zP`dZXYN=WZGGLuE^Hp@`3V!HRC8nqYFg+^h=+Ug>rf%)384%%y$j>cFC|sV6bQ#&v zS%TeW9zw;Mt;&dgA#hf>*F)Z-G9lQ7CyX<qRZ|8}bg0@#4Gf3NDJD-#y7I9xbGlNI zjuMRHipOD}hQs0*HzN+yGil(h*cfdPcLzfd0LZ3>-63g<a@^sp&Ti}HvR9eSAaT$j zZ0pl~C}N#$76VdWwmL(gjSWAFS~k{Ba=IZhiNcNeDQgG03L!G{gX6j}pOn+fG3sh5 zGz<;|GSn=&p`yizcC_(SKI#=mBi7BKIx3LEP$vl|1sK5s!`JxQDJ{CFB@?dAow}R) z7^Q3Tyu<?&@B&a{s>EY{=PgQI&{_co7*x0u=tWk$EHBK379vqE(PgG<@;<Citkd{f zj`PY(-e*d+ViT0z6p{DcQ49u&%@q|*Q{M@!eyuuY9<EeWAuL5$v%xj8Rx$S$8<Eix z#JB{*VLsG8(4_c6H+5;%>mX&~F`J>jCT=j@xUIqTs1Wo__|qL_#5?CG5Dl}uLvb1- z-irS4Me<Lb!PBkncOtWQ*^VcRc^j33E60oiqPTTq6N>20uj(Aw#A>rZH6c2FJ8n$q z8pqECNO~5(tjOVh;kj(LTj#o3PU57gT`Urc2iyw0ffnEHtaWl7a#g`1s)-_m!9g$g zW41?6Pvv6Ar+BDv3q>tC^3@d>)U3qNlR8a?x#Ni-ys49S@#9>#Y8R=_V5i1gV4lmS z>;}a-9kkBsPJFt+n9Y$5u1P$qM`1B~FSz2o@axX`=~Y%(?CAIDKmOiNe)StKzx|gl zzV?F`-}zqNTl?|v|MH7p`MsBa{oDWigRj5*pa1FQH-7cScYfcRu)O#`zhMnfUjFXi zzWnuHFMAYb6u!Lpt#7>i?Z0~Q3qSbuhkx_(*T4PpKmLy&fB&yveC^NlZuIgu|I3T7 z|Ls5j;Me~72jB29`Oy!51=0A<AOGa{zJ?Fq{PUmu;V*pp=fC*H$)KNoRDModzTcSf zFunYvKYQ`@KYjT-e*t)Y`V0U5)8G3KD53-4VX^<?zxXxY7Gc6sYyUB(YanHtiN|TX zXhM(Cd)r&17&Vt^!9hBV=StFTw+}Lbi6}vv^&}^AeGJr6M74l~523<$FKj?SmpAZB zsoApdAoZ%*9$fw2Kt=I*zgun&hnpvPi5V5P_9TSVDEq1=`q|lWH4Cj@pf!%p&e1${ zH*JQ{=7egXa{alG`mF_!(yB8F>TKCA?3JjO^@7o;ze!iAFRXg0zI0y|?f<{*y?c`! z$#Ez6e}9U^XqHt)WGA}tm?5jD2g2YnzzP_^01!j5whfbAmEE00b!Drv8t5KOoAGoK zNlDaW&$yCyS9dy{t!TX6TWW1@&2~ufVRj$oc0dmQ;#atE_jq``va-5CNhfR2IGvRl z;qmtH@NoZmoB>lni^iSd>C+oGpFDlKi1FKgLv1|!!Cv77YS(VUL9n|pgQaOhjv=Jb z<PA_~sav9UMA$~Ps1v;`<M!#-TBYnkE8ZZ(8nCVIEX>tg0CsQ!_zpL^Sx6{dFi%uG zQ^p6FCbS2>UP}uPZPs{1i0GYUhd#+U_P(@BjUQsi5a(khE<IZaTJ6;TZcm;QAIOuA zASb!bw^^yk&cH@1FgCGE;8<zSn1g`Apmm4EcBw%ag@9&{8&EZb^hTlwWfcNZMEv>X z|NN6*e(%p;{r<N<|JHwe^@rd8{0Be%#ZP|l*{6T_Kfdw1oY-eS{i9dk`(5cgO;OJ_ z5HlL2CLuyWawi&$r<hn?8%^b1JI%&-lKUN}*v)|Az%X?c*~a%M2B+50U@_y<1&4os zHL5Vl^^&v9zm;BiC$AK#Mt5v<s>-S^CD~9L*@<4Q?W=Z88c@~lznH>(t5`TkqL*YQ zU-SwZnt1o_zQD(Ggr?IDhBUMlT}n`K6<#hE&`sR%#<9!kX2wuZaGvlN-&W8^;<*a< z*n+cMTx-ROd7L*LqU{!poZ*-Y<3`~~hvEe-wQvbZiBoD)zap=&1myMtt=wSSXa}77 zv|<C2G+gn&j<{l>-fbVV@0RTMW5n>@0>DQ6GBC_1O_sO^x8{nyv+^mT3PV&7uqklo z%%U)2%gr67(hRCLViUucJxxLRB8`}8Aiyh6y0Vdxp0uv5L!wj~toP!}%;;30v6s<% zRi%~>=O|%*8&H1rmH9Df6|~r$s>vHPnl_w9XCE|1GLD9|3|!3zF6IBhJBlLVO622{ z_KU}MoBPEz|KO3R$k-x~-xClF1qo3S$88Dpr)(-W<R&wJucZsP*8d+Oi|JG<-fc1@ z!}70i3%#8U6hQ27WQYUs0#i74&}kB);f{0Fc<1(-?EV63)H~ZU;5s>UN%AuOxhX*@ z3++js;vo&~n7j*Yvh)Kl5z&(~NJ}ceVv0ta_?EJhNEFj(lE2cPjbHMtDE3vCX?I~e zvX3m!Ga{to;aVQsjZrqxH9=t-Bee8X`n14SfKg`ba6=z?)qSjE%hwc!OM>>Q(eSVD zA%K}N98?H7;s{|r^fw!?@hji@&?36toTKmL=({-@MVWJ<Sq&^EXw3@Y_*%<3u_(_& z94H-asL(N8HeF^b-+Rk(A$Jwidi<~ecWRM6pELW#BNxQaL)3`z-7FO1xur>v)iD-| z8kxOnE6<)CTGlv8;|H9Bgj3Q1A1{qK6x}z65^0dxU<H_{*^pZfo(x8$8L#wq;*q;M zs~r}(oAP_RscF!_5%F#`ZmDYEZYWy;W0JyS69<>vX(r6VNz*iOSd8-S0;GzFjR2Rh zECC|YV+%??Uh>4!BufqTp=A@D>-5PCLz|{B55}fT6lD_FtC{F`G2_Ps(2u)7ZiBm@ zQ1o@eSwzR!oqfUBAW^M98}NW>Z8VUBtsUL1YH-1Hx~Q#LwRdR_&PwH!XAGU{*=JXq zBM9`ks0o6+c(<8RMc+H3Xf7=lfXdmzCW8cqX~lbkrVecBZWmdWkJps}#+*XH)hzfX zj!NIULB&@W6;!9ernGOT04P(Al9X>q$f%U02ePM%d_$hy8uE-{aPG4$Y{eI>$W}Ab zr0$2z!jRgvKdXe?1F=0+BnxtR2DG%S_iLO6=l&t)L5v+an-Ohp?;g9mi50oBO*nVk zVI->oTc&F;`4DkdQweyTF$^y8m4R$|T92U}+|`!*xwtQ$wHkFZ_3@kW1mJdd71YO4 zN(78ANH~;&qLLjqy}dxbkbNZn*jQwaOz7yLJe_kWR<aGVWe>o*oeN&wnQG;3AWn!* zrd?uweV$be%#YjK>PGvAfb|g8SUhJxloM8`S1K$=o1C{J1s$P`cV)93Zm7VMl}DBs zjiq@*-IBJKPkw4F%x#${i-ognXz;0f7tX9u3yNWDhp?6VM|K8Mb_P;*22!>dq)dU0 zJpo7IjYJ=pGeR9(fHO9O8=_f5L_2vMfT8UG`rv3%<rc@It0o8W%mK~}S-$};+9>p0 z6a)q-`(;$O;v5zztf!cn6)ZKla;%SpG`8m}aUCCSBTFeo?n~<|X8qflfo;_=o&f&6 z+#_u`)@3ba2D$?}6!z)erOlMmNN0%tak>QIet@tn?4m<>Z4u!t%i;+HF+^+^B12IN zE&(C$>$yVd2wx5a$e<PY>HF^TucK{Pw-dI@*z=#RabCL`YVC^obgy}xvTs+7CP~gB z^;hotQg@$_2J8LksJ;t6!7h-8Eu=2v-n__-S(!Ch`a#>MGKpQSH)=1ec5y^tRvxw3 zi{PiPTuoN+Ey-gBiY8syy3kyF$Fr-R9~xqrvNGL77wQ(t!1tk-E~ukp7q|r4tgmJ_ zaL&*<tRMJgKSEmbg%O$)0B&X%911yyq!z`SqiD$@A^1Y<NxO~>)&o(OB2fo0-I963 zMvGgsB7fH2%tG5?0r6mHBy18nTTuDo%5k>i_HlsqnCB&<l|dyk=8mE*IbCCdW6yBJ znxVG3;Y{v7ll#x){;=HtXaWjezMtQ)x7#N1AGCX8fRUxIlU&T1xkQ+SFteuz1+I6i z7X!4AO)ZV~{%*4IZn8hgN5yV65p~Ftub}h2d<E@A6w57gH0OE81p^c0*K6Zh`5Z7@ zrv#T&&qW_I%s5znqG9{Hoz#X7o|HRNjBX`ldodkH%mH^^?dvS9GrcIs^W9}j+AVnf zT4sU(lLl3<Wu~oaKCkvvwgs6?u6*=tX9i66dNrwp9N(GkY~|g{Z>Mj4IsMY*bgifR z=slejSOv{7)W#ccD@&&j)A2oz{BMlM<BkQH$mqgup<n|6f(8IuVcl$rO{BmtV*a*w z*I<PpFqAk2C}gNqsi$BeWB9JQgp3fSoTLE3GoF{#K@Et{6z)TrXNVrJ_V(Z?J`Mzx zwtH#d?DPPpibzO<fCw;BU3zi*@|7!>JATK=DZ7?kNduM@`A9SuzFt~sumlv`IA2%= zXVPSsdYxrTTnUs-V;-3{uD>2m53G#Z#>7M+>|<+iPc(PR?a*A7NVF-h=!vK^EKrUL zJ~55Q-tE8jcG~~arS#$&bns=lF6ll{wwr=_!ZZ_OX063tv5F>zMej>rPWx}Kr5F2e z336Y)5~4@B0)+02U_a=He%%$4!M)2F(8|6vT3hXBm($DHmDN7XxhwE+F}p0@uVsBv z%v<6+{QWZg9f?+?Yw#=W(|^S~_<k|FD6(Eo`+fQ&C_E?fBFPm&>MfC^FGyU1zqj8K z*~H7YQz-q?DwT3c$RqtHkn3YM6Rq0c`;sW9e<^$G$))Veg36`mU(VjXeJSfd?~4ZQ zUZNMf{p?H6SK&dtcmm09i+mp^_r$C8;^pk}?aPorw0l?NdIE3c$NrZ^<*bkJhF1qL z-bs<J5weM^(yrlD`%(EZ?BM;iwSUoJ+phc=TA`Xj<Zo}iJsNfRGBcY^zQqC@$^FCr zdJBc$Ij9otuOJ89C;(zWoxg+-IZ@Jp^+hb2N65rQ9l*aKuz+2x|FNtG+u$X9p<4p% zJa?<nvjKTmqzy~#!`*_A%Ow6HULhM{K%vb=yYJGaOC2xf>)9dZ>=1Kyh-o^+JQSPJ zn-|5|1s*88ijIx+W}in&qK|n!!sOyFz1S+J<2NshH}J5|qPAROQCn7|MGOS9t?AO_ z=B;aAx%>F(-TT+CK_5N6dE@<?Pv5`xK;(LR-AZ!n;kA1=pT2kh;f<RQpMH4f#^c)} zP2Wj#=k8tc_0gTL-4q`$t<l%p_aEN*+Wik6U%TsJF2Uy~Hy?^sN*}eeC4IVk?Y*0K zWp%F5t4Fu*fB5vqwa3?<KDvGFhIoE-^Pw2&r;mU8!A*n>hMt0({H+|KgLFp7^J_u% z8D9I7D<dKa+owl)Z^W;WmO4ASDB1kNs0kJObimhTEzXNau+&Zfd9BKkcA*XBc*tK4 zaTS8=B%sd?R8b|S7?re$!|{~bIxP!`a|6QK!nb8BLAh>D$8|$ZNNI{H+|jemmi_9O z$u`uX76QwOhE7`RE^OY1aJ>1omT(&du~T7=PpVPwLP0N&+dj*8cEof(HTXNpV{n<| zdW<i=nGHjMpZ=2BW>;B#Aa<N<Vz)h#ruZEyLU6i#wsU~u5WjF32?=pt+@FzQf7kPZ zwa<K=r^+z`3MA(U=d9{qok`bd?ey!A+%69vilU8-=mQfQM|_{Ig5`A3=VH|W(ORN7 zq2wF%K!$_renv5du1&nFEEh}5Hcb7X5<3eB+y-%31tRG7cq|*hg*+@q2RfpP99{IX zU$GCl%sN5Z195)I+;2cFLs5NsFp&;~SG3SOXGsSH`3?%UI^qn7Dj={)BunrR(&I*) z6?)b3jY(~Mb=d~EVB^g(F`%&#{4+)ohR;a+pd5#t!nY2}$rz@1x7UEdPL_u}*%C_; zhC6mk++vwQc4wLCRR-=)DrIO5En8U$dVJ#A%KWdXx@K?|p&Y*tD@*$}!VhP$zwa-- z5Qh0(xi9d^5L|E$hN%z%ttwdJQpUal4i7#DYXBV8Xtbh9ZsRr>{cMi-UJ~jCasKS8 zI{8Gz0OILXS92*`2&)@kr)>mng=$w^ca8QD>Q=Cl!wW|jP{VqG^fkug&j%<2^LlZ# zU(Lt4INs)?Q8m*(AY|bL+WE{kzksuo9%}FpxUSxId#*(XXox^ymTF&7ci1sdO6vAf zeHS6$lWf!N9j~v1v@v*VAkMv><&|^qfY!ot9A#)3d&?7i(HxdmY@CRfD?xS5k;H87 zpk4w(d`WgrdJ3~w9Mtk=NFK4$5Is1wmKe!ttC*vIK_!EM)#Ch(Vc;u3h|SS)5>*YV zL4;F4*wH@1yu5p&j?b{ylT|Zp*`f6dzX!bR;V!BxX~>DR8a#Zi#!t4rsP2DZ`D#`K zN^CF*7?3%!>i1aJL@ONW2UFXlXo~_Bjkn4WbablNBquzJ1je3$8y})nh>0S7c3}?9 z3cSXYSCn+47r4lTvm1Pr>C9vm>n5L!4ko!4mjnlcQMc9-UDrN<c~?^i`n&9nEnH_+ zAb3vlP}UPF!tP>aTr%55yWbt^Mb;5R0DrKb;eooW<2en49BX*Bl?Mh0Orj$~CN81m z78{|LQM)5|S0s9pS?WGRHn|cj*Pb=B0_}HpXYYeDb-L3a<*TzEFyX@it5kNFCP&tb zqvQ3!aT%07ED<ePo{ffNb3Jmr5IwFnPha=~BP`?*xR@-K-ej#U`XsWEHA<#`+{3X2 zEnp#l2lO--l79&%od;I55JDV<D}*^{ET?di*x%RQ2D+X$rch8E$RYql?v`6lu~UJD zLlrvTenp2jnWJ+usm|#pI2;kum#RiLbkc{T%FE+k=BBrM^szXH)o??g>%wdc)SG-h zcVHd6!EGKLcVt_8?w(%*jO@U#{?%mIPm}(p*j(UYwZG}^Iq||yP}Zt0Y;|#Id{v#W zVXL}jeZf)1kyOg9_wxB}_TWx(A-U)UUb<1qAPq86nke*b5LKjw#JB{B%!8yDENuO% zX?}|;IlIgQB_gTGVF!FOVk^xYG5g<xlZL1_a^<1Qw&|RI*hK3n<|8(vp<)#%Rm~(% z)i00K%cISuV?GsgIQQKIwfKC2FD0mi4O2Cc75W(I9;{yHu|#eVT)BD@77|$1;*bWX zMY^zYaBk~zg8gFOzS13Uz8|y-ImAG(NBCbUw8`!=hY)<x-)yoxsbf|rU>z|CY0?~P zrcSSk{Kppu$?D}bCQ~>w{Q9Isq_Qa}FDa57E;x|-z?GR)#C5i8hyLSsTW1c8p2D1V z7WI!42)LS#pic&PAt(2mYKr~z0J;gEq)E8luYpCv%>&|#q~u3RXJ1pV_l0CG+H=GD z+I97*=YUig&>*OeYq8`QqNhj&^fP+3?k#j5|MOvv780I<2f6hPM16H~P~*fWXXA+_ z6P+oh@o&}z8dRzqLuZq~TB|bMFgUs@VSteZy+_$a8;Q3{?YDyJpqILgo~4HPpd5j2 zd2SgMYMS@Aw`=r5?>a?@r6D!~_vPAVPjLUW?2;+MuiDU_=^hD1mXQ;S-h=c#q# z&42_)!)59rR=-^3Ze&=PhOyLZUTQD`dq7dtMY^G8CGda9X5lTV%XyQ*`B={jwX^Ul zKvOT!l~0E74Pwr%CjCH+9@JZ*+lIwt!MJ!2RvGAEFf=r`{&cDUN@PI-#S_w7S_NNF zUEvfz$?N%@`X&UmTDJ@@(QT<aR8!D8=t@kkVBAr1C&Ajho2()50H#a+g{)*R7IcSt z;rs^n=XwN3!aeo2iX`!f^b9&W3mk_saSXaZ5BVXf9LBR81Ev{Pnzf_<>PO%G{O|tu zv!DFz7vKH<FaG|oKl}6>zxa2*_ly7YM=A)!Uw{6yzl69EfA#%IS<ip@t?zvPvw#2j z-+YIs@I8EJP{fduu4Kbtik0;T`3E!zJ@~B>Y$TnI7gZ4qTYls6#Y<QG7)v;|YVOJM z0)VvuSIdl3)aW}4JM~wrAADHW>Dqh_Vbt(MD*D{AY2HV3y8`0g!I;d^CLXlM6nM>1 z)M&U^*;{Y~VN;rpKM|Nv!vx4{XJ}rqM-{e4tlUk>BLco}hCfJJ<^_9POe+u|iuPyI z9@e~8t<p=YZPlAHI18?+Ff+ScB26XQxmK3o5q#M7bY73E#g;i@fI3%ZG3S?{&o>Lz zYp3pbcUi$Rh?b8ZRFk6}h=3dvkoU3s25bPrlCE@9seMn(m(i0#z@WR+3t-^3Yj>uN z<O#j*n)=yw;=!gZk5+g#xwz)b(985JOu+?RYi4PrYuhznyD3of@2a2O<r>`oa>Jn^ zDCED^<F#e795&Uk(|9HuE{T|lMzi?^g%yPB1_t0Jh5XFXvOvJ?c8=Y@CdX}d_Nd)H z^Hx(33)qXX+zaNTN<L!6bzSBuZ!~z7(qyUNOVpvuN1zKk9NV)24MfDm*ZcMT?RapT zCX3M2izFeVHUz0*oEG1s`}9pzf;~pZTGneHUxZ`wvGcE>bzlDK#v-6JX~fs#?*EUD zYUhA$F1jD#J@<NeRCV>v86-|cF;f+WI>fp-ptcX@@2bx2Wo4{6fnkZO4@lb}jspAQ zb1?;rZhra>97bR<M7_^d^#=MW>|I5*81UMpQG%i>11I=;yc038dP-Y$wyzBL`_$=* z0LDQ)Py*-3j=qabX_~_d;g&A#p8aip-HASpDjf{&qw{6vt$Tu}FL%MAC!9%ta&w;K za%zF*tj*>e)~oV*lbf8hbqXq5(Qp>(84@~12eTSHe1K))W0zkzI<m`nR)SY9`6OuF z=M6#sUiG|C0Tw#>Wa8R~R@1%ep!RI@f^l_V`>*E7UbO|@FyrERIV$#2^ezR3Pd%Cy z;=m}~#HuN|Iv&jD?&Xh!k=XAR8Rm44IBpH0pAbFJX`$M~K-f}k!~<`LKmqq1feyMk z9m@q1>=;n3pR`yaaL}gOB#E8&ih+4%b^=y6;7q1(#s*2JL~TqbYR2GPIoz57GAntM zF1}Z&54IkZhs8wc(C}jI_1xZgZ;yg+ookAy8O~|0E$aEKdRDYQ#Rd0)Pd*9W7a7;x z&|t!`=0nHm$a5G<WA`lRWxJN*|9TBGfKLJG-qc0c6H6T_T~}jbIJn}1Ac3~<;NaR_ ze3b2Wj6ZCs`H`SA%P`GWY<M{i%R3^n=P$u;e;s_c1^<n#fzz?m*Tz;)!Cu?M6#~;J zusN`9Ixm_#PR9(w6-`khk(ORC?LE_iULX>h<<El|h3F@puf>rux;DTjOsoxl>EGXM zC;-_7cq|(Gt>l9IC5=13*z92h|FBtgL2k+2m=cD0ev{tijySbQy-OgHAj1F%D>qnz zPS4Y^Und-eIeNg7k*ouG;VG<ni49RfsI^dU6zD|dSjI-xthF&p$#=*Y#HO4gp(&)@ zzQZa``*T1`D_v}$WPjUZ^0ZqY*uNhO;(>6&@y(iiF`t)p*}y}iJE&`10BsW+R3~x_ z6JMW5yWVSH1ul~Am1EI{h72kptS59IjU~K=o1@*ksNNB8aKO90hRhXqkCz$VcU$ou z&@=XJb%-s5wFqn$^+ixV8%<|C@^;#=e4k<_h&(8aYkK%xn=EN!mLXHXWyAP{de`0j z>I>^MRJX+70GqPXf*XdPz2BVOy%1mA&pI?mmwY!rA^+aqF&7AuHE;{-qi+}-#A0D! zME}ln4<}Z~&>HPR8*D5r>6aB6Vpf5aNS{^}ZH<)g&>Nfw<M=$_>G#U%z5MXee(nR! zH%5lReMjeYsY*O>%Pawgp3Om$oj{Va`6YIkJ)KNj?f0gwO=jA-mnn3RP7lHz!(0%j zF+NZh0n;gPV~(98_p88FF`w*y#?<bMlvkSOe&V92xHXW&vwRKcZ|fQaEjyLH#6zD? zt+!xgh~dzUGZ!<oLyIwty;?6|GmKEb1tG(50!q7crorNzsDFUb4=C*wL$p8k`N#g| zlKX}6^5mRkT1_8HxSQ9Z8*Ifu)S@81riaiZSHVJh3l)5)JH`qblT@U2M05>nIxYDs zCiQB$KO}nltcT2x0|FY^Qx7eo7x3)jyb0(+lrgi;kCT_zUK@S^g=Ezy>c}mPVc_v1 z5p-4N;?L8Z;u!<<Ku%i^2hOzclsmpUNS@=Id}xoifL2UNbnJ^Tv~1MT(^@YlT7ZgD z+eNtKK7Nu#yHG*j%2&o_=OP=(*C_XOz_Y8f>C6<%;)}o=i&y{KAN}gb-}(7>|L*7C z`Jc8G1ekaOj;!qWw~Nt5Opmv_;@d6r?GLQ$@z{krB8d5+)ZOrPOGqn$sP~P5>{L+_ z4?Glbw&BKd7TPO=DaSb9G^=G(Z6%_WBGb0Zmo8H<Y;;7#nkr}G{aH0C5c7b16u~g| zs6YrUL4H-iry*E$SXXtGwOM;8!pe|w^j<b-xbVinoET7LrMASd#;cb-H!=ExNd^l8 z3I^N>`4o@dE@n?@-r_>)^1;B`L$ST|B)R)4x0kt1EI3-nLOL$SxB13RJF&Zcv;Eiz z*9FyzB7u`aZjJ2^q3``LYP(FiV5i13UPxIn0304<Zd}Ta0$ydxqaM*OCHI@vCYP`E z%V)+*4Xp$8&w#pnfvAv?3q;D4Ik8~phMh}CD_HBQ<QwW`Obw($bZ&^#=~d;@4tGNU z^9wG-tW}F@P$|QAU*`xS!+8TPwjNY?p{*Cf{OnJTbg6F!g4Tx@kvB_i?bdlqz|(DB zmDL`|`ZumICIb13$<Nrf_o6B}qh}3Xh3Q@k-ftc81pUqMeW0UE3;Qr$)k?NxU?y6a z-~vKsnl>rqNC{{dr`0KOL324Ni!scBZ(E-`Rx&3Mv21|SuwvUz)A5hH909d~gih0O zA}hNTj2XN4WkW)tx;)jZ1e)!G5)f{9^@j*_kO{jthd$^wn$x>}tDR2J0U&uFk=Uzo z;rhj5)esX2+cOfwzEjPP5EIGy2BJscN|r>949`<&F^XFb^XmxJR9233c>v{9-4cB> zRyz(NcFw_`{^FW1=nSM)z05>q?Uhq!>{5}r7f=zD^({Gj1+%p0liQv4S2fqw==5Co ztNIZtGM6HnNhpeL=OxlT?!*gF@0V7zYIP{c==W#0!P^CNDFb{VFZ{%T&jog}ZU_0Q zH+1;q2Um&7i~OiYvdT#X(e5$}PFPl9!-2$uNoPJgOWQe81+16CCo5~WSlg8D$od9G zboV*dnn=EWyL{SA%-nUywaf7TBQHXm=?pS4jd}J{cErC?c93B3Xt|CD1g$26^Bsa< znixsUy{HhoAIJi}%rT_uY}z7_?@)s_o1~K0m9e$)b|+DZ<Ob%LOUtv+Mik>uCF#U; z4+zY5Zf3L&)<k|@mE%OAjp=;^Ou37E4&f{g=JK=%^091`g%b5*w-h-E?Px0>Ct~It zh_hm`y$v_s1hO})b^zQLtip>aj0XdbQXTb$FPP?PBoH45ts9<%H{+h`-h@Lw;DMPi z9?&Jz0K2O`+yz66a++8NR6N7hbMbBuf2XE1bE*sUfTgGq6@g<X0RU3JfpNx*UBSI5 zV#ur@1I$!*t~fj&Os55$n)BIFcA6=ovYtC(UpubTQFE0R7L@>nFj4Y-(~8w67xXiF zT;cNV78%LrUloUV`S{zedxI$gwBhdv*&ZYu>*c%37Hq|_zGBJxp}c*amnjaG^fz8Y z>rG-Yh)ULtggC)i7YpE1dT}{cgqKaJ(=DsAK+lWEM|*S@aofqnHuT4UrmmKYgvC@C zm?q+3SYY=HTJkbG04wXjZ93;HKX$2QOE-g<HVRiWeC>B<JP0jTH@T~<vRy}limT&g zwaOMiU##bpix03VjL9>q1UuiarWz5@#x$B0+r><x&}*D-4{c@LyL}<Wh8IN=pa4z9 zM(Q<0Xbbr{pF=1Y<>a7JN-xjG2#e%mVPykZYA@n#;kzH8i5K^cc*v{5-gSFTKw(~M zLW<@W(r`;pT7#SzxKy&PlN>xn7io7CcA+>N$T9($;9^j<pbf@?3FL)~A@Ww-{+3aC z%Z0!TFjMW!pr(}yccJGE_so%g8>&~W>jd%R^Pm0O&p!Q+zx>AEfBw^d{px@D4tH_+ z<+r}`*{9$5{9FI+S3myFXFvHSxQ~DH-@f{*?~5$r6a4(M?|t^^AHVwBpR8#6g?#@_ z3?2Yhgq@=f+B9_z#ot*zE)Qx5H3ETK0T&kjf*~$`=*XtZwh^77totTLBIm7>wyn~t zRW?oLWr`OA?hgm)X}wC2eyHCoUZ`JZan8>|g`9;7iG&JSCbFS)r#O8CLm3Ka%%TSc z0tMk@qcWYKL4oK)kw8Ou=EGQqV54IZxIeuI_SGU+p#mtOrENYHA{)IB@+TG`{&vK2 z+n#seX*8cr@If3pI))}#yi1y-MIe&NsfbDwc!>+_5SN?7Stz74{&vRSBK!?Nj$rwd zZw^fLWLD*SG|MY=V1&{^YWKmmGsqswvWL?YQH8e)IWF@TmEu-tD*!wO^6U7Vb<)M6 z4s+2F0B<v;mLFnk)UTsn2ApgP^KrI<8h4O+kX%ZvOlxHzk34Ep7glw&@Qk7pjSgnB zqc`6I(H@>;%%W?LA3sF7uJf<fo))90ise6rhSx%Z0tO@4J+S(NEiwI8n5tSFDGr3F zSBP`-Y+heL%Rd;UYY*-m1Kc@JE8`ED)1%-8{JV@BWPPX8%AGM!r|tv1lo-6C#-l$^ zFXQGA`FEXM`D8-pvvIw!F6P*~5;AS(N!6+UAs$p0)?JMA`vsXdwnz;F97?Y54TfHF z*fBR-q*c2!q`hFoa>1wpuzmLC#V*E@;dzvZPC#L>i)<u2<@4eZJVSDME+f=};)d=- zcHif8ua!X#kDFRf45{@X5OIh-L5fPjinR`ybUH$u5UWr^{$plqv0HlNy+Z7UM~R^J zELGt$5;0R?uUG}-`&HE;O0A;+Frdx+kPjhf0eDE(Hg@L<ErKIECC{wa>p@E{{4})s z)7Jbktc%!$Pg(ccU={8;UC4*Uyhxe~_YU9C5X6UDUG;9Um3|Wkj3x?poq8`-D})_} zUxuctvM3O(h_Q=)nTkzNjfK)Sh{QIKY>b|#C6J>vVEq$OfI&wH>DKXg!DbIwf3m~A z?iszIDCg1Z`V}oQ*#s}Et<+Q8ylcOHvrnPov=%{j8O3UndzX-FRM2Om+B(+_%|d6i zdvwiV2KoGXb;w_s*ICJI$W5nc6n+c<aou?ztYOcpfFYI9O-<J&u97?!C!N$Q8UX%# zhPhl<;C`f6ND&%~MHtBGB9)ZNavu6MsS7e#DQ4Gqi_tSN(D5CN6)wk2?I}b(7JN%` z9R0gv&kLsIjc!;hvlU>gC$%ZBLm2Qj*s;Ci98C3|(|7iqahn~d1y}Z&10O5N_T5X> z({k)FUqdaJ?D+L_*w7eW;3_zA07G_!jF0rx7Iu?V#+eUfc5)si$d35SzLaBL;BOU2 z1I1mX;e_Cx4mTZcro=({sytrt0wIz-34su;>RS`RXh!b=MLAtWvXALz5~TJyobOU` zViGGXpC>QG5MVqKm2)Z&SmHb@go1plI+!b=Ak*{k;~B;91AX+@X5F5p^89!<Bq<v` zS-R{e1ljD_D$wv|FfCp@v}Uc%FBKAt5ZUdVsy?zpY=T$QE{1kX)w!TsO&@?0lPM~k z>0=5dXL5ZFk0(|(d!DH5PD9<PDO+{|S&D7>v?Bcb%NFaKEkcqJMwY-~uP)va>^NON zGOiHkwaNIa_}|~g&iN|-_qSEeUd;0SYt!)!$(?m>(_R-fTNy+-2ZpZKwuMz#kF){? zQda~`#L@(T2)-)+zNXsq15Bv;;iAK}j@4vG(&y`C3s24jv&5%bh>16~h2Oxcawriq zOepzz3dJSNAs(<A1Wx)gdaqjAN21qvqpDUX)k0#%8fnhCGR9Qarm^Ufn=@lqCM8}* zG-ZD_UQ@@fsFB8i{_uGrD|rvZMpWGxb_f>spdPE~gt&JwnV0($v*CgrTs|{;B9qf; zRahpqg;AeNgPds&wnDs=5th~Q^*$(7Q4<NSB(vwBON9eVmvqTe+YPF&Z3xlXOY%B- zR)|w-DTE|(syoV(o6kkN1TPeVeZF5)yematq$Zgwl_A;oXVsRNn@0%-C_=boyI>4K zw?`_xc~wm^a*28Sa=&l(J@Hw{h@d@!v3lBJM|bi2!K|!iB|_$!L8X+?st%x!IPWnM z<{;_2@3H+I%lVBy=pN|+xXB7TZpqahUDhEjh8~}3@fdAslc0VixhfU;gCwYHL923T zNivXjfqbjtT{DzDcwQ9=<~ZR5Y$AEWBl{-mEJ?ZhmeG`8u*8G?{R##iq@HoPjVHpn zx|p~?*Af@-QbH{q9rh2_2*u2<j~Fznyh9R`+tv|f_IkR%KX<v2f&y3xG-$wonBf<t z4B$U%$j@$i&u&7_ZbE`LAt?L+j?@)END>cH_kRbq8Y<SW_@>k}82b05H^RZF!{xNJ z?6P=pa?3``j;_vPNQ3pLWIv%;(r|ziXSX_kUXb*|$%t8zlWG_G4kCC#C|NxJkfhZz ze7!t+lFt9#rZDylxZxi#qPsnyOGk7kBmfz~@*~ytA0-F#aw4RP`e0UIq`!SBDF9p8 z!y7DcPqWOaF|tApv;BzFV$ka(0)r+U3P7`66d}<j8!d?C_*mh4r<#$#|LHysb^2MT z&qHoRE}oAaw6n$=0kt{RUZBq9&G}MoDEEPk+UfgO8$CRzIrDv&LV$G0=ud8(L9GpL zy=e94n(0LVyiZmIZFi_#$DG2~qaN8XNMs`7jT!}54T2-<yQrWuBP@;JhqyPj*7rB) zzS3xJHj)GWBW);;DS9oYm?jXfv<WXUtblWkI+ZRNOXv=P=w<{7u>lRyJ(D(@`Pv?( zMx7i45Y=qG5eJb#>a?muf+1efpp2-mBF?7goU``ggt->Nqf9!j(~u@3C3}|Z^Fc#@ zYx^iCtNIYn>IvC{1@p)^g$h)cCrBH~c~(#kHRpRXv8eTvLo|{uKGj#+z4dUL8?eZi z+T^9;F=nG~U3@4j=QM0)&+52v<Cn!cJAZip1mD#q?eB3d4njMIy=b^jzpbkDMCe#L zu|jQdLQE>S4I3-Lb^x$#{c{$%*z9onEqJjwChz*&lI}Fxk6Z>@1S}5zYRG$Z)7}P$ zrY`{r(DbGR%8&vi9|hf*C@z@<_PPOxaR`vZDwEaa&eRD+|HVY35kh!asiy2XX>2n4 z;BK8<2)(_FO3E;#9j{tSMR5Q`f`#{73e_xeJ!i<L{3I}B;UP|(8G5|zs)7~0^s;JH z-Jh+dB~}yS1tvqgCzo7FfrX^J1sy=fz_NlchXE)4ZeW!>f=hwqe0%|kr5O0u3wZ2@ z$cJ-dp-!x=rbQfM4Wi!anXhx0$SUsSUVhl^L#Rob-5g~{uh5M|qo@k%ytg3`DUmyG zy?2T98IgW_BF>3&J}XDk;W&$<fCe`8C80n=9C0nc2E{`NG1JGe{3pjMrT-K3ox5=H zRsmCiGau)YV)w&w!JSV&En2cJe`Kg+G&D908JVc@OC0VK=pTapBU-?PPSqP!`07#g zBn6Fi`W{*87()bafFD+%SLMRp(7hm|=}OWTi?y=IwYou(-O<r4l9HH?OnB%gl3Yxp zs>pCkf`RoDxUC6YP+(Zfm#Fx$T6ol1+`PWkynegp?FP^&!|gk2-@a97V87YN&xuyF zUrqAaKbcvKwP`VpU3mdK{xljf5}}aW@E(I}Ar}inB%|M;pZOZR4&`lJH&-PAjJWu? zLamJMQb6KWt4i<nvXgbuR!;S`7g&bWvwL|teXQ|!X1c|%V`Ylf;Ll#%74xmS%X?kz ztL%*zXO&Y^6I{dcI9b!gq261#s20^`(NbHK`ZPR+d{l8*PRmZ3$ArygqQhS-HzIb< zG_gr99FGMxSuh%l62C?U2#S9in|~B8c;a2#W}+wG%(-{-uK4jW=x`_h3^#V;yZz5~ zOJ6xY^UFN5MmV!Z2wEd31@{92P_Aam#6YlykJNEkfBcB9h|&9TtAG+=s*)W5x&5dJ z&BjZk+*b7Fcn=L0ix|W}CM7WEWWQ7|lu_JPfnb)1p<79J4(tX=j?)l)o4m_Q^Qu-= z0;IRX_6Ko7DF=)pJm4u4xb<GXuN{SM=k>1mZAri?2ryjankc}`ax!LA;CUgOI7oGx zG!kA6EZ#0gwSS8#FRv}^>QK<?B|=gYbTjXLaNgm$5EY512~_MjaP1zvf|vV;U7{@< z32~&{KDvJ}-#?fmNF0Tt@*I=|D=MaAu;T&LHJJQ@cfy=D&PsX-WyyO5nO&gcumm(0 zvsh6TOKfWb=8Omt2NwTgR!xr7YJp`E@{T}@LRj{|C-TYUfyB*IWQ)UMB=}kahNnl# zHiX`!B_h+KNk)^g(CeS}fFU7TsP)({5b~TMyQ2t+{RyxV&~ni^dtR`0?6eXbO@L8C zc1W6U!wBTIQM3ZyPQ{quDEKD=DA<e}K!^j{JQAb10^^*Cbl|Rl&;M|1`6O#M!zQ^_ zO~y|#YM+943<rcIqMh93%!YlatjPpPbjuWieLOG7$os%DCQ>-Iq`6hrNH|8I3cawG zA6_8!E_6I>y4JOY!dT*t{4W4M{kbtBPtX{d!i~5Yhwck9OF6uz`UhjgN!$KQYZBD| z?KQ_bLuWh+X1u5}erfI4&9~`6z>_VVm|7s24I%HB#8E;>N=K`@NoEFa<uyqo@Xe)# zs~$Up#)U+qLqi7#L-x8TVF*op+x1=$gkXU&FneC^HlQlcgop)1Ga-l`)TsInj4~^j z5Gv7REZM4rv^XP=a8U{De4GPEejs&11%>HAMet5BLWv}dwrQ$uNX(l#kH|uinkL!u z;VK1{z(q|fUcM^#1dA>OGZGBfrIZtj-Bg90kVK}MEWP=s&JL)uz_{A+gdl%-oqND7 zF~2YrCfF#-^8yX3*c|t3?Ief*9WLJ&1Ay2?6^MF}bq`S#6ZD6LE+LbZZZCU%(N<hS z`^?hOjj00tEG;2TL=Tq$I%P()H-!VS>s^D=_XSy8hC)jtui~{0!u%s6vr>hy{*l@f z@+LL)j}i0}dhxLp60+w!bq2U}cCbG?*e^QROFzCa3zk;v+L&F-^JtV(PM;Oy55)T# zkXji!#$ES|v7G?Z&2DfPU>5VHGR$rh5(7KEQSQCTJkCsI_b9X4!6G-;d)ls5Z*`&b z>hTJ<t%BwfxOhQEytU<-8r;-0sh8@q$?}d&e&;|Os0PY0;JBehWhlImT^;mL%@91^ zx3spCrvAWDLA`7WuVV3G>>iQlc$ak48^UWt+Z{;lKGaPa{tWogs_$OdQ@-C=MDU$Q z$w{f+gk5vbHkh*w=4^wBA^MSb_YDp0r8uKlX7kw*x@n&+p0mYsws;~=poCC=Sx6eR z*-FbgQL%k>-}2@~2rXi+-|@`K@eC+13SCIhSAdV8r%Zp8dpcU~mNoiKcJ)Uq;wYzQ zp06fD{bLiXbv7+1GuaSBGPUdMp~E=u7T67=_7&6>Vi+dn9Ngj1@3Dm7B^Ke`ycRMG zdc1dZ+79BQo#Wpqs~>Ase9h<^b!VoD1c7NHDIAk$iy-~5jj3e<011?1LvOt5seY!< zmK+anLYg3;U)F@qB$`j@VwWtY3o#vZA_!7e2dXc7<+Rgl@{PlUU@`+HT=<N{)?2## zgzF>3wQz0n!&bG)4|Q#d>9}oOju!<21h^9(7eLOnt*@uaG&cd16>$F6*Kv_<eLWKi z@4uKnm{o#_%#XrvyGY^;QsHbjJ=;wqyQw~u(_vGoJ{}!x!LeMrBZ^~iNAFObG`g+g z1@7LyC=+@g=Rz^Mn9>~<vilDZaexB5lF?f^J*W<9wqq(VCICsu_~N%u@8{%BErUmv z&goq61OK#tF6?S8DLK2M@2z5`Q;<_3#}?y(BD3(ehcfuiE1!Il=mz3tuISN~a2E4) zHR+fx#SkJ`*B51tAw<rO<Y#>Fj1R_76;JLw`pUJtPaizIbN}I;$G<J)9rc*er|kOu zdk^k^aPx!5>qblb1UXmN$(%}-DDiEl*CrEXFGUtF#Mm4I5oS4KDVA*$U6JVqVudMH z>w+u9FzeQDgO`XTe(x7xDF)8?5Se|0TlQqm*L6Semt8_u*4&!OGF=L>zph)nVCl}Q zYyt#bx4js+h#TU|IYgOWB}~I|D#i|YSw2AzbUDtxF__&-A*zFxzn-UyQWA(ekqw}1 z;B|nL1=3SEUcfhY2=*41C~rS+lzW6|Y#D;dk6kBda&LjL7w<Uxc2S0{Q21=4YEsRz zf3#(T<~H^W)-84d&Qhlp^Bm91>^9>yuQ6C8?bk@m5YbeZD;~^z(VxS@4^A`00}{hS ziBst>Y;~*C6kmjaHT$xjSNjtCxH<rUaG;7WjsqAt5>`?S_Pn?O4sr`8ER13=0>o49 zNpDItszEPHnGIo%SU~{_2yrbboFnLn*r8ZVY}4o9*hhsh`y%tMB(oD`Yp3d9Qe?p* zg7i036Emc`z91(?Swv1|-i3@i8v-A4J(8$;T}_H?QtfpA<)ix_WCX)mZXb1>G64ii z%*A(;Jj3bG<18e&{@{*F@`H{c)=8b#^j!WzVFJk%4rN8a{DLiCNE5(vKwj7tj6~Gv zDkP(*_9KjBm581M3%4T>IabvVJA|KE65WQiAQ8ZI1a-l<xSmlIzK?LN8;u*l(B$4+ zca)TH6odRvRDK``kTLs0YI|ambX8d_R*7Ji;si&DEc{aB$Aid#?3e+;be$f?N~YtW zV&xLB68}P1ccHv8!K0lx9q9&R-Q;;`T_ku1zKVzQ=UpZ}C)`h#ZCGyF+*vk}z{aq# zLoXaG`5sk5ZWcp|ffb)V%_sZ2`K@YpU%ee*Qk|C-qlyp$hkT^#W7#8ev~?E&qm++! zoC>o;>JiAW>r|hyxh82pD~<wa)11OkB(ZhKnoP~f$mwWPbI3qfLn6Jd&d!Ht=fkt} zVZ)W}Z{nazZmO6A-Pam+EwyF_*TDkFk+CWmKF*FU%^L2PCb*Ex`Z_7Oj$D388`?%P znuxV$%XeKXbmg0uhK4M{TD&~&ArA<GB`K79UGR#7+oG?+h{s%|n$RAmG-IntA8x!T z$%?HPv)B&a0H6qGSJ`x++^bCE!3P0Q)P|kkSX+Cm7>|Xp(D{vGZCm{7Fnh^zYEsU2 zw({;;ivR0%HZ8XlEZ{bV@$kzK+u5bJ*1}ZL3)Uy~C>I@=yFo)uuIy5p^p~P|7dV<Y zW7QFYUl!T2D@&2Q23z85sGr<uUjwE3Xm6{Uga>+5&PE8d*qOoh1K!IW1cb}?s_8g3 z=u@#UI-x=yl^=&kyDzGBW$|dAxyGLDmS?+VgEm#{j<iprC5C-;(cjj!Ifp)>*eT5? zN-8%V+#KZdIx`8m!c0QYA)y{&Qt_8wfc7w-3F=rY{fj<MtBT&kgWQvzSZ6jMk8tAl zy_o|p&XhqbGK@5MGZxbkYO;nMI&=Zg^5lbAk&i)dwh~0_R?$B#`9Z53fpj@VQ&C`z z)xrG!HvM`{C5aQ~B*#@id-QJ=N6;P<$|794_(f-3crr*A^b1axNFY$h;iP&|%-#bA znkEPP`|?=|Ep3}(!<;MpQgP5lVxs=~_@8R6z!DusJ@tu<3u_fJ$px>&DI&HSIXSkf zL(%YZXDZk}Z9<^gJU)F$@_M&=VfoV{HtwW&4v4rc-pI#;<T6V^b5Z)=A<kr~bUyeC zm<XuDF6am)2oJ5i)f>@oRXEawh5*^7V017nz^myk#-~&~$hg6;w4n@MV|(Qk9S8UF zLvR~hlOcwIy^V73Ho8@X?@W_zvFQV8Aj{qO$W2m8_$2Qd#eu9zfFe+mii5p_dd`|# zZYw({>58mBF~YiOK4DS4<q5Mm_ENn#Af+#pdL*JW>4JHYa?z^QE5v5~Y~)`3N(-*~ z4a%LJw9P<tNLYicMr<>1D~89|^=x0sR+ad*wL@o}6x;LA)WOmV2({Ts{-5t99Y{w{ zD6`?C4&B_{KQ!ko{O*k&QUu|y2BW~d#)4V=foeaHg{mRGQOR4?d|vI*Gpk#;8kE>? zno|uyoK4DdUhI7cpg!KD6d!IEtYvJvBEHQ)2ADE41i^>~467&Qjbivj*dBxE!$Ne8 zp6%d~<2s!}or5F`=7ql7D%Ed{Mxzd!kgvY+<5z$E*Ps9Nhd=+DZ~pTC_^Z$V;J;cy zf<!HK&MR+!`O@~Kj(-HvDe^q`3YI;#<_<S6_!mF=*{dJ?<X1ob&Z|HEH=q6FkM|G7 z<1hdIFF*gmfB5XvAFciB$KU?>U;OWs@>f6pgB62aKZdiyAh{BnphW-GH-BGb{QSTF zuOZ^E{_OXD{^vh@^=JQDrxL|o5uX>X9a+ZD|Kx99{pnx){NMbSU;O>=z54byUw!*O zeg1==zWTwx`|Q&{eD$aQ_h+B}(X0RdJyZOjeP>h~Lms#(em@rzyC2}6D-5W8R1zZ$ z%+*)_<xipT|N7HcKl+~2W#189CO`k~4_)ngU@Zx9H2k8s$KVkQ7EEKP_V54r)en9s zwkRmzZ+`UZM}I0BLL6MY`Rvm_7C%4x(Vs}he8KQO7%Jl;g{QoEF>_Z4bVIm8*uj7P zt)KtZ{{^-9-tP`Ozx+>s39Ra~pZrN@)2SJd8Ln-<`nw;#`q6hqIx+g{ZC}0>*~D9` z;79YLNipz(eaYE;>C&Z6U`mNPz5368;jEP==;@HS<Ob{^t15^(GgH#L@52{};PYCd z>44BlAav{Tf^0D}M8~=~a`D=hCubz`*G5v0`8|r95+gN4?6x!^q_fRMr7Yd!uwlSf z>%swJ>_e%iy*3?-t!S^%Q$x*$^(Cho<)=v27LM<<cyV9S26xJG?%jKdI_Us1SV1pt zjK1z<FQ&j7>U?%|)ryNp5jMnOEuUa)qUR74OM*ZNp>UK>pXWv>B=Za|ZKCl`F@64K zKclpdR2uh6+|)bMrESm_95m`bN6n`=op6+tx0e!8AVM1<6V)U3PUsvORAdJxqv~M* zp~ka&M}PMb_R-Yjj+{hY?=xztin-m2rRNP6LL@A!7SZby)c<kv9=Mh|{Hu297wpnK zNJ+*}i<ILB3W@RxGS;#5Hnl&NnX+f)2>;qxDpJP~0DX`JE>{Q2eS-4a3@UIgiUR4d zspJ|v`zoll>9`!}W3;&t;$}d1C`~NXij2c5-aj%&d7F=9?2x}6z-E&rxVBEf2m+MJ zJjR$P+aEV%u!;by$hh&8G;xYpaRnW_Ep-KUo3zyP0o8n06NBBk5~YW#KOsL&#A<(B z(G{21#$FS4rbVt{&iJ>02FS(-)&s~aIERqQykJ+nXM*9~teF$SjJp%+U{wwnolm;5 ztkfPmP5iwhq+!wHeX}sGkm!VRVt0aV|29~RbVoX2f778VJ6+m!@B`fD@6rCSVVMb{ zD*+Y}K~u3VOyjMUSX=5hR*-~sH0gXSdb$hY9G`$03GCzaQNjs>u1wTvB(HqostF8W z+fY+5Fg{J`J8`rO(cxY>MP1vbMNw5xd|d^VR6ANaas+B(5f$1{CY&v_+e9_6IOd8( zZEEL`?Qi-NQJHL0H1iT7VJm&cCoU7GzIrIc9i?}xW^RdV@UFj^xg@u$YEtCW<78;A z);DnGZj!NV{yZ<y*Mod!s4S4wuyl`}qpMGf@lNpw^-Fbff4`WnjwY4hc%*W2NS2_v z5x+8T+ahwu3#1mO>&;qK22!SpDX&;~>vH8@%MM)~&9$d)reCdlM!q-#JSqvku+!;7 zvZ1J7tvkGhB9+*0VQN1yCJe}hS=Vn^zW^+|^A4P+-|e`&t8GW&8{w0A2dSBL$Rf*b zRn||kr{LD4Ym0Yg5tEMR7M6#MpQES;LiY^k)vfZd7*o{&3SO)`>s5cVw;2e^V<qaj zkSb2^Ji@8i)q~TEK-cI5UV-wgP;@&lvBYDzd{Lct)$|QOj}Oex-a<kbqm=qKrKli6 zO}r(Sjo88$HnU+obY49m(gG01AutS1`mj(#HKa0w*6XV0V9(@yydlIZTN;q_e9{sB zJ8yO0`bykFS@)c3oKtqcZQ1=$*=vi-juN+~5|CbP-LMe4{4Hy%CRPAWDU*Y7QJbwB zATJ#xKDR!>q1B=gTaS@h_dK6?100xv=-3{ZX@2&8ID38=%HBN>HOo{rbvOyV1*FNv zwO()i#2P|8ev?+N>4?=%M{_-&$}rFhf)~Y&f}+7}9nnt!;LUh81z^l@y)hw}xNH@K znp_fCxJ0<X=-+_OYtbQS&T++6I~2dJfJ?6;c_TlVYn0eGG8=E9P%&%JY=Xoy74%fe zRq8j2X)96vrZSY6w>$%Bkw!H2U{VYUM4PNH0L2S%LO)I>;=eIj1%RWOX9ZR<xwEZi zuzi1>Dk|Q;X~ldui~}+|ms{>Ae7ZpG0-_DMweX|3F2EKkAipMDqisq(H;EnK3q@HT z#R1mACLoP4m%s{PWFrnRvNN$_+`UF->otTfBsjUIR#^@N8h_51l7i#FyBo=x_`A9q z@>Z02SZ>RAz;_e!+JSCDGIKBBvRY85C_WWumY4O@<+*Ub4_ERSFi-kn8^OKk<t z>a=Ca_N+3b?`-0kQfHu6fc&}MlCSbq0G$li651?*@gn&ywafw7ck}w#2?$GiKw0j6 zt{X%TRR1kpj5zLsMxSZZVecJUR*sjJqZQsubd`D%8ciqH8^qD=Nubknm1;bXbFNY6 z0M+Z}jiu*SL;eWm5K;_LEM}@D>y3C)Q^7#;JMwbdr=7+O$`}=NO>05OHb+xr1JyC1 z$D=Lqg($n}T^s}-mN@{9f!jQVq-9=Jj+KORNFr?bYTM0}K&YwVZn?9oR1#U1rJyyT z-<v)hxDY_#4rt1$fYf2SNs~q^Jd3a?$)o&1H5Z&^fKA)Y;fhI_W@IZqx{|czv=@gc z)jzO+QP#E$g93E7iehSPlwK;saZ$bFG$C_^L^nXlQG(a!&x$NWSIA6O2DBbST?tm6 zK%}MU;1htY7lvDLp@q)qJTa_)c?<4#fnw1a1cn#g*X<oQI<N<(7sQk=0bFHL?UW<Y zEt41dQJw5SSb>~u*ya;zwBVi4w}2GlQmw&)7!B07%N-)j`o*3z1l|H%2TahtxqN?C z?vzupsE$BN1$kFn%Bm??qqJ%{8j|~Lt#HS|s@sF?2gzB~aGc;3q(?%7$`mtz;LoI- ztRU~JBoMX&9A4+SkYsP%ymjp>cOO5!e*f<MhhCe+tOOKwC3C-k9I|}TGTj6)R5a6- zS%)0k6rI^&{RFQanUg8wyPX{fHK^=|I=y2*=mb_0PYk=_Krj;BIVqn(MRb*vf!cAZ zd0EWL(cr0F>Do7r)-40~gAMzvQ<O<;<FJ;FuMrqFsRuIoqL5|Ek4U?b%3FTyD(+g< zq0ORW`B$w+(bRxu6HFRwg%gIfA*JP%wSo0s2IVcHk6;6TFP}Y2@~B;@7yW?H`K%E+ z5zw1;_Y>1RxcfG4oAOfj<{{n6!t=E)2pSNQ`Gus239VU#Zvv9PNKBNh)bz@odGats z#DT@@%%M5ZNI5ba)Cy9i_^=Ta{D@8Y2JFFew%0^iKglQM7;?2)Gck;m$X2ubQd9Pe z?qX|PZHsUitey|9q^6ajHp`q#V}qs~ctN9DBKH-sby(J*2reKNTN9l<A&4ZCd`p~* z=CgcSlO<XTK{;Scl-_h=x2~)BN;TLaCRQ)=rHK8rrm~Bcs6FO;r=Y<sqvK?nhSVC? zO!dZw7w5Pgi#%Q&&8!uVGN%G|+6u8G+DCCogT8~Mw)XMkUPdW{&_^s26Rxa$>yeVd zP^o?Ckou%GAiFxZ7M7_pv$g7WtS=pR^)De&1VsvE>8Fpg+VU?hfS}=!ZfINvfkOhy zZ`RsJ2NQFY7b{Z8#VAHof)JT}KA(ZE@L9oJaC=Q#Gegp<qcTstH5TND`%em!Oc!v~ z89#BXv|en67g-2aW+ljUr!}BIiJem3NyGWUOegBZ`J(=i?UnOTX+anCj!tbY(Uk@+ zM_%<jb)2KYnz8zkc_}C8eXf6QE=1u8x07b~GHsRX!DS3>+iY?y(QdWw=stDGey03e zxD!Hi=9Y~6_&W#SR7+v*rh${ZH_Xfd)#*u#tKgehe=6uvJ=4TCi!SBRaQ>32*Xem9 zAL7;?zLKRtk@jav1BbTRy_Uafi!%qO6w9?hydoc7Ff7pSk?S!$EJjtLD^=(XNoo`W z(Hd8ys4YOjEop+5T<jv+_;rR`(s!}mV75i|cQ3e`q=CkT#AnnAYpCx~v>UQAml=`^ z<0d`vrQ*f$TGRk%A%#w3C%7V2X3#N(zqRdxz-CoKNV#=!Yf|O&E)xlqqgSWrpch7y zllxbPp%iW|WoBuZ)q*>dbLT9pWj%*mUufoAwUF;ebK6%NY!N5e!vpDWzBDC$SNg?I z;<u$ZtL|e^!mwf6F=~;~Y%_YRiZX-*4&Y*$dkJMgDdUY|-V0w;cN5sodY6zh%GrEX z)NsB!E}kc1r1z^?J}Zs8^})QHplS^**S7N!nz4yGi4$CwbRUtAZaJ3&sIui|m=z4) zbBW(m%=4=~&-#yBrN;YSne7}qNO8{HGN!HvK17_8j_N$%k|P@r>08e5@SN<@L0OxJ z5D=pU!g%atF`q<7h+}9n#IoNjj;iVSUOA;8PzisTA3kA9e>VKOT59;u0zjSNqnzQR z#L>j)C<NCF2r{Cs7~Z?~@acQ^zw*Hi*gheOasM)?JTT35jqI-O)NN>zjDSgEP$U^c zhCe;lgpg2orT`Zq7G%dk2axZ`S3Omp>M41Ur`msfg*hEafP3Y=%`QL1G=Pw`GEg78 z)lm_%&>?VK%wZU&MJs1~7-+R)YC;!uPhFVv$OlGLodxj_Bn$;@>69h|{0LoBFkJWu z-+zRcsoH+NO;uq=fkcf~Tk^Up7e_RC5l41mBVwLnaZ9|4R=t4RDcYRT>>djyLDgrH z5c%{;R1u#0!`%W`l6Lze|H3Tps&8LuOT!*3HnCJ*pp|A81p`Q$2$A}wF2{_(F056E zyXiDT5V$!-j)f`kR(k>!4rB!}iez7`gF-I=L06QF$qF*r3uL}Oy)DLZA~W;e6YOng z2Z~ln>A)oGgPGdll{jh>aU`iGaBB~JLWd$z&5zVzeUwFI*r1uw$sAi9hLzO^f>$Dx zy0oe2Sabzz$Y(nTxSxmpFv)hQ8~!K{j?BY{?m~R8Ndi=1A2az&2r#=9xDIsac-C2O z$YYs0sw0Z2VeptwW>{EVis!kMS7C5yTAj=mkAy`gHWJNhR;QH&yg|wlj<Nx<x?~<> z+Q4#mxdMr~8kY43`3L-CuScF)Jh{J-Lc;X`@qQEWzDK+tCf?s{96<&cAcu<$ev{o? z%gKfK&eBqVA6D_5<4bXFrZo7(<Y7k%m?){8N**Yr$;ehA9ap=xG%%i$Xo~#Sr9lh_ zmE0r@^iY-pGl|u0m=;3Xf(r&<)3Zbely|JynYAMBej7=DJ?hY_dVvEhG<sc-+YM&x zg*+Q(GW2@#F7;Q;uK@d!&EvRIS5w?b$c8;X)TN}X;`WR+Ir}DOIqj-<R?hzBiF7;> z*0PMTrz46&2^EM@K@WKujG0(ZkkfFN*7nvVo>nyMb}ny5qPJL%npE%s^9#oB+y+;v zM<#}y1?`r}r$Zba#2z!Ls%Hcp9KMNM=sO!6F-y6`U1#Z?r>t`pk4ooznk}_)1p$sj z^;(kad1>!R4@PoWaNv)P)^J9ap6G|S*;9=R!bQNjY?ANoTcNmBF~kk5<%XMtn`R@r zB(0SF7S#H!sflvmv6;x?x~(<UZ6UROh?=WJ<vEs|%#K>ILC3ye8$8JrBN=_lnD&O# zSi!lb%5fUQ5Wz7&pE|uJWJUltGX}?&w~l7)bjk&{o??s}Cm3R8Zf80(T-WU#r)qkW zmmdS3mN1&S^mm;(2KlLBBD3E8%z}YCF4Z0gGRI7-8`uIWLVZjO8aQcQ|C~b1dzFX! zdNqo{ZIH55kRHC2&;;XD>ADF=;~l#a?;fLFv#r+LE~jI{4!FUynrTR~gCCrWkl!sF zjYVJt5o`mS*Kvf7P>OhPBTuZtx@Zm=h_K^bX{F|}ASwne958sv+CtzRhVFXg(#nm~ z1r}zQRS&Nn#iSgw+75V$$3b|CaI}s1Oh$WX5Luek;HLlV>jBS2><Jles8o;U)jqPl zS|5_R<ATewoWnr5keczQ@HnN~86BE<li<#19&-c==|)4~Xn_dG$Z=Z<-rK56l9h;= ziW8B?FR=jt#)8oz$J%){;FjyFtJ<brJTf;3yMynH4^f)42Qm1zyo)h#a7<M68#@~% zsH_CGL)<#ieuvTm*FMMTAqEfp9zrr)e)t(TW6WyD*fHuN$R#tu)<(IYbr8ABd^0hv z2(WnUdvRFhb3$SC9-1yJQ`EC3<|3^<1-Hu?n*M@sAoUV-IsG_)KGomX!d*Z+4_vLF zT9Me*7T$CvN=d672Sy+ky3JR{oH=@F9|$o3LP+rxR0TLf;PjWH2ES!TSRLQc5#jU! zH>T!(VzVhWKPc3_Gs$GJ{4Iv}c!y8F(10)QB2^~VGG;mv>ppxxw7x>UGRYhoI@BH^ zYw^a7vQ9I7eWpswpI6@B0BAs$zl;J*bU=S>K50kWTM70bly{XL1%r?tH$r}6R>%P~ zV=t?Ifju3hVi7SH9mgi(OOFSA4{TS#5Nk5*r4d%ubU~AGO9Xc0b^DOc4ktl>*p(H2 z1|ZKFg(9ugz+j@IFce8$oG354BfPTC6p?%42b^$Hg}kWzb;NWk_K1QwB7lx<Gy-7i zLK4&zjOhg2UTKz`&$dd@>l(kQzqWQ2t~9{~0dGwA%fn)Vw-i@bjJxUq9)2#at(hQk z^}N^zb7A`!u<9J|k_(hu&QczL$V$lRssUw!s~sv11Hx^{Y8k1~9y~8toFObj96Bam zMCJSjwoHv`D5HD0=7HNx+V!*0XlKR@XT}T-p|cgcegastUXT=cyC_CVi%1)x5F2ne z@Sv)3=F?&wBrge0zn>};{C-N%_TsMsr0=VvoeK~xT`N;D3rfy%T7V#{dOB8l2rGEu z{YkZzPa3d_4OoK4Nq7x~BXffhz4qWvL*b&aphn#<UrV7Os|tHZZ>Wl$aCtCYn5Bbg z5M~YUi~|ff;75}x_jTjX-MBw)wN`vfeIB>C+ktp2ogPXeXx0)$M1{x#``N766Kn9= zWa3^SHQ==nzFqYY+Z(-7IZ5Zerz0L%dJL$k7l6?1rRWH1FhA*Q&yZHH*AfVzAM8h& zgEaVS?)4{F1#KkMjUqV$Oo`NBesAf%D1{&eMhgjkwuj^6i-TlUFbE-H-38Po-3e3% zAZ3BMN%f)-=Y>grR5(}-wb;`Dh{ePyH^!Oyz6X8}{|*O8J3ADjmTcwl(xxwhAIWq_ zEZtfl-3v04!L<0CoM&{|kA5KYt~A!c-1LLxSmW6*ZaS(u=a3S>`lqATWHLxXL+r%Z z==4IzkXZ#T>%r_M@J1*rNYm1SD4tuIp+}=(FJ-FX7+OoP>c!Ego&02my`k)WuTKtY zaD_ofR7poVeX?lB%9B43F~?9=2F1f_e_n4!%f-(CjX9E$sgp-2Jsgo`IKVWE8s%e< z#psx1-P(YK^=>uJ7SI>sFvMMvk(nP?=oF`5QEyf1V5N^uC^2fkJ2BBkp+1V~7mrn( zR*qj_w6)hABy-N|*np*W=cix{WjW%(Z-No6$v@J$sWiPOQ?dSBKP5AzZ(=aLhz%E# z8yvl%&H~$&nos1wM6<@be^4bDzpBt0LPHrzA*73n6sls22ktzm_R5PiR3?v_<0@WE zwMUWyC)f;2AczAjrW1;r;~^^IEEac+SgnZ#0&-h54MgM)D30RM<UM45TMNXdAzbfy z{b^P$pZ&d1eDu==rgx1z7$tt~G!GyiSc}As0uLEB*Fz`{5e@^|20vPSNCPRu(sSST z^@#tWU$M-KJ>O&{1XZ?slVV5K_ovt;4m%1$I@mP<or*<}$FdKqL@n+|t09#W*-IZ+ zcm{6P%v`q`vAL|6x-ZXr?}JRYP)6Nr%T4JFq>e+Z`l`H}bnj>P8kU**IPxTo9^S<e zkPq<oyXy!iFQvdHN`urWf&f;(62;_uGNbPHj!zbiBIt*v4i4n7bLOsdrr|o%aK+tq zV0}d)YD3Bn+aB`R*>C?<12s!u0~}z*$NSgDGuj$k+UX7v-wTlcraPM}A&*WOK~nUU ziXaJ(7~2sZv~P}RHW!G%H2fO){CL_FRHCSQDAudlt_JpW1P%`Ism#ieK5U#OV}^c4 zk`trhu1<H(K;QD08`|X9yYA7++*_V&U|u{{F$S>6Y{fvBN@LPxnYC#gxLv5AJiKu+ z6Zxx2KN-M<<cd+6!1nP70Z5HlH}qYsu#O#ex*s}TSK^5(+@Vw7rd>@C=5%30U2&Fb zJAYQFU;^N%PChyPwM|xC3VVEKx_>Zd=vRSzpX8Evv%~TZO-=gAs_DkfVY#`9Azx%w zETCUb0GlLJm)Ox4J%|c6A||~xMX+;l2ZuHfJBOyH)8rC3?01e>#{x{zX0Y#+vZ|Pq zRDfD2R^L?4w$z#?QtRSePEl2jX9KEj_JrhCie_MChZi?DNoAIt$D-AHQ9b8PU%dHZ zvX))3#FKYqb-Yxf57$J`_0<eI)-3V?iT=j^3P)YE4{ZI#?wA8iFQSjKB;<ZP%U|G6 zFsvK{EuG*FdJ4#7+Xx4OQ0U@QW^*bj=ig8{yIc8uq(QLdfdk)>H84ML;A`M>d^Q5l z!4H|KZUi^ONhT}3;l5vQ%9Idk&xl{jdvfS8)7h2enZR}?ur*vs8i<uk2=*?2t>Z^R z8+!}x+K?>QNO%@0HUx-)5dR>`Q*gzCcJI@Z-K_8)0DT+xMT`eE9V4oezHN>7zSe zy9uUO7uVe{(5)NETSP^|CL_V=QSycg&h!Sez!S3oU0f9iG{7<w7V~BX8Q&m>(X}^{ zE<Krud}0fbmgtZW97EA!SejiLba?J60G$m;%aD2mAoskGexQ)PRS054FDRvNO2Oo& z81(D~)M8vxU|9s*1H)D+>syM3K~yRF<9qoGH3FIIFfT8qtxM|DxyuJV7TlX;3#-nq zO~3^ca>qO`7sn!YBMsx7)51W$i|IIiHkJ|a^3-U`+?<Z<)6*j9`BWqX^C!>j(>01a ziAN%7o}lAr`Hqm~c1~Y4Byvh$K%*`?#l1ROmdf`af62!T)vI`PBM-D23f;cLQ*F<x zJxqm7J1B#}h_k0#2jygp_9iWTAp=gjnnokkRp9FWl-D_s06Ca;PJ$m%*XrP{2z~5$ z&U<>U$8J+J3P&g6vaZ-bH}swC24-E|gpk7?4k`o-jMM=lR&@eyhd>;d28MXlC8RdZ z)Upj&GHc&){<={~sSwR6wIx7J2zNU8OXhYmLK)!flaOtk=(TOQ_`)<G*+5usxIvu) zVg<2lQ6kK}x%R!C9HlD`9LOAOQdynkMKCp$Tc}HH1lyt`JV1gp2DFqx!l7pImifb9 zAdJRs#Rnf((!<Fc4=3R*v7}8>JFTVTw`#qlzdfG;-d%w=5#XxDb918TKRn?Qah1Yx zKT-_OCS3$Ui09Ee@Kc{Y>DU{Y7lBgR-RerAmP9vzsYGOA{G;?{6tEED)S(Yw=k&}= zkb6JhZ&=#mYsYn1GH?=3t^lwE#Q~aG98wB8nR@RS8_7weQ{&y&V<k`87dgJwJXaK5 zNG|%8CAzao$`+lvs=8s2aPWxps(Wn9_|#DbP#Z!)&+&drDo7VM#jlsr|DmNmXatuk zS?@Tu=;aRoBe48wm@t{0$X)Wbi57C~m+dTz4hMRugN9K@?0d-e2}30oGjRsXC)Wtt zDz2RE?3H7&k3v`Ch=j>4BtxSqhGPVWnOP@Hh60I(zul^)^1JC%SZ(mW+l%Bu8!SH$ z^fuZ?bWdmk73IA`D)3Ef-hVyDg!+`jdBO4=X343}MJewf;g+p#H5xBb)SWZCNm-Av zJ%{1xI@o7mb5r8%^CH2DyX<kzNxIA>aw8#{530%0PBpbWLql0j*cv;ZHKFjnz<Oi4 z^D5e99n9)#rqDm+0Q8bUAm>&o1sXao5f$o9i0?9)i1Rd=-Y%aH<u}6*U2zsx&_hz^ zH}W{OwoujIdG+sq;_iT$T)_)VB~w>XCo9fWmnQ8pogt<AThfZ|Q_l^ThKdg2k9QCD zwn9GTR;s%Ys-j)02UR(pdxu{m|IxglnswC_5`w##_o?oXR4&Cd;ZwOa&HnN<UE^v= z8jtk(T(Cw%Jx<yZWDT#wb)xbw%Sd?>2iBE^st?n}HCE2`KA+y0mD?D$rfEr7)M-Jj zdvx-hn;3V!JtYU#8VIp@*~~_Gm(Z;1+O%cMos}QuFOD}Q^^5-!8yS+4Sj96Yiom_2 z5h5e(ljU_*HlCFsfE``$8v#Pza#Cb8(h$RK21GbRpiI0p;FOFGwM#9&Aj9(YFc=zz zqtVCD8gB7&IDRV3WKIk2Og^T~{ld;H-`_1q7j}!uzW51DiVjk6R4qY!49MAI<CAEe zEd?<Y`jT!w8dY>51ZN?Kqx3X#v+lRk%bxzU!vf(7E-ZbbMvh=geH;HV%$GrI;_OwT z&p=OPIT}U$rEiIL?p0fGA2lwXm!o1Y#ZZ3eF)HT0IR4j@lCJRZMnH7Voa-XElVrEZ zFsFyE;nWZsSAfHZp5<w4(Oa<ZBm6H3tewt34RLincDi7r?QZMt%=2LEBl3J8p1I!G z#mO-c)?9!7V$#p9q$e!Izv+Q9XxAnV!jt=|7mBnVB*xpp>n(m-*1^jN<^d^W$O;Fx z$-YJMF^MCb*(7M9(3JT^`?Qu9!drFw-MLhRysdCZ!LR^)0JsX5DRrhc+mJ~Nfr+{= z#hy^srD1WFQ`2!w{MS@MLh`BjvZlO%HOGCg+!p<_WomX;d9bb4*QHpS!^#8;a4xaW zCztGYuAP!C@OiJF<Ehl#uwN`lueu=ccF9F=gj~MfZGpUo{WKYi$MKP;SawthOQ@FZ zn?li=b6Ap#{E9CF7&uyaC~Jl&6bKQ4qL_2Tp|v!{Y>t*nK{e!%NNuKJ^=vSd4ZmT~ zmrPa%Qke{)!BVahkSz3o0=Q23O$IZeC=QF!fxhfCG`5QEiY#XK(Ksw0`E3u~gM`)n zV|f;mA%PvL1o5qEYWrp3NZ|@R7h;tJXDM@b!1n`+`+B_#bD02|24Lvo*BgveRXwg@ zHM(Ipmw|r?>oYO9iXG^C*fj2d0?=%shJ-TJ8X?rTJn%p}8xX#9Ke{vioP8&b?mu+Q zpA`A5@%AbJAq?x)1$gfU+S&_WQ;#dZK-WgX5={Jq_wfmkr&WhG!LYVd!#1I@22Dr& zxvVf@T}W#Sq|?t9#=)*JSe?uS;!#A~3s$V&1*UD6vf?@qOEWSTO_d`NrK|#y$))Y+ z^cT@-73j(uaqTbAB~O7*$oju`%=Irqx)(caAI<(j<r$3<br}6}WX~|0gGYBmF&c9# zls3LV7ftvJ7R#sgi?znn9pcwAZ|DSmPpn~EFNJNeN8Xg|NS|h)1L>)=yrA^6szx&b zv0rV88cZXCSIGKesU;=KqPPrX!>8;Kvjyg1(J9Zk8Y~<>$@%18uy7ca{vs;NFB@wb zyXHTl!yi2>m^JyyXXnZITUd0q)v)^R=C;Mq7R_q=q~H_KZ5L;OU>SqJA`5iV9eqLM zTv>&@QT+*K53*NLhKCrt$CeJL{EDkZO?avNIn)(49AI!g+P7s^Nf`nRiZfxi89hUG zB#6~`U`zuc>Cx5L%^+Vpa+F^OsA9LXkII!!>X%Atm!5aXGHpLmyUfV6ZyL*Us@B<M z>jnnxprp7Ln1WVMo$Q`R&qB_A;_HBIFU-l`yXhg6ikA^gfB}29dpzhmPs$V**U>-> zN-Rgit^flRhx2_2;^8z1K{Z@ufrc;fr80$s?1FgsA{s|Qk>#W(Ak`0(ioql38RT;q z>$Zx9jkUD52m(~CivjAw?&9XCJ9Q23QrGbI(~LsTGxni649sIl0;y#=!!RK8BMV0~ zZAxSwEs$0}O1cjf+IH!96D+=XTmTnGhoFEy!B4FeTb_mSDaHx|;Oyql3s9HTIoN4h z7j2a`5G@R34WW?8pq%P5t0Ej9nRd6x$DXZcUQX<*E-LT?l)%BSWQ_ugI9@1Od_4{~ zU3hN;{mC6OR^9j#0RPELXA_l;Zvfz1!gnvRWC<1~xLT|2ZNb3@Ow_f2CM+M*KKYnh zm3G}tbsrtfW=|NHDffgqPo4C|r1arMOul#B5E`NDy)D57o;BfrG<Rj2?$kAE?nvI5 zr8Bf`)GV)Y%=<0Jyx#~eVk&gfT~~2M_uT3;Y4@VW35vGZlvUQ*X01bRZ@S70#ARU} zp&TPdp7n$&`%NjG>h!&=Cq8Z2W^26jjfsvc%Pcn0lg15^0U^jLO412TCD>WXiq4L> z(h$?`oHD0au`g&})?zm(2HX@7aw}`xtI1Go)qU_oAFkq4n#?NlZyb=P;e$JH?P7C@ zL1SG`T$NQ_7q2R-ZR_$}n$e!5R|uPe`efB~ig<L3Y(ao`YD?sts4^gSzY~)AU*Gjk zOAFVNs>ihTU*I-AY98aIr?)Pw*TuKGpmpe59`;PJ721Mr+pnl?z<NMbCA%wq$n3zG z(mS?tsn(*{i<4wl<GN0sYTmz-lBzRGB#o;SDgQ<du2<E4q<x+CX5UBXYGniA@AYuM ztZ(U96H|7PY%kMbw**Wknhy7e1Jk;gWxh!eGtKvKI|)hvr5x?p<@gp`1Ki5uU)l9H z+Vd~=y$Jj2Ei&a<VAA8dZ}g%B1}gA&IF5#W9qYrn#YMk`AqgXQ5bCyIgm#xWW>K6} z7?e-~g<dqom@Nb}xf!D(hJLcGZ`VLzu_Jpu1z_f&kq)b3YATZ^tW=PD9P0l_3gKlP z8@!8-xDHsbDh`?O<|Vsl8gHxCm)^g)xrb}3vF=zhXiKB^yJ)~53Yoe16*YwFXtSY? zfA4D226Tyz37Ay&*!R%qn&(prRkMaC?uMY$dJS5-kaCU%KMb88%~0FNvREHjn=a;X z?3ml_hs*7SakC!J<lAs+ojSbjHJeQZ=BHz7WWR4QmlnG9DTptJaWChe=Ts}QU(-(8 zWs_5EJp30}!2y=kqRm(_PFK;ojFX-Ajtg$etsLx>V_n!!uTe5_q!Q2muJ!RD;u+m! zeo+^bZ8?(bK~N8~d)qe~)wJ8uhUT4gk)=75!>nO8kXbmQtY*BFSXr9IqI5ai5@uSs zH@O68^PvLU$XTeWC^AwKeKk$g<8Q+SF;WTIpr!T|MuXsMndXaQ3iKFkj?cib>;;)~ z(aT-w>q3g-Jw&zIDq_UMQmhck>0p0fMUOSxX%@^TI)`>I4OP@NUSn&i{NA&6k4SUm zkOu6KqTNi?)9Cj#h~xx`C|<C9ddD(8ZrkI>?k!$qvR4OlYpzF}Dln24W&njgxXx7D zdb~7(OH$7v-ruxvOazT?e~YXHA^yYIw&Vl4V%jBnO<X=(yy7sO-*jiSQM@~Nv)EAW zbucM|%Fx87KAthGWDq32HnTt+fNg|yZ!+Sj?s9j$KAy3$eGY!nF3gUp-#tilA499L zvq_K=&Jsze92)`6%juZ<g>3iiVX#3gPH3DLScd+=<N=6<*bVom@8z@8pF5U9U%-7} z$-!Kt+-iR$X?;XmIW4<x&6o9{MA)&(gQ|9&yvI*Xj!iS^!JGpDd5_<AUwdBU;d7bm zVF@IZ@ypP(VKsCRF`v)-pPdn6=Z4_n5od3s#g?Pi1WLN1ag#9Jo>Li?87fN~mN|FG zWH6_L%gU`rj}?6Z(WDSEX3apOR}JJ`wmaXOSjazwnL64nr#ZP+3I>)Va-OL85k;UE z8}7abOl0*B+=lX5i4lcON0X<J4oAb?TY3K^@7fdCrGf$qBjNxn!PPe|MRV|fVeigt zaq_$sU`xIzYk7jCgp*tdbOj<v=99@0ky2ZyZCxK`o$9O84I8{8LNOtvM9x%6_R-nu z5OI=zC+UQgM@^T(+SuIb+zr;fr>q*@x4(PBs-2){Tf6Z8{=v7GE82Fn_^?U-Qa6;f zV(@^8T28g=nhmTqsVlL%%blHKX2e026P%mD>v;weAe0A8nO3Bjl9r$Kb~QSv6XoTh z=V8*->wUM#=X+wc<C4XN-fPn)I<o*u)C4yw3{0(;lG)WbEw#aI6{DPhZk6&yRM6i2 zq)=NYc~TtaBN;Y`6H`_zl7G>5xmVT`i2nqgQ`?%HYBGKg-Ci~ta1w2nKP_IUEZj`R zUb|o*9(2A~;CI1@H{v$B+6}>_9wUweOU4#tFDl*4iuzzO$1;&HV7dV+u6)x~9hB;- z`R0boXXm!)?Hkn#A<mA)e_^Ch)8?RETP1?Yjt9Wz)6+9*F~R=k(hxvRLVMH~9sznW z4rWFO8tbR=PeHj=q!ZId3@3xy4#Rja5LqF=Rjx$6B!3oY-+M>Ycc^HC7j)sdK$0$N znq=}Mp^NFApnlSXN!JU;vn$&Uah5`Ymdt~u5x#g06mAH9gn=orazcpZz3D6erRU)X z`3EvMbJ!2c-YTB6{psX~DeHjOsA^l%9Tg7Z&bxq)*O6tz?y3P&F`Y4^*WRios3~ZK zGqt;|8&rj}&T8i7C*fYQ1nZ7NzEftS8_G54gdMS1wb7<4BB~Frci7%uR)rBI5Yt>N zJ0)ygss-eW-nFox5m-A_21IGHgE5QUWn-{pHtgFKO@Q(xR|#rz!0%doYbyyMV;}KK z3JELg)&q6E-2l1@SHEtQ5Y9rh#@wuL>UQZ=x@F7uojZ{SPN2Fpu>wtyl{Ls3VwqEj z2RVV2&*?&cT=K<5+J3-@0sU!pEfI!u7DZQe(Yy%SsJYrW(6+AC%!A1JHC9T7JTsv~ zEPxHV&sE2jRO9*>cpOzVW-_QUzqEP(AbGhjElcSy1K(koLg&tT;6YUSK-FSp5!g^$ zprO|VG86$AI_5R<frWHPlVh*@Ti|)w-R{}StQbQY36hc~Lj$zp{M6t!%z$;!CZow0 zYKD9LU)B%l&=kAt$5;gOd-<W$JeiR<3I<P#3<aIVY@=OK^;M&d3>0V-lvwmyujktR z+V~#WcCU<<Md*e><Z4yiitp|*a2f`&gvHdf5231T9E&TWomb?;70djXkH=~BrYx3O zNG0nA`M8i=G?AVx=_ssXM<Zk}or3bwXI}o1uj5daJdGyLyufb9)c@FCU`{c1|F$`Z z^L}*GF6tJQu46|)I(M!cAf=J5n_)A=Wb-ojylJCh0&Q$2S%I*{vk+3I^{O~D!$5+3 zQoK;V&cZdFg=;zs*VGWMiNJC0h-vrcMeV5Ch)9EChxn>7@D-kj{0>siov+@ziIc`S z^~2Z*E-9w{teWm%O8O{B(L-kiV&;fBUqW<ZDW3ECaeD(9o<xT~(LsNdVhHTvud5KD z-Ise}{ylbr4T%HZ?;I2}Kq)6`$Gn6+&PCxLg%_?FfQpKdqA+xnkP8y-S!CZc&U40j znj`xHYx!DL?Ik*vZzBFbJHqIaniD{9%ULxN^{r;zefHzci)U->Y>l0*vH0%(pe#lO zT-~d?6FWfmqF{XcDtjOn-+hdS_z+@f%U9})v`&Hp<qin!wK(I*cSw-^##lJ|mxiKK zl;Gc;?c|*NuJoh)GgSlcVby_PprbEmS!O~oZ)TBv#(a5TVmnh-3h->_6cuvngMANS za$&5hZJyXfjx=b9pzaabRLCgZZ=^rNF1jmbrPT|MH5~&>PJt+~qB0t#O;3#AKGX;! zxFH}o@B^_{M7~wXv7n#%*AICIiw0NwP!S-KdC5$FrU`MiP|`p*%8tpjc5-3ZJgHVK zw)2C@oZ>cfTv>x{Na3;_W!(L(uS0MLs0!Zb(+VtvP)RY5RrV}uc^k5Jm2(`{X)Tuh zoP7I5wK{7Zh40(BA|H>JB5jrwkb_@+K}VWh;O|Q(qN^H;2Wv@=x*!(^`-7?J2qO%a z)BF3yRG03PMJ8BIN0WoG)F{CYmWzJg%fau3Ec`wagg!DIyq6!Il<XE+kw~if;YX~t zxpXze81<>w3F^HQ*xg)*&5OMcDGdF^wKOv92XkEQBkkCu*URJxOe|p)pd|=hNhm(C zc!*f|0gP=eHdr{^V6C#`zOv3rb$OU9vub}E1DFhw{^j%^xb{}1;&pc#Y1f_{VZ``h zEIkNzz#LNy!}M3VDF3D^4q8AfJ|$tMuJ#I&Rw|TJ=CgXxwpB01v;~FhVVX?f;%yFp z;pT3x?$Oh>qzK1H;%MaagBkK^`2rovQiZ+Mnr1DX+zfccv9dTC9n@ks1jQu`C)rC@ z%DSU{oyWA-(WDVW3<4mIM3%f)zzEi4Yx#ze6W(Apyo`~#g9ha3vye{nJs>nGpB1n- z!-(}^eZs><^>9gV(2Fa6O^h<|t_x!5$TAJ#d!<hS6IsMDKSODaH^6KxoUvc=mXz2~ zz<f+>wc;D_7Rn&x>*s~qAB0>BYpZq54b3&&Tg;IO<GA7mR?JiPJ=&{9oM8f`jEgzQ znp4pud7ZprOk>~3lI|Vk0#Yo`>k9oB&_E5u*kW|C{q&*0jO7F-HO`Y_w42Z7^#xsh zW1xEh8ghg7_+r-cc6ShE!DCH)F89%NgA9WyK&N?+kgIgV(Xsi<`}w|LjV@;=ux>HG zck+EfY5oFk=jJae%mSXGV#Xgj7Qdj}R-3%Thp4xt3B0oY$~Zn@^#W~CXi2ygdGAQc zIVnxnxeQVxPH#eDA^SocZ7^5BBOitGZaXL?j4G(f#Mr}lT7x79ytmxVG6{I(g*xU} zqtoIANoxSoerH-*F&OMaOCV&oMYd(^?j;0h$}oIMj+x{GpK2)9L4p<%**oO-{_ZhS z*jx}HI{8gpjW1<h+K1jfZipeRw>3Acmy9o4hrKWCR(FWmbfk1hybbxLVPKs=HKpT! zuzGN=1XZX38RS1S1A)Qo+GZ!B%J+o)R*mbS$+?+<jM0_uK%oH0THWf;8plG2@o!ll z?<^YZNa=#jbiZ_TQl-@{w4=Hzq^84d6zkrQZMa1+lfS4l5|jI=v%Vmw)xyz4aLTTE zbrQ>Qo4n=jqg>T}9E6swGU|gxS@~oaU%Ji`uoVCBvdI$`6X@Qd<Y8A#7(pCbih{0C zY-7av<wjEi7RphEA`mQWznaMtrjT%HYfF^KRL6w?5~*Z*x@ZlzC4AtM*QQ7%;OiN; z_wSuLbiE3tO>0Y?&BHcE+>Hknk)ymW2K=)Y1_pLE(@8>-9KNj8L19$RMkoqQ0JKo> zX!B`?#|Mzq;manccI><UOe=+We1VNCNMa!OAe5vWLx|`0qELDs0LHX}Q_$WWB1Squ z+3J+J+fbwB@fM1*Tqp244d&2CRDq9-Z-Nke=A!&5Y+6+UG2RZQsL_=ZshE-gpLwVj zENC<R3fX|eJ(}RZ4@i*RNM0UCQ*o6etoLjpmh%(y-9uNYuPfPKR>Qopb`ylV>US-@ z;zBkdGqL*dEar8H0|2w2)wrA2_g_pO%qk(5%#V1sC|mNoZD`(YB4*}7Pwe$D45QyB zRfN^HG>JD44gU|tz|_Xl*CCHXfxOb?$HBc3a}vc*0Kco210}aot1`hJ`{WarOS&V3 zGP~jR5?78u$8K4bFMQz?&5?B(VuDSmpz{XSL9geGEB%s(7qp03FhOJ^NvKde5}M(P z3O*<EmU1e8q-?#cEO71*gGw0$SJea9?OR_Db#~AtA`yw9XT=}Y6X2KVub-NPURbm` zX?XCjGGYy@Z6%Du#VP`wXfgoTEV7+UW7rQAv~(v1z{b2hoSPHa1uGDiv(QGD<?Ot| zk0*RnwWZtE$0IZa7liLG<knoOawIC-J5<#{$t!yWxV6Ft2l`*Ny=N|7iqsiH+#jeU zL@YD)LZEDV?&+HyST=mOFzGW!Pd(a|)Dl9+Qr35*rW(%NnadU95+qE52q5CK;)qGV zs&B-||5kAnlqVHb3+c$62`i}eA~-OZekc-bY8aS^IOeZch4bL_-aUOFk&2Fh4f4%t zeLyahGxGZdAx6l`k^2rZ#H=6T{h@@;2yGEd_w|YUTg&de3uAjPRlN!L&m9Q@i)ujn z>+0?ZL{$rH-3?$DfNs(>icF~`CCCA;NqeY*V*0_>L@9ryNbdFSph;ko?46(SorA7} zE-TL}=+<^V>A+S+uW<D7)%udvePDF^;gf?^NygpUf+Z@fe@o$^-A}kKqsgHyEI7NB zwC})S%j7SVtIE5~n4bDoDRCSu-mred%^Mr8fvp2-IWUp4USu27W^t}NN#(J8I;^{P zbSJEim^kR^u0m`WDHt6b{cx`sSJ6JFfd4VhK5~+i9+J*H3wTu#wR3b-cLt*yYWy(5 z_?)7KB|)lg2BHxgIdKpUgX2St+6h~CH$r~a2J>@Y_mEV(Q1kUkliPypwXEU^vgPNf zMd2h*KD^^p!uz8?;vjj)R=(QWS2_Ga*Kv>4d3eaicRZ+Zg<a0_73TAtTnZg~QSKXT z{M?5Qk}~riW^}awuzQw4Z(*oQSIwKCldv=AbuWf@VGsdHZ6P(|5H=pnq0r<tVLQ8m zG@uJ%Y1slr!+9hNZtwed#wTB1o<0nTiG7I8Ji$p>7gJaS)7(}kL>hM)Q9(_;fi)oI zn04ZSm$=|$CFeL5u{4Y?EeW~OtSz>h>Frepf-8-=T;?q?wPfYBm;y2ZG8%Bj<)RM@ zFkur%7i6c6(gLj>o_yWMB;&dq|1`-nCmX!2En&ipiiUdVTo`JgeQB+===!w9g7P_o zBThc<(hpXoYtivAaS-6oO5q~YM2^&Jk>j#o-g&P8=A{(EhVf>)KMmB3-%*z>_lkMW zClo^BPAZ9p>nMkB*lKijTaqPRZ7Gl+mbGL_<rFN>#C#X4ca$@jmzMLe89OZ!&qwU0 z1x1JoeGOt~gtRY+5nJtdOC2`pxt3%?dy6-H{C(G6#1L#=U1X}K<Is6FUM`ibz6Q%Q z;#b$MVdE7Q$4R#5gG0sY6~FFfZ1IFz!Um3TxUdGT;GxRc5?oMBzkM+Qy@84S6I{_R zpA)Yxd1xmY7YP3xr|t6f-Fyo*j1jn~M+f@^P|#L6rNT}-DCFil9hKZ}Hs5I<HxqrR zXF#e4Y4f-(`Xs8y$2)qLKyiF+Gh;pM=*%JUxggiZ>K#n$-Ew;#t083Hbl0R;0k=0O zwi_G0NS(q}@_G!?M?1>}Ae?ddy7l%-xDZDxV>@Vkokv94TL%-sMhEj9Uoz!9;$3P3 z;=L041%Sp`$`ftc5k>=|smr?6EDj`<T^1dz;}-JdOJoEC72J;TmjVBAY~wCS#~X3L zB!f<++gUNTA5!9^H*hWaQX~K~|B#8+K}{xFmd(yF`tQi|l(zXm@4^+&dM>V2c@0W# zE8(mdl{Hbrs7ia~l&etn_cXb<))X2&ZWn<9f@z#gtCV}@!+OY&P**EI><Zz(1_7+g zzNbllO`Pody|DV+B4m~2SML!EK4{=1S6MSv;K5Lx#nO79`x2}hSMza>wa`gk?1Cpz z_q;AGn^(8WLvWc?IeW;BOm%=AX{zreS3K^nKAt}x;@hEt1Qw#6oi3L>&{#nqi3#;Y zYjG{SG>TueF$I_ro+<Iq`SWR%S=sx9HCh39@X-XZW(c~WO>9Ao;us9kC}GMNtghH} zkb{wCH#kpp%fxVs<n{-odY(-H6AU7-DS)-EDs5xKn%}VRiQ|nul?N0dQq>ITyGQ=l zIViMSh)On$0tQ5DGYamUB9Dk)=bW<oj&1s{VM@&k@OV^5$+{a<oh~gWkYIoYu#z3S z!7yymVPQNaZjXMN4T+f-cm{jCRinVMO8d>LGwsj6|2MCG{HLG&@UK7n$<KcA-S6w} z`PGlV^Vv_n`RcE}|D3DTKKt}PfA;Ag|NJli&Pn}0zVW+mF(T2cKl|R#zx%__KK;h$ z-}-NE3RfDBOfWK!4fg&BEe8VF&-&;%z*a6}pn%uZF@J(7Q~=;%ACe0h8-bWsQ4PH^ z9{aV*Aq^8GV!8zR?#zolc6aKZ(V0z!l__}PY^4BUOb&$g{@4{nefeDGrs3~&Qj60Z zudjqva;kug4AmP{bLbi**LEOlV+H-<oZI*gHoDV`-9;-<POQXpt{c=813E%oZFYDW za!}39NP6U_kQjG|6KDg(sz47q@^~ZnjGcURr0y1j876a)eh2<DnHTt2d_>A)A=>Zd zVjRa|RX%H;*W5r8QF@Rqw400jM<D2p&Y=w7`xI6^LcEkal}a5t=0{375J#1AdJpA_ zP~CMz>&XtveDL?3<Rbj_BUy98=&}SvhaJ(cU~9jFE`?&0I)Izinb6w_z0D6ho14SQ z&Su!G*9xq?MuD|2QLtHgb`)6^1XD1|cJR=Pne2Hz#EK8g%}7o3_AfK*VG>#5IdnJ6 zTqTNc7niYN4z(0b%$(Nn$pEhw+GW`FBUJvFN)HR9=A)8uEkNDS>f5wJI($j2uZRT= zT%JC?ar4R3r?DY*b)E0>>Nm}UQ8lfrNs+zCXVY$@e^3Vx_DM%b(%Omx6zvmWGhj`P zAE?kqLLwjdor|q|3w$`0nKY>NcM!Y}5e%jf{9|7w%Hr`ldu?aXakyvQvEkz`Mn{jd zevWr2Gfe{%bg|CSB~Ywv{7XXGAbFW(*)bTRV}do6;5ZW32@KE+MCPDf2;BC|ZF17x zpOr$QoXemKf*v+O&<oEJzLiCFmI1RRXKO_=$`Qf7&7Bo<A>lrkCXlrwj5Hs-N+-!{ z75ze2$>8{J%=UlHCl$U0(wPK*tp^p%<mN0lk9Rs4sNp|!Hiv2k;`Z?_z5iSNUYz}% zv9yjy?8hgcgvIrhh}Q|fM0M=D299#ppTy+A?^}hNc1DeE?IRkZg6VE<Iou5V(2hxe z-@=?QppWcZ3}jG6RZj*Q&p3K0mrxc4_Vx^h@C>Nv45(-^P?6qP5HpZ%H1PX0ctvgf z*2dMtVme-YGl9Wu^lbqAa4g0!K}O)(*CrDW&VKp0alpji&-WwXt@3N9=V!vOv#J;; zul?Q6d#j>L4=Wjz2p_tE!fwHxTPOqUHFzl%3aNd~ipDEa-%&458-V+{m^e4cz)ll? zBHy{R#mLu>Y2Q@YGWE{6=271IBB>I8x}jmw2~|jmG&!e8TB3z2T4B{co#8yZDc^TJ z9i5D-sxqQlUUflgDwvx74F+7+4rH>u@bJJ0I8+N#MY)36>FeA-S)I44L+7F*(DSs9 zcX}x=Ih0UBKy<<Zsim7ZwClZm^lS$)Xu6uDmsADV#;@UYnzNYBB{?`CJt}u*l)t4T zZ%`?x7!p9@Q`xR*j7pSM(~;Ppo{7X;rEE*~w3<RauEPiFF)2^E@;jw=f|qtR@l>gX z#A)%)6nptWNR&Rg1ye(<Bo4fW4C)5eZnB=PO%ZCPQXVwdj*RKbtDfdjPv59^5u2vW zrb1y_7uZh4o0AFY4gAIuTzBD<Y7Ojo(4ZFpEw16kApa5&mJohd)#fwc9VCwR@_ihd z=xD%u5iAMgX-TPUjx5b7ov7yFnB{IJnOL{8IW=r@1O2oht=RYm`YE1Pf;kQB=>WaW z3{1dcGrJ;syWdvP(d#v;#*Ih<GeysvlZSh9H~^QI*dhzt+Uo?d=+YFv2f0%<y=?*m zN(2}aJ+0Sk3{V}Vpd%vnf{dAE>F%NZN{BZv84@k9QMr+P+efM~0x;FjpKmf|jTi8# z!2@|g_&qk5zA<3Kb?{R2ipzdYLiqCXGkP=Vo4nviIJO-uM_4To@rkzN*OlhJPW6DN zF@ZMjo@`$a*=T{OXmCA8REgyOWA9y?+sLv5!SDPPscv-xC?%5sNa{hBszxQLS_+FL zg`}>2usEtDkR(w8kT4RINU6EunOU!QV%yQX8}`_qotT~3*jPIzcI@?pW7gv-+kd93 zy8X$2Vb9~f9|=HGwcE2OyG3N?z2~0$I`^D&&jSM+g8W62DhqJuD6dU929>+6bHR+8 z-KTc}J7F&Slb^^+I6M?iF?0w@z#M3??!HS5q|@q>OUdR&Epv0GPISi1VL&aqg+0bf zOInT3<<EkWT8Ke##kIAiIDse!04KkeXg*{L9%2K`vwtUPw;XmLc(^aZ04#N!8^^eb zw8j|&z!a#Nj8x`RI{Zza_#tsOQb(QqQHeJiXvaK$j-%)EGQO<RW$5*!7)U8j3S1X< zAT-p)RQagDV1FY0)MRjmiE6P#<`HHoH@`hy_C)kYP6()42f{^N%;k_!8NpbJqONSB z4H!aan5P^F>t7nJNX!CpcyJ1FGs>}a9}$O3tsv{@L6lxQDAV#+7a_hvDUV#wzM80b z7V$F=L4DE?Wl+lTOA+n3HOsDs+;fY62sCFf7E2Yw#>&wLO!pD76z>xc);zBarCf1? z|LEzHKc$Iw7#Yvv+Umeg;wVZAb<C*EwrtW&M|uq$Sgy=UneHB;tDxCkO-C4HNEnt@ z%(qp<--xS?jFIBdKHV}2%En{Ie(c(ho6d#j;&_l3im9YoHl3uQ;h5{oxIA}R&S5Mg z!Bg1t-Ej(Uc?r6IgMwuEJ3SIE!``$@#t2ca>D+EOI*Cvl%CaU!E>n!@u}IJp3jJ~O zrs&}A91$X72Ngi~lKU>Wua`*)8cBwv1jlJP62_3H14kB9lZGzEA)d~ypu^V7Uw&Y| zReqt>mE!73ag|?awZ~R_>>qTGsk1D+$yU2(wR={(Cz5-!-@lCp_toVN@T}@-ca60T zJzx&+J>7diU-hGD4Tt{Cr2ax4UozYxP~6?o<Rq^K6hsy6&4mrZK3OC*4k-05Hnf*d zpBGap=CFm0N}Nfr9ebM*Rgfk&{bGVz)^U%VrvQ2(W6U2<2N<2dF)4@nlwK5N;~<(l zz>(I_QreW#WB}O-EF6KCO8!Ziyr=m?9)q<7OsG{T5b}BEP<!01kk~RinU*g}aeH?< z1ty`vV`fl1RG%EeTFrYi{WeR!4~q!lJ{XKCKlk)Gr6%W}w?H<BZUPIE_p?T8etZ=| zm|}B^fU>v7eIP@lLJf{ghPoT5!+LzTs2;kEbp`#8&OxR;O3m1YAqiV5MGnhySma|n zbl#x4H6Ac2<-8aDn8uJbHZLxBvN50&(cg)vlM&_mNm+@QT*}1fnSQq$j1`EI^GQA& zmM@!)T%rnd|K0DJ;H;<2?^M$nA7h;TaIVIXJ0l&A@oMi&!W!-NVOn}KGjfQ!*+M6$ zPf(dFO3ReDXnRj!8cskB3k^?QX5`VG7x64;?7;g8I_^g{Yg+iJrB(w*4ub(`-|F;1 zI7H|rjm1xXlISPObP%)Xk2g{qg5SLZir>{6m<6N8S)K~s;t0432zns0z!ZY=C!b4O zq|fPK`Wz|$=TSKNFj2$QTE<aFXoT!BP93v=MUpEd58*&SexcAfiCgaE!?<(P5w}1j z71<(Sbtqb3U6Xddu{uUR*j=W4r>=ZF4`0NgFW%77tz3k*6p<-wOX0C*(3-eEkeXO& zL?KATTEsyoyhzxB*FYhy83moS+ol+GOX&Mmq3^YLD+}Kx+ym(47OgEJ|FJ)-NwbU( z@wO4PT@ByF%Uk4^lSaMqJX%MdO(z#2NHvSmY{cXvjMbpdwS~eV&!w<Ni@OU2QkKUr zi*HYXA(;&(<^dcGerW{WG(%~+xAM|+N|t$?zhpDSP>4yaz*xY<N`pq=8;}f%=(A2t zSi0)u3l2jZXk}jjpV&mE8L!xlF9M2lKftFx#RdfwaUi4Uoy<l<OP-MF5D<tHa?ADr zf&-MwI17aUUI7OB{ljUp@j)Y`wMSrebuDZhM1shKXu3iK@Bim>({o`4k+Wwvcts)j zOswt&Kdievw_;i2^x3s5zqZT7=&E8hSeFH(!5OTnJ(KccnUASQd-!ps?p!HsRtlT2 z!p7J)VK*ct-D}NABrWx;VetafJhnA&@Cto}b%-jNt7<YBH{91~M+K#g${QQ}<#EXY z&jX(x9vuPw@FMrj<XP!lc}^*pGNzgV#<O8~W~!e<&Q$5##DaVwvR~SMkwOfi+%;$r z69h>{Vj%;yLox!937A7wrNrab3}R_xT6<2cu31+!aYYkrmDnU&Jv_SHl>yow9+?_y z*p@$hIQ@|&`wK?rQgcv!l7GU%4nH22`HV_sXD!mhg+HFRTBNzQTevmuhnuKv;Zn2- zY5`=)z5F@Fy036}F^WD1qJA*|dd7KJW_j;9%&Q90z^V3B5Wx(gC{)piQGRK%c7!V4 zIvZ4X1|ug*zesQB#;#oN?3$kh22fo}03cH6d;li=mZ}K-Q1Gqbie?Z>vjEAr6mReQ zvjJOUS{)&+o<_y&Nh@^$sn*O78abzD564QXl`Y-QhrQDwt<L*E@0ty#Xu}33@_d>l zT6X_slZWS0Xj7e<*XBp(YOvAO&=k9z24t288xvFR3{<!;qD~STVt*}*ljxP-fWLNX zfEpkzKo{nNP$YzV&Z^T;)e9Lhlq8znHThoVFV#^zDNCo`{H!ZLosdMk1V&+YB4V?$ zR$e65;|)jYHAT*hG?^(M7kZ?Rw@ctRSl1)I>o;p=WQiWWzD3b7RlX2o;gaaDM(qi| z6x-fvH`#d4#_PQeAy{%!<6%!0RI6uAYY^(^?J=dDFy>Cx+_8}`@RuqN*zgi)A@DYk zNyWgnjGCbpi=IOdk3K2jtgJ9JpaFn&87dZy9M64c8V=0;XwRRk<xn8piL+ohvu*-e z6I#S~K>0(&J4`sE_=sKwLl=kQ6;u2>Rrmu8EoCsjwS#jd{xujI*SLriyHo<8!&63% zJ->Vnja=~;ZQiF3?>tPN$mD&<cA%%mn!f3=_c8^IcCQ}!D!|Q@;zX&&LEJ#g><b!C zx3oz3MVW5I@fa&&9--DPCq;4+oov=qA`t*i*iipkb_T;yE#8^@3_J5{+nXHt+8i@{ zF5Dwg0|?}Wj+6d$nvW|KsPx@EA7*sX1e>0PEfjCiu_GZ@3J@duEFvD2c*6{sBCJl9 zC~8W{RiP~M;sYQw6umL!P>%3N;PN?E>t^Uhf)0nt=ghoff3XxZtMr7Z@H1_~&yyTA z&TD$ayg4AP`v$Wh7p6YGt`Y&?c<&<Fr(aLbs{^aJ^gKdL)&ed`WD=&%ZX8H8z~+@Q zJKvcnZGD0)>pTXeoRai<FeX2U3IJ;&4^wjgDADOe&pEuB&{nWK%KlLO0j3QX8MvWl zmuh}4MjM1Y1d=nJH1=8YgOfq;1Xo6td@klp*8W`2n%OWxLlF^gQlUw4W-D~HpaNp_ z6jz$c#)a#Gy^Cm3z&TA>o&<SKc)##kYjoS+X{=c{rYH+JVib!<d~u-{7QL6l>|Le| zMinJC;m?`sKxN-RV5%PEQ202!C7v#Ks2$0sNhql~m9BRcx=zr@m3H`fJZIF-<%oF{ z{}rVOnu;_z=RecDKRB)UcaF{w{PVad>HNbPA{t{Usg&1-8@o;pC|MO*iX|Af5Cz&- zr4QWVa+ESj2CbKh@YRM*clanRp<nJcakf&w6`Zw}AD+(T3F<&8+ypE?j36)coAZXm zzl!FyVIi%!CcAz4+E2tYm&LD%Gl>=oC2T2N7pLN$S!827BHoy&yI=~lwRjjtH3~kr zwV>CFHkQC(hOm1ng)g8%3!G>Ht??|7Vu?q8KOB>o>+7(8#!GhO&5TVG25}w&ac+W8 zd(8rH;EncOq=byH%>D&OWs0m<Di8U!c>!~~(ZIOm;~!dtJU4@bXw*+xAS@>NdKlaz zP`s6@n)CAp$2SiB^{&B9W_&;gohd3WOKXke7hqC)d$E@lnWN==-^_T5m&E!LimZXl zRRCvgQY+r}{h9=-Qee`<>eQ3|=&Jc$zfoF-#xW(vg=P+FJY~uczigJoMcNFvg5MOG zwn0BcazpSf1Ok=yVEC)YY`~z<JmU^=aFB6$rjNvzW^1vbvGJF1-wpbawGgiFo+`fl z34iPrKW9e8=jHiK&Dcn6T~?=Wcg9+>vf16W7`@WaL~bvSehDl@B!90B(*I~EHnG9o zE9z!!ICAr*I~I;ff-K$><LFbK3nemrJQ!jyXBx?u!~$bh#?u*{kPasf?AQ31a!*kX z5?QsVdeZ@MbO+yvG@?zGU2%jl0P?6wqA7~Nfply5G9R8-%2;E1N?zx<OA3|))b=sg zrUGa(&}h$#*IE>v5N|v*iI*I?x;kkY8oy9|i%H)R{<_v?7>q~@{JmlZU6k~HFhXM? zL*+#8EL$n)G`u~Ryt3ev*UY6PlKgZ7)+~0P48BL!JJ<~$UNX;u*@wVMYcYFt6)%w> z6Mtphuf%(27geVt&go=xNT(Ex!Fa9nF54|yiI!ot^v^=B2I8g(Q_%$7q5+93Hxn<( z9Wxq$i<$Gv4IttfxFfU;uIC*S_MnW4{vaPW0@Ef*${v-l`doMRz*@mnP2WZSEC%w9 z$~NQ-C0P&dn+_Rg7+9i%fo2X?ag<lL@vGbTxwr9br6gh}JHA}_w$_!)b-A*#FiRyb zD`K&o;Q$0q3N^yB#axqF$_~RJ-f@;mahAX05M6MVPm7IHyjs4OS0{V<#1MXjN>_U` z5z-VLX^)~Ivmv#p==$VLy=cys?YXjD&L;!+Z15TiG_R?z{hrT?dfx{+=AJ!!UQjMV z*U8C^7j2-;!9cYCTEM|)8TXwfTy88J9C6*OCc_x==nDia?mIpUwQ0bXALUEtFiX6S zjo{qOIvu;wFoTKW%>FoAWo0Y2I-ORhQ}lFFd*yTjE5G1_>Ol?@KWmOAcZiv{2!uh9 zm%7{`DlxgE_;rIi^gRa<-1?HxiAo}NCp$x76(`RhUIN;$&K{vYoNi|x@r8>}uo>~# z@VXScgimD2Y9)q7DCY}6IX9r(D{zZiU<^?Ma58P&0JtZ4P)|?~3}sVn{vZ;H?KaBW ze0g+8#{=q{Ulc;<1sWl!vbs5=yQcDZ(DS3SIjR+229HF&KuS#M&1IAwaN%HIYQg*W z33|#&Hm<}<H1s(v(k&Q(6+0NZ9a9U%T4l|^O&JFrw-%jRAM-1Bf|cdi=o)zOTGDNH zb04Svz)HYm-Lc{LV-f5dUNYq4^Vo6=t}jlP2A^YYLGu<Ur${@u0jxO_Sn-|}<OGHw z<;wE(W`j=694~0W5B+Cq#eiKVlFHWbk-~^=Sys$3gB(o)oLFYJzw1_{i;YPPEdCcH z!;Z=`K#_MtumXHB8-yAN5Bjal9886t2l2vuVY6Xq{U_#zVX150W#{ItdE|v>rDjUr z*?hd?$q1;Kmg0tOMt`z^sI}DTuA?ZDS8m^_H0Xzl-KkaW+ZD)V=FT*Kxq#SbSHKp` z+Q!J=@7u@7Pk!PQt&E~6xn)05-<vH@9Gr+AvGj|UN0#0?GzX6T1l=DSq*VGk^QdqG zW|cQyqAt0v=gZ!VH?!wLBnYzDCl&BR7ik3iOz|)Pp}~ZM+DM6RFhGpDjQ{1|{?Xt4 z&QE{-m%sbfZ-4pKpZ=HRF7Zwkh&^Y2|K(5N-{hD7>8C&c^2@J&_Rqim{r~6dKm4<= zfB!Fj{+Is&fB){E{{5H#yRRBHyQ3e%Ui!vtC^uysr8IHoi9)efO^>w+m^|3G(Dr#N zBDK<a`??189piT(sXWGY-ANo)S9ybFZroRQ6RGV@d>o@BgT<y1tafUbMx!Q~fwPCm zo|VE1qkQ*rTB5O^)f8@DL2T`PWk<kOA$yHl$8O>v%7i(ipfn<aGf8ah#aFkr)wa7& zfyML5$)I<4XzW4%P{LsI)12cX8=31*2E%@63(yB*E%lxa`S8ca(&)BQiSaE~s0a^N zH5hW#?2(mmi{8RMRf{9=(FvnUSC{`}Fdi4vwYcGG{f*<Bm{^AEP^k;qEBl&q8FKH6 z&vynRvj3>GwRlKevCE2h?7<66Q%*A0h^QYV>TLKIJcj){?7F}aMm@_|K(%fQZMYg< zUw8&a_fdGA$T%T%YuyJTKVu1Z2!bqWIP#gkmCurofm$5qz2{`WiC5^Pjk4~2-ODfb z1+JQ}IZB8`@*<@XY3&9g{08pV+?m<82bf`t9QSD`it!Ozj~d>$2bLj)#aAE$Leci^ zMonhIG@IZ+Pq<R7&4`~+X+d___Iz6Qzp1@JoDko!m8u&)qMLia0SZvUjhh$z+UUtj z`euxUpqY3lLaR&xL%XEZo)O#@A38Ve$<Ca}M}fO;`^=TpQ50l^c2_r`D;@Jn#~cYs zyOG?x|H)Ijon)<7FGpH_Sg?l%FiOejv;b>Bl)rZp4*hJ!nl!W~<O)`uP7A{c#ESgL znb6ql1*&Q-0MI4-S)4(ui=x#gUTxyH3ABO%Ro^_$iWg{QztI~^dzfr0Y2?!>#>WkZ zUD>~$CY`GX=~`Xzl{L@NeaFms^{WrM0%I742csB_xFSZnpI0YExavELxMCw6#R&g< z$q`^SqdH3UQ-yTBn`4d>=n4YPr;SxqmlXkC5#afDWRk{eH@cfK{l3;gjD~OQzKM!0 z><6rMvS^a+3ztRoofcllhO2I>ELgSlN+AiPLkWU1d{!)nMlJV!_q&NLH%cI6gbFPq z+h)B(!&K*;#K|jbAZV){FfXV3x=#WA_Pty1gnhYol1|(GbaCL`Dl`LbT+%Ja^2{<s z-!<2TP{o133W122Dr$uHCFBoz9z@1M(N`Av4nnS9S>v2yJ)Sjo{i-oHAIFs0uLzYu z;)azfEyIMXs786w#8hwX>{>G(L2t+SF!;`yyTP8%wXjz)Kl~9;D?oaP+9>00AcO8U zX0^5#4mt<PTAgIw0OQ_z4L_cio&&C3;%R9*tMP`$S|ZlJ2t(t3R9=yW6%4|Pe9(3F z74m4Punwb)I-~Ot6uYP{X&V?B!9D~<WmTH`&~QwC?1&#^<H&bdVpehFIe1eexXUp5 z2Yal_Kp&AHBjNOj)?nzFqfoxO>-GnaQm`k}KEtAAR;HZL_%7xrklFQ&>kgrqJ#+$4 zi=5a)KTfp9V8``0Oy8B4FTL7ve8wFutL*DqP!Z|}LcoaR>B5COW??BmU5Jm}1E%x` zItIe67v-Q&d^aD{v`J8@K~<T5!t8d<S=rJhR7U`$+*j5k(D+8f2&aRQqX~|jNt`_x zU-2{;!*4>uaOJ0P(@g<ZkHv2EW9PupnF=phGawzs)8~yx{y4#aarA+$=RU@w1-+3` z;qD&+%c?jO>3ZECjEq)}_Qdyld4(R@=zS<%o>CeJa!O2L48#vtzpWhj???|Tri~Jc z<&P-xK7@?I97iiTGR80{Z1%184n!C}T~Ofa7Be|14NJ941V~oZZ_Rro<%7#TX<43a z0gz4zKsgtz-H$l$nRf_A+LvBFofQ@EXx+Z&9Hv^9tGj)WIj+|f9HF!db-Y3Wh7Vp@ zZd0lcJI?z=F@=%`?3z3u7O{*qZR<KON#$+niYJl&?su&+&EU%I%vrK73mOE{o&%&6 zjb&jtTh=<g*SK&Z;V{=}UD1xazWDb331v%V_0-*QUs%Ab>9`bR2LTj=PB7ODX6=oQ znO$3$e#8=HEnuSj_U6g&z%+Srv*egba?IKA9atv+`WYqnZIk5wTNot!^2j1VdQ5X= z9S0KwSkzl5+hyOz7&&N$e)nv`I*f54wRJ`Rn3yt5HHI@OxU?}H$SCt5Cxhn~9$$0F z@d6asd99@KuJ-}{mQ(MoP^(H^f%82|)t5ZE)bzzfVBGD28H^S`4;5c@A*mcjf`<q% zsGwW4X+TbqA7<tEhUH;Cq?4n`?*NqWCT{IB?Uf?tL9Hd5GT4tJ*O`wT8>a`5JAY&3 z{xR6!8+i8T*xxT`cW++k%rU#iqTjsL{V-<Vt(p%T-4E-G?isQ$urY*tM-}Q;LAJ@M z^z0eFjMkWyUin!WERAc723uru6=L<d2-!g*8{cqAk&T~1uq2)}2EI-WZB`uSt|Uak zT+uDpf=&tZK=Tj@z~p?pDCCRQoRQSShlf?DEH8rP#!1u(?6v(^6>CzC-HNTWt{#t1 zpjNEXL435{nbSxB);n<*nL|_F+FN8%YEnZ=mZc+05|Je+$U7q+OVW;Sig0{GR3m2g zyb!%uidZa5Dc*=oEKeh11Y&M-ySE|@@78%~_>awb30Ke(u1m5wlr?JByDgaoeW#@d z;;ZGE?D#lH2)>7dMcE8n_iohIedxJ1dDM;;sZHt}5=SLW`liOlDuHjTt0R++;uX1Q zbvICChSyTuq@@{rpj7Yf<%Y~PH}#-NA1#St*n>@6g<F?M(!nL<z$Uzm0_9y_DeE>} zH|9wY79RWhDK)+v#3Yl5BUa=l%j&|u;csMoIoOR!S#NcO84GLyBCTD4*jMRR-I?W3 z%y?b@T&i(es_U+G0?GBYpvN8-zm1Mpl9~iHmAtT&rI+;Y+Vu><7I!rhE@ZlWpi=IE zW<qF$e9A87piqB~E_Hq`c5WWHN7{0O(m<4+=>5A>KP2W(PwRj!1}F$*R$BPj!>|lC z63`+*7WL*+hmzr}7b384>V&6{kU5@s!7zev?~XTI#vRYO`v{R7@6uzQ6L0Os#Ujji zBp!JEy^EtM_dJA_cV=~NKFp=6y}I$))%h*xjjB#*aRz9hcwWv2x}ZbtT<6*NN(pS5 znA4`s>KQJZ!(Xk-ruNSJhjZAR%fu$H*H#{zE04|PJT?tcC+@R3bbU6J@UvhY82L|1 zBQ*6|KuS`e_76P4jLcakGbvA@pXhMDpQvYt>}(v*_;_s*w^5Bp$Zb@7mAKf(CAE&D z#@(3V33~Z*$G9k4&QUbtBr0}=V#Ab|sxferrs{|X--L_l*I*6n#YYaVejnD1t_q&( zt(xsD->l+)->Ts*H5`O{l2^zIuq%;$mdW7ZYbL|5IbqYiNAje$qs@+LMo!_%lXvBV zvhqO*`k=gpgD&aQ=KAMSshjrW$~$+pF;^S&9eC&70+HuUymMhMKe`J8@X7Z~huzM* zaGj;h1dJKFqMi=>urAMddQ|Q`x~u_FyP}LCt}p41xbJ&wcidSy3F4?E^c~;ikVJBt zrb9p!GnnDC7+mS7z=c?0?F3^tpr8dBP$SPL%>W!M!ry<uPPlEe1Mk8sI1N}>g-6Ua zms+{>uBi5kYR?OdLV@Z&Vu=$vHz|ktRQviOU0lxBH;?%G4rfBsJIA9*Ya*tH3)JXX zHH3dAOV;v9n+9<##*tzRhr|Zb8k(KtV`$MpSNd)YXQtZ*BPPF156y3)4x3gQxHR>L zR67E;>`I+jrH)gHrOv}hQ~E=iI4#LfomicYUB~v(G99u?aTUm8j)~+^b%Vuj4TsHr zbSoRqQfScdyTVeLpJGzJOx0Mf85ti%wX-(Q!<qH=T)aKE%XWBPoU-EW`L3NA4nM{n z!C-9O))kBxi-ldmpuum#8O-<Xf`%6L?t-Eb|1RIz3VU1YY!&jJ5{{rUmy_=~B?@#7 zcHhKdYf&dF#QoRN$qL5*UAS2Rn13)wD;pTS-!V|JzDg(Dv$p;IT)aOwI82Q&bb6V# zW#7XscOor!EY&`5baHnPS+(~YXKf5Vao%nKC55LBJ$1xW+j{EAl2#^G=YEsjUyR#K zPO1FP@?rc6T*!nw$6LCQ3BQY#E7>>WN=B>dt^CKn37;@pa6DJ&|F!GyWJ-29%tdTc zD}|<f+r-$Mli4!vW>~{9vidc5y80$Y-|>NhEqV5Cys-p+BJxMO@#cP6fYbTAal#Vg zz&M>Rg3~`TcPw#03;KP*5+3v#2=3@q$cebqB4^l~6Aj}=EaJ^&Dgftrb79eM-kU3r z`Cq8!!`@u^Ja4WX>Z?2LMf|yBh2?yI)R~Nv_iFlm%#?^%p3cmgSD*dCs0N_1R$}ak z#8k5+%eY=$#6O|YGp&VK0X0T3zrrdG97l>~S^*J!j<&VaG%!$~t*f7$<ddS=;KmyD ztzLXXDQxEKjJNhlT69m;Y>4G|!;)K}b{{Oh0lwMQzlgJszwY07(ZAJ-e}m;-*R^-! zWRw46bF#saUNkQ(FWKSwaXF@sVxj_$O#xRMtEBB~^O_7QcgX09iZol61+U|BW1`?C zJGDN>EIFMGZrC+$M(rB&P~M@XJYI6!<3%FyrXCGT(46pgt=pz=Mv&e;A-ZU}hR)Cz zHtwzM%R){TZ)h@%82Pi%9~>Puoz;gc!v;hPc<%XNY&2nu_=umH;X|N8qPJ6XLNFEF z@#yM2KgWxO+&|sHx2Sb0dlIPV?__g>drQF{N#;3>!Gv+TkL{Ji{{2P9H85HJc_V=B zMzY*JnwFDFBAh1Q%=B=_7M>yF7!oz#a^&mhSPuJQvnCQ%FS!L4nySH~Jry`ChH!CK z^iE-&nRLh^y)o|>wI~)y3g=FIU0OJ@K#&zJog>$3P=Q9Q<~_WBt*b6AAF?Q%o^XtF zu@3pAxk@Y=lkBu&kGX)JPa3NSS9=IwWoy!CNkkZS#M?W*4UY!H;SM@N4UW!l4Pg|T z)QL1{XInL{<JD|hJ}0~Sp%E#mev`Ipoq6Oio#0$iXXedSd=MPauzerkyhes!wp`)o zG=NBItiRM<QT`Z(2b-#WT+DhWXzC=XRlF!JG8yi)e-<t%77iw`vk57NVPq;pkvzk- z2i4=ECn|?+cxd0B;x!EM4&lkZsGU|A`+I62jYH!iHvg8>n=8m#wE_gv*r2h3t|L?a z|362jxeWh2M<!F2umYKqa#HIi;a{zb{D<>_njgSE;4vl7+c^$WRP4V+e<<_JH=Too zl;ny=!6V=Ey09Imu$u2&O?qg1IqU=M<U5IoPHeL-Cg!Hd`YZS8iVc|OnB|}t^RLPm z^RKdOzvBK?`8ViarR_=PC+1tg!OHgkNo9a!4!19?ZlvW*%-f1>Q78~POjkKo20O_{ z(rq26Sj4od1cGnj%B9X;<=Ui%DdHH_aw>*>myDJ*y<IsTtt@3%ma^~K@rX<S=Q<uy zshjrW%JFEmF;^RNepaf9u_-TaT4w5Owrm>6&4AlQ)j#J47G}*L2Jo*;eh%e_GOAiu z7&b`r>BD5-csu|`VBdDsN1Yd1*y=)Q5+o}M8Rwlo$b)e>aB;&B!eY96yG!sy^DW2h z*)M308As|u;$-B`q6@}e7lV(WT=iOp;L=QP(!h@43;KJZjmmGU=6K5i95vn&=03J{ z;4qLGhVK@U!|Z~(|G<wHv%)~v7?c@tw8a#8A~7DSVPKUmQ{PGB22`>fN*lUH%fEP} z0#c!bjajcS<CgdGChI4x3FTJJV$l2~*e=hgE||$;HUbjqxcyoX1VvGUv!X%flR>o5 zFKZ4;SOm8q`o!5nshE~v>mgK)X$*GE-a=T6q+A$yj5A>fk;vUUTsK>iJv{uP=%KZ# zF2a_hyx-MZx5LJ~$ug;2^aR5DhQePXXsgDeIxOWBPADXUSTxD2P#Phr7r3v41))!% z7g({*gw9&}s&Agbm}A%PZ5V?tC`GAQfBIRjezSyD%~^Ht3bm`y%JRC9x>%LC&UtM@ zLoX(QBx^Vmc{!`}^a4NrEpby%YEP>2pCAK+wdg4u^CMQYUfi^+0#7kK?H8mHzBQYn zR{u4ZL~m8Y3$i0Ap;)^F)LgPOw<#?J?*MRH*~d}`#-25LAV9Q2ewSQA)K;mt{KcTi zqc>w>1f7;)wacE`E1rk02u!yP&?Drv<u0t%DoFU@7b&o0v#H~|1Mg8De)w{XSB=GV zcHX2?E75nwVXrvs2#0-Jimt3Sl#=k1(?evw?y&y1m^K@diEWsa%n*yw6Dg^N18ikn zzRb*>+2Hq$m9)Fsi>tjjR}FQm$BsR;g<gy61G)chpFnH43yT-9#=Q@H_`>!!@Cij{ z7}HzhKAXxlq=lwodXb+G%e=45Fx4fVD^bhKRcU>ET+9^hFsOqg|Jb#Gmk{k`cnttG zS(_fo25ePEYnt0erDh0{dpk@ll?{gD5SQgd1=>WHO{)kxp#ZSG{Hz&d>OH(34fFFS zGcvJqf-u*)m0&zsW*`TzU@coC0{cVu&$Ii6HCl+!D)zvyMQ`tHfzD`X$LWmFlbA(J zV_$)jx|_j97h1JALeZ70KU%BzbeT2#D_F7<Im-*LSG_Jg7`|k-wmKSDN8{>fj4Ohl zI@{V|U4wpUnrr3PY#@#m;NxL=ru@~=AP4_LQ<-TwD|$0=g@e{G!H`ygm{vjWkDveL zZ~fx0{`jju|L0%*?BAIYuC~&MksQ|ftDpLH%&<w?bU-Lfr4}}&`d|OazyIpXpMCv@ zfA;ks{O7;>gTMI2pa0jd{_X$t_h0_>>)-pcuYdZ_5}|<T0UbInr|0Iukq;4!*UYdu zLW<pOf2Uyv=0Z;dyr|XyaN~Og56jsM<7OIO|1UYBlwJFz;ObjO!3mO_@$pWwotlbo zOJfKPB7%+79z}kcGzh5%2b98DM`Rj88@gs1tRcPj0)9=4mxFO%zK+e<S3mpRum0!% z<?H|TKYsmtf1^jO#1XQM<nRQzKZf)21uBlZ?Y6&cZ~_Ss&mR8&zy3X#y{~@v_kaG^ zzdNdoaj=f^cDfb}D|Rs_dYKFm_H96>5e)Gq0%aUnZa(Io!QDLt8PD1>Xw|UeUDqHN zF_pVE%y%ltYDW%Uz*@E5(XEAR&xUwzp!tlU8x_bX?-;W9+kKP9NN=3Ik2H3C{6Sq4 zsCKJdw;YP0BP42I$>BsC6>3c6FgV$Bo+--^$H!{!;8SaoTE(u+@V}=v*K!K<`4*f_ z=S@T)O&SIu*kJke_>?$^H^Nj{A@WtyMY3<M-vbMMhub&1U@`oT{?uZkZ-&`4y9{F= z;Cn-t7JM~yN+zIsF=h11vL7Z!(g2K<U=AKO?%xsZT;abh`C`GS4Hm2qZVF()%sL|^ zKCCAlM`*E%y`Qv0b=%?W0I>nZ*1YiztrBVfCzpvYjfh2Z9A6{>Bdq#~u0!OoEQdut zzObpAk`fnb*FhD^eGpngI1_WXk3=V_NE*TOWrxlckpyT5K9m!8J1Jqra>*oF#Jue` z21y=?FmabIQOU)JY9XwSBUl9n@zSLbW;H`)QgP9oB2lrnNO**1v^kw_)AsGeIfLUs z6yfs51*KisxYRaE%eQt}Iyn?|kxvNGqAeOE$0uP%E*P9-&_82L_njas;(AJSCG`v_ z2QGm%q00M7VG&I}E%=HpAj8=u(fx_Mb-l07h3z18EvqbT846O9A#iZ9292WXGIe0n z^|;STfTH@%N1^%MqbbNHr`1VQ)Ne&b;nJXbLi`2a5|VbRDe&jxjADSvD0NVx6?dEG zUN;&GAxUeEapam;pk`~gHd~h72HeHqc_3_e#SUn`ma7#wPIlv_oHrzO2uqUIzFgl2 z<cT6oPaL;oVV|#wsFjT3wQZ3t1VVww#es5Mw|HD_h^ux54U5Clh(*5$-51<uluVr- z4rMSYgNizwrj*o*LFJu){KfIKciAF&1T`CSV1ZQBlMbsByf!M-Z!`m%tJSs6N_Vx= zUDfHXp3nuTtHH8GuUZ9GCazH5fxZe|fY6<7+?Qd$r^knRvz^lawMdJCDhN_O{PM5= z;+Oy8r(gfkpZ(qc@o#?lFaOh;9T!{z_;#<?Yoq}+hJx`o|K;m{|33s_$k^g(M6=?+ z_{CrS?N@*L*Gd~QIfI{n_h0|;mw)<y{`@chs{Qw0{*Pb(!N22@fB)sb)SX5WNtX^M z@aq-O7dmy^wi+<eGg#R}tp*v4DgB;O3kAZ`C(-{Xz&bI+xcZpCsS9Es0zfAlex)rA zNR%Q*VOdfHjoECP1(h~3%^Vu+%+7BQroEx*nq(%o>zJw|m85ggDEC5_*G<D(rOo!% z)$Ofd@O!C_N|M?!{Q6)0&e#9u|Ni>l{mw7`<KM*M>r?1@M*)cMNOj42NmN)0UF2G_ z;C}$+2Pef?TJI4fBAj_u>qx$Ud@lnN2og*^Zd#<LF9yX+bgIpk0l}@mfLWr>ZE(jh zkil`z@3H3_O6Hm~i36pR6hmoq10~C7PTW>NLq%_KmAO(e`rH5c=YRc2U;X*N{rb25 zSnSik{@Y*t-k*H++kf)apZ}Je+5h*eFMkFb`Imq8fBo{0|Jl>KKYaS+>5m@VU3xu5 zlPS2B(|D4DPH;29G1+@g!6(97L+-VnyUo0<wi($bz3%4rW~UCb?a()ihIejkrQ4h7 z)(v#T-)=d;jHDL+{Hu?5PN$;KX1g6Jb2qO@C*J^`U<?HF{`lePEUY><4T2XXDEJ=5 z`;TVh=;vwiqUQ4_aF|9u(;A_v=yv@t-^+obce>Fu9`c@H-t~fAA9emcsz1qLCO0<r zHapo>n5x^IYuPqV+0}Hb1HZ1O-D}y_6MEapuBTKCe%#*L&aTm$?Q2;#?QCY7{ELdy zM*t##zDgK86iRM)u4h~LD<zOyS%-dLwO*UyblL#6i(k|~x3{*k8|gM;w2iR0+Sma8 z!iu-)7r~-(2t+mrZFliqw*!s$+Q3Buw%OJ7O(?vXZLfES&>ZwL>-3;EH*UbkPRhT! zP_3PA4cAqP^-e|wp!Rm!&bsRa;ZubD3MK*O;0s{U(e3JZ406Mc74(VYO_URN;M>@< z&8&O7a}|dZex=*c0T}*k^aFZ$^$C6Jrc}5KgAc#Aufjlf5EJ@E#kRH?fC7p`-=-ni z#;L_2!LD4#(b}RPST8*CZ9Vo~9D5vb9Qhmg7pvXg#*rmRTU$Jysca1!zKTD$v+Dr9 zon38r*4v2jI+p01z*uhf)^TLp_y+#BdE*BC>U`R{k!|<z^;M|2wcbhT^}S6%6wBiy zexSddPq7J{=4-e<;dk<`+Us5mwf8_Zq<<|o`(q#i&g{c(fE@zEKJ0dJEp-tQSXl5s zXl-+yTgAWE2toXXJ=zw(uRQ<=upeOeh%flRuK0?7w-c%;!CZ&G*YR(Unn<aG8TJ_a zzB%mTB;r3q_{L=z6)^z#_Zkf_p^^$z@a<5%=sbY&gvHWLdh(4Z(&h2bx;@5dopIR| zf3GuffTad|^g1r=PO1iIu^|S@>V-4JTR@q*I9b>vEKgbmU1OBC)~yj1_-@N_f3Ssw z;40E59$?WC)gdv!W=Cj%c@hPvj#yorIAO4<ufvq%2#cAP0JqkyAr@1!EeC!mM|cY< z(e_r-6E8%8ZYl?u##hYsrkwNJTSQ&(pDiSScr^3q#7B2&w&nKQvNrEDf783<_(JTF zt&U9B{G&a@Xe<q>j%%6EwS@%a`f_4|y3shBk*j#2dK(SS2IFQx$-vPMJ|-T04-2gn zbt^^PN>Ml8$P7cBn>J=zI~TGpTPeU-`)akXqKW7@+8O0z=+kX@((O}JGFa!(>C@hf z7JeY~naaGefmt28cc>O`#VQgl&8~7`MnB{Gv<phrWxRgxBB^>gEN0`KxPfDZ-v=T9 z8)uXVL6p~Op>I-qK!Mdv8Y9wxI03N;mDFr7Rp6DC9Obxxf<s}Y6{)G5X!UggHLBxb z!G2gbZUN1gd~<5Pq1##W#jre9&%#Jf^xC?Mpi4v%W<Xgk;KeRC5kYdKLQmBN$P@H= z!(w{^&5y*L3o0o&I)XV38D6540!1;##^T(u=4??DykikSl2BUYvUpS%o^)}u%j%xG z<5;TIW`l1@<lV4wRib?Iao`4Hpeln|)wBkMCT(>Lu8zUgF&Jkr4+rD^<*Ptr@W(E_ zA~US+HS|*=gREUH`RM-TEqF(<=pNlS$W=TEPvoxHHN$ojF4(qz@Di!?WU%`V?6Ea@ zmbh)0G^5Uh8qbNhLE#l=p#T)7#l}ZSZD8W?lC7>$c@bCBFgGGhQ)@tBho^JlILO`| z5^1Z0D=b$jO~CREAVmez0KX`#ZCyhnC`X09!8YiC6OAl&#&J{Ts-D?u4|9=gzeU&3 zRWb!u<=yCpu-=Onw0~hZ4F^Y1$JDu=eYo$JN)dR3U#hh=b^H?aU%Jn+X5|=C<a?+8 zetrl}|1(heNW^lY_`aM<q@g}XL!#GI*54amA_{Za#5VA|p(D;RGfi+6+SUX2fzt2k z!A<QI;r7R#Ic6cAii{>V-PlAiD_X&V72_U2x%YJM0U7mX#KdQkbu>V@rkD;+;u!Hm z4evLwa}PLl1O0wF=sm~Zw^_+aKP{@#IPmq9M)C+JZjCiEFsA#BXS_Wd$rUo6Jg`Pq zEix8s{Gs-<G^~Z1sf{1bbIWK@_h~RqH1u*^1P_KMCAr#_67z_7)-T!Ey__uV%)>+^ z#>|U_JS=ij{!W{&Z%%*`E!8~mWYG1c+n4YKiK?O2fz(elKaa}F4!dXi@KeAc9ZJo% zqi0DbTvJLpb`5#<vr+q};_32MJ!Re4NN$mp5r?KaI;sl8j0efQ)e&vNZNI)LtZss_ zoYW}DPC3Gvw>>^gnoVU>bPl^vJ+Ox*MKey`chl|SYpB~;ZzRA?UTOGgRCY|jXC`2> z0dwGrWWW;a6#~27h-aQ<HvlwkH~QVGACo|ypA$p;eN9fP&}yo@PyvwuNs*R+P(?Vq zVjbzv3RN6K_<f#?gM9;?gQ)#G6}mMX9FIA9n2ofFa062$6Z0O%&RS0&+)UcR#RQXw zL(Uc|JJLpFEp&J&^ghZfUgvW#TnYm+irG<SF|l4XMuUETSXdaE2$KC7Z1Z`zwPOvC zIJIG1uwB@>#2%GS0%plBJt)S<u(IvVr_4m5i|*dqaW;iB)Z%7wFT{Bosvq+L(xp_$ zC5p3~Joq#~pNrfLhP52LLOquW=feOTX(<IW2_qYX^gWu7MF2s`5S$9&KN_A^49LXq ziqVEWS5Htf&xeBMvT0)Gujj{N&D0$qT$xjM7?`>B?dSL8YU*5X?^1xmGMVQ6K|apx zxkkG$KU}8>YK!J;;g4fBUJHLjUWJvr!3lY!V}|<kpbpF6;xMf4oH?aD8lhDtir2v7 zel84;i^t&!yS_!?iQ-{+XAjUa_@=ue&mPk@zG>`!d-=&x#I(+%A|F>|Xq)Qy9r>P# zS{4e=`p62*%5)mmVDPJ;ovncNq?|AG5;IpDy8E@$1QUgGH?Q0@x0=J<nlnX^?A1w0 z+8<CKmjEcI3IRGRngH@JubX>bz!zU)4Y-caWQ)nhm(DS_$SA!z9t)0K``2yMGzBpx zma8AkS5XLm2tVAd1`Cn~m1%~hp<sF!d1mU<(>}@dX52A;+hwGW2mf^}dL#$2WAYM` ziA#M3^RX&#J*F{MbjN%Mlp^MDCw>y;_?-_Ti&?BeQ8H{bP$i>si=lg5FSHh|dnmw% ztGO(r#?$oxz(S<USCW6`Sx4(gF6L9}*%}(#VaI)udd8ntY3D^6S-d;O?}$+t8IPMA zFjR^R$@OoSu~o9Mwk_Avaa_G%>>7h<#e0*(BEkD$80jN)sU4n!z*F>cyh=J0+Hcr- zJxWnAE{c9ZiFZwCc|Ql{9Z^Qo05UBm`O{)?le}rT5X-r(%sLmPMvkta03E!^0z~j8 z2=77^pqJ=R(_jz{L`U4TNC!57O_k)z-$wRiK<LxmU_O~l%gJ;=5fD!DncxO#8&!D8 zWx93A#tu(sgcjmc@}*G!xIkYyz}s=fS*ur^8tU;mT2fQV9n(1I8PD_`gsnwT1%iS| zAdm4(rgy@*)Iw4!UD^cajJ-zwV;#Mt$ipS`^~Ngo^W{z``58lc2*>YW{6h>kt#kzS zWq)Lr4Jayh{SfCv45v3r6ZrrAb*tSpv7Uc);2_E$Mcs8N5Vq#D;WSa(f-#}0BOIh4 zQZU0C)N_@Gt2t^#H3(RRuCZ7@ML(4;#^G#nZF*%j^_8#0g;=xI3anwTzFx*b03HGc z+oGGE1Z5fmT^SXOwsZ|!I#b1w4Zmr%$Zynu!6W>CNaLZDNXG6mJ~+%!P%}m3<w^rD zl^g4g;Drkzald~i`(<lMKwxfzSln@zVW}rgomd)Ls(Y7W@OiVDRv3~!XsI#DF0c-; zml1%qF^A^#mo!D+aA%#B(eYLWyt$HCQykcCdby%=ttB>_z*>&JAX3G~$*828nL3(= zz+1IG<y&KMVmMeLNP3SO&FHThwz*#w+o222@+oX_E*Y5Q31!+e3I(<`&8tzOB*-Xm z_?lOHqr&O~aPT9oDcLbfb`Gq9VI{2UrJ`rZ3<XZj{r$7i0G8j`C_e+SYX6*`&hhCW z6d=Rz&;FE7zBHLiE%{U_0|TAn;^(6Hxh&2H;8I<a`{-y|jvisoNc;gDWXXvSG1v5= z+&50gMU{OncYt#0tdvjtvKEdwmh?Y(F+n7ItFKp=W^m0IFRqN@W?^;1Ecr5x4t(OA z1a#r5_?svA^wBwMVcnY_X@zO)gKnQzvvPzgOTN1$JF(A!EqhK8kv>P3^>cNP`?=<> z)KxED$l8{mk!UP3Z7gT7*%$Vc2VQcKn)_xa6Nnqt=OPefM=1+ba$EJXDf8m&I=up7 zB1&ioxTg((uyMU=<3X>W(P+BUBrfeSz>j(L-&6s9g!QXIDh)x-oI6wIi&=oU$_lnd z3ao6RZaX!%<09~tDH7~Ao~f&G(IvK_2;bZ0{eDwIFiHr_<QE4!<La9<1mV4R9KZi| zx?m}dXylI747-Lc!HDZJs6-adGF6l1%o>FRyVG<Pq4^}}rFGUZrFmL@=N<2oh)Q;? zk{v7wui9%hh6oiqhY3?WKc71V<wq?*gMzJuE*)dHKWel%NBsl&*mSZ(I|xy#@sMZU ztFGnz*J>>pI8U!8+?;Q}nieJNc-ey)$54%c1Qjjai)u2!v_a@IiAs$MM7CLRe4aTm z;F+Y_HZ?wJLA?bkCn)0CpfZyMSHd*3R|@*x7es2!wYd?f%^|`Pt=njyFHytxo|g1V z)C!~)pA{o{UnoiNefh4o7A+cCRe>=Unkp2s_&PyjkhvhF`)F1Ri$h?rwB>J9tpwXw zBSdO#uVgvy4QUCoC2dpKo>2Axc`k5lx0ENf70dfAF{6$h4_*{c2*sxAW9kf{THvZL zuKvE5-BUx>#0t&`%83(uIh3u!8sTO`1Q`k^mxDrTx%xT2oKk!BrjC9b#7GQ8r%?ww zdsjpv4PL0Adv8d59<WF9+ftvQa>_8yGVQ71pJ%#)alyXK5w<KV%QB;Z9hxH%hBoz* z1c=M0*2uscH!q?=@DzKxG|@BrBUgcHEmLrJ*OsJX+S1YAqnsw?fjMs>Qe^qdc$92z z^}<R(7lKnuz5|000s;KO-J#@U;i369<Zx=-QrRjjWv#Ft(jL4WVbxRR!;wq~g-fdq z9tz|V`_IIXhb5~x6{$PlX($U1)Yvgro(x3Qr)p`iytssO$BJHuYkX>6p!qfB1(?@S z>xJfExtq1;Mi7m=!_*$H*B7a~s#{Tu*ta6Q!pP$7$*ygDWQ?ToA#C+ER|DpzD_zX0 z$~lhhw)N3n15Z(mB>+$Pf&lFT*3BW=NV=(gt#3Ry5v6r1q5y6>>yXp3y!Q#}N94V} zGL<p(l+TNgX5*%#X;t%4d$DQ_c_t(BxIs$hlN^bA&^*;rs@5Z0duMDTD`VTd6|&0c z^^K5?-i6zkqBfza*90^x17A_=GW=MhRnrsbNPozwxbPg1UAd$)R;A8G*=eyBA~uRl z$lgtqN`C-IJj!P$sXT4c<mF(<M^zC_!z}B@6<T#HEE$5&6*(rs5f%m|#{)cty?t7L z7VA#IT&yc97Suc-IUwpEi>M>i42rzf9Npr_Jc;LU#+P!>3tSbhmQzm>qLwD5C+Fzn z3?S8>W$@h;f?82Eu{dfhFO*-Mnt@IyCo70s$Ijm1kYh$T&f8ikOU(1gjw<OI`i^AE z0M~{%9}Y2!ueY$v@omydnnNd$YX$cJeaiaN{P>vMcyH1o+^s1&Ae%`+I!1*e99-ZI zKuQ7cRvbh*#^wsTT&@FC;B{Xeq&-+yPfOXq)SAKI^6;!c14_Me{C$ysaG4QY8kKm8 zNLx4cxInWPvY06V$_!;ZbhDO$ILZ4M$1|&S6SXxQYr!7S0NGEDrAvybq=N8MwItnR zPVI2#e6dvK#MOopk<>Xgp_2(ZCgro<iO4<aq+^Vyp!Dp|L<$mxN$TB>?QpB7gZ`Q; z(71inYuM~1UcdFv(`30`J`*!?+hR1D`$fh!O+N&H;-@l4iQ`jHA~Wp??xV6ybJl(` z4B7$^%vMJwtZBNR6w$A}6fC8bv4tyjiOL@qvSsC#Z_?rUc<$ERU{t-Pdy66S8<@<D zMCAkfc7V)tHJa8pa|T6;_w8GVc<uH<%k?65c3L*Ej9dhi-TFHH!E|=+-Kg>P{2fD$ z!<CPKD1QPAvZzR3E-`h^CO65d_NR7jh<TFHX0#bF576yjx;gjQwd#9$dr6LwDGW`H z+e_3M;N6=JI&oe_`*AMg5b5XR7zG5jFs2ks0DT_t24hs9ySE=lkdIQ{@*hw0k&s4O zVeeTp>Wi6@u;FPD>MRb7)|vrD<DHVMEqfSTB%n)+FQB=THUB29X5rv}SAxdvoa<3# zh6d)ngXT&#V`8lggHV}E1C2CoA8_hFTK)Ovq@;^3;W*V+f&QhhZ8mthBbrDVXqYZL z+uB4hmsrObXlucQxMz&o0tJCV$7mzxyLE(ScOKQYQ}UpWyT;VP)J6s_+<MDiw)JJu zmHe=3a_#j*574eBqau07?uXbzF)V$bhxLhX-ya``H4LQq4i2q0QBV|UZgL=|F<y#7 z34kI@80B_rsFZyN<k|y8*#goHxziYu%&f)eie*;M6iDro`r3~W9mq`x<e^jRrR+dn zUmWtf4f*YO+8{q`CxumrEXUG{z_O;<oZ%8b^4#{tdZddq6xGQtSSz~ZbbVBw@%Kj< z&aG-1r_<|DP7&La-0p(R7VLPjhl1vshaKk=7UvxF@xth3Oeazve&MJ@D%o*TtoBN& zQNd!m-~JIJAhoh-0mm+|n;ZX>0%w1=@!7^kiW%25)@(YCjUn^&`oj2xmq(TfHX=p_ zF7%@#e{|)K%>$#h^f6yEb$4P0u`e_zB5ETm6vUl3nmM16d@NpIi4vWk4)bcz(-~1v zEG=FjugxsNw4&&TdO2xn^rWn2_4n=2fV_0qf~GnC6pdM2>e;vLsPczz%IJ@jiVVsn zGyGN<5Gtg^g)e=xtlW4!l-VHnMZ-veb>RPXQ&#K)8eV-glVeR;qnb_2=fx)_86f%& zt6JwKu-BiIHVEBd#qUgNg6!f<$();gjS5ApZn~)YO(So|25r*Sr+AriYND|S{|3dg zc^I;$#l>(<8vfw8tc7lO{At#gE&F1^VJnGAQ@_ZSU5aP!_$!zyWadVq7%aV<EAA94 zl_@iF(+sK@QRR~PRl6-tLSE12EsI`$;&Lpw{MZ%WL|^*x>xaR(nqhpv@+cu2(KQ_s zM3<6+?wStkv42H>P7~wdz-<rZ&W)Q%*L&YF-$NHOX;`bvc-?(SnuJ(~`K#<QZe8=e zyMNg#9UGo#M-uB1Q?rscu3p=0X^!U3lYCkgkBTXhMqsGTmWZxeBha!Tbml_n*btPK z;KCgdacvM8k;fujfgWVzinM7#z<>rVpw1$IAV(_@VGhh4K>iA><Cp9H<NH6{yDJ}> zofc=nk~@ZtI8ADWCM39=X`Arzptla^#=?k+_*nE)3D|KWqDvEb2)&$^<gQqq4uv-w zV)7J2Vxqs`=>)?O5uE|z1I5bW3wRui6A^<hB~L&07R;03U^W|K=*gp_K@T88JqdG& zp2`^8QQ(Jrhq^(|j!s`%3X^Utxi!RaKM7W-;4H21K^zKw7JG$3G7!a==$koCzBmPG zz#Shktmc$BMVihD&82L{C8CEm410q5@Ns!dYLex4!fj^V3&8yNkz>8p>s*0EFW|!$ z9=6uclhq;@IJ7ei$<T_GraEKv5tsiZ6I0<DAitZT_uOj>+9$6~%bZf#<y_PquMz-W z$tp~m&hf5Vp#nIE7ONX;H;t<Dou0|0Ub2S^SL94zvYMyeXGU=q?{^jNcNOn9680Wx z)sM?^l&Bz<3H)z*P6E*ytib`EACEvDoR)BwRKS5xjEBpctC-rWJ+|6oH7Q%la(Gyt zsc5|9kE0T|Fyr9_%H|p}KsFnfU_sM~NR;JrN~=hjx;O%evVfAx&6090vsBxUX<SWg zGvH*4=`B>|i#!eu3kDp!`SkddcBW_c-C>0+SICY)*gu^Xrg~hw!f-T+`29&BbSn<w z$NZVy{Q<IB+*b9<k|4>m_-nQzK4w<#Y4f_oxs!<Js5VoKX)$^yxoSQl^Ug8<>eD<M zkpnogBZrByayd_SIEGYenO{&r^M%MBT$4+iZeTzZ#0aAXuu#5i_v_=lKRB)I4mmlp z^#`HHq^z)Z{##Bn>%OLVG}lvmh@TE-!@?V9Q~?GvpE;eldi81}oXmDyj*DP|-dL`= zXp@0vH}BrKetWwSyCpHFYbNcbchGdjnp&}LB^$dsWLJmm>W~c|vd)Q$_dxXrY9Knl zaq2A)oFC7mV>5`-u^nk?UTFPGW_xepvnA;%pmD_qspF&CSK9hWq?>K8p7_qe-d<k> zE9*OP^#ToOoL4vTR>(2yG0tu*uy1HP1>a!cXYvcAmJS7XHz8(|)9Qqs+;_t_)8wU% zLeHJS(NQtAQD&@A5qn@UB~{C|v7qY)Ap;4n!YRN?vidT-K*;*`+$ovTHMQGnaaQzB z*>S==D}JLWCbYp&h3HyZI^%6VhOFXkG;pwlg039)qgD(CP^XD~3E;ptWdMkw8nU54 z4ZSjSC0r)^27q`q<pc@~fZ1-7IkZWDwJQWYXhk6h9A(WR0cP})=&T6I#Ft+lC&6Ky zzF!s7k9Bp6+l?hQI8q#P_`AAg-myj_jTTl$`(|;;%}e))Xl(=K9rGbr;UbVzA>h{= zboX6eLa^wt+?O?@7INc=qiN3tt~9xmtYNo~nARfwmo(K{>UtNvfv2=aQ^6LC^k6rX zH~IdNs?skDzBVb&s(}-aPmS$S{n*CFHQIF*3&kAC-Dv4R{+n3QKnfk_uys2nx3%8Y zQQ#su1(tSRHRmjXume#PCy$xHb4)gQIzFwCpRB`_k0TRNaX`I2o@|A1U%2j6&Succ z0c+QW4tb%MD9B9@jZ#nTz(gpheL}{i6@3i#SGZk?(Cb=Bu^TKY{f!jIqh9#s1$i8p zxcToKt}0r2Uv>ufId><xG4*|@E3y)r1{j#y!0SwyKsUvZ)hF^X4!4XM>H0N=C2EMD z=C7l6g#j+*4c1eDZBbJFUVyTgQAlLDkk7sPcvt8S<^a?2NKB|}KCuO1MiE@7k&I4f zg9+YdL%j^8AdnN`6Udf>aZZsC^2!C{nLNvtu@nA8gIty%GC7(P<NINbYK}(e^F^@I zjI}u5NQ3Uni{Shij4zqv(5nx<S4~U+;ZxH=&(7bYEyST;RbZx@4f^B@P|Bng#M1Ie zqJ|cloR+o`BUi$Lk1B-86tze<+lbU|kQ}f;7BKde9SMD;iZ0i|R(N4JZdrOe&kfe3 zves~#A6)c=yhs?P&LQw*Hf3MY*!fIW0Xd~k(bS|FW)%gz;K$b&k@r!K@@ywrSCTur z>qbkSFI-aCqsqeZg3>BgmRyjp4Y@g@<&HK`vuLRwNhny`3Stl@q+YB7-vQZj=|#Aq zQnc-YT9>E1S7UrCA^Pl@y}$I~xf`zp%c(*BV2E8KtqGqPIMkn<l&8Z!G1*gcvdj;W zInyJSCNED0y^~}_>eRym#XE{pp4Ec(Vn-}E>~%2hl~CU`9U8?Q$#kK5I$*x;MP`1W z#NEMkPBD-l4~9bv90isKFvcr3C?nY4ZnxVDLKab398Bpgfimr!WB*;$4E{wc`pH;* zr?aIN-<!-P4<V|o-l8vy$by8N<X6K-H8al?bVAdA9Bq!;(+E)qZ9^>RM|4Az;sdj_ z4MIT`P1aY%kWlQX&G$;=d|Df%UjcUhCZSamEY*xjj(5nHH=Dv{-PU$_IRhUP+iqMR zCixNiX|vLMPziWzQ7J?ZD23TjaJYRxLc5Jo%TaLN>XU6EaY0OorNLQ6#@sK;K_5Bd zQ36Pjr6U~a#n{0H*@fFDgJHjEvkKurh|mg#GZGY1o&a@G2xU?IX4hp;_t+lY7}tVR zDtj!V0hSy|1v)WKW~wqnTH_i{f+~Tf<P!36Ii4BKwH7)1NrYyPYuRhl@%M@tapPSb zj30S0Isq8;PO>e59m0`pi~gh2*~9VEl2YAbkgwe!FCbgC!dasqwe77FBbKql=O$m% zhsm6ST{x7*MVP%WC(0Pz0`p<gT;ERC&0e4s(^PEZmE?M>ZU}y81po&wGwJGK5ROgD zkHUVV({6tU?J_0e5l$(1Hr|vr5DROD&Hk+0{plv}qpA7QJ!ro<@{})a9_|-WyA!@U z!h6iOxT7?UaMX=l!2Tw3o0e%LOpTy^+qBfO^OZVoCxIF=um^tj-Nkz<^Z>7>-=7VJ z?2Ef_k4+VX)jh_@?>4_*rsGmgp&u{Q9kiP=+0wGU!--s0t$VR#dgeg(<!`Dh%j?p$ z>AUSOT7S!CJB=D&vH{*qK0E@}`n=I1)lGYMWn{jx%~{#z#0_Ap9Oy=Me+1wj09cBa zIX=z=mCuaN<_>+LU$Z~A+?CqF9(^47W)F6tQQkK2RCnU0(WcgeH}<x&YiYNe-FVQw zk!_}1+u8PmZF;wvZNbN@>DFd;^#T6azW!i)GrO+-;)gw`)x}z!2lPwo287nz>3l}7 zQ`0zUg8nP=c(}uu({2zKLXHimEa{tee*5U?NI)9X#k<t0!)6+u_6ubpRqX(OCT*gG z-eod4D~6A8I(L#zD(sHYe$(v$&7Jhn#LFRb;3v~^R${-@g(HmqrDFWzawqHM;}?1L z1fAoiu+VpTaZruRTTm<r2TF+&Ql7T1`$7i|MW%}cZ80_FhSNO`7i;SUKtqe4wTZXm z&yAvYl22z<Lxa1F5lH%FkIbMmRwdtMp|07;Ee|sG-8S0AH!7M7g2%PM6)xvlALuah z5>o33jCzCA8ayzf6o=SAuJhR;%*}HHwbSX4@3kosML8Y=TU_+f_UZeNA2eN4a{M=q zTMip&JKsF-EBwzLOSca9*I2TVg=#eGeKms-nCsUJr=VVohzgP+fRQ_y7Dq5XFiMI$ zyL~b(N9<wwF%bNt@@&nyv)MzH+T9l_!=YS@4YKm#m3}xaUjlcL4T``^%;@Oa5*9CJ z$}UNQ*QzEz6D@}D9K-T(;-#J*!iK9tfjWD5ehzUzx{<F<ZV%U-i0;8C0A7~sAYM$~ z4LK3w05MA0IDauX&VhT$Mip-9htr3XV*JstJPhes4&mU#H99K~n=lbs1!oj=J#Dn? zP-RNM$Eb`@CmV{)*KUE+>-lsl2J`!a@$5S1B68z^zB~agqd8t*4+(|@V}E=g+rmA6 z8`jjVnFq(e$vT9diuSS7&3%IA_GRv1H4#o4*!at&yF*%i`Eti5I`}degnl+ca?yZ> zyb)=<e^~a<Io9jVZ;f)ibKYt1e(Qs9;lb!QsiwV~-$JC33PA_HrE8z9^K})f2zI~4 zedMyurbHPwj`)fG>_jYpW)Pf>NUIx&;|GnvMQx5VB8I$#0d_Ampg^WbIC5}B6Gy|3 zq(ujw^oavWhTb-eBNDc&agMF6%=TBJ!AdlUiw3Ys20e^N6A}#6M^h}=lP?z%3RLL@ zMFQr8_74<4jz$5jh+Yes&Tx=06d^ik_j-2Y<XYAlf)ugd?GCSHTj}O?c)GUUfq#aZ zX{VcAKj~~`H>mvf^^@&Rw$(6sE@b2Pt_peNq|^R%>-xz${K3apdtIoSb~fSti_L9% z-`RY%2SP|U?c&R=t6cci-ll-RnO!sBSF;=~dK-J!p~mL*Y-_j<|D=G-aI+2KO=mmX zd~mg$ZgsP5{M1>;PwU-Iww-o54`i)Z$sQnnBi(FMA*kOSu6ICKO0Q-&=+}*P_{HVh zvW@Og{)NtT0p1YduESq$sQW+wmEhs?HPyg_&21PJga$aKFpdvsFa&tU^E!+>;UXH6 z2wX?04&EbTgd*aK7|NE#-_8ToE{tFsfB>Qo*4v2fH5d^&RuZ1<4+xA<@*4bwd56C? zR1IB%d<BODEUhnqi~<+QE}J`6mW~<Fxjs%*mpa=$fg!v8X?Ob`Jb#K1lD*As>%-<Y zy{8JWHt_We{D*36ZgU0e1Jr=`jWxq=3y}I8@%TJVK8Ll4e`v|z4?^j4Q?ljoU)Bz0 z=~i&%rF5GV(1H0K6qN}3_L`4UEdg#*Ttm5Aefe)&8*YUXQO*<k@)!Al_+JTP6t?d& zEykp|k<ePYa$Cz(ToPyIFvND7`&i_l6>uyRpO6g>)bMx^fvFJ>t=d(C$%713?t8@; zMNx`7#!XVzzJ{r$<-!~eOw3MS{t|Na$c<Z1VUAQimVsccG$I*6-568~3@mTeq;E*Z znh`=c4Vk<?f|IM5z9={X=(NC$=zX!`{3w@DX2<LnPa?i<gfav%mGsKf`%nd7ho4g@ z<3J_#Emo1!Uk2;pCnw(RMQScwp&+7R61Ik3V73c$gVRiX6DvTV@a~rYBD`7w^Hu<F zz(p1Sci|gb0*J#mP8}p0^XysCd#28xXY~5nv&Q`467#swfYG`4-^hS1Ff`oVIYXmP zn`z!3l!$nxGN<ngs?FUHjP$-(cc~oDgS7+WWS^(mO%wBYop;n5e1?6_8y{S43J{b} zFeI8(PHVx$2+Qdmt^Sd2M<3HxDK8zlL-Ru@ZLAqyaO7HCfRGLJ?33c<6SX#MzQ<T@ zUZ7B8Iay?-Iz4=<G{??p^_{YV{;r!M`ibnnD(a6#(@D0o*iH%Mp5iFRy3s)R_D6R? z!u{lX=qo|{LgYirhvFFc(5fH=z{-MZVI$mt9Nmzbyo`$q4`UOx-Eee=Jv7KY=bZNW z^!$7I#K|{TPWw;JD`({CHS_|5wpO!ZWDkj|grQ2s?`)<>M=yufTMhDYx8LA24nDb= z*@Pw-l^in`m(%lG9Q<501l#D=Sy6p-PH`21Xb`5uM$0qsB3un9F}pR4rFUmA!bXhJ zS${Cvjg}WnTUNc2G_X!1Ucqq$%zpE<n4arvgouqRhP;1DT!?HmZ1g)|iN-y^@lFYG zBYG1$`)#@%sMv4#ws;q<s4X30DXE_7b*7?vi2&?tzEPT3-}|zgBI&#LmfYe4UX&nX zG)Zns&>8~%ynj<81J75k#H_CZt?a9s5j4yK5l^~{wdEShj4g_XinT$K4>@?~PRN?j zjq4(v<%Gzn&qq^Mq_-}2APr0Cqdf3FxanK2nV>DFmq0RI<@IfQOj6m@G>DE{5L@vR zLa^xCFi~!8%Dh@`HnO^vi?A69r>^&!IHet?pLXnyeYA5Vf0!Qn6AH{@X&j7)*c7Ib zlXuNHn`%Sg3!#OR2q<la(H9Z>{%PRCRV~pS{Zoy;dF^1eTH7Lpgodw*nc;Z+eewBJ zWD;v&JimNe+#2^euvcU4!dzLxq)l16$yFw2m=0e?SeDIH7ZCZDeQBcc0ftcFyt*n` zU6rh^O5#@~sI1^L>;6rN{3gV*j~+a{{Tt7oJbG~d>D|ZTE}E~wueMv+7v*5w#FQYr zR2a(a8D$%vq2;oO4a!0EnR3Fk;D&rz63xMU2}#n)aG)jUCSo`b2hWRy)6K&9N#(jw z4hK?xt$LUVdzvPbL9s^poiW`;@*2*U(_yhAjBGaOxY_vLusqC%7n0mic_9wJet7sr z(VJb+yTKUto0G-?@n=HbbcmOheW;Tko!_>3-q(gaMz}K=BVrL}z@!93@|Ah!J<i1u z(p*StTUZ*1iUZAg@&Is4fg+P~7!v~y^Qs7l03V6h%|NyxS;fME2R7>5{Jc0vOAA@E z&piDz6w%eofuDKE5zGVAxDSvIV!UU4t=d33rl_)`aE!YIQUq`=Y>wkYTvjxY5=1Kw z!_gKj5JQLfDp;Q^u*Q2M<ft8M2GZK%f~B%&XYI|s`s(Mx5&&aBoWH!yE%XLKZ;Y+H zIJ{arn*|{{oU|lhYjcNSC;mxK5+Si;;$kEhDp2{2|4I=>XV1A+RmBJoVdR(4rVV}P zn9vErUMk9N5^6e4viF1Zn%n>2LIASpHHSHf((7EH!ytYDhp*XPF|sBFpCJcf5@jJB zaY>Vj6@HJfo;=EH6Mpt~Fkjl5FtwRgS@kATko6ntk(C=((UT(YV~z&&n@So7K=sFf zKy#E&gukTUAA2kuHL=(*s7WwgA>5SG<?wVwH=X;I@<k^v<F|N*wfr!B%V8!OGq(sf z0jH!$mH?e)9>p9tC!JnA%{mURE5=5ATF{?VE_+%(a`9V(gA5D}jhGu|n@ncO9Fl+z zMD}>UeISh$L#hxN#?g(1XhHpgp?;yEDv)1<wJQXY2V3It#limIpq6G*pScp(_xl{w zb@DFciVTB!%+JORS;4ur7ByrsC<uqW!?ywtKwnz(2o_O2liK`hh}1((Y@IbPFKb}? zF0wt0OqPL-u^V2N#uh*D=#IOXbfQZ71q29Wi-8k0CA2d0>G6XCuPs!Z@2KHz-^dlI zO79B*>q#dNmvPL|A7wsza>MEe65Pgim<ArzGU8ysvbS&=94xpASQYzWB2}{1PDply zMJhHiXQ%iXQr&GLcZstl7T6Js$WBYiOynwnd+XzAIpUyIhU~PaJ<c)vkvs$)AuGn^ z5N+Q<<phX-&3$jW<}d&v<5H9%3h>XN-73Hk-LO^cR{mC?12qQ@8iuPRiTf}wv(Ku7 zjbqA@=$=H2&8iUqoOw2Zr^CAGsRBBM$#o4pL%99Z&#KR=_c(c@eoHSeZwPcR<Z8Nq zl;mi_-g{12v#J*ftGVnoGN_(D`SfG@(4@kKOYIZXkQCU1lakaqnAn%%G7O@y#gaN2 zOsg5%JfJv;<%FM6I~9-0`_edBC?1`xs7lyd)zzcRQ%E`BQ=%XhQ5k&@9v8<%%20O# zzwe$+nvMO2Lj-W{4zA#}Hd)j=J5rn@*we@cG=`M2v%#o}y;n7%mc{8-FCGZm4?l&U z#KvdiD;vj#>6&IF#oCb7vg%}Tgz*eSO}n3FqQ9PE`W#(HB^4leu8D@s?ZU4D!|Y_9 zCD$}AY;RY#(lG?w3!8Tc9RaF;5f;m2ubd%4ZYVYyj-)@Z*&;cX0shb6)VOR7pT+|U zd>LtP)Dvm*_{<^@@G4+}Q6of3i7^dyW5@XIi-YdUg}>Iy6&w{W;18ll2(9G@gKDN0 zvq7RvE(YmTWF>PKM0{v5b3<z-8*5f@Pja<}7RqqRRWe+3i5QGbqY;n*?N=wc?2~hw z$f2J<$v@#WhE6XcR`kb6+z35NR_I0y(h&W4A_6Z7(NWil4vRHSl(yp>U3w|{=OAxn z{5M?-YP>vU)rHFfLLtHbK_i(nTywmethx@rd+~M~lYsMvzY^Voa?-dkLnDP}#|0;6 z2pCDLt5PXI4o*Ajqxst3_u-AtbD{T4x@Hqq{CDx~Zp%+{xAPgi2h0d=?PXX>q6a1| zNNrdqX`l}_Z7`4E&&KaXIH>o;F>KI~W$dnmQiGc}k2QLeCWHQ&cV+K!K_L-J@yXr^ z&vkY~9)vtLk`0pMv=2xG#3)qG{RZpMW$DZ}j`3CXvT%sWwGAeIgEiuTml2x~zvRA+ zo3ii->!o?s3jWtQvF50~U3)DPZ>dQZ`ZY_Ocr)#<Kf~6!7n<U*K^X&S&9U}Zb**ij z4+nYWNr1}oXG2^QZiql88+XKYA#Yf8Ab_KzH!G)e<w=t6E~M3-xyL0;?UtqevYz!z z)PSO$#_n33yOsp9ptsf(n8=6Y;khu)G2KouH7m^lM<wJ>LTB`}RE8Gx$qEL6o<8XA zvw3fGGjX1_w$Xv-Mz(#j-n|YV(J!j|V*Bd7?ars2t?c>(^o~lq_wWOH++1gWpBJ5O zb`8o109&2x8UnE6M6frFdC6-z({L<?Kq34f%G5@Lz!(PVwT@tkuX7m3NDch-k(1tP zb5j&JJe|$TvCbLR-Q3>nSl^zSjUr?+WKpxMqeUze+W}`W2kvaDV;kHlM@@t7$E<_N zjbAQElj<puBFYg*3DiYhgWhRb&T67Q^an4b4ggDvoYcLl5&;DpDqU`VSe3)mS+Pr* z-?k@byO`<?|8fLV`bp*_^sC_kb>`eQc&>@LptEUnDiRrouyRDnnqHo4nNCwRuIA<; z!B8_|67D_Sdmt<s*v%UYj=Uh+Rz+_pg)e&2X;03QZd(tMUBMq5wILd&B!STt_Rs=m zq1h$DTx^q?8nTG0CK~a3gO+8({CtPbja|b_9_>ethCu!>@%L`Sz}TU8b|;;WCf*J) zwCgz^&3anzSEDH0b;D+OSX!|&Tv-gA?;lR@(5d0nY>F)}?9Ez^$+&3F08kTMUCo2J z997k*B*MHO(i~N`6$PD7CYYRz2#PKqmggP*0ygLO;e|L0)k0gVZ9|qagSd%TnLID; zxt4Dmp(@@AHP)mEB~HJOV0PAz^3ecJ<54*-t4ZD~_-%y=A3IyHGf}2qm$kC1Kx=m! z@iymd*+?}b8KYm>InL_9)X`Pz&<p~R@}1x?4awHXNpJD?x-hDHjr}c8S$*g&K$x6L zi=05>z-jYQ)E1{s+oClLRtCFm071%UJ5+F&>F_$&B09`7v4gobceUpc2qeAJX$35S z$m+f;Glh16fa4)&ESjzYvp(hIqnnd6Bft^xLsjt+A+<Qco)$+i(kF{nGscrUeg%5I ztJlXmCly7h)I54MZ)DGj0i&kk)8OG$6~iOJ)`+({AqtK}b3RXltb?&&5u(kWYib13 zLQ#Nlb)s2x(->_KwPkc7dMmN?>R5wq)CylaT0*<At)}O$+q5S2-Z>UMSv&!Z?Aol_ zO-WPJB!12;Y;0sUWa~g|LgA`I=1ZbIG(QIx*|W0XW#B}&IhmF(=_2FqbXrcE4P?OS z^bi*?NrCSZT!}?g&!sK8oi=MN;)9m)QUC~e_C~GX=fpR+I<Bm&j1?PXIpw9awMv5} zyTOt!Sv9u!u7^NvVJdwocq-%VfJ@KK6W>B9LjTS322L$41_+aG^3#;eCOQvo{N`y< zk$LjQ)vKG=Hn%z(r&X~&%MaIQ<vL!s0ksCgZ*eCc8IWIr0z5CyF|eIQ1H8})%_4(x z7;}pP$z_!4g5#~;2zUZw0K6W+pQ*U;8$j8Lp0|30R$j`6j>cKhS-^EB%P2rk@U34M z#?>o&cii_=I$`i`B`h$5Fe`WHRdQGyk=FwC;R*$;y24*L?mm5RHnqf`^~LDj$!soO zmr@T}{%xgQ5Ks@Ko|>G>!34^{t_*Till&OglaGfzMxo*03}#d8Tqn@vlw4KF@cjsm z<0`>5YG0OtVB9Qf3@TA3wwP_cj@%7@m2^J#-Pu6u6t*Qd5jFlM+Fr}81}7YJh2zI3 z>&f*tMJ*$?Wz9a9txc@YWm9E_uXkfg6A{>Xp3X$W143ddOrpw;NP9B+@<I)UV@zM{ zYOQ79q5uy1J#;3*#>K%4rvN^s%DESx0)|$qoW>1aeVPwF)jbK#(o^`R1(#Af8qbcx zodrL>?6}-%%92E(FAXX-UsP{f0iMOE&Dhy>#k&a8@@X!z*TRnw>GG1HJ(Rtq`%%mx z7l@A`#!$IOzm8qzal>v10oC0FFYdG=`%}|mQ}5;r+gGfwcm<_mZY|^t=P()47f!-^ zx2|xmi@cEN9IIr{IWB5F>o~mY3vt(#8TK+a`q4R=&#CHU8E88T8_p7*3yKVa06Za! zL49QzX_xq3aavVGsKxclOa@6XR;o1)e80g-+5@Z02zorIq-Ri!e-xj+Ko)w`mI;q( zZT*|E_%OQ*^e%QgZcj%V2}~0pd%9xZr+$mN>xLXO1N&TFh`L=9aZnQ9r&Bt0uKYDu z{+cU)&9J{F(fsZWq}4?Ig>UAqr%xYW?vkTr8{-$j+|Ql?b2}{>yGz;hTK<rtys*Qd zojlGb)d{Sy*GNEqT$Uq@y>f^``cAShw)B126ls!W*@0_~NF-bGZU#8ZeG;+8i-5t4 z;tBqSBhE1Z=1jK8-VaLP>Ln@|kD8YMAx;AfqKZFA>%N#_2<~KxCp0g9;Wy8(GJU3Y zZ!`_$EVB*l>3xcGpa;OS`696dFqif_Xi9F|4x#nf2W&;=2aBdrkOM71dFJI5`$-hq z*SG{76A$6+eLi3PL#$*dtr5jB5{HEtKM*@pai&vBVc5)p(R3~O5yyF9Q#|Zn8(|zI z5a8QH+#!nXfD&ONrMM@0C~U?x98AVSDw@x=m|{xB$JFtgc1Q3?e`I_QCAH)UY#*4@ zRBNNcWz4>W9Vbcl-Lde4X2NBGO>#<h4(1uYT*O!aUfn8Wk=(`0IuO)3U#lJ9kPwvD z13uTaM8mv%RvXIQp<;DduRlmAWVq-qG;L6zkI?{qR!*2D7!K8JWov;=Y(@P9`hut| zMOZBBQ;)jLBPR;HK~K!(7;?E5HA1^0M0m*ATGZKn6B6WlvC2l?VpSOnr#CF}sj({T zXe0Z4fF7s|i+8Y)$ETyiVtRpT<H~6txXpa{GC!|yqB@y_9Gq4&7c~JVw4{~0lty#^ z_4DG~A{kP`wvK8d&KDPaJY&6k16&X1iC9d)>){gBXX=P^OZEpxM+K61#9SzUPPi(X zSODL3DwuWNisoTKRsIRN?gwnWO(&s1R|A{enX_FZm>!le7i^>o3em4G4t9O3cdD?; zy|t1;R#Her3b|vkKb8V!W;1C*Ro_@i^{f4~+E4TL6J3j}w$o}mt+vzKY$w4E-%&at zsaXICcs4yJhI6%fR-0$Fc|w~<*anNu^MnqZHB);RixY_7b`1^nbyGu){`(U&+JN<} z_v4^1j5lbReAX^{pP`Kj^fn}8XJ1tR-AP{E$Lsz3eQN2>t*5u1{rKU-y=V9DJcEJ1 ztM%WXwFPqP61is$GvAXW56wWfZRKS|qy+y%CBSs>BA*rNnWfpNZ`4UKgbCRAXnI<m zpt;Ai91e@A(0IT|;~!xhacGy3N&f7&(mwsi(`KusZ|bsg+-wklMw%QB#?s)T98>+2 zwy0TtM2ZHb#hTl}Lm0&(AKQp?8-of55O2y~6w1wt_>{%mtmdb|dIiAHd8(auHnZ)M z?$zu@vWGuY{P}4++1u=99r}20`}(Kb*YDxa<Wqdxuyc-5)}wCP$+jNcplny!_OOFl zjqo1;+Qy#*XDhq$VrwhAn%u*eFV?$Py<|p+7bi37J^wuHZ6&vg@V0WY5?zHsQKRK2 zCAykTi!po2csa}$$zE@{!I||8OCSM2t454(0F#}d#4=$s21NFwnT*dIK?mzAe9Wxr z4C5mhu{kh=IgcEP<&rp@0HuT7QeEzF;()A|4~MiT9I#6nIXOEtI~}WSWWrp^kjVoo zGtN8aOln)g-eXUH*+be`YkHs5**>4mc%Ne0<k0S2v+VBXn%)Y*WR^cKm^j}i+k40G zmh_Pg`z&eru{rcd#%9OB*Nb&@A^a+NPlvlKY|canWH&L2bUA67i(f?%i;lRQT1il? zxkZahSnQ=Xsv#XDJZFOnjT3+JljIT=66)IdDLn!g26UvV&1#}=I=%X9l=j<gWCyC| z{sC}rK)J-K@8Mg+{Q|2#rF_qO`53qe>kP6!G)?@cgW?56)O%9Qkcnz)x+8O57?k1l zU`%<IF-iFGbkJ`cT$lmSeI&9GPT#}R+2oWjtSUL;3Z^|5DThI&vZ)G*>e>L?v1%{5 z;cUa94}-?xdhA5z2(-LcFKh!Tqa3z4#jW56Zkc_AU2Znc8XAAIS9a_MyUuy6PUm1z z<0S>G`5Jwyeh9l4F~Q$Ig5T$ji`KsC$U(TdxY>|>`CsWf!?oH?>lRdVuCVP7MiiXF zz-KfV@8zC(W**8rGN>c~C;Ez+;v+w^U4CPC+8C5dv6c!i1<5?*On<z`1qu{B@9Lbq zj;Sk8Ci&RAddAis7br0R%b6p+#O^$rmS^Wp)n*I3xu<|M9nVG$K7*g1;*AltbxGtw zK;K!TNPgxOahEX{$9u-%0GOCPwAb~n1KV<rM1+_Yk5X1)1{lQn?ismd!uxh0zgZaR zG={2e2oT)N_DoXbB=?R}rZDpF?n8I>vUIxU-PnK1_i~J^cVQ2#pIyMXr&q_IvlkX# zcg~I=D;XmMYcRRSqV^Y-No)UA(4;~HE5fDxO4(1`l6VGCcQVa5<PSmNTv0zX(E1>W zMyD4z`F)aPXUqy%Fwr%*u+vrk@Z}f|-C1%pEk}s<37VIq5+bJyQNuRix`MfseE<~@ zp;<``(HHox{}LA!7rroj^O?SxJNw!!VT!ybK{z!RyD$l(KUTgG)uj*zQChBGY@bYD z42FmXa|Cz}P^m+@17!&&N^=N~<mLxtm%;f1D3%Al8kbCJOcUz;#@Q_yJ_ZB+oa-km zb|YCoTS0%Qy?u(8s=Uhgo$#qnDM48|I-6a;0r;Ax!ES+@BET2t_j5lr&?%NZyFAGI z2jP&pq8thEs-KGsYho<Sk4_>V)fb8zVJ5AyZ646n=0hXl4+cUNnS>;t=%cuhOp4w$ zj!bGSuvbb9LXRiBg9*t-cvK1qIK0w!S*IiLWTBR$$WU#_x|E*)t2z>rMc_VE#Y3W! zojvM8I}_P`fJR@r9jckJ#w#Z92G)^@F};Z2nG|7Rwv-%Ubl(w&v;qve`Y0a*^V<wc z9M22-`fxI<nxtJYaxqg;v~7)qM>k4jL{9D$y<v`eXmrLgKAxK&{bXz(a#p<`HoPx8 zAYRrrvUD3i3bnz~i51~pk6$rHT{_LF&DH7E;w<2hIjWE$pe+nM5^&h1BILxn6S0#- z3%vV3+`Ef65!0l1TFuJQ;8oH8FjyKp`vZzG5#lFlLkxyP?ECRy-fXAze_6NHn3HD0 zeiGZ!OgxE^bzR3J!9Yod4Oi}(4w*wr{al+9ibI9e{>*8uslH>7t%20!_i{KGN|m*e zYNg4`lVV!HiC0KBtqKKIy2B}8iOk?2l=wZGf-q6`iVEnLkzU3=l%<ZtaoM)@8EdY9 zgd0kokBXMzG1he78D|x>CB4{8P?j&755Q@4-+Vssa1=KMoPty)tmSt`z!_DjWyeyv zRaK`Wx}cfT<xq){P|zY;)NtJVxGx4YmzY@C=m*Ps`NB@uV^l#Rpq?^8N<&PzF(g(y zvW{`76WVn<6w<lh*Q*rP8F3Rr>pu`#g((O{>cS8_7+r266MR@8Fud);%dXF7AP;Xy z$m_+~Y+8(p4CCB<ZpR4d_dhN<*9|jpjnwRzBP^Ju&udFx1cfZ4J|fS8iV48cG+l~( zo1<2O;dwgcOI8?}5odc9*Hni^FUOnL0eQ7y5gO!va$d}`wLscVkga7LSBbOE9%}0{ z(D-tEOINe^(Y^!FaRBrx3*~^-X;_@0a>Vqy1=Y59Yv{Ac9n(Mue7r0cI`~y`(H{aG z0*b!x77Fh}pw4$KsaY=(LrV$oC_S)>RT=W;U1%(q8c$JJMlp9QS@_@(taogUNi<x2 zou{ylx)SttnAyG?-uKHWSw3aDWL_IOl;nP&4n{$1^2r2P$Sj!1+`lcpV(tkw1a+~6 zCHeDQqLJu}G~Y!0iMox;msuc2r?-_7GqG(@v4jVga<_13RZJ!1E=Z}xNt528=eTYj z&-=2Z>*T9^(cKeRoWcS`g<A*z()J0)PnMbvEJgSzb<E1NZDpOavd)S7e*yyNp%5~| z5uZ#Q+hcyEqvzH{$rWW6wBC?`Z8x*)>E>p(mF#U@OFP%I8z(oi>z`iFt|fchSF_Eu z+s-=4?QOKvxRGwPvuzNouA=?M^%UOS?sVa4GlQz|w{tb?;@fl+%AlnO2DR<n+sryI zIv|WCdsuMuMs}mO1qC}DwEfryK%E<C5`zD9t|z??d|XFx-EI7_1*N)M*|qiV^=#V? zj%$o1+i5sv8rPura#VaPjcZHVCb$krGPc<QdRKvHRP7o}=#0{)swn#r2y#J{U%M@- z$QJrdJeq~DjhP?N!n|a_YbzNC4OI>#{i>8jYpa7`br7r$g7`sz8b{#u;m=M5BR<Nj z_0ga=EpdF-VS0C7jD`)i$b3nGhecpRc<7feS<*r9M}u+EZ|HpY{9VvNfN_63zyVa5 zMc5j&?7<s^3t|QQ$z-%k^YGyv{RwRL<}5${#JD<<!GX%#ei8P)+emJ`C<lGavo$y# z(>>W3haLE9Kn744;95y}kf-^$!rh1C2_<`9RGGk1!w1C3-y0A|>9QEVxZKHl`S?X% zJz>7R(DrjyV8}~QhvKYI@YyPRHHA?@AkKRr2F(V2L|Qo=8$7y+h;>>x<KhNSf(D%E zq3=@z6x~zQMR6X^78t0T-=dG-`oO$Fx-d<QLh&8nA#N^KXQSa5u)^0^1zvq?5lngh zG5T{d%_k>$F*H(y!D{?;??KblM(Rb123LUC96KvxO>=G=!@=}?SUfo?3KC_oi^dzR z3p8HJTh#ZH&5k{)a(JGo!p#=0k;kXQqS?sgLTMZpC;5v(Io&y(4x8T=%-6S}kFACk zAl{GSEU50N>Z2Ki*!mP)u^6wPRzQCbr}^|83T$t7Iybhy)4l%blkEETcYsyOtI3(+ zB&+&^X+_@<NuD<2D0sO^$H3Fa8*r%JU5C<G;OWCV56Q@Uf_5q*ar=v7m|5US@;+tW z1mcJkzu;>Ck@T%%(sO(7&gD&*ok#iXgiKvBc*As#0_W1lJ@}YS`JSI9_BSbhAic)l z{5C&iGfH|55B#=QR`MPE6!nRMa`nNO-@##jvX`G-zAnFv@-snY;^f7MlRg?@bf`vZ z1RfrY;Ba^<$=RbR5a%-rt2`}_2mPHpKfG@h$oAx{o6(ei3^lr)tL?Ui`(um@^W$VA z>6+yp-2L?K18FzkY2$xJ75YHK)1eO<N!UD(%W`&iC?hr-+^@~)4HwQ)(54IpZ5f+> za;Cz7>(KiGB$;nvAZO~+6&yi~|NLXWknll=R@-S?0J$)FQjB{*^zO|@!&@`KDcH6h zfvj^+IL2jV<UIT?rDyzZKAP;BsSv-#uYdEjob9SzVzfRzKI{TCtHo)WK&8V#yLd6x zL`u3Z${dL7k11sfZL|XY<4BNJ1IV|JF>(t=XY@=X@g-kxQy>@kMXxe`rV|1UCi&4l z82GIn6P8->^y=my_;%QDjpEIDD4GE(=c9;T7cv8_#`4t=1SAmiUcvu&ohzYN$uIu( zfB)6b{?%8%_2n;r`Y*ov-~Qs~fB9F*emkX|bl}cxlVUi3j6u%@R7!2pZYA$od-RH3 z(kLXi>J>o6Uj<Z2gs36nXyv}fFwxRf&K+#QF^X`oH5m_#gk^cfhFX|T^E(YcN2b$x zqem|og$*1f=#@mOPQ@Gp5>h$pgx)G<zV?Dy`akI=^XS&od*b)f|81Bd*f}mch|~{( zn;gu}9kPnXt?(VK&FQn3ZJugRr!pjXlU^7DQ7W)k#LrNYKndMf?#kMoSRikSfm@Y` zG3PoE6i*dJ(?^B*e#d<1x`xhV3nGz_zuwaoHV@|PVL86HhQLx<qsv3J?0|~(WG5S5 zu7|0c%3gLwy+81`GizZ!9t?*b$4++Dc;Es}n%*5cREZd`2?e?w+eV-Rw3XwU89vx6 zgFZ)WeF5wqUQmJr%$AMC88bZ|c_1jr<Dt$0h|2dc^Fn|`s~HpDZBu&dhI4#O+($e7 znFBuGB)Z!U<dOr_4fRcVbW}N^u+`qg#Gv7JF#I+eEQ4%}dCo{0t$_scYfcH$?R{h? zed}RcIDKdt`w_CRKye?#>riAdS%pknDAz}CmJtsXFMCf$m!`tZX8EP%oEau=XhV}v zgSijr`qh{*<hkT?V>eiwEH5M{E4!>-#OqAjIH`o%S@NFleM;*%I~VV`mj^X)IvP$l z1gN_RBswM~(y@_YHSc72t~mGR1Xd;fPuJaDxM~NgcIH>Th<3e?tjvT`W32-g`|X-x z>YsDjjwsuSl$E=YWhvO@-DdwRh3d$mbgsAIT&GWu?(fFTxlk#}V5*by6xckp3Q5N0 zczs+PlY2wLA+@sTRB-k8!z_o5>Xn<x=GAs==wdj2T1?NAYD8wm2&O_Ywtw2A$dadH z*x|5ZfEbE&R?=Q$c2b<9*;Nc|kFCR5-<bnZ!Hq*I!*R*lz=T<^`Cac6>sROZK1j~O ztHys5$xBj41n^HjY<%<E`b|g*(QwW(M^)%KUi_s&Y=01@wL0LSL2K_tNG+R>h|?-M zZ?H-P6ORh<Lvb(=;AovDZEo1OMC#9wxhCY(+8P~I;~Z;nAA&Xhfrw&cd-A+&+*I?4 zeSgnX3|OusJT+$VPEB#5g@aKc&u^vuY4V5)coB>x4}oV2l0pS3T-;<7unKK~saX$Z zh+yunEigE+bbbJ|Q(UK1Xrn^*qQsVC1`IUBOY#a97p*BujfJ-|%*zDrZc4lec{u<= zaQ|-dvK%*XSpsW0!3-aR833Q+5*nUoVWx^&y~#ZzM4sRq=?xZ)p^BdYcV(H{>{W0K z_Ns1di3t`Rie=mr7&Ry^9s)z>rY%ufC`rl76oL_v@fQOl!<pUiE+;2ZV~9cff#W@* zgzI$2141&v2{zU<1r;aaf3R#7DG<z8FMHx8s}IeP?5-DlIEt@K;Ap&RB8bctpFGJ& z*f&vOF<b8$8{vxBLwK)%YA~x+-!Ik<X^iY^8}%jpQ%~o*pH|%$$&9HG{#EAd*5c=A zkjd7_d;puhZbqot4mq$oXkl#O_Pi<T25WZeYYIs_+A5JumK;5`LIhS6j}WXdd6ZJg z94S$h<?Dk)T6RXu$uqctsVC#bBm+f%qot(IgD0)Nm>Q98eYr}OtF-Pn%1!?O?Xg9* zT&cH3oYs^MfKid-9dt!^E<&Y(^r_sDQxyY__wSfoX$r8i7|x!)rn_73$#MLwd?uSt zKAZ!#tKoKb7hqb+viARD?_ImwNU{UL@B9@hy2=1V5Clj`6p3QV6h&3hrl@L>Rn=7# ztx5n1GD`pwoe7FWSMeP0c)jD<vA6f^@r>IZduBan*T-jP);;?gw|l$oAG4+E?oay{ z_CDgBkqMBJdpx_V?gD|#h#NO<MBKP><323ulpOI{E-hMia#pBJRa-2nmC^s|`WgKc z1vq^St5T$fg!MCcuT4`5f8}?_oc@rML0GnKFR2+>0P~ur!%3RFjEZ$lj+RN?k2X+U z@S8v;pY8|>3i2W$GjWe(*K3=lul#KcV-Pv^(PW~$6)H!j6{;DdswMOlH-?DqgyZs- zK!oasW2-YzrvSVS`w@Bt7bw~Qat~hTDTS59Yz!)eSr)l`MnkDw`_T@<e&f^6d7@PK zrkV+-c*<Rss51c|&o%psVmR0xupwQca+747>@lk`g}y4N;N*8)9LVC4AX10{k(>PC z^oWfX=)%L!6M&J+7^&eoNMdK<t4RBj<w?v@hfE6FkL4ajF1i9`^nto1zRL;?)kZC! z0~+x^78M?FKhc6`ldfj~)n0{MiP5&9;x}Ipp7FJt$PY+kfaX;JxtL9YFL>Yh0*+M3 zdMME+CG*T@pfI{Or*>DQa1#S-IqT;cCf}xeGc(X&nl?r_crGj(n53DlL(l8YH*>tt z;CGHw5nXqBdsCh$YR*w4t1D+1ODLFMV3ZFzql>@e<CA*8|DCjr`@zW>x*{GWe7Egf z#^Tv_=&rUWP>2jM8c*yMwxeF`*e~|gi+%gWwtBH`zxa-N@tw9EbSI-*bMweUz9t`G zPwi*jA@Y>mGy6eo|Gad5Pvd;d7rGUioRO1U{_Q^71c@>r;F||pI+YnGGF_paOS?Pl z2`8*$IIKBRI(H4Hh%-Bw4tWh<b`g{H7gY2uC-NSBvgtpdskVY)P#_trW($Pf%ec5N z^51lhGIBoinFq?7<5g6!g$1Vt1wE-L6hZc95@hiIErNV!)Bk*DCZW1B3AI*ycD!uO zCIl_kIm=zH&IxbMa+f8zPuGfd6STxZEci~D8o~%4^S$%1m%?V<r31lv2fmzV$h3PA z+DpS`5WNa>$vCZPhdaULYVmc`6bnpC3J~q8@VP|F$;%dMiPuU1Qu(PYKb=*c#<~j2 zV_x`Fej3jM|El1aS9qbJNH${<D9X(!cQxl4Zq2)fXBBKoh^w;;GQ?R0S0%)?*##Nm zT7e>mSYQzt;(bMHr;J5yZx%1p;)^d@spYS;%VKU$@2BPOXI#BeIJOylVE1y8hTTbU z`0R+a1j7)7w#(wFi&quLcgiL$mAG3{g1U`Xv(+KrsL-D!_|xKFt&@`5Ya)uMy~^cR zx%L|WS}UvVxmI4Lc2@v!oiTy0m)E-~A~EoCKF;2q&Q~s-6J9zeJc<;zExNDDqoZ=M z-cclu_ti4Mm4fhkI2$kN#E{J)mcW}5q7IVoOS(O>;1sW0yd8!SL%n}i)qO$Zg7mUv zK~udc_CFrE^`>PFw#)`4O=mXOGMlq%l{F@m*_tSD9t<wRfKG!!I4KgGkYPyM^(v5P znf6LD0k|`RkElyK5otP1yJt}rfNXIgvXMpRC_zg&1h_9X3c*_FsA;$ym}Gw+ky|Z8 zP9XS{uYjP{&NOJP+;5_iIt<3~Wi)7z|3H?YVjpCmS)e9oKtfCn+CinY2$vc4=o&p9 zg_skf<R3|Ck`S{HCzjhp+mh9FyyyMAU0VEV;ref8$SR`G>^()>A&x1W=m&$K8>iht zG_$vA45v7yy3={4lv!Vs3-wt*j`v_C)mYEvzIq>D%>!5nddqWCww#97prz6F(pzi0 z{4HUXC*+g}IrR~8N`#!wMaaw6TbQ2LAl~KtgLd8Ja8-~LHRWsCLTIE+E_^Gzh^j#T zOEiSJME;%ORzTlAhi9L!*6QrRGZ&aCf+0h=4EKiV4Z$D^Zv~sBH^=6(`DSQLn{U{D z>kZp)`P%o^tCb#JT4jfq*7XlBtnqxdS#Bt290O-qxEja1LV@qHSqB#4Kg%`wtT#&s z)#Q`jjAGbU3)*V=fwZ_SZgXj7n=NjW+g_R}N6tK66<DL)z%=)ohHH|@a(41>H7nbt z)KZmN^HdV!WVF<pr=^zD((FpJxp4W!!+)f0t}}V$(&jGIOQE)AKpha&)(xPxt_ig@ z6KZoVsLdSIB35-Xe)IWexn%~&`2dy&*v94KT?sCO%8YwBScyXE`@Y{)TR~&}ajnF- z?ImBOyaeG$+yDhH%Prf+CR==2#4d&?Sh?#Ph+n+Afm+}E_z!uR1mFDhPk;I6|N8Zh zfBfz5{o5NZ5VhW{g{`K6er>MC;@PGtgl2DW#$*>{IAT`jolIASwj-`v6!wm-5?t3; zN_W8C-DrcvKDyz6?#hIxH<d&GZXI=p^J;wZWZyLoKu=`%c2ZhNP<R~r;anin&8aN# zf_^!n&ghx<=H0$@u4HH7ICAH^<08#BwXPgtG%l?YypaVx783I6mu(!><+aFjG*3mo zW6o8zGfzkgc}(azxL?#eGR*CV((a+{-qu1>yE9BLBu2LR1)CUfeP0w)WhP<S#CVMI zVb*;RvDq`0V4LrTTjWtR!Eh|2a5UjqHy9}E1=-1E!C7(<49~k9DF<`CpfO!E8iW*p zvoob&FRtoAl85eO8o^-_#FH$@zIRR*bTCDvVuG@#hZ#A4Xpb@%9&$ahH*e$_sx=yD z+hdyK93+Pbw#eJA7fnbF+>|O=U=d2ayXq0ZG~sUx?JfmVr~;r`sX>Pv&BldvjnJT$ zg38#8O6ug=Ar2v?Bz?z&u>Qr-##LB|YR$=X!t3otFHR>@ER}Z-2eNh|;70h?wLz!a zo%49mqql4q!3+jDfK!@aO%e>K9(TQ<3`BHn9bd<3$%qcRrWz(1rqhH|n<v8er4zey zXlIg0Pj>zx|E@YIYPLC+z$BqryO1}3L4H>ca-0tRx}wX8#~N*d5g`i9-3SL%T%qG5 z*4Hi2tDI}(yk<94o9$;@(1lhs&Q6q!p5=oUcy=OfrDGueLK0|xgbLBv?)7Hj;0{j- z4qS8w4sYTrzxQPOgWa3^%4<VE3W8$wJRY7p)|f1|!gJFqjVr$X%YX9izy33N_w5gV z^v#cd=bIn@Pp|*yKmPf@|I2TF{J;MEPyfqr|M)+?{+&Phzkm7%d%O2Rp!??_$$k4@ z|Bt`?qd&<7ZV>Si5E2;^C!H@juNTJJ9iBF1EF}9U@P&_o*6B`&+5WiZ-jfe1meHYT z!q<VDiBq3b-M1)ESr$}cM0jDxjHTHfro2MVa+$IN(O%e)le6}M6Q_V+RjHAhPbSDx zj7>)G8}PlIw^_sjTT=R?f`@6>w>4s%G_zQNw_kE*7xOv#&1DC!X!-1XG>M0i46wtU zNsWhocc5g@6E&q!l!I309j>b@AMt$sLWgmGOO(_Gb3DvbL%B=JDn3j3Qz6Hx*@Urx z{6oidyC@koE+PBm4H7Ww$tX1#mn!Z>*){s^jL5Z!;0}i$zn!p)mtbNI`j;4W0;YXF z2)DHaa0R;y#wjJ|mAOtm#nk*s&PuI&CEqYxE#1F~1#qqZbSwDE35!jv=z4i0FBP}E zq&Pl~$*Fof6>n`D(+l<9ncMVMABJ-Cn)suxoqd|Gp6TkDO9o{GBi{RP&ouIx7yGj? z+ez8C@PZ89&)&}IT<!Yb{Os?4{zresd8LEbfA&`aMi>Lx2ipAQ@BZwYAO9h2`$02M zTm9?*@V|Wf$N&Ae|J%R#_J@D>^Z(%|-~8mi`oDhXpSYlnbNUX(12%O4)RL<MkQF?E z5_|Ehe^8BqBBI<sjAKCC9gAl&z(DR4LOK9vaPbiNUE9h@J^##puFhPAuHa<~20AOs z)~;oIq;Q#ObmXQIG)O_<G54i)`n4CnQNuGA_t4{aFo{x;ZzsaMI$=5us;O*-^Y5TW zk2C+kt~Sh__zf7H<a9Y3Bp3A{OE}MrQ4vuJJ0hqayiyIi5HZX~KN$cVicfqNbzj0H zjWV<b3A<$b!MTQBMi*I7y*P`zXHWoN6T&XMcqFn9VcZ{zbsJQt5y+6?XnGM&b4r%S zg>iy(9Ei($Fm<#JI%W&r`t>dfO03H2Sm?}GV$Fi#D>mmv(43b)Zn0G;wmQ4m8WdaO zV!1vH!^`hlF$ly3fw+AbukxR@ykE4a{h3?4bs}#ouy%`Uw@!SGtHt`5rl!aF+$kaM z1)j88TNQ1xM{9fLg)P)t<yxz%)@O6nS`}@zuGQA6Xlv~{Z9TfgN>Uq-!Ak_+S|ZEK z+8hw3CWNVk@EJk4ds54dg5vFsF~+bWpPfpR{Ng1PoFX;WsJYKSlh2z)?qP1AQQAfK zc3Uk9Z1{UWef`&e`|V%-#p|E`0FTE%{=;AVAAj@B&;AVd+#)Rda;A6#oB}e9CuGK2 z&EG^U<z|z-R-n+I!D0M;=>HQs=x%if@wjFl8)nLq-V0%raB}0A7aCE}$qiO%MjQ`C zT<;yD42mtrwd-XqryzAIaKr{Rk7~0Nsx%sgs3m?o?ouGD8D;pVb11(hYUbiXss`qh zf-E%Tbg_k;JpTLEDLF6ah^-oBPR}-d5JkN#csYWDg6{-HCnrw?9O`vYO-O=G&T2)9 z^~rE7)m5mSX5B?WAh#?U^aY(ghbsZ70sB5CAvLu&MVFoVI`-{M{-7i)Toi{j;-iu* zcvceA2(`w&FVSt5DeDpxmC5~>5A*2Lk_2$Jo&fE!SBDtj7npEzo_3={-w9t&uzmZ? zEf;`TzPGV&xAD*f;4b`&$O}&gZ!!UXh5*kH;28ou(*TQz@J1(el4xOK%yIs9iWZ*1 zJ!KEI&dhV`TQVE7qKb3ryWZyTz0uIkFjlxFxS-c>Qu4?7Se&jRu4PcE)F06DtDMEX zUNou{sa8}|k_ne=HHvdf?r1jZc#`UJxk0D`-IwspZ;XK47;D8~a`dnE@Om$sn#7ko zX9=9S1qT$uypwz>s4ko6YwSsWK+%iK7^rE?WMu8a8DYeo_HF@m@U}u?^F*5E^Dg%? zEAsZtS!lH+_vG1HET3#N*UIb_tj9UmVy}pK=E<fzlOvT_6&MM8{vokKfcu8Tv+DAj z=T(tp#q&1rpG{t1B2HF8)Fg`KNJZYu2dC0-mjG~s<7){JTc()L5N=~EZJxwI#V18s z@Cw%$HADP<AH;|##TyiAjd!%X98M!_ts84bs8y|+|NpP7jVry}Ro&aUabEDN5$#!B zI^|vQoZsHyD%;b;U-4!38{cLh?SA*@Ed+jlwEKAb<Nc!-hex07@4h&A`s~T}K1V7` zhZHYWmFy>@2`!%;N(QzSe09|>c)3G5JmqIf0Xw$8`{MD_gQFKa+dCibzBt_bTqOOl zVMsxSayb=9GiFfr$Ff~(>=+v~P;oDk`(}9y=VM*TO*^UzdX8^9m{c$5B7}U%aSu`6 z_ff*PO_Wl!xS%mE1@feMpUx!r$z+mPkHcX+n7Zn<sn=wdSZhLfYGV2kX0STwyL!~f z#)Ei5k<D_x1-6vp%O&OMt~ufbNN*ZgaM7>7_AZRN@7NrNn5Ixe_=F$L4}%TSOc0;4 z#4<Moynx;`vrriQ!DB1{YOU6SuY+d3ZlB1$X^sjMuc*vE!Dk^H<SK4b;)UWVXs#r4 znY9;Y%x}|SH<vfV0b@oO!d>x66lUkC($$~?r%K{9<abogG)Z{}k3M*zj+rV&A!OGT zGi5ebs#8_uH7-8^R>e_S;fupHEUa>ywfT~(zk>;zW^1U-it}VQ!n8)qtC(A9d?`~M z`LvuBp~;2U!!SLKNARUXfp|ADVp#j)3`n_5spdAvY1DQkZajQ;lHSx3nr#wz)qr_k z;_IQ{DsmJINQw<y`mVrEM;KnLAI1ZKmQnEGXu>HSUxkCXN3*KonRGT1@n{sKA0Cmd zQpL8DdPMh97-C%)!mNz=g9gQpz>c?G0nqp5`FMpWN(5~bv}@ARnjr|8V~)X>T0SX= zO$p9v<-q0;w{{pgnE}t-WGBNhiZSo33Js#05keI-MNgk3Ri}{Nyp*2NH%hP$zj%4f zZ$XcXdpwDUz}o6TNRGxVt{|_&prF$LjaC{9K7&_0r>WA|I^TCoGxU_Q_gJ`0xI<b3 zw<drLjDvHFc%C(uW+XluEIKz;Y93y34Fe9N*%U8F2{0fq9$>Ci{M87asTY(8ej>BO zli#^z8n=6YxgK=RCzv{s0&yEKqanbYL>z~Y+}BaMHbSoIvkBJnnZse`Ti|97(O+05 zvq9uYFlO%Ri)$yS?q2QrVoIAWko~<1k6jdFnuaxb8I3rity}##K56i4zoHy*+ea(@ z8F8<_WE{T)92uO#>&s#fAqkvsExF$DmnSsyYV!n|rSa#=5|q5MDpmUkic@v2@O)IM z6<ZKFCPS{00n?_Mt7aRY*oANg$8c2N&K3T|eB-P~Q=&7E0EX04Yv*loeaZG7<N%uj z3o{-S@moI^QlICIa4Mh|3-$(UfJHvVH=v7lbr!}bQK_lCkStS-4t)h7%{|fcVnS$j zrhnb0u&ZNGx2u%&2l&UU7#KY5NOSw)=v`JPzM!1A#Cb*>rXQn%p+sYG4fYYS_W(!5 z&l^tzQ$JS`N0&vY5{~VHYuX@^8maQ$In77CLUiQ1|42t-*3(r!%%7n!2Q(T_%h>(0 z#v}1OcL7e@rwaFMh70LT1Ij9yJ7-#G8P?j{X&O$8?w2_u2TV0PJ)Z@PtT=Q^r<(r? znlp9GfYg$ZRGNw$EXgwXFCIcrT&>*Dj2Y!UfJOIzM+PQON3>Q7S+6W7#T8=!7v}I# zWYT7h%OYB3jj7*`_7Nww72U_{xK5Zw<Scf9q14a9%tCNB{jf0)=T%g4xUc=&sP8c2 z8))<OgtM#b>Em6Jm(~b=w|c3i$A-AQ3<YB|A?hlhRi{Q3o_gg>@o@svS5v++jC;L7 zR59Q$ZMhJQytdL<Q*Kk7CDvyB7V~U1*6*T(7Q&FHop^!?lSP)PI=bT_`;1tGgQeY1 zg0PdE^OZHRSc$0#QwCa<?>r|Xa=or#uy;(Sx#@omN5}jtMFiD9?nK*H&~f}0PZ_$P z?56v+xSmM+oU0)bMnSvqWrc1eIuVR~rMOVsi;`1J`dwP8lT0Sb(2x2Qqs<t!S#7M| zZO_+7Tf$TK`2>zz>{7I_UCaxLW0QR=UEi5;+)8Bg$Qwvpn}n7fI2z*}Pg2jj}7 z*Iz=gGa+;Ex`U%%#K%!eBsfVc7~_mlL=SY&P9wmT;Xr}KZj41b8N4ADxdma+Pa@y~ zwdWaM(@RTo7E<(Y&q4ST%Qjv;Y3Cee-Dk9Qd7h({Z_d76!S(6QKFN8(zk>=q<a8B} z8?3J^KKE(XJ}M}W?|gL_`FweNUU6j{brSjXY#L~`jvm;<VKksQ<yPRmSgzL~i=tr` zT%?H;bWY>WXO`p2t7Uw)OtXLkxr=#FYW1(_?i6G~HY6PqJjtW3q=<wK5|Fuse*ha4 zJ(SEwT{BQ!2F@g$4hIS~ns;6F#f6+IUl#-750P&a<L=BXru*afgs>JwekqiSL@>C& z`1?Qk<v;y{Z-4ls*MIg`um9N}{_@ZNZD45pf^Yu*&wufw|KgW_@srm-`2m`}{<A;) z_6Ps%H$VR8{uyWx7V~@&h=Rqybs8g7e#M<Z?vln@31Z~Eg<VF1r<2TMK5sD(d34tZ zJJ(Ndc%&>o!a1izMz<cwzd1{HL8qdrEM9W}ToJthX6)nmGU`>=Y81K?1Dq_8@woSm z?TrG5q@wz3&YMcTS#MVI48}S=dOO2mEw|7Mge^6=`)H{z61pRFvPp7Ev}B3gKD3X9 z!f5<UQEgCcWg|l`0`x{NeE-U~43I0$oPm#1kPVNWa;3}999zfjs2GtMme5|L=Cg*j z7`RA+;Zays9VMX1sy*X2#oQUp3tAtkFvK$^T47}vM-Ex=T)EDO4`VP<86zfVNHo|q z^dVTi?o0W;Y1=7jl;;XJW8$Gg&V1zw2x8*Gb?3pxE+f++Z93_ZJUB1p_qw-YaWt9W zZR%{BBXgs7uTyOcnw#1DxbXdZrnc@e+qZ3JZf2BI*1v&BX(?N%2an=xJP4;@2d{wG zHmFYFF6zWkPjsk*y%CH4Mh#NTbfRb!43R(M4kaNk*f$oG0|)Oc;LCf2hQ6nGXU)D5 zATb)vlis;cA!@S8F_bycCQF*GqFBSZfHQyQ3+D#eevq$_8x{M3ATtx{h;AU>dZdRp zwuAF%LN_fhXb@XAEyrh%wFY0NHl^V_e6=-VMdo(ua&fNx=_YYv9J0@AwKu=nT&{sR zjOOMthl6>uf~IY^1Dqxwg_Oy+0l)FlZw!;(IZTT0bExnYsJ$YJ!0VNT1=T(&p!Y_T zRuc|kuR=97#I3k|jj!rK3k4b7@Nd9T2^KQ9wOQ1bY6|ca&#NiTt!$E{!VP~x9<88| zx*}&PW5BH~V$J4bQJ1sbraE|u@T2}DjxO-(_8O*fg2MCG&~4;RN_x!dHscZQXUiSD zCT&Znflc-pXe+yuG#Z4H_*K;Ab+SfgCt{_v?&6P%ZWK|R$A(3it)MAOQ`JWzS{4#U zFD#<J(8Lhm+V)F>zQ!+W+#*!ms<DKP;7QVp`%^hy3q}N!N6`R1j1S#0ZS<@cZL<!n zBMhnK)(DNqT;31MNsMVOzZ^o1Za5fJ1ssvQ&El|;FZZM3C2+tpe$He`zMhm|i`O8= z&KeG2&i1CX!-hCE!3ZSc1q&}^K@utWZeV26z$CDb0w&HpFX$9aOI)4)fLZ8eulXPu z7E;Y_G6HGx90TWV8XTg|Z(&Ekysw)Dj&p)ZRiFdnjBr&~X2R0y_cx@04;mUhieHK4 zEVdF6r3xC7lNd=cqru!Vup4)Paax2Tki>e7(sCnrfK(m(7qg1r48|8(g)qUR=cd(W zL%%54!nwc^a1&oecuw^e3S7{xipJ*k@BhuW|MEXrBaudZU>#>Jxh#4Kan#%hkX~XP zU~cLvPQScu5)a%M=NOejKs9^t^ji}JD(H@y;*l25bkYX8$=odwHgD3RQl7H>dXf)? z6`^t6t2m20Y;}vjN%!NswidZK8!ui6#&D3pw4%Bt`IAd{Rj~~Xrd^FllOcJKLerB6 z)Q6E*K{}sPBGcu%y|kI%>@F6f?NNtVXptFR2`Ze_^&txVf-@UWss*u&5wtod@I;`W zHRjfM^eyh3XgKTxvo+h*531MBldbFp%YtL-u%3Fm@Z7dOio~&;bly@T!^ApNjjR=O zky{gC+Bn87Q!o-#3{8?G7=|OZam)&?7&yk@w?F#9xBvbxe)+pUd;NRA9~d5I!RsIV z=oi2Hvu}R-r>}qX(_j44{~cox{^Vc1{)>P2`uBeC^?&yV-~QkSzxcbq#qdP`;`b5C zAN}p?AN<fC2uO*Ijv(e4D9^T<Bdp20SmrYMmgTVQGBD{QDE<nw%Lk&_Q(@{_#oW4{ zm{rP0P=3kRXLn`-kPB<2=K(i=OX2}DnV$=|x3)a!YwB2?@R85K(-R%V7?eZvEd3%U z<mbXTSoIn<K?@>3*i~FA<`tgi0OP?T$qMBmbzsVwU*{dkc<WjyoSyDGec&=wP+H*m zl+XBch)u>o8TCIDnt?e0nDGlFgf99N71h>L%{=dTwFgK$)6X<tt!QXo%pwBm2@QE6 zwPXcW<P5|~x6wUM(@1%5<f52XxzGUfb$=>Xjdhd<Si%A=pCM&AUsQN9pagiG^3P~p zlABCBM~(6!{f8pQhsqHshqPcL*XbZgw$~~CkgQxRf-K+}34@kc_T=nRlWFA$s~XrB z7m6No$tss~lrnyTem~t$POFu@5t^qrnxqyQq7(X<k5r~byJ(+nX~lQ4ptbc&E5XO3 zJkAkp%+T#)Dp`Sn-VdiyTB!$>c$7t{{)q*x9}myt!6Y78&z|Ddq<SKuWfeYyRG<gy zC7j^ZcUti3*CfFZ+aEvM#~*n8dX$h#y0UO$Iwp<6p%Msv$I@dgaH4Dza-%`@fi!re zNTXAb(4$nUwCE68H^5>cn#QkAKYq4Hp&}-e@#f0P#l=PAVy%&+rz_}Wv;qZ?LpxJJ zYMo4+#rXU6QwN7tZmJ$gJZT8&wu{W>g6u5pB^UT(wZU<1HiPW4PH8za3{iK+C}V<= zJAknY%-(<}ZF&`=f$VQ4bR9{?vW9XKE#O6`51t<EvQO+Ns&Gw=UG|LfY>3pLbj_#V z9mXTl_S3rzA;~v8Nv7X)lZ@YdwD-<k`S7DX`E2!_b^Q=dn5+Ckq*~qzTK6%j8P*k; z?tXN*xBv8j`imL!%#k1r?|9UrsxSBsUG}3pn7|nR5Y-icINK%|pGRrp)vsdp_Y53B z2**e72g~Z24G|~zhhc_ScG3YSCN-c0EJ7JjC??hqK5*^~1LZdv%Z*$z7JO^C--zE^ zG@M>M#GPRwCVW%q$A#-EY`Ca}kEm^6q@MV2LQRA+Re-gCSC}eTST1r{IGLofR7IIh zAOjhSz-E|rRZe$4Qw{5Q(Jw-b)D(v|a3H97^m-Y=qA~`YgP_9L!p;PL8l(ohMW%J} z2zXgVjJ@$94SR7osJPlba-TzsgitwUpr+vzi%00l0E?#^1@VNkeUJxQ56)1i2h41l zh-0B6QWVjguhA7EF<zxU?N=)Y;Xwt{fG+1^TcGwX!E0OCd9bhkn*dEfvcH-JAgk}= z6=90V_uc(?^wLX12NZBT4^M4vY;3Gt0#RR93<&m2>BM;5O%5<T0lX6!X;i%4a(?pH zU3BtJpMz?MF`$Xa(NNIRk@)Clz?JkYkQy}BqS5(v(|mFS5*3+9lRH{M7Sb3Q1n0@l z8Jwu2N)}+`y)hn-JLjinWy-yJMyJz^?dU@)yG-%v0V<rV(Fqu8h9kBt0xsXkwT}&E zXURDno@KHW)@o=Jpyhx|nhtW<r36!NON%9mQl{~!les_9jZ6YZrt!gTS{^Yu=s?qp z>1ijdHtT`-f1}x4tu3;H-dWt^DEy)+3k#A>FkxpMfl>JkQ_6G(VfQ6B-c1HcYE>fe zh?MBD^ks!7oWA!WNng@PaKIOso##;&WJ6#uQR)oDh{2f+m?aLQ$oz?mA%oQbWX&2~ zByxN{q(w1akv~`BEQ9t|deJ0|2M^-j*1fwM>l;lI4k9<ifkN|nnFz-yuwvgY;}Sys zt6t+3HBP`dh?kKdp!Sq4!M{DRa&S3Rd;{jU0<yTcFq^?Y1}n-HSr(=!GL@1vO;H@l zqiOWDLp`u=@ePjQ-5K*&_cz)ewG9s4eDRlJ?%`Io`eJ02!Y?&nA}E!aAhUw(;J-Y^ zwtqDK+bquWq}!leN6^MCK?>UJbIFjrZJ#CC1m_?6ZBnUf&1t_?+WBQVC@T_tD(v?S zylne1LGcN)Mw+qG)UwS#>4hkSuZTxxehlbvwoE|-Ds?>#<glQLJI%IQc@N5Gw7xfC z>nbbr7Cx}=mgLi%F{r2E9+V>?Ni{8N3y0Wx&V{xJ4BsVTFkdBI+Ym*5aWbf!*C=Eb z&XodpT^Qz%b`Kuy9el80M{7Z3cET}b8uY-%*WGYzQ3HzC+8!`;j4FYH1hfEQg&d?| z42RAA82%K&q7nlvp`htXb2B}~C@i+e)*v?s$#gsTX#42Hg&T!pvQ8mpaxFMxjg2&6 zg1Z<#=X4f?3c^aef#2;n`*b%a-w&dZya(~!=IIJ;m$i3?J%4gt@zNh?ZuE$eGlCXL zrzWVA6Tf9P&^wJMd6yd9$P<r;jBIH&|H|VzW3;qi*3$mlZ0S2?Eq$k?r90PcX{W5E zosyRBUALv}O|R>1_p&?_GnJXnE|bmyC!GTh>{!&l8O3@>^OYNC@f`g_Gbxm|?V=?O zvtKWn>ygGM>||AbQxL8>&UWIo%aNyT)r<phnN>;t?BeKzUs}CZfHmcvEWa*x@OXbq zAX0F5EFtFa&5LfZG3*ZI<SN5|R&xa%C}^)7mS`LG3#8Hm>WU}t1x?)S)q8whD-6kx z0`RR{Y7+Ud^A5^oQ@R}7sdmx3KgH0qO7B>urBExFP*bxqI`pSgQJK`4y0Xt)Vo#hY zQ8AC!w>U85A1R$e;Dn3OFvTx8k42YZcQT-~r9l=BBOlaHBi8$1be*%f&yLR;4D2Rn zn6VU(n|${40pTn0Z8*M8@ao_qoFY6zvdb&zfp_}K1y(eHDEO-!qO!#9inFjvcUkCW zeMPSdj2jAPo&|rI8(1oBV2-s{*xi_B=0;g($v6^LJCL}_`PFNjD~7Z$uyHiD(XlDY z(Eh<qS?d5|^9U6UBkAK{W4hBuS*^zufQ!R6)VWz4Y|`-rC|T7_G|C{60SOg;LOE|h z=*)uik<O(9og8v!%fLuF6l1Nkmp=iaR1}|gh7|FFIamQ^pE)Y!33IRn3rO(-+#L+! zaTXQlTCZ%&EF^cT>19oSpB7{l*Jmr-lW&WQ5vaIC(;5D%<q1Run%1r>;e1{uOMPCs zF1Tl#vqnnE3bV&!R?&<3i=NF_v^-@zPhFt0f3PZepNaGEV!k5q=d7&Qd`0Go+2V|u zUSMLV`KpF{&W~yyyGSG07YWqfAYb|<9(;;>SC-QQsg`o%k+;@xu9t+8BB<~Mfw->~ z8J;mJtoX&2bp>YFrV~yyuww5CfaJPG26FVHt#5?rx7lS`+VMSbUFkJ2ROV=)h9VN} zKF3bdY<R?gjhx%20>H@GEo!$lKyBgY=Hf2S!;MCXP6loyk&}PhhO7n5T!;i_BSpu4 zTa6{kyZ2b{p~G%b+)EJ0qEnHI7xzI7>o*Li;yNVAFqb^~Q=d<klm2oVj!tt{h@@VC zGCMF$M?K0Blg3fjC{|1LDs|a8&xEBv{tGKn+IQ~>6wPH9pY03=l~Dot$aDpZ7+O&* zbYb9fLmiMvFntpxkXTwWRgYM#9HspFt5uy43)3R&G^R$pFf_5-<KXJFP;(0YqQu6z zG^$s6-3Gbrq-J2tE6rK_8A(gBkrrnnEz3eWlZgfMaxv=IHQ5+b3NMkUurG70zBQIh z>MV`=s81(C+QCPy%syuN9t*skAxEHNty+0$(7O-~SZ|qt`1(vPKkNM^ZnnOPsFa?{ zD*qX;Y!0^n1`AvGw&A)qgX*po1=TgGJt~T;i#@hO>dvu;8;0$32f{50f?F5>SH>lj zmej7@2Ohph34_(ALm97DL}|u~9GVuj3YAI$3-O$gb*SAOpP|b=lL4p)CKFH(YYx;y zKQq8rIbL9vcUmzSpTX(c7MgR!nlxifmIRnA3CU_kT3m3fX`DFnbS=xl=`2GYrx?;* z*?nJG`5ml?|EfM<aO?=dxp@4QO1+?nj+S3sMux#JE@8yJ*YoT|i_|8vGAci&aWI{3 zoq&qy^=3YLoTM-Vss&MQmCvdU_BuPjtKOe|pyV~F%EYE(uIZ<09nTqf^jZN&tw5tr zWKlb2qY5JGL=7!j<8;LoT|nWv1AUeS_+0Ru5HFcOLlrY}<y1d4qaM#U`l6z5_>}}8 zAQ(lB(3|G=t(Zz3;~PQ|WJb#}?qj7O)TPW#;$>|`VPYH(`jN`}YH%igW;jWQFO685 zlVt42JSRSwFD(&5pB#)L_Ku~`cjnBb$<1zM0$(Y0966!at-#2%jgXSr4L4;8GX^q_ zKvOt*#SyeHHMx=yW=20=bE6-7P|*9P6$p84PP+p-u+lO!VecSMI7&VkB%N?j<z+5{ z{7yaXHgGWklw4XDvGn<6>!iqnfre0~E|*e)HmZ|YS?oato6?i?DLt|e*RmLHZz9xQ z%@e^k9~2Y#l_#RDCp;_^oE8#Wqu^_m-*D1-Ph;YB>!hd&_Dun@iSUlgnieYGygqNK zHLlix6m{NdRqeyaHcq=h!6A*m91gZR*76z^s4AfLI;m^?OoNbu6_#IK7GpxYsZ55k z7s-Tl9DCX`j+|oqX378y*!HM<mZUPKvf3(5V;Z?1%A#8`)M71g*sB62;)b@J=wHlG zF;T>&3^FVp9<QC`d5N!K4kcPEY#4*4mNmO<H`|)CS<jlW+ZC~XXY{ygcR5&gk-?Re zANAf;+n7)^0ed4x1l5jcqDb|Y-Nm{TxU!KC-`>=v)oKB)JlF_o<Z!8$B2%-Y@VXdH za};d46kK&ESa5D~`sqx?=7~K5bl*lRej0@RK5j7PeI0s51(R&7?VmGS1uM?@+=$qs z`6+?LH+@gyB?7t6p%b`<dVr^i6Za%$6j$HNgBxfz;f-y8{$v@FsVgF`<@=b!*KFJy z4&fHR_g%000C<j}_|}*5SIc)+f+lJ$Uz(*bd^xXRSqgze(GoYP)D6~9yFqjWf?1f6 zDG$a%#FR9>1xVV&#G=7%^W?My3)B_A2oEPilj+H3<!IU$X=VJTo-mh0c%Ac6Ry>zz zmh$9Ov!E>eh8}av3)q-IUTj?0coNZTVIi;L5ZkCn`SCb^im;fYy*5RAjx_!;g>?*w zB$s4HGPUi1qfw3rSetoa^pa@Q4wjZ;Z>A5i+HA1iHCwo1XU@Dgn0;5do0Tim*RSC0 zX)jvCF=)O`N=7KMcJtZWorsq2gQOTr$(AI`%47wGv98dNx{(h(iqp0(e6#D6*-B}c zs;__glh?ohAAj-JfA{mB{k1<=M_!GG_Ppp8V$7@}^|o_1xK`-Gvap3$^JvcDG*7O~ z!K1j}54H!VaPXL%4HslAv{;5Wk$yX;@cO(1$JgP?%W*I2zKqh9FEc3FU+KV+ab*~y z$MH&*c31cz%!S66nK6s8r7Fjo#jj4pEe;{k@0&jP80jlb>!>-QztQ*3!$IbTPq>wT zO!JPOS~DYrbEa=;i#Zw61n;!VLq(~845|VC;@k+sO6ZID0Z#0)6lG}s(#QsJH!=@m z+*Q^Vc?(b!c}zQ)op-u}Fv~a*B9K4BOCvO>i$`NPO^?$UT|bf_Js*wCM0P^awjYgj zGcJP_f$X@9z|~hK>ctafmEN-74a3V_^R;MmNdUGBccN?}?$?jM5~{MzV7Z0yyocjt zggfUZ2!g@Yi5(;N5bX&qG+<H0ji^DS5Xs=!bTMPyk2Fve-feE5Spmr-d<m!1?qnw! z4wF$;qDX0!<dl?CwCP;%8-*J}tGN`k&}LSU0mO09n0U@q@$FtQtl};mZ|6y$XOC!6 z$~*y+ZByb>$qg+KdO*Z@G7ZL2$~K!g<?%sC8PQ)xqxk!#gP>ki$AxWg$}c#^=a_ZZ zLfyuwP>=Kkb0nhMB4EZ*AQ}Nk@ZFaf>uZ1r56@XGlCi<zY5WSvk259^0ulK;cDvD- z)Qj2}LNSi$GV1E7T+Mj~%2DXW;b}4o2Vx>Gw_xMfQ?qTqe{ZY!9URhDixM3oWBn*} z;|Zx-p<Yk4u4bSGc{ykmnckC7Sz39iu(Db=RRhce1EyRAn`q&(Z1vV}Y%V%dWSUA* zOVGDh$SPTIns7KRl)<9mm~I@EcPlORI)~y3;)xezF~Oi;u#-l85N&#M+irJ55l>eR z33@>BSCb>WCm2Gz2#AXMYfu(IHE{w7vTI)QUXHn1JEg!0odgu*5(@A2nR?Q>8eO*2 zVGN{UKf*C=Ez$h6oIyw7v_FYQ=kr;}6ZaobvO{1=vL$xNzKDVg%;|_;)+wG<Nt$V( z1$w6I&>rc7OFh0gOJM$t_01U7!3%y7)IX+#UO^xBmNV!u3rzULlP^J<AOpYbB@t(e z8N;Sc<vS>;5r5*IfJjDZt4c=^q{6D6ANkq!UVix%I!{QZf+~mstST~z)71-Xmr=%{ z9b`xD(Nzhkp||b29`sz$>>GJ!7|4n)w-rZ_?gi9~I!uEK&}Iy>J%(~OMhHV#mI4<P zGn1I#r0X2(QxTvx*Th!blv;755Yb9r1TmLdkyl3_7sgo#G&zg4_XW&5IMtnrX^mLp z>V}f&*U?KnYn((Jn^HHEZyafX>@hzfxvYwvuLoYL+FgIs`Gg6mWi$o6kLbQM*dE0y z9w#V8#vx{P0-1$07`T!pyJ}pI2^MeRZV*fRM5Dw7b5<IKF3w^&>sAeE81@KD4EKqb zDJ76`Wt_Zb1j>~hp5V_6orVa%W-S`?v}X=5tZU>JB0sgOErw&ygfczL3dj1Z)N<K^ z4!MqFEtr=0w?Pfid5^!z=b}Y=<7qwb$3%>V^M7%EM~#+vmw*f!ijYeInl-r4pk8*y zx#Y?9o9j8jY-V&7&(K1Orhd?OTzZ0*n+{1g<rn_}*RxuTcInU{o13ErUtmIN#pG<} zRG5>=<*i5F%Ar<Sp*S3_?LR7t;zdF&r_#b6?$DTQDT`NQ$$A7rhl5JV4j&uphbs5= zSOYkb#5&fsPjVZ-e|O^=?o$K%0>(qGbGnq<n1_ekbI7QB<&SybZZ?waZCA0#U1*!r zOrB588Ab;Jj}DWb+gcX^1x?3p3c*(AnwuQTdZvyex3?LpOjU{rV3<^^H$1m<EW)@g zm*i_&84J|21><JIYVSR(5&LC6*Nx_Zel`u29PWHey=xTk-D{{q#N3ej5MBkk0h)Dh zLp7p7YQ)61wr9EFx!%RX-3*u+=CemSG$LN>!(J}>87*DSZz?n=&Bekank&xppOWTt zP{Q(K5$jh^S3547J{OseOERB<Qdy2Qld^S}V}}7UhiKMBKvNaKk`(f6N6s4aw)2wA zeu|ak7!0rjGOUB4s@_1BQ(UVpE$b<ZP9JxtC*deO1v<+cOg>?QB#Z&f#K8tn$M3=S z?0x)p_{j%#tS{zO<Frv%F#wS)gLo|5n4(Fy!TEa5Cum*rIo=C_d^H-xoDB%O{$%^v zZ@u{V;N!#HN0b*(MD66q;$f?z(Y`stbD&DtlIEShjl(n?24Arm^_8A|-%s~?@*5=| zQud2M+%s!J(=zRcx-X&t*qjpw4`)zB1y(hy@_FrR{&ReC6->g@gAjeOQER~o0N@eD zT+Q+ouT0n5^yPloi3T7&;wRSNYlW9|5okoA)8ktDPXw8>(=0tg+G8#lw&O(_@#ZS} zEcR>B3;v~0<Db1`h%Xo9^yVnoMC~mCXl4VFq}-AXm@gHvwgO=vub-G9Cm#gI^2JH8 zsS25(H2JnPzGeY|H6?K3Z)lm0k1J-H8cfSd9cdCzSWxsbBH3CdBCg2@0F#U0gNP6K zVv^%LKz=O=0ml*?5?J<A0U{%HDhxKNrlQL@n`COfi+R&Yl0g)Xu3&T@Cuuj@!HT2_ z>+1s%0b>Uc4Qav5b_4SndX}kakMmogDJEH+qpAYfctZNJQH3TR0i&aL4ugyxGik#4 z=!QvHpb3k2IzX&@V>NZGsbsimFfi*aHX?eJJ)9o#OsQ6|XvHvQ#^1^s1EyNjxp+R1 zWLvP~S9p<CHfM~F#DwErKct|Rc?WO8+D#!wSk_4h;W5NL2<A=Raa^>aQxkJCMQl;3 zN&6`pi=flVD;t1Evv7+Dg36Q-(Dum(2!2;i1QjV<)({szxmp(3k~~#8tvhxpB~h9| zh~MqPKpMAXk+M)4GLo@BKuvMD5KGLG4H<`jl)2ug`@iMoxC{Y0riuDwZ$^%bWi<@6 z{b78{F~3^4J{_*ggg+T&97bhMwS}mm6GONT_kQ~nY(bf}^Z89OR$;;P=;;$>A5H8} z1QBt0=F`rXQFrpS+;U|Vwo8$bU4`Ib#Y&!Iqm9{66Qr8TuXVfKN&xl0now3U8M?V1 zG#ZU76QRdq6@0C<(pSLwMXxyPt`Y|exv3~;uPMR0B`_<zbd+~OF7O;S8LMF0Rhlc7 zI|xBLwszMOiqB-O`GRsazfBs9s4oV!q76v}vcEZ(0$EJ9S(|IR@vX%;jb6pcd4|$K zUGAX3eXTP!2Fey>fzzL-8QNNsVLsoVmsTW-w7rIBa;D=glbnv!JjPi9`Z_b*lwh$G zt_+TD%(_+h&bxczY=Ux+sCRlc867E_6vkZ=jk;~UITS}3*%@(9hRB(A04lU{VVC5J zRlX^S&}?F73%kTc++I1WVBYCYWhe=jcRHJv=ST?CKD3~UY28^cJ&asB79mlv1S*Q_ z$~eo>&`N5U49&TrD>3V#ypZacrjBH#LL5Tb@+2CWmzX4N<RmVdxg1;yVZ?kxD;T7^ zI~<?nxfY`(--tvc_DRFc_aUC;4B^AmOo|;|VN%v>I|5_Ghg_-;$Rq7{k^$aylYbS5 z3&A^l)B`LJ;+K&LAPp&2Iz{yc?la(G4a?9f3BJHiB6IDA6GSAdeSu4y8x8sVkkEFg zYYMuUHIGkN`N4S$2#!>g%6m(dO=OtatN00=u6Xt_hdCda!P_ZfF+~KU+c~oK5G9h4 z3Q>l4o(M}^x64Y6!dZt$y6wT>V}?{X_qeBO?!nKh;ip8yBMkzLDT3ANe#R&0cZ^ky zLnbaxLnWd~mm^e&`4&zGk-?I&3yt|0I5t>HlaF0;7`S^jBkqcIUe;aF9r1B(F^Dwq zIR(xP9z1K<Zp<<!B7vXS4ra<V{~+^2&^bRx(A7qf)^mp`C@c5(+*#7vMR+@PWCdr& z;l6+;`7veXai*A&2ly)J8A*Z7?}mm+Z6c^~{hGqqe2tdVS9qS}CUE^)n|Rr-aro+# zLQ2`wRkv+TTLUG->Daw;l##kP3YXV>z5vqad;TCgDrV4ifVm#e8q|^U;wU@mIQY9G zO7`(MtOb(NjR)3bItF~=$`r}JcrcHoCydmAl@6)gOY|E%N{DX`|B5<0W5&Ko2Q%F{ zuQDI8P_n(0z{*wej&{8ef}<e^N=Injruu16G_W=2QfXeUG7oHeN=;pXw%kxZe;}~s z9;8*$Kg;@(ntC`$Jh5#4>kFoOzrNro#Pow>ar~AoVl;nFnWUba=+c!JFC-yf#G@Cm zUA=h0QA;@V-$FbB=`5aPRi_7ajcv`C#fJJ$4G`|>s9vBf5Q$3fVXAvc<A9F%D)O&5 z<trdi+OHVall4jj*y5QRSW6qWN)oo_T2g8f_}A9Tf<p`YIEmpHlk>^Pc{Rm?iUG#z z3YEN6w6RdM6`*p#SYjOI&K2L?P2AYXk7aHanXbUf|A+6Mrktk4-K`x=xaniF#z{_% zM()1lbvT{ZmXYTx2L(f1&kaQ81hdt>1!nAOPHoL<p&-1w6x+gys}S&MkHwNe>DIXT z>svPzzE(^Xi8&k+eL69hm{5P97^J@uAs1tS853fOrrB0-*?7zd<otrVk0;w;kc>`= z!4e@U&IeJbusRW%^)!w&I4hd*^(-+DI3-*Op(G}%@ADbeQZ;#Mv9{5Ii1=}j&#g}S zsJQ2I$kq(S&M0TjWLWv<>7e>+n7l9US&8~QW*N11fkrO089QF=nMWaeqm=XSN>}*4 zvH0W$>k2FT*6t;_`PazJpIO_O<oYv|)jYX+tYV$TyDfID2H8Go>$90!0Xc5woIT~) z%enS)Hfn#^2TvoO42Z>zID3Ct%m$e&S44Z&<BZfX=S%KpLx*rUj96a_vy5Ec^mzAV z3Py_L;F$*ufb-9xo%kr>bZev<LIn@PwGz@nacBqcA(+QWWejDWA{Pn{P$)&jI!;&C zM=2{Oh9NTY!ND^Ww}|Mc$I2W|=BLt1W;%VJ1i-?I$knF?j8?JvOXhIryLM^Ni0eFa z*EuZM@29w0wUL3MKCIql33eIF7;V(dJAFnA*{05dsTrtL=WDj==)c;&yC>C_BZket z+RK)p=WfTh3Ujhf@ja2y^q~Z8<N_^DzAe0htyR}{^`yd}!rB2F;(0rFkz;WNGNP3b z^mDa77aSQVx9W2MoCUs6B>tEp0YMdt<}Mz#(0bYtxfgO<m~TGWQox)yqgn@q>nn|x z#k~`n`v}YgR(T}U?MBfiT((L3)kn_M7MCkGo86{n^V(aPXt``V6ADruin&&kdl6*w z0^`In_jcy6tIJl!m<MKTihS9rRd!lh_HxyNyIKy|Dm-0%!_Cxz-o2c^i{0t`T};iQ z>08{JbMc~8E2k7?&(SDfw(7y<YCV|3-{~suk`%-pbs9~wtO`f3!i-}-;1QlfKa_M# zHuv!;o@BV2oo7*cI1anf(-BC)rDDh&__VImG~Wx!kQ5J-%StZrl;B2`wl>Hn$vD#r z2enDNp@L*(l#Gp<hG{%J%glX(o*ZH!U-G=Vh(N>jv>Savgc%Mol8g)FK73WN(jq2f zhf*rFB)51RpEURp=5B8`QP6mI1_*q#Ow}zg^v#+1<{dd!%MAh$Cbfh-9CyvF(7*as z0%BBG8r}`h2a|X_P+}M#v6&TTLI@NA7hG+jEvda=@ma|{-is`~<kW4}o9SrFShxR< zYv!eaUo}*w@NhD3o2&vQjZ$Sp+2x#1?#jyu>T4;AZl>N}F_Ko)cfUFtZMDfS_{QpN zFNA-z>g*j%k`CBjN1e@Nwn_qXmi<OX{o+Mez}32FR}Jm7T%d*)5}gFzc+-XIv|4^* z@hnp_SA@KU)rxCJC8VN6<)X&hhdPn@z`lHuUB-)B<0{#SZE7K6-)R*f!?hf-fx<G& zZ1-vg%e>F>yid8#@?mwMJ_mP|2NA`rNpYanT1EY5lu8I-SZQ4u$KnD_+*SS>BP92X zU41=h&JVKl5aojRWV7#Mv6!vS<+HNc$7#u7Jj6Ha4o_6r5pdAYLIKT;Z_s3MZDl#n zz7Z7Kj0e@OgTrtnuRmu^c=u4j{?(!{e6gViVnMfTU2*6R025a~q<QiCIpg#XL)~d* zt7uSO#aQBOf13P0<-OmUPswg_GH+?bta#IAq1}P~JnlIWxmdi=Y0T*k7)VHo%uQDe zmomrj?!+4~6ek_oMWQMMjjIMgj^5PN$C~Q<p3xBkI#ac*JLgt)l-4&vCx4ruo2wOA z;UA&x9%r1&*jx@J)nw4qgGH^Mg_*B<C!(-1Z0$OjN*8gz<-RGa8kpV4kx|?%=y{qS znVhbVbbMH0Sv_Z^p^d@PQsFCW_<ZLBwec2?yH6__yKzLy$>oJilgOA<yMv+#TMyA) zSp>rXZc7G#iI0*pL!Gd*F}7IF<|b=6Cd*1b$nQ?#B2$%M-UesDS4Tx<ZwVGxsDQ)0 z#r$_0qoRa*`kryb59Z3u%yeXP<ZFI3*`82T6S`^KPdgNZE{j3_gM)-zF?4b&1Eji) zc9$1A+=LF~j^_Cs&xRYVWG)y3Z)N_8(OfVCh&Z)P5f51(_{6IybyIp8aGWqFutT}w znCS3`+`!*AHxxZ(7%{dr!z?tPsIz>U)bb4RsE}5CrNE&>$DtEz4oLG(Yo7M&#brDb zwSI#hIX8^7j5y+{xtMaJ034ZmtVwOmsD*MAC~2_xKBpqN7&8w;k=YW9q;Oxq3~pEy zDcV}rw`ni@f;_e<W^?Tej?jYI3(Y0T##Lx9#KbTxd;p4@V^OSM5+L-Q6eWzzC|1%r zg%HnYz`kv+XA;McI2FlYprqFkheOef2$jseb2}OFZ3+$+rB;rNAUz*gNgR!ZX^_s` zA9w^B28B#|OA*r5sp3{R7RN;2O}3Y<8=_>(BSg{Zg<_^z=a&pE63){seiaR-3pv+C zeg4oLtQ*oRJJ+{rbs_Iv#~CNLP&i>Hlf>=8Jfs>WBP+3>N10(OxwI(t)|6buM~Qir zT;3}`SMz0@{9Jn}<5j`oLK-|59;J1tD9I!|hEi&!6<OxYql*eBdN#SbsJvB+-K;oP zyq%^cu=&hH3RPpkqk753%@t#w`u}LvVuyt5ufoO?$c%|nY)ejlsC8%NOC}?pIlb1M z7Ur{UJH?>9iDjn%@sG-`)1tz!!m1M_es0sF#LwULa5(u~Njoa_HOvijW`;U8y`C>+ zW&|F~LRNLSKpaVNPDM<Csvw79fx<wSxUS`4-ZbXs=YH3s(D9|sYg-+uwM=EXaBZVO z(^ybm{{YWGkv1n*m0JOd^;=>Cc;kg=*#kZ%1QjcA&G|}}>^x#cvE7{Du!ft|tOe+? zev?ejwtbUN|KDc$<}OT%C*yhe7VY2|ENRK|4HX!}8RPfn_Hf)><1Nkn;`!{kXEOGj zpy<x2c*;uVs<$Bjw&V3Hn9ttMBD8_Gdq?dtFte)W7=GI$g!&Iv!mxv@+B}sNz!nu5 zvl3@e6nM0MuTZ%$rzjo0R7O(wkDf&l-zE%;#*-+<=my;f8raX^^_7z7B7!^Rjo@z1 z&b3LL!_5tsU&ErUd=2EnHMq;!X78+TQ9Gk2Mp8d|lqO?t)QXiPDi_8}GN5~R5D#4M zJhic;uSNivc^5Mkfz=m%*DZq&g9nbG2tLHje!z@dwO~`GP*G4mn;%Ncf}+wuKYjFc zlP-cECYMZwhlBG}-u8+}O0bnrqlpd(O7=(Jt&1<8)q@Vy5vE0M0;Nm?h4#&7PZ^B= z@n_~3iU!q2m8);0GZi>_%YNpRMYNrQh^Q{W7Grja9o<XEa8ajw(v&RghAuf@SKRWY z-LcUq>XI(y@7DGBwAhtx9$jGXs1~j*PV~@-Qxa-Ltd&~3w8~Uf`Ak;%th`EpkR(0Z zB(A0x#iRID+@oud$wk7N;VcoirV}`zBrh{<2N6<S61Kh65@xiiGGm=hhJ!{nj=GHt zfN*izNYc|4)++<+T;ZAxEcI)E?J}h#x|}Sp_JrJoqiV31-XlyCOhb*Ch9!yGR*|Wv z$Y*wu=v5qwjARTHB(;D=G^k%nJ+peHZb37s_&B~4yDsUg#&ngGCcu$~1)?MlePy}T zY$}6Bj|uS{Wyk^+$~~cws!=?sDq7qQR-3Rrm`0QN`fNBm7k~wy;iM#+K@6|iB#-YK z8co`&H?N34(`r&46W^LTxkxy;jxu=;v6zee`mYCN`jB~T3kw8TCpfn&iHnAAvX#mJ z3kYYy^viv-jnj2b@ofjb=K|`i>T-J~-K3aJsO<X)HGCvt2fr~)dgm}OLgHKj8Fxj$ zUNNW%^DB$?Mw3?aomGsO?u0CmuklqqXf<ng$Ys-bK*uTM_-}6*nZpKfvw$2njJF+! z!wfx*`OH3|bI$gwFdk3@U3rsD0UaH>(leZD;&6mE6vXHGH{SSBd>H;|6P*KxZuem@ z?KbLUxN{hH21fKz4k<YsJ;WtnTSujb*~hPdAs7W4#v3z9qAva*P<QP{z*B*+QPB2E z-;}j1qZz@|^8)}FVKG0==OlsKXCrv390((zs*&qfmn-e7F84-VWkK(qR#{(XPp&OB zxy)`0M9jcK#fX&K#LgSrCC5#!3oKKB<mFm8h(RV~7P#qWfx&N}&Cet~?@p4`+-T8q zL7ltlD(mO}=MP{1tG|2w*MIx^PyWg*>A*+%0{GAsx_{u8e1y>}jOd&Z|HbJAEL-4X z?Zqh>d<!6Ts>0^rNCd5cOF8s$YKP1g)kvbGZ)S*V1chk;_zzzPR=>L9HgKc)N=0|G z<14!^Gp|mi<R;?`J5uCuFd~;C6u?3LzPPw(T&$7Q4We6fWhMYLa$?E0(rUEI%TnHv zG{Fm1EZ;vL4007{1MOy+$X85WR?D1aZWHhR+cJgRX4uJ+0l;k!qW)yF*`6e0__RWR zpW5CiA`?J)<Qiib<jt{Nz1&m49AQ(g6P3&EQ;h+A6-O5om3b?0Qm5+()A1{%$`_^c z)C1O#!tw25^DOT5qLC(E8Vx{reid2dDi85);3U6Fg))wu$r0sy7eC8k%I>u|7-#YK zqbg4F2AxZI!Z-MgVHE{*C?-GV9v7h^QS{U+)k%rGATlCKMzU!vYLQF}nIwh#_4`uG zWZSqT+Ex}WOerq9h+Uciz@}y?Bo-exOPsr38KsT8M-xcZF%dPZ)cgUSJ(*AllYLxi zR+|m|!joBB*F1v7>8l9Osa|=SXi1(l>cbQ{a|vSSGvf(i@>sf!<&6lZOD?nxj|knm z(|ZI_vj+xHeHeCMo~Gz?N!lMf#g_HTG4jW=PTmLIo(5v+YCx1R%Ytenq|r4IA<SKU zy2AzS2%P5Z@G-p^r7a$pFYB5!7iR&`6WUzXxuxFDjWuU!!fz@+lbe9-lN_tCZkY}7 z5WQE8^v?pmH`5O1DAp%>#^E@2LM%CU+~z6Fe^G8ZSILld#p0GP%G5j_P_{LKA*ID5 zL2hqqp`3{tUCI`PN>Uw1t%GgYIwNL~9ZcM7Zd*EQ`C{dIttbafybp8qwlgD$l|_s4 zt-{hQ0Uq=X-_~0DSJ4t%J{3{T&j99Xs_2rpC<vB6dR2ZBqG(=_1tIsuW(u4ss~DH7 zBHQa8r<XFaNmUJARd<?k9J1(Su4rMKJUu3NubzyCTW76#ru2pZCxb*EhBHi<8TLdn zWH)>+X2eA81A3YivN`NVS&n<+l9Py3qfj)*<0zpDye~>NX9Wg$$?d*`cBziYW%kma z%goPd4I&>C5RtR&_~pq-yAZ~l9JLt0#0`~t9Y(7~ETI!n9>W^1xvSWi)Mn?t&42p` zn*@c~^xo<eu$R_<cC)}<{Dpk;fu%w8%$T|Zsa6PTQz_o&pLoh=JC|-GpL5WIrcJ3i z+ViKlQ95F$t8=1Lx+xXnI_Cggzazy+=f-E|DlcwIr;wVM4t#Ha$ZR^H$ZjtWycC&D zMkrOd9o|^J$r(9cQ}nooe3Ng=?#|rJ`A%ORGue6By|sL9{Yv-f8!_lPSKZb;b7~f2 zE}M+kIB&g;DLn5m|AQ`pIoH6oalPpZx(TLldHJ|T>+Z0bIWcA`Qc4TkBzBADlt!jL z!(M2PmPq&^Y|hTpcr7i>4f8ds({owQMx7GG$=j%;%<|lg4vzEXaMW>iZ;-;#yui3o z8pi@jV!m{aa=X8NN=Fs#;F@V2RkV<6rFK+3nkT)Zp^Pp`@mMVX<YLjiNvcQdvi4f( z9!<4>Y0Ag)o?N|28q9h0A>LGw1){`PMYZj;kk{}l@}-INDgW_u$mC?=ib&iJ72J#% zT4eLaMJihMzWZc1`1EWVJkYgmoxIpO@H&m0k8MrOA$qsOqcQpeuGoQj#O<xV(bX+; z*hygkPi9Q|&I_v0UxOiV5A)^4^R2+XAk!_#)={3po3&;hs9U6EsqG6%;l}r2AhKVg z3(7C%h3dhUXSnpvW)Yz6Dd6<j<Ao<tJ`@&lb{8ByyIIzzJ{m2KFDqr`9b8lmpDMq6 zOErA0xbe=E?ip!EvCyiZg<L#(6%OLwf^Yxv8+W=Bs<?(S=TuY5zZzAHh}*$0{+qvf z{eyogY%l)cC$Im_zj^)FKYRU?zg#fmC&2Xj6p@(ga?}|9x!U{Xzx$!5y$`7eb2TVu zlPfzNx*X?huXpKknv!*nuP<=$j@3{|3ZEPkFgE~~C=J3R2qB-!I{fp)vYO)oU2avz zAV`B$gg3HSQ~W$i#zpngj#=-S7=HQtVKSK{L!+*>>an-*=EP)8#xvj(;rS$~6kIct z#p2^Z5>6DL;y5R%v4T=-^^ov$pQIntcoe6=PBH|}9QA0y*2!x-o}kfg@X3??hU1Jp zFs&_MGYZcKbdlb00g>U4$tFdAY_XC`9e0rucs4YRH=!-+Z0<#>Y+&fUecD{6$Qd>i z7<C5IoTF^o$(4oQ(kVjDdt~xSR%iyH2EZRZIA=_<V4unDz1a6s8D&|ojLZxIPx4qR z!cuQZ$`-}9;ZQ$J6FR3(5%)v;pQGeaI0-*a2j!GvlZC2t`GXz|xdRlOeVL%Syc88U z5r>;GTF;_M*3#v0(C(h$08h3)K6<=-zmCob2-J#T!KWx~OwH$j%rJ(fgUu6q3`GyQ z<U6e@mvoHz{N0psyeYCIn(~P(piyeAMur$HBBJ6uY?zD6jf~9#SAvg6RKrA9=6s@p z6<Ce?;WR>DlnNi})K4sE{lIW*a7Gl*xIR9Aif+KFq=ZO@aL@tuq8AO+cbaY%pb1Za zXZy@9aYm4Rb7jFwMl~`r)B4Pljz=O#aN%H#I7cm+{H4(;oQb1UfMFBAx&gRGehUk? zgZ;Q0jWT^pxIKoBN5NszpIl&krN?Ml!d@-a?Zd~l;G8@jLBxg1aC9PnZ9Ey0Xpo?_ z1py4g(=-yHO9J%XA?OEBkM?$U(T4@A0}l}rMNh`C1i9rRNng^b47V0+I7FjwjJiZ< zKt1SPnBukr4UeZOiB-u3u$k;E9z$zK*pI`<5|xbMibkQI)8t%q!|1UfL_PR~Z54yn zMiaRM)>#xU7i(>*jQ-~o(j$vB>>#@AMq@h0cVQnG#N^|CTSw;<Kmftd1dODE2Wkw3 z2mO%AarY$wCkr@0L0}kNhJ-5_Udqm`>;pv)4tJLUU#jr&Xb@!>%;|gQF$TZ`DKQ)a zI$ct^4#Eo@HX0oobo7r;V@lx*l`}c+=GbUjN!&23olyX&72?1wZXX7Fhl|0(?Zdsp zdhqGq(T7hzJ_<hFe)eqp;An66FnIbb*m-*JXzyt6=>hzD9Bdza1{Hs6@8D5Ah+^`) zk1oe4_5jd~k&aQ%m_ZT);jn`!kE3qfkGs&d(djuF%bub^<A|K2qI4K%IGh<>eGlSc zJfUfnLCsvh8VeMR2PB0daib7}g#iPdaBUn`nD{WI7Zw0XD3LXUWh)*b_*+}O>d{3_ zH0s6?Cz#ehb)k=*?LB?AcZ42^@~eIsk7AT&@Q;27i)|Ej$&8o387;=yj(V$qSOvOf z0Ure1)`gEyg6abK3i#ii@V$6AWfv&-Q9)sfhu}QXMJ2C-RZH1rtl#-!AEgm6#V$+` z^11Xq_EqxLC@!94I^s?KVZOq4SNQ$e5Ap?fk_0&y06Cmyd{18V$|9!w@=*+|mFM+V zQ2IWP18h$qLl`adgM7hH;_N&e7zO!(2VxTT*pb9}qKmS1`i@*dPe1?|D5G`zabYDC zv-5TEsaxeRN@11RjTp~zE#Mlrq01+_C`eH|<XB32UUv9(9_1<XBpe%5fnV0B@>~95 ztU-_$j*^598se*dDMJoyNmnofU>c6kfDcmQ4g98GaV#(rknxLt!P_cobm@zJF*yUt zV?w$S`BlF>iw0u?$6xdd5!if7L^y97Y_iKF<1Z#RW8Z1v=q?}AvE+j&`OU+p2kflF zKeJ@?PRmm)qt$2r)P>F`G0lSR$M8iz78fIY9U>pfDdS9&?aLS!8vZfn&gd0_9lb(~ zK<>hTjw>s_27Bmv+KpgH(LWaizpaS(kj9rtpz#8h3U;7@Cvlo4<m4}<m}<9%`}LDB zjlUcPABM1}bfTA$4oZ_PkTbQrH;1F($=;C^c(kK*7g`xoD~(Y!k)i@^aTHb>{;v@U zs{U%VI!P!Xu}2_~B`Ma%jhUo7&I<pV;j8elo5mpiz(8Pf79q@Z(&Pe!?@ET@E*el1 zE2H?+1(f?SnouUd^(R205lAQl!<?D6czP>f5el7XkX#@TjCjq0(U7QhCW+M;4OTjX z<aFiNy2E7>c0q#7g2uu^)kp?K*?=%t08U3?nu>CEf^pesd^t@LC(+^TWBgipVv^nh zsSmw~dX?aTc+pVRC2%+gZEEOTfq_eW2t2=NghTW?;~!Op9s&?ZH;fT8+Cb4?xZPH* zBN%zdV2HXH`a$P!px$o{&U>fA@40h+%JNMo0wTsqsv@3tNp=QG!)R3~uyP;x+<6)? zkX{7ihBE*K#)uq(0Z5p!M2J2)+ou#RZPE?05x_+E!UaCs>bJm@pw(04pAGf2y&&~f z;Y7s9)urS^>I@}%iMlTnD6&Fdp07Obt;CH<lufD%U`;}dqZjAnNz!U!`6q{ay8)Cg zDcowEBa>b^N@Eb-CeK%@4>ph2mp4wne%||PwSHB5-e}xTUu{;O_m*laF#1u~11Rc| z6W7Wv`~?uDWn(O<(fs;rg$8^@Kn8YN{EW$KyQ=FwFw|7y3vx9Caxd5nma2r4hF&{v zohTeGqRvZ_J#SGdfV}c))cLI#`d>(_?@d%K@dc}WXM*Fg^t=Hdg;l$-#gOo)o7<sB zCC%X>VM3$+6!xI7q+}NMfkj}+?J))(7HYawRL~Ra73`=Ye-qXlhTRvZ(GxUlfn(Y} z(|P4d*bSZ@2Hy=@&wI}wRgdrUTzKBAJ%3b;>{&RPkj%XD5r6&7Lr-Bjut{dog3xCA z=PFTwCrJlRpg`!0Vj9B=PZJ83x3bM&y+w_!;UbC9`wp`i(1{k7dm}hJKLy4?M<_m} z4~WB}o0wF^!0->CLL}Gvkg&r!nvh$f#00*sz)X31`1Qj9u>FTonohr_!3>_jnMZzw z+F$SOau<u&H4K(+0S8I+PBIH;uE7WbA)a@3(x->dJB38MfGrAkFf0pSW$Ok^Ycd+k zQOr&l90e4mqwZOCMJO1E4cx|cal5uc4GQZ;0}!(B9Owg*;hd7RcuD`5haz0T%_r|~ z1+BXpy0VJb3!iSH2_W7%;p!B7c_!2zQE-taAoNGCkc-3N3r1^#M_mAy#iyvY=?;4< z-AOvY?EsgIAXa}6k9Xkl&ag+KVwX6VVjpZHC8+0iWlLNks6y(^dqHcp(Q4K7K!;=8 ztLUy`2SlTnBx~bN0hO!FFAWw7B-!8r)rwDywR?mk-W{M-g}TFrlftv;boX*xU9A50 z*Uz74wZ&iwif8b-2phyZ^bG#Hy;$Qb3c8#a?jS(Jexf=8j*P*FGc!y__dHF-&Iqp? zgoRGA%99;t5~Y$b5#$X;)HVWoQE9D=C1%iPH)T;+MDM18Xnz-B>>B!Y+&mG+5K1>~ zBb5WvtOo`hjO$Y6)*c9mtrK|0k2ZtFMI%Dkl}&y_<qq(xN<XShHpt=-WpFksK|gq% zKagL(&z2kXLtbcn6-1UgKQiob#3EAKY!r2_O0WV}y4}-Z3S7^2rwhVC-*Ry!YeBn- zXfUZx!qYk_RyibqB)1bZk7SEt|6c%N%mW3aMkKI?P|Y#XeH9Ca%ep?pd`)hY71FIh z7?<fHikzd<MFwC8^RbXckQ5PLRIaHpP)4cp4S=$9N3vIfc&&z>Ge$bCibBURF-qSk zb2QQvE2Y#9jDt+%!2`)bs^BrFw!j}@7qv(+Y)<iH3S2XaoRR$KnnO9q;Pa41_NDw{ znhc`Fda#Im5$cheQ?4#|HWNF-)S`0VamM5sz9WuD`A2gcE1STH7N+~CM;|zRW<S#W zlq87qf-6PTcSkV!xh`^K1`H3(GKbiX*{0o}l$Zt$9a{{|#<vj7PSTqiGt$C$l1>qJ z1Lwd|B32icBJf5S4mEYVwAV+*rjg1ihdPfzIL;z7?lZ$ik}RUO08VvLx@eOF3ot#b zB4uQ;HZvJVx;)HC1ABDDX@Y~b8YOxa@|q9;K;*j!r<rIhW66Q@ba0>&%!5T1{s>C( z+^z_`;zlkpxrhi?q6`^TWo-*!z8A4f1b|+mwm5%pT9^&P!Q(8+CT(SSrh~1R(Ns+1 zJbA^7Yyo82YEiH9OdZAxWaM2~-A05fIDX>E8;^x_BZRuP3smPUemoKv8*rN5#l!w0 zlUVQ@5WLjPm5}W?$p9Keq9%t|X1E3b%8Z0PKpuus^KjG#LXVqJuyDX4?x!Kk@e<_w z!G^}T5VTnviE1q}Z0Q^hT_R{tLoG+EAI8EHgJZomSFWetm9YS4RVSQ~0cqm_`V=E< z*8`c+CO6w;ljT;)I~zwmuU(|(tMAAt*1P<?>-9+Nyos#ImbkW%NhcsFWa8>@<iVw_ zK)wc%ZxQ}SQXb34jQN#`-<L@|A_SwX8rFl3iCu`oa@femu(?(NRLz$^nq`16v-}bj zg|Q1ECTFHpWx6l)O!THh{pcX-h%ZQ|_%bIYbj;n8qs{D*O{cTnD57wgDsBpLpM?V| z@l-y}28XPg0Fi?@$6zXwp>@traY<pAOaTK|O$VK=N4#LZx&{XDm^Kckmi=OvqDauQ zSK;71QdBheRl+<X#L?h@u4jjM(Uf9VLEsC(XCh=$*?hS1e(KUltl1Y><SM^`b>Kiz z?OW3$J<ZB<nn8(k5eU9z?~w|p+E?-kii?A375PA&VArm4s|j`WPdi^$lg^j*0BCv| z!A^?z&3K7!#j?J|Z>hWV4I|84$)&5NFdm$dUjjgT(!zrVOopcyqmTG(J*{Hd8XNY? z7D*4yJ20>?(WbYaVJ9XrI>r}hR03`B_uQQ4f|3k$aRDc(Oeo|B=fjbR-9kJ+V3{8& z^OEv%g&j0R#b}&eI)XJ8Wa7+TFodlaCOo{PivT<>3aPbWQyl8;P*YV2p5#sdj+U1~ z0@}mVruhB|PGl>1;ixAy2YN%GhXP}mhGB}znd9Gno;^QrHpAx0iaPNcAeKpnu&SyB zW9%Ikhtl|Q^qXKL9}=P*a=2|D&@qnQQP|O~&}sT<zq<H*0zzMG;U){e7m&JG{(OIn z<VR!JrTzjB<=BU10HlPU5%ND-cUea~q343wXfiko-jzQ!7J;t1Bx7n{nf&rmGzh0w zm{OF3$h3`=lC=90n-nF@1szQ+r;{P3rjqm`ldGe67$xVEs(@z(*dpi{L`W3r*Mnh3 z1srvQq%Z|)sN*>-r*JU$8)7=<iPPS4@HM-D2uPCnvAe{UTgLKY<sK!rj4y%r2IMGD zI<+nw@CJ0**9*|eA;qU>7*?5Ib;4BcO`_-rbicgTl(#<5s6o7*Nm*<g;cX+-ATCby zhBa+!@G5(iA(}dI{WEBK!1?y#tRmIBAF)pBt4VT5Q+3nBTNm}ERRhZ}UR`OV&gsTz zOoPDpZLC_x^Pk+Nf?tOtcZ~V2^#1#z2j_r8>MOR-z20PQcvYto!{nT-S-wir_%t4Y zByyV`Evomg?AJ^9WKki9req>VCuMZhyeL>+X1+z4^q2+mU0DLMPc}|4H5Vlk#LG%N zOibeL`GB-mSl{At2*_b^rwQIq%5~;W#4+6vG%3(F&B^Pr52)^CAd11|>f20C48hBI zJf<bBxduQk0Biw5Hif7!DImbCu*)89g?(M(z|q4P2*eebLeL_B(L9V`7T_b^8JrBC z<ars>Hpk7x=@6<&RBaTm@;omahg~?brwH$Oagl85)tJkdRpsI)4jihMq}6+Xjpi=; zH3g&@fc&Z+p_ENxvdv-C`{U6`PNG2oz^#nlz^`NYPc*;WI&o?Y!?9$NmN>>%MKW^M zY^KTaL$De#%Al{fCT(zbAD~nYbvEohB(r6S5ec!dxM3MuDk-&M#=z~;m?8mDp(@o7 zqc4U43)|RIa4IU!I6{e&8jg$vN0%u{wzMSi=Gu64=|%{!j*aWK?4AINJ%iPOTcRUx zl0ph4PP|yJlelOd;4mJtKCE$IQlZAuECCBaf33F!P%7VThdY6d6&w*uw{38E4WbY? zPtJS=#fU12nI6=st~<8)%v?94WVC&_v$uChvD9~<<xi88Y_jko?il5>ULQX1-e1Sh zjpj1`>ED6RdrkUruMh9nns@NWT62Sbg#3fv+@WH3dY!xQ8PSi8ez*JlJnYhs-g?+S zS+Uk@oJk}ehFRRL>MIq|i<RdW;vNxSA%nwwn~Tpc?>84=`Uu*=%f=-67<J6pF&Ob% zs6B#b`^klRM*7eqBB(}c?pa#n2(RnHJj*(is7H$So^I(;<l+rBX)-pE=NE9Ie;+mr zx<t!^@N3P)69H8ABEPJ&-QgIHEqEkyH@=ZPD;1xTMs!5NBhBc<z=ID-?(qhYGo-Iw zGX6se=X?~Cy^+$iW{qGQL<Y1WL`fjT@mY>kc`O$!iQRrQ6^3>JnG>01=wf{$lDW}Q zUnC4TM_b<zwW+Cql99a?Rz!(!7=_t6?w|;un~b^<N^%W#S&#PUd|OWfNS6{a0vOJ} zMs`#gS!iV|eGr?n6?L5pbV(Q`nGrY{_2bj?R2WJV7!rQaX(Ng8_(zzdoz_@NfvTH3 z)Jw5W*LXRu-NWU2=l<F<{n?;Z+oDz5>Cq=G=WdHWSLyQ(ecq){T;}&$ys}#%e%|TO zkGm0mt~c?scaI+Ry7U>*kBE3eMD?Tl^cnICY<9hc4X&>d;PpEQcs(R2>m3BS9#Jdn z{WbW!-=a77TO0IAZ|<+so7KDgW1T)X_y;zy!QJ0zVwX175VMUt)bEWu_vw>L-Q`Dj zv9lZZsO&uiym24#+vrfe4t8~;%SDMg8(pg1!)7-ksup3ju-T$dd=gTl;T?K%ho0P7 zr_cNJN!<tujqolNB4UQ?{2eh035)PPRVG|Q#v-KA32Ah~F2N&=Lc%2^TsnkHhp_0Z zMf8bd-C;6x?%bhItk$`Ek3JDxhp5mYDs-sj4)wp&ZPF)|r;c~mXr#M$n)G>(f83|f zkbhv|E)lm&O>_x(mw<PvLtUDGU7C5_E|uxhb84vDqq;qMPJQcA-+I)a9`~e2J?T+n zJ?cY`n(0w9y>3XK*i5gtN)>ukfuQziJB!v@^m%8Q{$P#h&N}_LgDpiJdf(yqoelcz z&?h1rb??&)!nxnNPoG$*zjl{C*Xff0S3s!0o~#qj{dEM}zfY62fBz1B-lI<{%NuKd zgMZMx?o(5Jq*1H6+FQmyYfbuG<sa+xxj~;HefH=x!q2<+>66~xji|yss!a&NpF8-8 z0}h{e>62QzPcSy{bL}qBs<qyt=GI$SVV&DvU!xy)SLt&NKiBE|I(_e~Qz2wHt##_a zdUt~!_2_*MU)*ovihw`#BSb_uR*?+wXO%wJ=@a|0u|`kU2*}17j6^GJt<xvI4so)< zCyomI!TyKT*$^iNeBPxO_qzDGzD7UR`3Lr}L%ak2AaWh*T4(JZJtDf&nrd}$O}9Gt z2<r}Yv~#~npDp|hi87t=E`8poPwZ58wTmyhYism*k3JFiZjYMn_Ezch4*iIl^tsAE z?$aj{sMn>!y$I{~`ZOJSC}6ENn_c?s;U|GyZT11mYB%cRk8U5(TkS>krpMCSYDfaw zD*f2lpik&&c<&xo3Gd-x!e^I0d-#bE;S)fG_mSPf=RNxD;OFXH`lKhwFvI)QTzH=< zY^)+N;SWOEpmi2*+@&|PAm9%|+~};)Cl|&=7ZO7bLt^ysC&Eu$y70M5pLgjK+YRrm z(I-{FJq12jsaod_eXi5zeflIo$ce%bcS3k@mp<>)C!pCA!f7Ar)$g>RLZ5|K_=At4 zRsMl}?)Nt$`pgTmyXIcaf~?MC(m*i<)iv9bYO{ui-SvC-QKGVUcrEE(S=uEO421Bb zY$W(n{`iaL7wzDSY$8vVUz~u{L(Xbn!1?G4lw#nNm!U?BG$~Zg(v#rX-$EX<BB!L! z!0=D0bCRyYBT|Y!pyS{B@NF~Tvz^AG#v-gu6MT(y02-jKq$W;xs6POh&hZ6a7&4?J z19qH_dwDwG10=;H0TNJGGmy2iKFF2~<BM?`^}Zmv52d|9k^!+%Eyq<s6wR{pp|sA1 z{|`VqoDe`E^+|XFR3i|MqL}~@bRv``Pe~F@IpZ!?	#-$ShjnVZxIXGto^F;{tno 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≧̸e|k1FJ; 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 literal 0 HcmV?d00001 diff --git a/public/assets/cooperative-a309d245cd0b0b9c653db471c53ec090e49ba7ad885879ffa02a11b6efd79d74.js b/public/assets/cooperative-a309d245cd0b0b9c653db471c53ec090e49ba7ad885879ffa02a11b6efd79d74.js new file mode 100644 index 000000000..d88cff28e --- /dev/null +++ b/public/assets/cooperative-a309d245cd0b0b9c653db471c53ec090e49ba7ad885879ffa02a11b6efd79d74.js @@ -0,0 +1,136259 @@ +/* +Unobtrusive JavaScript +https://github.com/rails/rails/blob/master/actionview/app/assets/javascripts +Released under the MIT license + */ + + +(function() { + var context = this; + + (function() { + (function() { + this.Rails = { + linkClickSelector: 'a[data-confirm], a[data-method], a[data-remote]:not([disabled]), a[data-disable-with], a[data-disable]', + buttonClickSelector: { + selector: 'button[data-remote]:not([form]), button[data-confirm]:not([form])', + exclude: 'form button' + }, + inputChangeSelector: 'select[data-remote], input[data-remote], textarea[data-remote]', + formSubmitSelector: 'form', + formInputClickSelector: 'form input[type=submit], form input[type=image], form button[type=submit], form button:not([type]), input[type=submit][form], input[type=image][form], button[type=submit][form], button[form]:not([type])', + formDisableSelector: 'input[data-disable-with]:enabled, button[data-disable-with]:enabled, textarea[data-disable-with]:enabled, input[data-disable]:enabled, button[data-disable]:enabled, textarea[data-disable]:enabled', + formEnableSelector: 'input[data-disable-with]:disabled, button[data-disable-with]:disabled, textarea[data-disable-with]:disabled, input[data-disable]:disabled, button[data-disable]:disabled, textarea[data-disable]:disabled', + fileInputSelector: 'input[name][type=file]:not([disabled])', + linkDisableSelector: 'a[data-disable-with], a[data-disable]', + buttonDisableSelector: 'button[data-remote][data-disable-with], button[data-remote][data-disable]' + }; + + }).call(this); + }).call(context); + + var Rails = context.Rails; + + (function() { + (function() { + var cspNonce; + + cspNonce = Rails.cspNonce = function() { + var meta; + meta = document.querySelector('meta[name=csp-nonce]'); + return meta && meta.content; + }; + + }).call(this); + (function() { + var expando, m; + + m = Element.prototype.matches || Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector; + + Rails.matches = function(element, selector) { + if (selector.exclude != null) { + return m.call(element, selector.selector) && !m.call(element, selector.exclude); + } else { + return m.call(element, selector); + } + }; + + expando = '_ujsData'; + + Rails.getData = function(element, key) { + var ref; + return (ref = element[expando]) != null ? ref[key] : void 0; + }; + + Rails.setData = function(element, key, value) { + if (element[expando] == null) { + element[expando] = {}; + } + return element[expando][key] = value; + }; + + Rails.$ = function(selector) { + return Array.prototype.slice.call(document.querySelectorAll(selector)); + }; + + }).call(this); + (function() { + var $, csrfParam, csrfToken; + + $ = Rails.$; + + csrfToken = Rails.csrfToken = function() { + var meta; + meta = document.querySelector('meta[name=csrf-token]'); + return meta && meta.content; + }; + + csrfParam = Rails.csrfParam = function() { + var meta; + meta = document.querySelector('meta[name=csrf-param]'); + return meta && meta.content; + }; + + Rails.CSRFProtection = function(xhr) { + var token; + token = csrfToken(); + if (token != null) { + return xhr.setRequestHeader('X-CSRF-Token', token); + } + }; + + Rails.refreshCSRFTokens = function() { + var param, token; + token = csrfToken(); + param = csrfParam(); + if ((token != null) && (param != null)) { + return $('form input[name="' + param + '"]').forEach(function(input) { + return input.value = token; + }); + } + }; + + }).call(this); + (function() { + var CustomEvent, fire, matches, preventDefault; + + matches = Rails.matches; + + CustomEvent = window.CustomEvent; + + if (typeof CustomEvent !== 'function') { + CustomEvent = function(event, params) { + var evt; + evt = document.createEvent('CustomEvent'); + evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); + return evt; + }; + CustomEvent.prototype = window.Event.prototype; + preventDefault = CustomEvent.prototype.preventDefault; + CustomEvent.prototype.preventDefault = function() { + var result; + result = preventDefault.call(this); + if (this.cancelable && !this.defaultPrevented) { + Object.defineProperty(this, 'defaultPrevented', { + get: function() { + return true; + } + }); + } + return result; + }; + } + + fire = Rails.fire = function(obj, name, data) { + var event; + event = new CustomEvent(name, { + bubbles: true, + cancelable: true, + detail: data + }); + obj.dispatchEvent(event); + return !event.defaultPrevented; + }; + + Rails.stopEverything = function(e) { + fire(e.target, 'ujs:everythingStopped'); + e.preventDefault(); + e.stopPropagation(); + return e.stopImmediatePropagation(); + }; + + Rails.delegate = function(element, selector, eventType, handler) { + return element.addEventListener(eventType, function(e) { + var target; + target = e.target; + while (!(!(target instanceof Element) || matches(target, selector))) { + target = target.parentNode; + } + if (target instanceof Element && handler.call(target, e) === false) { + e.preventDefault(); + return e.stopPropagation(); + } + }); + }; + + }).call(this); + (function() { + var AcceptHeaders, CSRFProtection, createXHR, cspNonce, fire, prepareOptions, processResponse; + + cspNonce = Rails.cspNonce, CSRFProtection = Rails.CSRFProtection, fire = Rails.fire; + + AcceptHeaders = { + '*': '*/*', + text: 'text/plain', + html: 'text/html', + xml: 'application/xml, text/xml', + json: 'application/json, text/javascript', + script: 'text/javascript, application/javascript, application/ecmascript, application/x-ecmascript' + }; + + Rails.ajax = function(options) { + var xhr; + options = prepareOptions(options); + xhr = createXHR(options, function() { + var ref, response; + response = processResponse((ref = xhr.response) != null ? ref : xhr.responseText, xhr.getResponseHeader('Content-Type')); + if (Math.floor(xhr.status / 100) === 2) { + if (typeof options.success === "function") { + options.success(response, xhr.statusText, xhr); + } + } else { + if (typeof options.error === "function") { + options.error(response, xhr.statusText, xhr); + } + } + return typeof options.complete === "function" ? options.complete(xhr, xhr.statusText) : void 0; + }); + if ((options.beforeSend != null) && !options.beforeSend(xhr, options)) { + return false; + } + if (xhr.readyState === XMLHttpRequest.OPENED) { + return xhr.send(options.data); + } + }; + + prepareOptions = function(options) { + options.url = options.url || location.href; + options.type = options.type.toUpperCase(); + if (options.type === 'GET' && options.data) { + if (options.url.indexOf('?') < 0) { + options.url += '?' + options.data; + } else { + options.url += '&' + options.data; + } + } + if (AcceptHeaders[options.dataType] == null) { + options.dataType = '*'; + } + options.accept = AcceptHeaders[options.dataType]; + if (options.dataType !== '*') { + options.accept += ', */*; q=0.01'; + } + return options; + }; + + createXHR = function(options, done) { + var xhr; + xhr = new XMLHttpRequest(); + xhr.open(options.type, options.url, true); + xhr.setRequestHeader('Accept', options.accept); + if (typeof options.data === 'string') { + xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); + } + if (!options.crossDomain) { + xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); + } + CSRFProtection(xhr); + xhr.withCredentials = !!options.withCredentials; + xhr.onreadystatechange = function() { + if (xhr.readyState === XMLHttpRequest.DONE) { + return done(xhr); + } + }; + return xhr; + }; + + processResponse = function(response, type) { + var parser, script; + if (typeof response === 'string' && typeof type === 'string') { + if (type.match(/\bjson\b/)) { + try { + response = JSON.parse(response); + } catch (error) {} + } else if (type.match(/\b(?:java|ecma)script\b/)) { + script = document.createElement('script'); + script.setAttribute('nonce', cspNonce()); + script.text = response; + document.head.appendChild(script).parentNode.removeChild(script); + } else if (type.match(/\b(xml|html|svg)\b/)) { + parser = new DOMParser(); + type = type.replace(/;.+/, ''); + try { + response = parser.parseFromString(response, type); + } catch (error) {} + } + } + return response; + }; + + Rails.href = function(element) { + return element.href; + }; + + Rails.isCrossDomain = function(url) { + var e, originAnchor, urlAnchor; + originAnchor = document.createElement('a'); + originAnchor.href = location.href; + urlAnchor = document.createElement('a'); + try { + urlAnchor.href = url; + return !(((!urlAnchor.protocol || urlAnchor.protocol === ':') && !urlAnchor.host) || (originAnchor.protocol + '//' + originAnchor.host === urlAnchor.protocol + '//' + urlAnchor.host)); + } catch (error) { + e = error; + return true; + } + }; + + }).call(this); + (function() { + var matches, toArray; + + matches = Rails.matches; + + toArray = function(e) { + return Array.prototype.slice.call(e); + }; + + Rails.serializeElement = function(element, additionalParam) { + var inputs, params; + inputs = [element]; + if (matches(element, 'form')) { + inputs = toArray(element.elements); + } + params = []; + inputs.forEach(function(input) { + if (!input.name || input.disabled) { + return; + } + if (matches(input, 'select')) { + return toArray(input.options).forEach(function(option) { + if (option.selected) { + return params.push({ + name: input.name, + value: option.value + }); + } + }); + } else if (input.checked || ['radio', 'checkbox', 'submit'].indexOf(input.type) === -1) { + return params.push({ + name: input.name, + value: input.value + }); + } + }); + if (additionalParam) { + params.push(additionalParam); + } + return params.map(function(param) { + if (param.name != null) { + return (encodeURIComponent(param.name)) + "=" + (encodeURIComponent(param.value)); + } else { + return param; + } + }).join('&'); + }; + + Rails.formElements = function(form, selector) { + if (matches(form, 'form')) { + return toArray(form.elements).filter(function(el) { + return matches(el, selector); + }); + } else { + return toArray(form.querySelectorAll(selector)); + } + }; + + }).call(this); + (function() { + var allowAction, fire, stopEverything; + + fire = Rails.fire, stopEverything = Rails.stopEverything; + + Rails.handleConfirm = function(e) { + if (!allowAction(this)) { + return stopEverything(e); + } + }; + + allowAction = function(element) { + var answer, callback, message; + message = element.getAttribute('data-confirm'); + if (!message) { + return true; + } + answer = false; + if (fire(element, 'confirm')) { + try { + answer = confirm(message); + } catch (error) {} + callback = fire(element, 'confirm:complete', [answer]); + } + return answer && callback; + }; + + }).call(this); + (function() { + var disableFormElement, disableFormElements, disableLinkElement, enableFormElement, enableFormElements, enableLinkElement, formElements, getData, matches, setData, stopEverything; + + matches = Rails.matches, getData = Rails.getData, setData = Rails.setData, stopEverything = Rails.stopEverything, formElements = Rails.formElements; + + Rails.handleDisabledElement = function(e) { + var element; + element = this; + if (element.disabled) { + return stopEverything(e); + } + }; + + Rails.enableElement = function(e) { + var element; + element = e instanceof Event ? e.target : e; + if (matches(element, Rails.linkDisableSelector)) { + return enableLinkElement(element); + } else if (matches(element, Rails.buttonDisableSelector) || matches(element, Rails.formEnableSelector)) { + return enableFormElement(element); + } else if (matches(element, Rails.formSubmitSelector)) { + return enableFormElements(element); + } + }; + + Rails.disableElement = function(e) { + var element; + element = e instanceof Event ? e.target : e; + if (matches(element, Rails.linkDisableSelector)) { + return disableLinkElement(element); + } else if (matches(element, Rails.buttonDisableSelector) || matches(element, Rails.formDisableSelector)) { + return disableFormElement(element); + } else if (matches(element, Rails.formSubmitSelector)) { + return disableFormElements(element); + } + }; + + disableLinkElement = function(element) { + var replacement; + replacement = element.getAttribute('data-disable-with'); + if (replacement != null) { + setData(element, 'ujs:enable-with', element.innerHTML); + element.innerHTML = replacement; + } + element.addEventListener('click', stopEverything); + return setData(element, 'ujs:disabled', true); + }; + + enableLinkElement = function(element) { + var originalText; + originalText = getData(element, 'ujs:enable-with'); + if (originalText != null) { + element.innerHTML = originalText; + setData(element, 'ujs:enable-with', null); + } + element.removeEventListener('click', stopEverything); + return setData(element, 'ujs:disabled', null); + }; + + disableFormElements = function(form) { + return formElements(form, Rails.formDisableSelector).forEach(disableFormElement); + }; + + disableFormElement = function(element) { + var replacement; + replacement = element.getAttribute('data-disable-with'); + if (replacement != null) { + if (matches(element, 'button')) { + setData(element, 'ujs:enable-with', element.innerHTML); + element.innerHTML = replacement; + } else { + setData(element, 'ujs:enable-with', element.value); + element.value = replacement; + } + } + element.disabled = true; + return setData(element, 'ujs:disabled', true); + }; + + enableFormElements = function(form) { + return formElements(form, Rails.formEnableSelector).forEach(enableFormElement); + }; + + enableFormElement = function(element) { + var originalText; + originalText = getData(element, 'ujs:enable-with'); + if (originalText != null) { + if (matches(element, 'button')) { + element.innerHTML = originalText; + } else { + element.value = originalText; + } + setData(element, 'ujs:enable-with', null); + } + element.disabled = false; + return setData(element, 'ujs:disabled', null); + }; + + }).call(this); + (function() { + var stopEverything; + + stopEverything = Rails.stopEverything; + + Rails.handleMethod = function(e) { + var csrfParam, csrfToken, form, formContent, href, link, method; + link = this; + method = link.getAttribute('data-method'); + if (!method) { + return; + } + href = Rails.href(link); + csrfToken = Rails.csrfToken(); + csrfParam = Rails.csrfParam(); + form = document.createElement('form'); + formContent = "<input name='_method' value='" + method + "' type='hidden' />"; + if ((csrfParam != null) && (csrfToken != null) && !Rails.isCrossDomain(href)) { + formContent += "<input name='" + csrfParam + "' value='" + csrfToken + "' type='hidden' />"; + } + formContent += '<input type="submit" />'; + form.method = 'post'; + form.action = href; + form.target = link.target; + form.innerHTML = formContent; + form.style.display = 'none'; + document.body.appendChild(form); + form.querySelector('[type="submit"]').click(); + return stopEverything(e); + }; + + }).call(this); + (function() { + var ajax, fire, getData, isCrossDomain, isRemote, matches, serializeElement, setData, stopEverything, + slice = [].slice; + + matches = Rails.matches, getData = Rails.getData, setData = Rails.setData, fire = Rails.fire, stopEverything = Rails.stopEverything, ajax = Rails.ajax, isCrossDomain = Rails.isCrossDomain, serializeElement = Rails.serializeElement; + + isRemote = function(element) { + var value; + value = element.getAttribute('data-remote'); + return (value != null) && value !== 'false'; + }; + + Rails.handleRemote = function(e) { + var button, data, dataType, element, method, url, withCredentials; + element = this; + if (!isRemote(element)) { + return true; + } + if (!fire(element, 'ajax:before')) { + fire(element, 'ajax:stopped'); + return false; + } + withCredentials = element.getAttribute('data-with-credentials'); + dataType = element.getAttribute('data-type') || 'script'; + if (matches(element, Rails.formSubmitSelector)) { + button = getData(element, 'ujs:submit-button'); + method = getData(element, 'ujs:submit-button-formmethod') || element.method; + url = getData(element, 'ujs:submit-button-formaction') || element.getAttribute('action') || location.href; + if (method.toUpperCase() === 'GET') { + url = url.replace(/\?.*$/, ''); + } + if (element.enctype === 'multipart/form-data') { + data = new FormData(element); + if (button != null) { + data.append(button.name, button.value); + } + } else { + data = serializeElement(element, button); + } + setData(element, 'ujs:submit-button', null); + setData(element, 'ujs:submit-button-formmethod', null); + setData(element, 'ujs:submit-button-formaction', null); + } else if (matches(element, Rails.buttonClickSelector) || matches(element, Rails.inputChangeSelector)) { + method = element.getAttribute('data-method'); + url = element.getAttribute('data-url'); + data = serializeElement(element, element.getAttribute('data-params')); + } else { + method = element.getAttribute('data-method'); + url = Rails.href(element); + data = element.getAttribute('data-params'); + } + ajax({ + type: method || 'GET', + url: url, + data: data, + dataType: dataType, + beforeSend: function(xhr, options) { + if (fire(element, 'ajax:beforeSend', [xhr, options])) { + return fire(element, 'ajax:send', [xhr]); + } else { + fire(element, 'ajax:stopped'); + return false; + } + }, + success: function() { + var args; + args = 1 <= arguments.length ? slice.call(arguments, 0) : []; + return fire(element, 'ajax:success', args); + }, + error: function() { + var args; + args = 1 <= arguments.length ? slice.call(arguments, 0) : []; + return fire(element, 'ajax:error', args); + }, + complete: function() { + var args; + args = 1 <= arguments.length ? slice.call(arguments, 0) : []; + return fire(element, 'ajax:complete', args); + }, + crossDomain: isCrossDomain(url), + withCredentials: (withCredentials != null) && withCredentials !== 'false' + }); + return stopEverything(e); + }; + + Rails.formSubmitButtonClick = function(e) { + var button, form; + button = this; + form = button.form; + if (!form) { + return; + } + if (button.name) { + setData(form, 'ujs:submit-button', { + name: button.name, + value: button.value + }); + } + setData(form, 'ujs:formnovalidate-button', button.formNoValidate); + setData(form, 'ujs:submit-button-formaction', button.getAttribute('formaction')); + return setData(form, 'ujs:submit-button-formmethod', button.getAttribute('formmethod')); + }; + + Rails.handleMetaClick = function(e) { + var data, link, metaClick, method; + link = this; + method = (link.getAttribute('data-method') || 'GET').toUpperCase(); + data = link.getAttribute('data-params'); + metaClick = e.metaKey || e.ctrlKey; + if (metaClick && method === 'GET' && !data) { + return e.stopImmediatePropagation(); + } + }; + + }).call(this); + (function() { + var $, CSRFProtection, delegate, disableElement, enableElement, fire, formSubmitButtonClick, getData, handleConfirm, handleDisabledElement, handleMetaClick, handleMethod, handleRemote, refreshCSRFTokens; + + fire = Rails.fire, delegate = Rails.delegate, getData = Rails.getData, $ = Rails.$, refreshCSRFTokens = Rails.refreshCSRFTokens, CSRFProtection = Rails.CSRFProtection, enableElement = Rails.enableElement, disableElement = Rails.disableElement, handleDisabledElement = Rails.handleDisabledElement, handleConfirm = Rails.handleConfirm, handleRemote = Rails.handleRemote, formSubmitButtonClick = Rails.formSubmitButtonClick, handleMetaClick = Rails.handleMetaClick, handleMethod = Rails.handleMethod; + + if ((typeof jQuery !== "undefined" && jQuery !== null) && (jQuery.ajax != null) && !jQuery.rails) { + jQuery.rails = Rails; + jQuery.ajaxPrefilter(function(options, originalOptions, xhr) { + if (!options.crossDomain) { + return CSRFProtection(xhr); + } + }); + } + + Rails.start = function() { + if (window._rails_loaded) { + throw new Error('rails-ujs has already been loaded!'); + } + window.addEventListener('pageshow', function() { + $(Rails.formEnableSelector).forEach(function(el) { + if (getData(el, 'ujs:disabled')) { + return enableElement(el); + } + }); + return $(Rails.linkDisableSelector).forEach(function(el) { + if (getData(el, 'ujs:disabled')) { + return enableElement(el); + } + }); + }); + delegate(document, Rails.linkDisableSelector, 'ajax:complete', enableElement); + delegate(document, Rails.linkDisableSelector, 'ajax:stopped', enableElement); + delegate(document, Rails.buttonDisableSelector, 'ajax:complete', enableElement); + delegate(document, Rails.buttonDisableSelector, 'ajax:stopped', enableElement); + delegate(document, Rails.linkClickSelector, 'click', handleDisabledElement); + delegate(document, Rails.linkClickSelector, 'click', handleConfirm); + delegate(document, Rails.linkClickSelector, 'click', handleMetaClick); + delegate(document, Rails.linkClickSelector, 'click', disableElement); + delegate(document, Rails.linkClickSelector, 'click', handleRemote); + delegate(document, Rails.linkClickSelector, 'click', handleMethod); + delegate(document, Rails.buttonClickSelector, 'click', handleDisabledElement); + delegate(document, Rails.buttonClickSelector, 'click', handleConfirm); + delegate(document, Rails.buttonClickSelector, 'click', disableElement); + delegate(document, Rails.buttonClickSelector, 'click', handleRemote); + delegate(document, Rails.inputChangeSelector, 'change', handleDisabledElement); + delegate(document, Rails.inputChangeSelector, 'change', handleConfirm); + delegate(document, Rails.inputChangeSelector, 'change', handleRemote); + delegate(document, Rails.formSubmitSelector, 'submit', handleDisabledElement); + delegate(document, Rails.formSubmitSelector, 'submit', handleConfirm); + delegate(document, Rails.formSubmitSelector, 'submit', handleRemote); + delegate(document, Rails.formSubmitSelector, 'submit', function(e) { + return setTimeout((function() { + return disableElement(e); + }), 13); + }); + delegate(document, Rails.formSubmitSelector, 'ajax:send', disableElement); + delegate(document, Rails.formSubmitSelector, 'ajax:complete', enableElement); + delegate(document, Rails.formInputClickSelector, 'click', handleDisabledElement); + delegate(document, Rails.formInputClickSelector, 'click', handleConfirm); + delegate(document, Rails.formInputClickSelector, 'click', formSubmitButtonClick); + document.addEventListener('DOMContentLoaded', refreshCSRFTokens); + return window._rails_loaded = true; + }; + + if (window.Rails === Rails && fire(document, 'rails:attachBindings')) { + Rails.start(); + } + + }).call(this); + }).call(this); + + if (typeof module === "object" && module.exports) { + module.exports = Rails; + } else if (typeof define === "function" && define.amd) { + define(Rails); + } +}).call(this); +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ActiveStorage=e():t.ActiveStorage=e()}(this,function(){return function(t){function e(n){if(r[n])return r[n].exports;var i=r[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,e),i.l=!0,i.exports}var r={};return e.m=t,e.c=r,e.d=function(t,r,n){e.o(t,r)||Object.defineProperty(t,r,{configurable:!1,enumerable:!0,get:n})},e.n=function(t){var r=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(r,"a",r),r},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=2)}([function(t,e,r){"use strict";function n(t){var e=a(document.head,'meta[name="'+t+'"]');if(e)return e.getAttribute("content")}function i(t,e){return"string"==typeof t&&(e=t,t=document),o(t.querySelectorAll(e))}function a(t,e){return"string"==typeof t&&(e=t,t=document),t.querySelector(e)}function u(t,e){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=t.disabled,i=r.bubbles,a=r.cancelable,u=r.detail,o=document.createEvent("Event");o.initEvent(e,i||!0,a||!0),o.detail=u||{};try{t.disabled=!1,t.dispatchEvent(o)}finally{t.disabled=n}return o}function o(t){return Array.isArray(t)?t:Array.from?Array.from(t):[].slice.call(t)}e.d=n,e.c=i,e.b=a,e.a=u,e.e=o},function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(t&&"function"==typeof t[e]){for(var r=arguments.length,n=Array(r>2?r-2:0),i=2;i<r;i++)n[i-2]=arguments[i];return t[e].apply(t,n)}}r.d(e,"a",function(){return c});var a=r(6),u=r(8),o=r(9),s=function(){function t(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,r,n){return r&&t(e.prototype,r),n&&t(e,n),e}}(),f=0,c=function(){function t(e,r,i){n(this,t),this.id=++f,this.file=e,this.url=r,this.delegate=i}return s(t,[{key:"create",value:function(t){var e=this;a.a.create(this.file,function(r,n){if(r)return void t(r);var a=new u.a(e.file,n,e.url);i(e.delegate,"directUploadWillCreateBlobWithXHR",a.xhr),a.create(function(r){if(r)t(r);else{var n=new o.a(a);i(e.delegate,"directUploadWillStoreFileWithXHR",n.xhr),n.create(function(e){e?t(e):t(null,a.toJSON())})}})})}}]),t}()},function(t,e,r){"use strict";function n(){window.ActiveStorage&&Object(i.a)()}Object.defineProperty(e,"__esModule",{value:!0});var i=r(3),a=r(1);r.d(e,"start",function(){return i.a}),r.d(e,"DirectUpload",function(){return a.a}),setTimeout(n,1)},function(t,e,r){"use strict";function n(){d||(d=!0,document.addEventListener("submit",i),document.addEventListener("ajax:before",a))}function i(t){u(t)}function a(t){"FORM"==t.target.tagName&&u(t)}function u(t){var e=t.target;if(e.hasAttribute(l))return void t.preventDefault();var r=new c.a(e),n=r.inputs;n.length&&(t.preventDefault(),e.setAttribute(l,""),n.forEach(s),r.start(function(t){e.removeAttribute(l),t?n.forEach(f):o(e)}))}function o(t){var e=Object(h.b)(t,"input[type=submit]");if(e){var r=e,n=r.disabled;e.disabled=!1,e.focus(),e.click(),e.disabled=n}else e=document.createElement("input"),e.type="submit",e.style.display="none",t.appendChild(e),e.click(),t.removeChild(e)}function s(t){t.disabled=!0}function f(t){t.disabled=!1}e.a=n;var c=r(4),h=r(0),l="data-direct-uploads-processing",d=!1},function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.d(e,"a",function(){return s});var i=r(5),a=r(0),u=function(){function t(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,r,n){return r&&t(e.prototype,r),n&&t(e,n),e}}(),o="input[type=file][data-direct-upload-url]:not([disabled])",s=function(){function t(e){n(this,t),this.form=e,this.inputs=Object(a.c)(e,o).filter(function(t){return t.files.length})}return u(t,[{key:"start",value:function(t){var e=this,r=this.createDirectUploadControllers();this.dispatch("start"),function n(){var i=r.shift();i?i.start(function(r){r?(t(r),e.dispatch("end")):n()}):(t(),e.dispatch("end"))}()}},{key:"createDirectUploadControllers",value:function(){var t=[];return this.inputs.forEach(function(e){Object(a.e)(e.files).forEach(function(r){var n=new i.a(e,r);t.push(n)})}),t}},{key:"dispatch",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Object(a.a)(this.form,"direct-uploads:"+t,{detail:e})}}]),t}()},function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.d(e,"a",function(){return o});var i=r(1),a=r(0),u=function(){function t(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,r,n){return r&&t(e.prototype,r),n&&t(e,n),e}}(),o=function(){function t(e,r){n(this,t),this.input=e,this.file=r,this.directUpload=new i.a(this.file,this.url,this),this.dispatch("initialize")}return u(t,[{key:"start",value:function(t){var e=this,r=document.createElement("input");r.type="hidden",r.name=this.input.name,this.input.insertAdjacentElement("beforebegin",r),this.dispatch("start"),this.directUpload.create(function(n,i){n?(r.parentNode.removeChild(r),e.dispatchError(n)):r.value=i.signed_id,e.dispatch("end"),t(n)})}},{key:"uploadRequestDidProgress",value:function(t){var e=t.loaded/t.total*100;e&&this.dispatch("progress",{progress:e})}},{key:"dispatch",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return e.file=this.file,e.id=this.directUpload.id,Object(a.a)(this.input,"direct-upload:"+t,{detail:e})}},{key:"dispatchError",value:function(t){this.dispatch("error",{error:t}).defaultPrevented||alert(t)}},{key:"directUploadWillCreateBlobWithXHR",value:function(t){this.dispatch("before-blob-request",{xhr:t})}},{key:"directUploadWillStoreFileWithXHR",value:function(t){var e=this;this.dispatch("before-storage-request",{xhr:t}),t.upload.addEventListener("progress",function(t){return e.uploadRequestDidProgress(t)})}},{key:"url",get:function(){return this.input.getAttribute("data-direct-upload-url")}}]),t}()},function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.d(e,"a",function(){return s});var i=r(7),a=r.n(i),u=function(){function t(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,r,n){return r&&t(e.prototype,r),n&&t(e,n),e}}(),o=File.prototype.slice||File.prototype.mozSlice||File.prototype.webkitSlice,s=function(){function t(e){n(this,t),this.file=e,this.chunkSize=2097152,this.chunkCount=Math.ceil(this.file.size/this.chunkSize),this.chunkIndex=0}return u(t,null,[{key:"create",value:function(e,r){new t(e).create(r)}}]),u(t,[{key:"create",value:function(t){var e=this;this.callback=t,this.md5Buffer=new a.a.ArrayBuffer,this.fileReader=new FileReader,this.fileReader.addEventListener("load",function(t){return e.fileReaderDidLoad(t)}),this.fileReader.addEventListener("error",function(t){return e.fileReaderDidError(t)}),this.readNextChunk()}},{key:"fileReaderDidLoad",value:function(t){if(this.md5Buffer.append(t.target.result),!this.readNextChunk()){var e=this.md5Buffer.end(!0),r=btoa(e);this.callback(null,r)}}},{key:"fileReaderDidError",value:function(t){this.callback("Error reading "+this.file.name)}},{key:"readNextChunk",value:function(){if(this.chunkIndex<this.chunkCount||0==this.chunkIndex&&0==this.chunkCount){var t=this.chunkIndex*this.chunkSize,e=Math.min(t+this.chunkSize,this.file.size),r=o.call(this.file,t,e);return this.fileReader.readAsArrayBuffer(r),this.chunkIndex++,!0}return!1}}]),t}()},function(t,e,r){!function(e){t.exports=e()}(function(t){"use strict";function e(t,e){var r=t[0],n=t[1],i=t[2],a=t[3];r+=(n&i|~n&a)+e[0]-680876936|0,r=(r<<7|r>>>25)+n|0,a+=(r&n|~r&i)+e[1]-389564586|0,a=(a<<12|a>>>20)+r|0,i+=(a&r|~a&n)+e[2]+606105819|0,i=(i<<17|i>>>15)+a|0,n+=(i&a|~i&r)+e[3]-1044525330|0,n=(n<<22|n>>>10)+i|0,r+=(n&i|~n&a)+e[4]-176418897|0,r=(r<<7|r>>>25)+n|0,a+=(r&n|~r&i)+e[5]+1200080426|0,a=(a<<12|a>>>20)+r|0,i+=(a&r|~a&n)+e[6]-1473231341|0,i=(i<<17|i>>>15)+a|0,n+=(i&a|~i&r)+e[7]-45705983|0,n=(n<<22|n>>>10)+i|0,r+=(n&i|~n&a)+e[8]+1770035416|0,r=(r<<7|r>>>25)+n|0,a+=(r&n|~r&i)+e[9]-1958414417|0,a=(a<<12|a>>>20)+r|0,i+=(a&r|~a&n)+e[10]-42063|0,i=(i<<17|i>>>15)+a|0,n+=(i&a|~i&r)+e[11]-1990404162|0,n=(n<<22|n>>>10)+i|0,r+=(n&i|~n&a)+e[12]+1804603682|0,r=(r<<7|r>>>25)+n|0,a+=(r&n|~r&i)+e[13]-40341101|0,a=(a<<12|a>>>20)+r|0,i+=(a&r|~a&n)+e[14]-1502002290|0,i=(i<<17|i>>>15)+a|0,n+=(i&a|~i&r)+e[15]+1236535329|0,n=(n<<22|n>>>10)+i|0,r+=(n&a|i&~a)+e[1]-165796510|0,r=(r<<5|r>>>27)+n|0,a+=(r&i|n&~i)+e[6]-1069501632|0,a=(a<<9|a>>>23)+r|0,i+=(a&n|r&~n)+e[11]+643717713|0,i=(i<<14|i>>>18)+a|0,n+=(i&r|a&~r)+e[0]-373897302|0,n=(n<<20|n>>>12)+i|0,r+=(n&a|i&~a)+e[5]-701558691|0,r=(r<<5|r>>>27)+n|0,a+=(r&i|n&~i)+e[10]+38016083|0,a=(a<<9|a>>>23)+r|0,i+=(a&n|r&~n)+e[15]-660478335|0,i=(i<<14|i>>>18)+a|0,n+=(i&r|a&~r)+e[4]-405537848|0,n=(n<<20|n>>>12)+i|0,r+=(n&a|i&~a)+e[9]+568446438|0,r=(r<<5|r>>>27)+n|0,a+=(r&i|n&~i)+e[14]-1019803690|0,a=(a<<9|a>>>23)+r|0,i+=(a&n|r&~n)+e[3]-187363961|0,i=(i<<14|i>>>18)+a|0,n+=(i&r|a&~r)+e[8]+1163531501|0,n=(n<<20|n>>>12)+i|0,r+=(n&a|i&~a)+e[13]-1444681467|0,r=(r<<5|r>>>27)+n|0,a+=(r&i|n&~i)+e[2]-51403784|0,a=(a<<9|a>>>23)+r|0,i+=(a&n|r&~n)+e[7]+1735328473|0,i=(i<<14|i>>>18)+a|0,n+=(i&r|a&~r)+e[12]-1926607734|0,n=(n<<20|n>>>12)+i|0,r+=(n^i^a)+e[5]-378558|0,r=(r<<4|r>>>28)+n|0,a+=(r^n^i)+e[8]-2022574463|0,a=(a<<11|a>>>21)+r|0,i+=(a^r^n)+e[11]+1839030562|0,i=(i<<16|i>>>16)+a|0,n+=(i^a^r)+e[14]-35309556|0,n=(n<<23|n>>>9)+i|0,r+=(n^i^a)+e[1]-1530992060|0,r=(r<<4|r>>>28)+n|0,a+=(r^n^i)+e[4]+1272893353|0,a=(a<<11|a>>>21)+r|0,i+=(a^r^n)+e[7]-155497632|0,i=(i<<16|i>>>16)+a|0,n+=(i^a^r)+e[10]-1094730640|0,n=(n<<23|n>>>9)+i|0,r+=(n^i^a)+e[13]+681279174|0,r=(r<<4|r>>>28)+n|0,a+=(r^n^i)+e[0]-358537222|0,a=(a<<11|a>>>21)+r|0,i+=(a^r^n)+e[3]-722521979|0,i=(i<<16|i>>>16)+a|0,n+=(i^a^r)+e[6]+76029189|0,n=(n<<23|n>>>9)+i|0,r+=(n^i^a)+e[9]-640364487|0,r=(r<<4|r>>>28)+n|0,a+=(r^n^i)+e[12]-421815835|0,a=(a<<11|a>>>21)+r|0,i+=(a^r^n)+e[15]+530742520|0,i=(i<<16|i>>>16)+a|0,n+=(i^a^r)+e[2]-995338651|0,n=(n<<23|n>>>9)+i|0,r+=(i^(n|~a))+e[0]-198630844|0,r=(r<<6|r>>>26)+n|0,a+=(n^(r|~i))+e[7]+1126891415|0,a=(a<<10|a>>>22)+r|0,i+=(r^(a|~n))+e[14]-1416354905|0,i=(i<<15|i>>>17)+a|0,n+=(a^(i|~r))+e[5]-57434055|0,n=(n<<21|n>>>11)+i|0,r+=(i^(n|~a))+e[12]+1700485571|0,r=(r<<6|r>>>26)+n|0,a+=(n^(r|~i))+e[3]-1894986606|0,a=(a<<10|a>>>22)+r|0,i+=(r^(a|~n))+e[10]-1051523|0,i=(i<<15|i>>>17)+a|0,n+=(a^(i|~r))+e[1]-2054922799|0,n=(n<<21|n>>>11)+i|0,r+=(i^(n|~a))+e[8]+1873313359|0,r=(r<<6|r>>>26)+n|0,a+=(n^(r|~i))+e[15]-30611744|0,a=(a<<10|a>>>22)+r|0,i+=(r^(a|~n))+e[6]-1560198380|0,i=(i<<15|i>>>17)+a|0,n+=(a^(i|~r))+e[13]+1309151649|0,n=(n<<21|n>>>11)+i|0,r+=(i^(n|~a))+e[4]-145523070|0,r=(r<<6|r>>>26)+n|0,a+=(n^(r|~i))+e[11]-1120210379|0,a=(a<<10|a>>>22)+r|0,i+=(r^(a|~n))+e[2]+718787259|0,i=(i<<15|i>>>17)+a|0,n+=(a^(i|~r))+e[9]-343485551|0,n=(n<<21|n>>>11)+i|0,t[0]=r+t[0]|0,t[1]=n+t[1]|0,t[2]=i+t[2]|0,t[3]=a+t[3]|0}function r(t){var e,r=[];for(e=0;e<64;e+=4)r[e>>2]=t.charCodeAt(e)+(t.charCodeAt(e+1)<<8)+(t.charCodeAt(e+2)<<16)+(t.charCodeAt(e+3)<<24);return r}function n(t){var e,r=[];for(e=0;e<64;e+=4)r[e>>2]=t[e]+(t[e+1]<<8)+(t[e+2]<<16)+(t[e+3]<<24);return r}function i(t){var n,i,a,u,o,s,f=t.length,c=[1732584193,-271733879,-1732584194,271733878];for(n=64;n<=f;n+=64)e(c,r(t.substring(n-64,n)));for(t=t.substring(n-64),i=t.length,a=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],n=0;n<i;n+=1)a[n>>2]|=t.charCodeAt(n)<<(n%4<<3);if(a[n>>2]|=128<<(n%4<<3),n>55)for(e(c,a),n=0;n<16;n+=1)a[n]=0;return u=8*f,u=u.toString(16).match(/(.*?)(.{0,8})$/),o=parseInt(u[2],16),s=parseInt(u[1],16)||0,a[14]=o,a[15]=s,e(c,a),c}function a(t){var r,i,a,u,o,s,f=t.length,c=[1732584193,-271733879,-1732584194,271733878];for(r=64;r<=f;r+=64)e(c,n(t.subarray(r-64,r)));for(t=r-64<f?t.subarray(r-64):new Uint8Array(0),i=t.length,a=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],r=0;r<i;r+=1)a[r>>2]|=t[r]<<(r%4<<3);if(a[r>>2]|=128<<(r%4<<3),r>55)for(e(c,a),r=0;r<16;r+=1)a[r]=0;return u=8*f,u=u.toString(16).match(/(.*?)(.{0,8})$/),o=parseInt(u[2],16),s=parseInt(u[1],16)||0,a[14]=o,a[15]=s,e(c,a),c}function u(t){var e,r="";for(e=0;e<4;e+=1)r+=p[t>>8*e+4&15]+p[t>>8*e&15];return r}function o(t){var e;for(e=0;e<t.length;e+=1)t[e]=u(t[e]);return t.join("")}function s(t){return/[\u0080-\uFFFF]/.test(t)&&(t=unescape(encodeURIComponent(t))),t}function f(t,e){var r,n=t.length,i=new ArrayBuffer(n),a=new Uint8Array(i);for(r=0;r<n;r+=1)a[r]=t.charCodeAt(r);return e?a:i}function c(t){return String.fromCharCode.apply(null,new Uint8Array(t))}function h(t,e,r){var n=new Uint8Array(t.byteLength+e.byteLength);return n.set(new Uint8Array(t)),n.set(new Uint8Array(e),t.byteLength),r?n:n.buffer}function l(t){var e,r=[],n=t.length;for(e=0;e<n-1;e+=2)r.push(parseInt(t.substr(e,2),16));return String.fromCharCode.apply(String,r)}function d(){this.reset()}var p=["0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"];return"5d41402abc4b2a76b9719d911017c592"!==o(i("hello"))&&function(t,e){var r=(65535&t)+(65535&e);return(t>>16)+(e>>16)+(r>>16)<<16|65535&r},"undefined"==typeof ArrayBuffer||ArrayBuffer.prototype.slice||function(){function e(t,e){return t=0|t||0,t<0?Math.max(t+e,0):Math.min(t,e)}ArrayBuffer.prototype.slice=function(r,n){var i,a,u,o,s=this.byteLength,f=e(r,s),c=s;return n!==t&&(c=e(n,s)),f>c?new ArrayBuffer(0):(i=c-f,a=new ArrayBuffer(i),u=new Uint8Array(a),o=new Uint8Array(this,f,i),u.set(o),a)}}(),d.prototype.append=function(t){return this.appendBinary(s(t)),this},d.prototype.appendBinary=function(t){this._buff+=t,this._length+=t.length;var n,i=this._buff.length;for(n=64;n<=i;n+=64)e(this._hash,r(this._buff.substring(n-64,n)));return this._buff=this._buff.substring(n-64),this},d.prototype.end=function(t){var e,r,n=this._buff,i=n.length,a=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];for(e=0;e<i;e+=1)a[e>>2]|=n.charCodeAt(e)<<(e%4<<3);return this._finish(a,i),r=o(this._hash),t&&(r=l(r)),this.reset(),r},d.prototype.reset=function(){return this._buff="",this._length=0,this._hash=[1732584193,-271733879,-1732584194,271733878],this},d.prototype.getState=function(){return{buff:this._buff,length:this._length,hash:this._hash}},d.prototype.setState=function(t){return this._buff=t.buff,this._length=t.length,this._hash=t.hash,this},d.prototype.destroy=function(){delete this._hash,delete this._buff,delete this._length},d.prototype._finish=function(t,r){var n,i,a,u=r;if(t[u>>2]|=128<<(u%4<<3),u>55)for(e(this._hash,t),u=0;u<16;u+=1)t[u]=0;n=8*this._length,n=n.toString(16).match(/(.*?)(.{0,8})$/),i=parseInt(n[2],16),a=parseInt(n[1],16)||0,t[14]=i,t[15]=a,e(this._hash,t)},d.hash=function(t,e){return d.hashBinary(s(t),e)},d.hashBinary=function(t,e){var r=i(t),n=o(r);return e?l(n):n},d.ArrayBuffer=function(){this.reset()},d.ArrayBuffer.prototype.append=function(t){var r,i=h(this._buff.buffer,t,!0),a=i.length;for(this._length+=t.byteLength,r=64;r<=a;r+=64)e(this._hash,n(i.subarray(r-64,r)));return this._buff=r-64<a?new Uint8Array(i.buffer.slice(r-64)):new Uint8Array(0),this},d.ArrayBuffer.prototype.end=function(t){var e,r,n=this._buff,i=n.length,a=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];for(e=0;e<i;e+=1)a[e>>2]|=n[e]<<(e%4<<3);return this._finish(a,i),r=o(this._hash),t&&(r=l(r)),this.reset(),r},d.ArrayBuffer.prototype.reset=function(){return this._buff=new Uint8Array(0),this._length=0,this._hash=[1732584193,-271733879,-1732584194,271733878],this},d.ArrayBuffer.prototype.getState=function(){var t=d.prototype.getState.call(this);return t.buff=c(t.buff),t},d.ArrayBuffer.prototype.setState=function(t){return t.buff=f(t.buff,!0),d.prototype.setState.call(this,t)},d.ArrayBuffer.prototype.destroy=d.prototype.destroy,d.ArrayBuffer.prototype._finish=d.prototype._finish,d.ArrayBuffer.hash=function(t,e){var r=a(new Uint8Array(t)),n=o(r);return e?l(n):n},d})},function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.d(e,"a",function(){return u});var i=r(0),a=function(){function t(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,r,n){return r&&t(e.prototype,r),n&&t(e,n),e}}(),u=function(){function t(e,r,a){var u=this;n(this,t),this.file=e,this.attributes={filename:e.name,content_type:e.type,byte_size:e.size,checksum:r},this.xhr=new XMLHttpRequest,this.xhr.open("POST",a,!0),this.xhr.responseType="json",this.xhr.setRequestHeader("Content-Type","application/json"),this.xhr.setRequestHeader("Accept","application/json"),this.xhr.setRequestHeader("X-Requested-With","XMLHttpRequest"),this.xhr.setRequestHeader("X-CSRF-Token",Object(i.d)("csrf-token")),this.xhr.addEventListener("load",function(t){return u.requestDidLoad(t)}),this.xhr.addEventListener("error",function(t){return u.requestDidError(t)})}return a(t,[{key:"create",value:function(t){this.callback=t,this.xhr.send(JSON.stringify({blob:this.attributes}))}},{key:"requestDidLoad",value:function(t){if(this.status>=200&&this.status<300){var e=this.response,r=e.direct_upload;delete e.direct_upload,this.attributes=e,this.directUploadData=r,this.callback(null,this.toJSON())}else this.requestDidError(t)}},{key:"requestDidError",value:function(t){this.callback('Error creating Blob for "'+this.file.name+'". Status: '+this.status)}},{key:"toJSON",value:function(){var t={};for(var e in this.attributes)t[e]=this.attributes[e];return t}},{key:"status",get:function(){return this.xhr.status}},{key:"response",get:function(){var t=this.xhr,e=t.responseType,r=t.response;return"json"==e?r:JSON.parse(r)}}]),t}()},function(t,e,r){"use strict";function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}r.d(e,"a",function(){return a});var i=function(){function t(t,e){for(var r=0;r<e.length;r++){var n=e[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,r,n){return r&&t(e.prototype,r),n&&t(e,n),e}}(),a=function(){function t(e){var r=this;n(this,t),this.blob=e,this.file=e.file;var i=e.directUploadData,a=i.url,u=i.headers;this.xhr=new XMLHttpRequest,this.xhr.open("PUT",a,!0),this.xhr.responseType="text";for(var o in u)this.xhr.setRequestHeader(o,u[o]);this.xhr.addEventListener("load",function(t){return r.requestDidLoad(t)}),this.xhr.addEventListener("error",function(t){return r.requestDidError(t)})}return i(t,[{key:"create",value:function(t){this.callback=t,this.xhr.send(this.file.slice())}},{key:"requestDidLoad",value:function(t){var e=this.xhr,r=e.status,n=e.response;r>=200&&r<300?this.callback(null,n):this.requestDidError(t)}},{key:"requestDidError",value:function(t){this.callback('Error storing "'+this.file.name+'". Status: '+this.xhr.status)}}]),t}()}])}); +/* +Turbolinks 5.2.0 +Copyright © 2018 Basecamp, LLC + */ + +(function(){var t=this;(function(){(function(){this.Turbolinks={supported:function(){return null!=window.history.pushState&&null!=window.requestAnimationFrame&&null!=window.addEventListener}(),visit:function(t,r){return e.controller.visit(t,r)},clearCache:function(){return e.controller.clearCache()},setProgressBarDelay:function(t){return e.controller.setProgressBarDelay(t)}}}).call(this)}).call(t);var e=t.Turbolinks;(function(){(function(){var t,r,n,o=[].slice;e.copyObject=function(t){var e,r,n;r={};for(e in t)n=t[e],r[e]=n;return r},e.closest=function(e,r){return t.call(e,r)},t=function(){var t,e;return t=document.documentElement,null!=(e=t.closest)?e:function(t){var e;for(e=this;e;){if(e.nodeType===Node.ELEMENT_NODE&&r.call(e,t))return e;e=e.parentNode}}}(),e.defer=function(t){return setTimeout(t,1)},e.throttle=function(t){var e;return e=null,function(){var r;return r=1<=arguments.length?o.call(arguments,0):[],null!=e?e:e=requestAnimationFrame(function(n){return function(){return e=null,t.apply(n,r)}}(this))}},e.dispatch=function(t,e){var r,o,i,s,a,u;return a=null!=e?e:{},u=a.target,r=a.cancelable,o=a.data,i=document.createEvent("Events"),i.initEvent(t,!0,r===!0),i.data=null!=o?o:{},i.cancelable&&!n&&(s=i.preventDefault,i.preventDefault=function(){return this.defaultPrevented||Object.defineProperty(this,"defaultPrevented",{get:function(){return!0}}),s.call(this)}),(null!=u?u:document).dispatchEvent(i),i},n=function(){var t;return t=document.createEvent("Events"),t.initEvent("test",!0,!0),t.preventDefault(),t.defaultPrevented}(),e.match=function(t,e){return r.call(t,e)},r=function(){var t,e,r,n;return t=document.documentElement,null!=(e=null!=(r=null!=(n=t.matchesSelector)?n:t.webkitMatchesSelector)?r:t.msMatchesSelector)?e:t.mozMatchesSelector}(),e.uuid=function(){var t,e,r;for(r="",t=e=1;36>=e;t=++e)r+=9===t||14===t||19===t||24===t?"-":15===t?"4":20===t?(Math.floor(4*Math.random())+8).toString(16):Math.floor(15*Math.random()).toString(16);return r}}).call(this),function(){e.Location=function(){function t(t){var e,r;null==t&&(t=""),r=document.createElement("a"),r.href=t.toString(),this.absoluteURL=r.href,e=r.hash.length,2>e?this.requestURL=this.absoluteURL:(this.requestURL=this.absoluteURL.slice(0,-e),this.anchor=r.hash.slice(1))}var e,r,n,o;return t.wrap=function(t){return t instanceof this?t:new this(t)},t.prototype.getOrigin=function(){return this.absoluteURL.split("/",3).join("/")},t.prototype.getPath=function(){var t,e;return null!=(t=null!=(e=this.requestURL.match(/\/\/[^\/]*(\/[^?;]*)/))?e[1]:void 0)?t:"/"},t.prototype.getPathComponents=function(){return this.getPath().split("/").slice(1)},t.prototype.getLastPathComponent=function(){return this.getPathComponents().slice(-1)[0]},t.prototype.getExtension=function(){var t,e;return null!=(t=null!=(e=this.getLastPathComponent().match(/\.[^.]*$/))?e[0]:void 0)?t:""},t.prototype.isHTML=function(){return this.getExtension().match(/^(?:|\.(?:htm|html|xhtml))$/)},t.prototype.isPrefixedBy=function(t){var e;return e=r(t),this.isEqualTo(t)||o(this.absoluteURL,e)},t.prototype.isEqualTo=function(t){return this.absoluteURL===(null!=t?t.absoluteURL:void 0)},t.prototype.toCacheKey=function(){return this.requestURL},t.prototype.toJSON=function(){return this.absoluteURL},t.prototype.toString=function(){return this.absoluteURL},t.prototype.valueOf=function(){return this.absoluteURL},r=function(t){return e(t.getOrigin()+t.getPath())},e=function(t){return n(t,"/")?t:t+"/"},o=function(t,e){return t.slice(0,e.length)===e},n=function(t,e){return t.slice(-e.length)===e},t}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.HttpRequest=function(){function r(r,n,o){this.delegate=r,this.requestCanceled=t(this.requestCanceled,this),this.requestTimedOut=t(this.requestTimedOut,this),this.requestFailed=t(this.requestFailed,this),this.requestLoaded=t(this.requestLoaded,this),this.requestProgressed=t(this.requestProgressed,this),this.url=e.Location.wrap(n).requestURL,this.referrer=e.Location.wrap(o).absoluteURL,this.createXHR()}return r.NETWORK_FAILURE=0,r.TIMEOUT_FAILURE=-1,r.timeout=60,r.prototype.send=function(){var t;return this.xhr&&!this.sent?(this.notifyApplicationBeforeRequestStart(),this.setProgress(0),this.xhr.send(),this.sent=!0,"function"==typeof(t=this.delegate).requestStarted?t.requestStarted():void 0):void 0},r.prototype.cancel=function(){return this.xhr&&this.sent?this.xhr.abort():void 0},r.prototype.requestProgressed=function(t){return t.lengthComputable?this.setProgress(t.loaded/t.total):void 0},r.prototype.requestLoaded=function(){return this.endRequest(function(t){return function(){var e;return 200<=(e=t.xhr.status)&&300>e?t.delegate.requestCompletedWithResponse(t.xhr.responseText,t.xhr.getResponseHeader("Turbolinks-Location")):(t.failed=!0,t.delegate.requestFailedWithStatusCode(t.xhr.status,t.xhr.responseText))}}(this))},r.prototype.requestFailed=function(){return this.endRequest(function(t){return function(){return t.failed=!0,t.delegate.requestFailedWithStatusCode(t.constructor.NETWORK_FAILURE)}}(this))},r.prototype.requestTimedOut=function(){return this.endRequest(function(t){return function(){return t.failed=!0,t.delegate.requestFailedWithStatusCode(t.constructor.TIMEOUT_FAILURE)}}(this))},r.prototype.requestCanceled=function(){return this.endRequest()},r.prototype.notifyApplicationBeforeRequestStart=function(){return e.dispatch("turbolinks:request-start",{data:{url:this.url,xhr:this.xhr}})},r.prototype.notifyApplicationAfterRequestEnd=function(){return e.dispatch("turbolinks:request-end",{data:{url:this.url,xhr:this.xhr}})},r.prototype.createXHR=function(){return this.xhr=new XMLHttpRequest,this.xhr.open("GET",this.url,!0),this.xhr.timeout=1e3*this.constructor.timeout,this.xhr.setRequestHeader("Accept","text/html, application/xhtml+xml"),this.xhr.setRequestHeader("Turbolinks-Referrer",this.referrer),this.xhr.onprogress=this.requestProgressed,this.xhr.onload=this.requestLoaded,this.xhr.onerror=this.requestFailed,this.xhr.ontimeout=this.requestTimedOut,this.xhr.onabort=this.requestCanceled},r.prototype.endRequest=function(t){return this.xhr?(this.notifyApplicationAfterRequestEnd(),null!=t&&t.call(this),this.destroy()):void 0},r.prototype.setProgress=function(t){var e;return this.progress=t,"function"==typeof(e=this.delegate).requestProgressed?e.requestProgressed(this.progress):void 0},r.prototype.destroy=function(){var t;return this.setProgress(1),"function"==typeof(t=this.delegate).requestFinished&&t.requestFinished(),this.delegate=null,this.xhr=null},r}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.ProgressBar=function(){function e(){this.trickle=t(this.trickle,this),this.stylesheetElement=this.createStylesheetElement(),this.progressElement=this.createProgressElement()}var r;return r=300,e.defaultCSS=".turbolinks-progress-bar {\n position: fixed;\n display: block;\n top: 0;\n left: 0;\n height: 3px;\n background: #0076ff;\n z-index: 9999;\n transition: width "+r+"ms ease-out, opacity "+r/2+"ms "+r/2+"ms ease-in;\n transform: translate3d(0, 0, 0);\n}",e.prototype.show=function(){return this.visible?void 0:(this.visible=!0,this.installStylesheetElement(),this.installProgressElement(),this.startTrickling())},e.prototype.hide=function(){return this.visible&&!this.hiding?(this.hiding=!0,this.fadeProgressElement(function(t){return function(){return t.uninstallProgressElement(),t.stopTrickling(),t.visible=!1,t.hiding=!1}}(this))):void 0},e.prototype.setValue=function(t){return this.value=t,this.refresh()},e.prototype.installStylesheetElement=function(){return document.head.insertBefore(this.stylesheetElement,document.head.firstChild)},e.prototype.installProgressElement=function(){return this.progressElement.style.width=0,this.progressElement.style.opacity=1,document.documentElement.insertBefore(this.progressElement,document.body),this.refresh()},e.prototype.fadeProgressElement=function(t){return this.progressElement.style.opacity=0,setTimeout(t,1.5*r)},e.prototype.uninstallProgressElement=function(){return this.progressElement.parentNode?document.documentElement.removeChild(this.progressElement):void 0},e.prototype.startTrickling=function(){return null!=this.trickleInterval?this.trickleInterval:this.trickleInterval=setInterval(this.trickle,r)},e.prototype.stopTrickling=function(){return clearInterval(this.trickleInterval),this.trickleInterval=null},e.prototype.trickle=function(){return this.setValue(this.value+Math.random()/100)},e.prototype.refresh=function(){return requestAnimationFrame(function(t){return function(){return t.progressElement.style.width=10+90*t.value+"%"}}(this))},e.prototype.createStylesheetElement=function(){var t;return t=document.createElement("style"),t.type="text/css",t.textContent=this.constructor.defaultCSS,t},e.prototype.createProgressElement=function(){var t;return t=document.createElement("div"),t.className="turbolinks-progress-bar",t},e}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.BrowserAdapter=function(){function r(r){this.controller=r,this.showProgressBar=t(this.showProgressBar,this),this.progressBar=new e.ProgressBar}var n,o,i;return i=e.HttpRequest,n=i.NETWORK_FAILURE,o=i.TIMEOUT_FAILURE,r.prototype.visitProposedToLocationWithAction=function(t,e){return this.controller.startVisitToLocationWithAction(t,e)},r.prototype.visitStarted=function(t){return t.issueRequest(),t.changeHistory(),t.loadCachedSnapshot()},r.prototype.visitRequestStarted=function(t){return this.progressBar.setValue(0),t.hasCachedSnapshot()||"restore"!==t.action?this.showProgressBarAfterDelay():this.showProgressBar()},r.prototype.visitRequestProgressed=function(t){return this.progressBar.setValue(t.progress)},r.prototype.visitRequestCompleted=function(t){return t.loadResponse()},r.prototype.visitRequestFailedWithStatusCode=function(t,e){switch(e){case n:case o:return this.reload();default:return t.loadResponse()}},r.prototype.visitRequestFinished=function(t){return this.hideProgressBar()},r.prototype.visitCompleted=function(t){return t.followRedirect()},r.prototype.pageInvalidated=function(){return this.reload()},r.prototype.showProgressBarAfterDelay=function(){return this.progressBarTimeout=setTimeout(this.showProgressBar,this.controller.progressBarDelay)},r.prototype.showProgressBar=function(){return this.progressBar.show()},r.prototype.hideProgressBar=function(){return this.progressBar.hide(),clearTimeout(this.progressBarTimeout)},r.prototype.reload=function(){return window.location.reload()},r}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.History=function(){function r(e){this.delegate=e,this.onPageLoad=t(this.onPageLoad,this),this.onPopState=t(this.onPopState,this)}return r.prototype.start=function(){return this.started?void 0:(addEventListener("popstate",this.onPopState,!1),addEventListener("load",this.onPageLoad,!1),this.started=!0)},r.prototype.stop=function(){return this.started?(removeEventListener("popstate",this.onPopState,!1),removeEventListener("load",this.onPageLoad,!1),this.started=!1):void 0},r.prototype.push=function(t,r){return t=e.Location.wrap(t),this.update("push",t,r)},r.prototype.replace=function(t,r){return t=e.Location.wrap(t),this.update("replace",t,r)},r.prototype.onPopState=function(t){var r,n,o,i;return this.shouldHandlePopState()&&(i=null!=(n=t.state)?n.turbolinks:void 0)?(r=e.Location.wrap(window.location),o=i.restorationIdentifier,this.delegate.historyPoppedToLocationWithRestorationIdentifier(r,o)):void 0},r.prototype.onPageLoad=function(t){return e.defer(function(t){return function(){return t.pageLoaded=!0}}(this))},r.prototype.shouldHandlePopState=function(){return this.pageIsLoaded()},r.prototype.pageIsLoaded=function(){return this.pageLoaded||"complete"===document.readyState},r.prototype.update=function(t,e,r){var n;return n={turbolinks:{restorationIdentifier:r}},history[t+"State"](n,null,e)},r}()}.call(this),function(){e.HeadDetails=function(){function t(t){var e,r,n,s,a,u;for(this.elements={},n=0,a=t.length;a>n;n++)u=t[n],u.nodeType===Node.ELEMENT_NODE&&(s=u.outerHTML,r=null!=(e=this.elements)[s]?e[s]:e[s]={type:i(u),tracked:o(u),elements:[]},r.elements.push(u))}var e,r,n,o,i;return t.fromHeadElement=function(t){var e;return new this(null!=(e=null!=t?t.childNodes:void 0)?e:[])},t.prototype.hasElementWithKey=function(t){return t in this.elements},t.prototype.getTrackedElementSignature=function(){var t,e;return function(){var r,n;r=this.elements,n=[];for(t in r)e=r[t].tracked,e&&n.push(t);return n}.call(this).join("")},t.prototype.getScriptElementsNotInDetails=function(t){return this.getElementsMatchingTypeNotInDetails("script",t)},t.prototype.getStylesheetElementsNotInDetails=function(t){return this.getElementsMatchingTypeNotInDetails("stylesheet",t)},t.prototype.getElementsMatchingTypeNotInDetails=function(t,e){var r,n,o,i,s,a;o=this.elements,s=[];for(n in o)i=o[n],a=i.type,r=i.elements,a!==t||e.hasElementWithKey(n)||s.push(r[0]);return s},t.prototype.getProvisionalElements=function(){var t,e,r,n,o,i,s;r=[],n=this.elements;for(e in n)o=n[e],s=o.type,i=o.tracked,t=o.elements,null!=s||i?t.length>1&&r.push.apply(r,t.slice(1)):r.push.apply(r,t);return r},t.prototype.getMetaValue=function(t){var e;return null!=(e=this.findMetaElementByName(t))?e.getAttribute("content"):void 0},t.prototype.findMetaElementByName=function(t){var r,n,o,i;r=void 0,i=this.elements;for(o in i)n=i[o].elements,e(n[0],t)&&(r=n[0]);return r},i=function(t){return r(t)?"script":n(t)?"stylesheet":void 0},o=function(t){return"reload"===t.getAttribute("data-turbolinks-track")},r=function(t){var e;return e=t.tagName.toLowerCase(),"script"===e},n=function(t){var e;return e=t.tagName.toLowerCase(),"style"===e||"link"===e&&"stylesheet"===t.getAttribute("rel")},e=function(t,e){var r;return r=t.tagName.toLowerCase(),"meta"===r&&t.getAttribute("name")===e},t}()}.call(this),function(){e.Snapshot=function(){function t(t,e){this.headDetails=t,this.bodyElement=e}return t.wrap=function(t){return t instanceof this?t:"string"==typeof t?this.fromHTMLString(t):this.fromHTMLElement(t)},t.fromHTMLString=function(t){var e;return e=document.createElement("html"),e.innerHTML=t,this.fromHTMLElement(e)},t.fromHTMLElement=function(t){var r,n,o,i;return o=t.querySelector("head"),r=null!=(i=t.querySelector("body"))?i:document.createElement("body"),n=e.HeadDetails.fromHeadElement(o),new this(n,r)},t.prototype.clone=function(){return new this.constructor(this.headDetails,this.bodyElement.cloneNode(!0))},t.prototype.getRootLocation=function(){var t,r;return r=null!=(t=this.getSetting("root"))?t:"/",new e.Location(r)},t.prototype.getCacheControlValue=function(){return this.getSetting("cache-control")},t.prototype.getElementForAnchor=function(t){try{return this.bodyElement.querySelector("[id='"+t+"'], a[name='"+t+"']")}catch(e){}},t.prototype.getPermanentElements=function(){return this.bodyElement.querySelectorAll("[id][data-turbolinks-permanent]")},t.prototype.getPermanentElementById=function(t){return this.bodyElement.querySelector("#"+t+"[data-turbolinks-permanent]")},t.prototype.getPermanentElementsPresentInSnapshot=function(t){var e,r,n,o,i;for(o=this.getPermanentElements(),i=[],r=0,n=o.length;n>r;r++)e=o[r],t.getPermanentElementById(e.id)&&i.push(e);return i},t.prototype.findFirstAutofocusableElement=function(){return this.bodyElement.querySelector("[autofocus]")},t.prototype.hasAnchor=function(t){return null!=this.getElementForAnchor(t)},t.prototype.isPreviewable=function(){return"no-preview"!==this.getCacheControlValue()},t.prototype.isCacheable=function(){return"no-cache"!==this.getCacheControlValue()},t.prototype.isVisitable=function(){return"reload"!==this.getSetting("visit-control")},t.prototype.getSetting=function(t){return this.headDetails.getMetaValue("turbolinks-"+t)},t}()}.call(this),function(){var t=[].slice;e.Renderer=function(){function e(){}var r;return e.render=function(){var e,r,n,o;return n=arguments[0],r=arguments[1],e=3<=arguments.length?t.call(arguments,2):[],o=function(t,e,r){r.prototype=t.prototype;var n=new r,o=t.apply(n,e);return Object(o)===o?o:n}(this,e,function(){}),o.delegate=n,o.render(r),o},e.prototype.renderView=function(t){return this.delegate.viewWillRender(this.newBody),t(),this.delegate.viewRendered(this.newBody)},e.prototype.invalidateView=function(){return this.delegate.viewInvalidated()},e.prototype.createScriptElement=function(t){var e;return"false"===t.getAttribute("data-turbolinks-eval")?t:(e=document.createElement("script"),e.textContent=t.textContent,e.async=!1,r(e,t),e)},r=function(t,e){var r,n,o,i,s,a,u;for(i=e.attributes,a=[],r=0,n=i.length;n>r;r++)s=i[r],o=s.name,u=s.value,a.push(t.setAttribute(o,u));return a},e}()}.call(this),function(){var t,r,n=function(t,e){function r(){this.constructor=t}for(var n in e)o.call(e,n)&&(t[n]=e[n]);return r.prototype=e.prototype,t.prototype=new r,t.__super__=e.prototype,t},o={}.hasOwnProperty;e.SnapshotRenderer=function(e){function o(t,e,r){this.currentSnapshot=t,this.newSnapshot=e,this.isPreview=r,this.currentHeadDetails=this.currentSnapshot.headDetails,this.newHeadDetails=this.newSnapshot.headDetails,this.currentBody=this.currentSnapshot.bodyElement,this.newBody=this.newSnapshot.bodyElement}return n(o,e),o.prototype.render=function(t){return this.shouldRender()?(this.mergeHead(),this.renderView(function(e){return function(){return e.replaceBody(),e.isPreview||e.focusFirstAutofocusableElement(),t()}}(this))):this.invalidateView()},o.prototype.mergeHead=function(){return this.copyNewHeadStylesheetElements(),this.copyNewHeadScriptElements(),this.removeCurrentHeadProvisionalElements(),this.copyNewHeadProvisionalElements()},o.prototype.replaceBody=function(){var t;return t=this.relocateCurrentBodyPermanentElements(),this.activateNewBodyScriptElements(),this.assignNewBody(),this.replacePlaceholderElementsWithClonedPermanentElements(t)},o.prototype.shouldRender=function(){return this.newSnapshot.isVisitable()&&this.trackedElementsAreIdentical()},o.prototype.trackedElementsAreIdentical=function(){return this.currentHeadDetails.getTrackedElementSignature()===this.newHeadDetails.getTrackedElementSignature()},o.prototype.copyNewHeadStylesheetElements=function(){var t,e,r,n,o;for(n=this.getNewHeadStylesheetElements(),o=[],e=0,r=n.length;r>e;e++)t=n[e],o.push(document.head.appendChild(t));return o},o.prototype.copyNewHeadScriptElements=function(){var t,e,r,n,o;for(n=this.getNewHeadScriptElements(),o=[],e=0,r=n.length;r>e;e++)t=n[e],o.push(document.head.appendChild(this.createScriptElement(t)));return o},o.prototype.removeCurrentHeadProvisionalElements=function(){var t,e,r,n,o;for(n=this.getCurrentHeadProvisionalElements(),o=[],e=0,r=n.length;r>e;e++)t=n[e],o.push(document.head.removeChild(t));return o},o.prototype.copyNewHeadProvisionalElements=function(){var t,e,r,n,o;for(n=this.getNewHeadProvisionalElements(),o=[],e=0,r=n.length;r>e;e++)t=n[e],o.push(document.head.appendChild(t));return o},o.prototype.relocateCurrentBodyPermanentElements=function(){var e,n,o,i,s,a,u;for(a=this.getCurrentBodyPermanentElements(),u=[],e=0,n=a.length;n>e;e++)i=a[e],s=t(i),o=this.newSnapshot.getPermanentElementById(i.id),r(i,s.element),r(o,i),u.push(s);return u},o.prototype.replacePlaceholderElementsWithClonedPermanentElements=function(t){var e,n,o,i,s,a,u;for(u=[],o=0,i=t.length;i>o;o++)a=t[o],n=a.element,s=a.permanentElement,e=s.cloneNode(!0),u.push(r(n,e));return u},o.prototype.activateNewBodyScriptElements=function(){var t,e,n,o,i,s;for(i=this.getNewBodyScriptElements(),s=[],e=0,o=i.length;o>e;e++)n=i[e],t=this.createScriptElement(n),s.push(r(n,t));return s},o.prototype.assignNewBody=function(){return document.body=this.newBody},o.prototype.focusFirstAutofocusableElement=function(){var t;return null!=(t=this.newSnapshot.findFirstAutofocusableElement())?t.focus():void 0},o.prototype.getNewHeadStylesheetElements=function(){return this.newHeadDetails.getStylesheetElementsNotInDetails(this.currentHeadDetails)},o.prototype.getNewHeadScriptElements=function(){return this.newHeadDetails.getScriptElementsNotInDetails(this.currentHeadDetails)},o.prototype.getCurrentHeadProvisionalElements=function(){return this.currentHeadDetails.getProvisionalElements()},o.prototype.getNewHeadProvisionalElements=function(){return this.newHeadDetails.getProvisionalElements()},o.prototype.getCurrentBodyPermanentElements=function(){return this.currentSnapshot.getPermanentElementsPresentInSnapshot(this.newSnapshot)},o.prototype.getNewBodyScriptElements=function(){return this.newBody.querySelectorAll("script")},o}(e.Renderer),t=function(t){var e;return e=document.createElement("meta"),e.setAttribute("name","turbolinks-permanent-placeholder"),e.setAttribute("content",t.id),{element:e,permanentElement:t}},r=function(t,e){var r;return(r=t.parentNode)?r.replaceChild(e,t):void 0}}.call(this),function(){var t=function(t,e){function n(){this.constructor=t}for(var o in e)r.call(e,o)&&(t[o]=e[o]);return n.prototype=e.prototype,t.prototype=new n,t.__super__=e.prototype,t},r={}.hasOwnProperty;e.ErrorRenderer=function(e){function r(t){var e;e=document.createElement("html"),e.innerHTML=t,this.newHead=e.querySelector("head"),this.newBody=e.querySelector("body")}return t(r,e),r.prototype.render=function(t){return this.renderView(function(e){return function(){return e.replaceHeadAndBody(),e.activateBodyScriptElements(),t()}}(this))},r.prototype.replaceHeadAndBody=function(){var t,e;return e=document.head,t=document.body,e.parentNode.replaceChild(this.newHead,e),t.parentNode.replaceChild(this.newBody,t)},r.prototype.activateBodyScriptElements=function(){var t,e,r,n,o,i;for(n=this.getScriptElements(),i=[],e=0,r=n.length;r>e;e++)o=n[e],t=this.createScriptElement(o),i.push(o.parentNode.replaceChild(t,o));return i},r.prototype.getScriptElements=function(){return document.documentElement.querySelectorAll("script")},r}(e.Renderer)}.call(this),function(){e.View=function(){function t(t){this.delegate=t,this.htmlElement=document.documentElement}return t.prototype.getRootLocation=function(){return this.getSnapshot().getRootLocation()},t.prototype.getElementForAnchor=function(t){return this.getSnapshot().getElementForAnchor(t)},t.prototype.getSnapshot=function(){return e.Snapshot.fromHTMLElement(this.htmlElement)},t.prototype.render=function(t,e){var r,n,o;return o=t.snapshot,r=t.error,n=t.isPreview,this.markAsPreview(n),null!=o?this.renderSnapshot(o,n,e):this.renderError(r,e)},t.prototype.markAsPreview=function(t){return t?this.htmlElement.setAttribute("data-turbolinks-preview",""):this.htmlElement.removeAttribute("data-turbolinks-preview")},t.prototype.renderSnapshot=function(t,r,n){return e.SnapshotRenderer.render(this.delegate,n,this.getSnapshot(),e.Snapshot.wrap(t),r)},t.prototype.renderError=function(t,r){return e.ErrorRenderer.render(this.delegate,r,t)},t}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.ScrollManager=function(){function r(r){this.delegate=r,this.onScroll=t(this.onScroll,this),this.onScroll=e.throttle(this.onScroll)}return r.prototype.start=function(){return this.started?void 0:(addEventListener("scroll",this.onScroll,!1),this.onScroll(),this.started=!0)},r.prototype.stop=function(){return this.started?(removeEventListener("scroll",this.onScroll,!1),this.started=!1):void 0},r.prototype.scrollToElement=function(t){return t.scrollIntoView()},r.prototype.scrollToPosition=function(t){var e,r;return e=t.x,r=t.y,window.scrollTo(e,r)},r.prototype.onScroll=function(t){return this.updatePosition({x:window.pageXOffset,y:window.pageYOffset})},r.prototype.updatePosition=function(t){var e;return this.position=t,null!=(e=this.delegate)?e.scrollPositionChanged(this.position):void 0},r}()}.call(this),function(){e.SnapshotCache=function(){function t(t){this.size=t,this.keys=[],this.snapshots={}}var r;return t.prototype.has=function(t){var e;return e=r(t),e in this.snapshots},t.prototype.get=function(t){var e;if(this.has(t))return e=this.read(t),this.touch(t),e},t.prototype.put=function(t,e){return this.write(t,e),this.touch(t),e},t.prototype.read=function(t){var e;return e=r(t),this.snapshots[e]},t.prototype.write=function(t,e){var n;return n=r(t),this.snapshots[n]=e},t.prototype.touch=function(t){var e,n;return n=r(t),e=this.keys.indexOf(n),e>-1&&this.keys.splice(e,1),this.keys.unshift(n),this.trim()},t.prototype.trim=function(){var t,e,r,n,o;for(n=this.keys.splice(this.size),o=[],t=0,r=n.length;r>t;t++)e=n[t],o.push(delete this.snapshots[e]);return o},r=function(t){return e.Location.wrap(t).toCacheKey()},t}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.Visit=function(){function r(r,n,o){this.controller=r,this.action=o,this.performScroll=t(this.performScroll,this),this.identifier=e.uuid(),this.location=e.Location.wrap(n),this.adapter=this.controller.adapter,this.state="initialized",this.timingMetrics={}}var n;return r.prototype.start=function(){return"initialized"===this.state?(this.recordTimingMetric("visitStart"),this.state="started",this.adapter.visitStarted(this)):void 0},r.prototype.cancel=function(){var t;return"started"===this.state?(null!=(t=this.request)&&t.cancel(),this.cancelRender(),this.state="canceled"):void 0},r.prototype.complete=function(){var t;return"started"===this.state?(this.recordTimingMetric("visitEnd"),this.state="completed","function"==typeof(t=this.adapter).visitCompleted&&t.visitCompleted(this),this.controller.visitCompleted(this)):void 0},r.prototype.fail=function(){var t;return"started"===this.state?(this.state="failed","function"==typeof(t=this.adapter).visitFailed?t.visitFailed(this):void 0):void 0},r.prototype.changeHistory=function(){var t,e;return this.historyChanged?void 0:(t=this.location.isEqualTo(this.referrer)?"replace":this.action,e=n(t),this.controller[e](this.location,this.restorationIdentifier),this.historyChanged=!0)},r.prototype.issueRequest=function(){return this.shouldIssueRequest()&&null==this.request?(this.progress=0,this.request=new e.HttpRequest(this,this.location,this.referrer),this.request.send()):void 0},r.prototype.getCachedSnapshot=function(){var t;return!(t=this.controller.getCachedSnapshotForLocation(this.location))||null!=this.location.anchor&&!t.hasAnchor(this.location.anchor)||"restore"!==this.action&&!t.isPreviewable()?void 0:t},r.prototype.hasCachedSnapshot=function(){return null!=this.getCachedSnapshot()},r.prototype.loadCachedSnapshot=function(){var t,e;return(e=this.getCachedSnapshot())?(t=this.shouldIssueRequest(),this.render(function(){var r;return this.cacheSnapshot(),this.controller.render({snapshot:e,isPreview:t},this.performScroll),"function"==typeof(r=this.adapter).visitRendered&&r.visitRendered(this),t?void 0:this.complete()})):void 0},r.prototype.loadResponse=function(){return null!=this.response?this.render(function(){var t,e;return this.cacheSnapshot(),this.request.failed?(this.controller.render({error:this.response},this.performScroll),"function"==typeof(t=this.adapter).visitRendered&&t.visitRendered(this),this.fail()):(this.controller.render({snapshot:this.response},this.performScroll),"function"==typeof(e=this.adapter).visitRendered&&e.visitRendered(this),this.complete())}):void 0},r.prototype.followRedirect=function(){return this.redirectedToLocation&&!this.followedRedirect?(this.location=this.redirectedToLocation,this.controller.replaceHistoryWithLocationAndRestorationIdentifier(this.redirectedToLocation,this.restorationIdentifier),this.followedRedirect=!0):void 0},r.prototype.requestStarted=function(){var t;return this.recordTimingMetric("requestStart"),"function"==typeof(t=this.adapter).visitRequestStarted?t.visitRequestStarted(this):void 0},r.prototype.requestProgressed=function(t){var e;return this.progress=t,"function"==typeof(e=this.adapter).visitRequestProgressed?e.visitRequestProgressed(this):void 0},r.prototype.requestCompletedWithResponse=function(t,r){return this.response=t,null!=r&&(this.redirectedToLocation=e.Location.wrap(r)),this.adapter.visitRequestCompleted(this)},r.prototype.requestFailedWithStatusCode=function(t,e){return this.response=e,this.adapter.visitRequestFailedWithStatusCode(this,t)},r.prototype.requestFinished=function(){var t;return this.recordTimingMetric("requestEnd"),"function"==typeof(t=this.adapter).visitRequestFinished?t.visitRequestFinished(this):void 0},r.prototype.performScroll=function(){return this.scrolled?void 0:("restore"===this.action?this.scrollToRestoredPosition()||this.scrollToTop():this.scrollToAnchor()||this.scrollToTop(),this.scrolled=!0)},r.prototype.scrollToRestoredPosition=function(){var t,e;return t=null!=(e=this.restorationData)?e.scrollPosition:void 0,null!=t?(this.controller.scrollToPosition(t),!0):void 0},r.prototype.scrollToAnchor=function(){return null!=this.location.anchor?(this.controller.scrollToAnchor(this.location.anchor),!0):void 0},r.prototype.scrollToTop=function(){return this.controller.scrollToPosition({x:0,y:0})},r.prototype.recordTimingMetric=function(t){var e;return null!=(e=this.timingMetrics)[t]?e[t]:e[t]=(new Date).getTime()},r.prototype.getTimingMetrics=function(){return e.copyObject(this.timingMetrics)},n=function(t){switch(t){case"replace":return"replaceHistoryWithLocationAndRestorationIdentifier";case"advance":case"restore":return"pushHistoryWithLocationAndRestorationIdentifier"}},r.prototype.shouldIssueRequest=function(){return"restore"===this.action?!this.hasCachedSnapshot():!0},r.prototype.cacheSnapshot=function(){return this.snapshotCached?void 0:(this.controller.cacheSnapshot(),this.snapshotCached=!0)},r.prototype.render=function(t){return this.cancelRender(),this.frame=requestAnimationFrame(function(e){return function(){return e.frame=null,t.call(e)}}(this))},r.prototype.cancelRender=function(){return this.frame?cancelAnimationFrame(this.frame):void 0},r}()}.call(this),function(){var t=function(t,e){return function(){return t.apply(e,arguments)}};e.Controller=function(){function r(){this.clickBubbled=t(this.clickBubbled,this),this.clickCaptured=t(this.clickCaptured,this),this.pageLoaded=t(this.pageLoaded,this),this.history=new e.History(this),this.view=new e.View(this),this.scrollManager=new e.ScrollManager(this),this.restorationData={},this.clearCache(),this.setProgressBarDelay(500)}return r.prototype.start=function(){return e.supported&&!this.started?(addEventListener("click",this.clickCaptured,!0),addEventListener("DOMContentLoaded",this.pageLoaded,!1),this.scrollManager.start(),this.startHistory(),this.started=!0,this.enabled=!0):void 0},r.prototype.disable=function(){return this.enabled=!1},r.prototype.stop=function(){return this.started?(removeEventListener("click",this.clickCaptured,!0),removeEventListener("DOMContentLoaded",this.pageLoaded,!1),this.scrollManager.stop(),this.stopHistory(),this.started=!1):void 0},r.prototype.clearCache=function(){return this.cache=new e.SnapshotCache(10)},r.prototype.visit=function(t,r){var n,o;return null==r&&(r={}),t=e.Location.wrap(t),this.applicationAllowsVisitingLocation(t)?this.locationIsVisitable(t)?(n=null!=(o=r.action)?o:"advance",this.adapter.visitProposedToLocationWithAction(t,n)):window.location=t:void 0},r.prototype.startVisitToLocationWithAction=function(t,r,n){var o;return e.supported?(o=this.getRestorationDataForIdentifier(n),this.startVisit(t,r,{restorationData:o})):window.location=t},r.prototype.setProgressBarDelay=function(t){return this.progressBarDelay=t},r.prototype.startHistory=function(){return this.location=e.Location.wrap(window.location),this.restorationIdentifier=e.uuid(),this.history.start(),this.history.replace(this.location,this.restorationIdentifier)},r.prototype.stopHistory=function(){return this.history.stop()},r.prototype.pushHistoryWithLocationAndRestorationIdentifier=function(t,r){return this.restorationIdentifier=r,this.location=e.Location.wrap(t),this.history.push(this.location,this.restorationIdentifier)},r.prototype.replaceHistoryWithLocationAndRestorationIdentifier=function(t,r){return this.restorationIdentifier=r,this.location=e.Location.wrap(t),this.history.replace(this.location,this.restorationIdentifier)},r.prototype.historyPoppedToLocationWithRestorationIdentifier=function(t,r){var n;return this.restorationIdentifier=r,this.enabled?(n=this.getRestorationDataForIdentifier(this.restorationIdentifier),this.startVisit(t,"restore",{restorationIdentifier:this.restorationIdentifier,restorationData:n,historyChanged:!0}),this.location=e.Location.wrap(t)):this.adapter.pageInvalidated()},r.prototype.getCachedSnapshotForLocation=function(t){var e;return null!=(e=this.cache.get(t))?e.clone():void 0},r.prototype.shouldCacheSnapshot=function(){return this.view.getSnapshot().isCacheable(); +},r.prototype.cacheSnapshot=function(){var t,r;return this.shouldCacheSnapshot()?(this.notifyApplicationBeforeCachingSnapshot(),r=this.view.getSnapshot(),t=this.lastRenderedLocation,e.defer(function(e){return function(){return e.cache.put(t,r.clone())}}(this))):void 0},r.prototype.scrollToAnchor=function(t){var e;return(e=this.view.getElementForAnchor(t))?this.scrollToElement(e):this.scrollToPosition({x:0,y:0})},r.prototype.scrollToElement=function(t){return this.scrollManager.scrollToElement(t)},r.prototype.scrollToPosition=function(t){return this.scrollManager.scrollToPosition(t)},r.prototype.scrollPositionChanged=function(t){var e;return e=this.getCurrentRestorationData(),e.scrollPosition=t},r.prototype.render=function(t,e){return this.view.render(t,e)},r.prototype.viewInvalidated=function(){return this.adapter.pageInvalidated()},r.prototype.viewWillRender=function(t){return this.notifyApplicationBeforeRender(t)},r.prototype.viewRendered=function(){return this.lastRenderedLocation=this.currentVisit.location,this.notifyApplicationAfterRender()},r.prototype.pageLoaded=function(){return this.lastRenderedLocation=this.location,this.notifyApplicationAfterPageLoad()},r.prototype.clickCaptured=function(){return removeEventListener("click",this.clickBubbled,!1),addEventListener("click",this.clickBubbled,!1)},r.prototype.clickBubbled=function(t){var e,r,n;return this.enabled&&this.clickEventIsSignificant(t)&&(r=this.getVisitableLinkForNode(t.target))&&(n=this.getVisitableLocationForLink(r))&&this.applicationAllowsFollowingLinkToLocation(r,n)?(t.preventDefault(),e=this.getActionForLink(r),this.visit(n,{action:e})):void 0},r.prototype.applicationAllowsFollowingLinkToLocation=function(t,e){var r;return r=this.notifyApplicationAfterClickingLinkToLocation(t,e),!r.defaultPrevented},r.prototype.applicationAllowsVisitingLocation=function(t){var e;return e=this.notifyApplicationBeforeVisitingLocation(t),!e.defaultPrevented},r.prototype.notifyApplicationAfterClickingLinkToLocation=function(t,r){return e.dispatch("turbolinks:click",{target:t,data:{url:r.absoluteURL},cancelable:!0})},r.prototype.notifyApplicationBeforeVisitingLocation=function(t){return e.dispatch("turbolinks:before-visit",{data:{url:t.absoluteURL},cancelable:!0})},r.prototype.notifyApplicationAfterVisitingLocation=function(t){return e.dispatch("turbolinks:visit",{data:{url:t.absoluteURL}})},r.prototype.notifyApplicationBeforeCachingSnapshot=function(){return e.dispatch("turbolinks:before-cache")},r.prototype.notifyApplicationBeforeRender=function(t){return e.dispatch("turbolinks:before-render",{data:{newBody:t}})},r.prototype.notifyApplicationAfterRender=function(){return e.dispatch("turbolinks:render")},r.prototype.notifyApplicationAfterPageLoad=function(t){return null==t&&(t={}),e.dispatch("turbolinks:load",{data:{url:this.location.absoluteURL,timing:t}})},r.prototype.startVisit=function(t,e,r){var n;return null!=(n=this.currentVisit)&&n.cancel(),this.currentVisit=this.createVisit(t,e,r),this.currentVisit.start(),this.notifyApplicationAfterVisitingLocation(t)},r.prototype.createVisit=function(t,r,n){var o,i,s,a,u;return i=null!=n?n:{},a=i.restorationIdentifier,s=i.restorationData,o=i.historyChanged,u=new e.Visit(this,t,r),u.restorationIdentifier=null!=a?a:e.uuid(),u.restorationData=e.copyObject(s),u.historyChanged=o,u.referrer=this.location,u},r.prototype.visitCompleted=function(t){return this.notifyApplicationAfterPageLoad(t.getTimingMetrics())},r.prototype.clickEventIsSignificant=function(t){return!(t.defaultPrevented||t.target.isContentEditable||t.which>1||t.altKey||t.ctrlKey||t.metaKey||t.shiftKey)},r.prototype.getVisitableLinkForNode=function(t){return this.nodeIsVisitable(t)?e.closest(t,"a[href]:not([target]):not([download])"):void 0},r.prototype.getVisitableLocationForLink=function(t){var r;return r=new e.Location(t.getAttribute("href")),this.locationIsVisitable(r)?r:void 0},r.prototype.getActionForLink=function(t){var e;return null!=(e=t.getAttribute("data-turbolinks-action"))?e:"advance"},r.prototype.nodeIsVisitable=function(t){var r;return(r=e.closest(t,"[data-turbolinks]"))?"false"!==r.getAttribute("data-turbolinks"):!0},r.prototype.locationIsVisitable=function(t){return t.isPrefixedBy(this.view.getRootLocation())&&t.isHTML()},r.prototype.getCurrentRestorationData=function(){return this.getRestorationDataForIdentifier(this.restorationIdentifier)},r.prototype.getRestorationDataForIdentifier=function(t){var e;return null!=(e=this.restorationData)[t]?e[t]:e[t]={}},r}()}.call(this),function(){!function(){var t,e;if((t=e=document.currentScript)&&!e.hasAttribute("data-turbolinks-suppress-warning"))for(;t=t.parentNode;)if(t===document.body)return console.warn("You are loading Turbolinks from a <script> element inside the <body> element. This is probably not what you meant to do!\n\nLoad your application\u2019s JavaScript bundle inside the <head> element instead. <script> elements in <body> are evaluated with each page change.\n\nFor more information, see: https://github.com/turbolinks/turbolinks#working-with-script-elements\n\n\u2014\u2014\nSuppress this warning by adding a `data-turbolinks-suppress-warning` attribute to: %s",e.outerHTML)}()}.call(this),function(){var t,r,n;e.start=function(){return r()?(null==e.controller&&(e.controller=t()),e.controller.start()):void 0},r=function(){return null==window.Turbolinks&&(window.Turbolinks=e),n()},t=function(){var t;return t=new e.Controller,t.adapter=new e.BrowserAdapter(t),t},n=function(){return window.Turbolinks===e},n()&&e.start()}.call(this)}).call(this),"object"==typeof module&&module.exports?module.exports=e:"function"==typeof define&&define.amd&&define(e)}).call(this); +/*! + * jQuery JavaScript Library v3.4.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: 2019-05-01T21:04Z + */ + +( 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 = {}; + +var isFunction = function isFunction( obj ) { + + // Support: Chrome <=57, Firefox <=52 + // In some browsers, typeof returns "function" for HTML <object> elements + // (i.e., `typeof document.createElement( "object" ) === "function"`). + // We don't want to classify *any* DOM node as a function. + return typeof obj === "function" && typeof obj.nodeType !== "number"; + }; + + +var isWindow = function isWindow( obj ) { + return obj != null && obj === obj.window; + }; + + + + + var preservedScriptAttributes = { + type: true, + src: true, + nonce: true, + noModule: true + }; + + function DOMEval( code, node, doc ) { + doc = doc || document; + + var i, val, + script = doc.createElement( "script" ); + + script.text = code; + if ( node ) { + for ( i in preservedScriptAttributes ) { + + // Support: Firefox 64+, Edge 18+ + // Some browsers don't support the "nonce" property on scripts. + // On the other hand, just using `getAttribute` is not enough as + // the `nonce` attribute is reset to an empty string whenever it + // becomes browsing-context connected. + // See https://github.com/whatwg/html/issues/2369 + // See https://html.spec.whatwg.org/#nonce-attributes + // The `node.getAttribute` check was added for the sake of + // `jQuery.globalEval` so that it can fake a nonce-containing node + // via an object. + val = node[ i ] || node.getAttribute && node.getAttribute( i ); + if ( val ) { + script.setAttribute( i, val ); + } + } + } + doc.head.appendChild( script ).parentNode.removeChild( script ); + } + + +function toType( 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; +} +/* 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.4.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; + +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" && !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 ) { + copy = options[ name ]; + + // Prevent Object.prototype pollution + // Prevent never-ending loop + if ( name === "__proto__" || target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + src = target[ name ]; + + // Ensure proper type for the source value + if ( copyIsArray && !Array.isArray( src ) ) { + clone = []; + } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { + clone = {}; + } else { + clone = src; + } + copyIsArray = false; + + // 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() {}, + + 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 ) { + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + // Evaluates a script in a global context + globalEval: function( code, options ) { + DOMEval( code, { nonce: options && options.nonce } ); + }, + + 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, + + // 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 = toType( obj ); + + if ( isFunction( obj ) || 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.4 + * https://sizzlejs.com/ + * + * Copyright JS Foundation and other contributors + * Released under the MIT license + * https://js.foundation/ + * + * Date: 2019-04-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(), + nonnativeSelectorCache = 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 + "*" ), + rdescend = new RegExp( whitespace + "|>" ), + + 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" ) + }, + + rhtml = /HTML$/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(); + }, + + inDisabledFieldset = addCombinator( + function( elem ) { + return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; + }, + { 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 && + !nonnativeSelectorCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) && + + // Support: IE 8 only + // Exclude object elements + (nodeType !== 1 || context.nodeName.toLowerCase() !== "object") ) { + + newSelector = selector; + newContext = context; + + // qSA considers elements outside a scoping root when evaluating child or + // descendant combinators, which is not what we want. + // In such cases, we work around the behavior by prefixing every selector in the + // list with an ID selector referencing the scope context. + // Thanks to Andrew Dupont for this technique. + if ( nodeType === 1 && rdescend.test( selector ) ) { + + // 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; + } + + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + nonnativeSelectorCache( selector, true ); + } 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 && + inDisabledFieldset( 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 ) { + var namespace = elem.namespaceURI, + docElem = (elem.ownerDocument || elem).documentElement; + + // Support: IE <=8 + // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes + // https://bugs.jquery.com/ticket/4833 + return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); +}; + +/** + * 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 = "<a id='" + expando + "'></a>" + + "<select id='" + expando + "-\r\\' msallowcapture=''>" + + "<option selected=''></option></select>"; + + // 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 = "<a href='' disabled='disabled'></a>" + + "<select disabled='disabled'><option/></select>"; + + // 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 ); + } + + if ( support.matchesSelector && documentIsHTML && + !nonnativeSelectorCache[ 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) { + nonnativeSelectorCache( expr, true ); + } + } + + 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 || 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 > length ? + 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: <number>) 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 = "<a href='#'></a>"; + 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 = "<input/>"; + 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 ); + + + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( 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; + } ); + } + + // Filtered directly for both simple and complex selectors + return jQuery.filter( qualifier, elements, not ); +} + +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 <tag> 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 ( 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 ( 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 ( typeof elem.contentDocument !== "undefined" ) { + 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 ( isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && toType( 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 && isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && 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 = 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 && 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 ( 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, + isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + 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, + + // rejected_handlers.disable + // fulfilled_handlers.disable + tuples[ 3 - i ][ 3 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock, + + // progress_handlers.lock + tuples[ 0 ][ 3 ].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" || + 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 ( toType( 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 ( !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; +}; + + +// Matches dashed string for camelizing +var rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g; + +// Used by camelCase as callback to replace() +function fcamelCase( all, letter ) { + return letter.toUpperCase(); +} + +// Convert dashed to camelCase; used by the css and data modules +// Support: IE <=9 - 11, Edge 12 - 15 +// Microsoft forgot to hump their vendor prefix (#9572) +function camelCase( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); +} +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[ camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ 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 ][ 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( camelCase ); + } else { + key = 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 = 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 documentElement = document.documentElement; + + + + var isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ); + }, + composed = { composed: true }; + + // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only + // Check attachment across shadow DOM boundaries when possible (gh-3504) + // Support: iOS 10.0-10.2 only + // Early iOS 10 versions support `attachShadow` but not `getRootNode`, + // leading to errors. We need to check for `getRootNode`. + if ( documentElement.getRootNode ) { + isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ) || + elem.getRootNode( composed ) === elem.ownerDocument; + }; + } +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. + isAttached( 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, + 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 = elem.nodeType && + ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Support: Firefox <=54 + // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) + initial = initial / 2; + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + while ( maxIterations-- ) { + + // Evaluate and update our best guess (doubling guesses that zero out). + // Finish if the scale equals or crosses 1 (making the old*new product non-positive). + jQuery.style( elem, prop, initialInUnit + unit ); + if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { + maxIterations = 0; + } + initialInUnit = initialInUnit / scale; + + } + + initialInUnit = initialInUnit * 2; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + } + + 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 = ( /^$|^module$|\/(?:java|ecma)script/i ); + + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + + // Support: IE <=9 only + option: [ 1, "<select multiple='multiple'>", "</select>" ], + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting <tbody> or other required elements. + thead: [ 1, "<table>", "</table>" ], + col: [ 2, "<table><colgroup>", "</colgroup></table>" ], + tr: [ 2, "<table><tbody>", "</tbody></table>" ], + td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], + + _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, attached, 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 ( toType( 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; + } + + attached = isAttached( elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( attached ) { + 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 = "<textarea>x</textarea>"; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; +} )(); + + +var + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE <=9 - 11+ +// focus() and blur() are asynchronous, except when they are no-op. +// So expect focus to be synchronous when the element is already active, +// and blur to be synchronous when the element is not already active. +// (focus and blur are always synchronous in other supported browsers, +// this just defines when we can count on it). +function expectSync( elem, type ) { + return ( elem === safeActiveElement() ) === ( type === "focus" ); +} + +// Support: IE <=9 only +// Accessing document.activeElement can throw unexpectedly +// https://bugs.jquery.com/ticket/13393 +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() ) { + + // If the event is namespaced, then each handler is only invoked if it is + // specially universal or its namespaces are a superset of the event's. + if ( !event.rnamespace || handleObj.namespace === false || + 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 <use> 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: 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 + }, + click: { + + // Utilize native event to ensure correct state for checkable inputs + setup: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Claim the first handler + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + // dataPriv.set( el, "click", ... ) + leverageNative( el, "click", returnTrue ); + } + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Force setup before triggering a click + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + leverageNative( el, "click" ); + } + + // Return non-false to allow normal event-path propagation + return true; + }, + + // For cross-browser consistency, suppress native .click() on links + // Also prevent it if we're currently inside a leveraged native-event stack + _default: function( event ) { + var target = event.target; + return rcheckableType.test( target.type ) && + target.click && nodeName( target, "input" ) && + dataPriv.get( target, "click" ) || + nodeName( 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; + } + } + } + } +}; + +// Ensure the presence of an event listener that handles manually-triggered +// synthetic events by interrupting progress until reinvoked in response to +// *native* events that it fires directly, ensuring that state changes have +// already occurred before other listeners are invoked. +function leverageNative( el, type, expectSync ) { + + // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add + if ( !expectSync ) { + if ( dataPriv.get( el, type ) === undefined ) { + jQuery.event.add( el, type, returnTrue ); + } + return; + } + + // Register the controller as a special universal handler for all event namespaces + dataPriv.set( el, type, false ); + jQuery.event.add( el, type, { + namespace: false, + handler: function( event ) { + var notAsync, result, + saved = dataPriv.get( this, type ); + + if ( ( event.isTrigger & 1 ) && this[ type ] ) { + + // Interrupt processing of the outer synthetic .trigger()ed event + // Saved data should be false in such cases, but might be a leftover capture object + // from an async native handler (gh-4350) + if ( !saved.length ) { + + // Store arguments for use when handling the inner native event + // There will always be at least one argument (an event object), so this array + // will not be confused with a leftover capture object. + saved = slice.call( arguments ); + dataPriv.set( this, type, saved ); + + // Trigger the native event and capture its result + // Support: IE <=9 - 11+ + // focus() and blur() are asynchronous + notAsync = expectSync( this, type ); + this[ type ](); + result = dataPriv.get( this, type ); + if ( saved !== result || notAsync ) { + dataPriv.set( this, type, false ); + } else { + result = {}; + } + if ( saved !== result ) { + + // Cancel the outer synthetic event + event.stopImmediatePropagation(); + event.preventDefault(); + return result.value; + } + + // If this is an inner synthetic event for an event with a bubbling surrogate + // (focus or blur), assume that the surrogate already propagated from triggering the + // native event and prevent that from happening again here. + // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the + // bubbling surrogate propagates *after* the non-bubbling base), but that seems + // less bad than duplication. + } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { + event.stopPropagation(); + } + + // If this is a native event triggered above, everything is now in order + // Fire an inner synthetic event with the original arguments + } else if ( saved.length ) { + + // ...and capture the result + dataPriv.set( this, type, { + value: jQuery.event.trigger( + + // Support: IE <=9 - 11+ + // Extend with the prototype to reset the above stopImmediatePropagation() + jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), + saved.slice( 1 ), + this + ) + } ); + + // Abort handling of the native event + event.stopImmediatePropagation(); + } + } + } ); +} + +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 || Date.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, + code: 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 ); + +jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { + jQuery.event.special[ type ] = { + + // Utilize native event if possible so blur/focus sequence is correct + setup: function() { + + // Claim the first handler + // dataPriv.set( this, "focus", ... ) + // dataPriv.set( this, "blur", ... ) + leverageNative( this, type, expectSync ); + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function() { + + // Force setup before trigger + leverageNative( this, type ); + + // Return non-false to allow normal event-path propagation + return true; + }, + + delegateType: delegateType + }; +} ); + +// 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 only + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /<script|<style|<link/i, + + // checked="checked" or checked + rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, + rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\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( elem ).children( "tbody" )[ 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 ) { + if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { + elem.type = elem.type.slice( 5 ); + } 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 ], + valueIsFunction = isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( valueIsFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( valueIsFunction ) { + 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 && ( node.type || "" ).toLowerCase() !== "module" ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl && !node.noModule ) { + jQuery._evalUrl( node.src, { + nonce: node.nonce || node.getAttribute( "nonce" ) + } ); + } + } else { + DOMEval( node.textContent.replace( rcleanScript, "" ), node, 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 && isAttached( node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html.replace( rxhtmlTag, "<$1></$2>" ); + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = isAttached( 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 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 ); + }; + +var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); + + + +( 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; + } + + container.style.cssText = "position:absolute;left:-11111px;width:60px;" + + "margin-top:1px;padding:0;border:0"; + div.style.cssText = + "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + + "margin:auto;border:1px;padding:1px;" + + "width:60%;top:1%"; + documentElement.appendChild( container ).appendChild( div ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; + + // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 + // Some styles come back with percentage values, even though they shouldn't + div.style.right = "60%"; + pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; + + // Support: IE 9 - 11 only + // Detect misreporting of content dimensions for box-sizing:border-box elements + boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; + + // Support: IE 9 only + // Detect overflow:scroll screwiness (gh-3699) + // Support: Chrome <=64 + // Don't get tricked when zoom affects offsetWidth (gh-4029) + div.style.position = "absolute"; + scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; + + 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; + } + + function roundPixelMeasures( measure ) { + return Math.round( parseFloat( measure ) ); + } + + var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, + 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"; + + jQuery.extend( support, { + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelBoxStyles: function() { + computeStyleTests(); + return pixelBoxStylesVal; + }, + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + }, + scrollboxSize: function() { + computeStyleTests(); + return scrollboxSizeVal; + } + } ); +} )(); + + +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 === "" && !isAttached( 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.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.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 cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style, + vendorProps = {}; + +// Return a vendor-prefixed property or undefined +function vendorPropName( 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 potentially-mapped jQuery.cssProps or vendor prefixed property +function finalPropName( name ) { + var final = jQuery.cssProps[ name ] || vendorProps[ name ]; + + if ( final ) { + return final; + } + if ( name in emptyStyle ) { + return name; + } + return vendorProps[ name ] = vendorPropName( name ) || name; +} + + +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" + }; + +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 boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { + var i = dimension === "width" ? 1 : 0, + extra = 0, + delta = 0; + + // Adjustment may not be necessary + if ( box === ( isBorderBox ? "border" : "content" ) ) { + return 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin + if ( box === "margin" ) { + delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); + } + + // If we get here with a content-box, we're seeking "padding" or "border" or "margin" + if ( !isBorderBox ) { + + // Add padding + delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // For "border" or "margin", add border + if ( box !== "padding" ) { + delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + + // But still keep track of it otherwise + } else { + extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + + // If we get here with a border-box (content + padding + border), we're seeking "content" or + // "padding" or "margin" + } else { + + // For "content", subtract padding + if ( box === "content" ) { + delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // For "content" or "padding", subtract border + if ( box !== "margin" ) { + delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + // Account for positive content-box scroll gutter when requested by providing computedVal + if ( !isBorderBox && computedVal >= 0 ) { + + // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border + // Assuming integer scroll gutter, subtract the rest and round down + delta += Math.max( 0, Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + computedVal - + delta - + extra - + 0.5 + + // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter + // Use an explicit zero to avoid NaN (gh-3964) + ) ) || 0; + } + + return delta; +} + +function getWidthOrHeight( elem, dimension, extra ) { + + // Start with computed style + var styles = getStyles( elem ), + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). + // Fake content-box until we know it's needed to know the true value. + boxSizingNeeded = !support.boxSizingReliable() || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + valueIsBorderBox = isBorderBox, + + val = curCSS( elem, dimension, styles ), + offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); + + // Support: Firefox <=54 + // Return a confounding non-pixel value or feign ignorance, as appropriate. + if ( rnumnonpx.test( val ) ) { + if ( !extra ) { + return val; + } + val = "auto"; + } + + + // Fall back to offsetWidth/offsetHeight when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + // Support: Android <=4.1 - 4.3 only + // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) + // Support: IE 9-11 only + // Also use offsetWidth/offsetHeight for when box sizing is unreliable + // We use getClientRects() to check for hidden/disconnected. + // In those cases, the computed value can be trusted to be border-box + if ( ( !support.boxSizingReliable() && isBorderBox || + val === "auto" || + !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && + elem.getClientRects().length ) { + + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Where available, offsetWidth/offsetHeight approximate border box dimensions. + // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the + // retrieved value as a content box dimension. + valueIsBorderBox = offsetProp in elem; + if ( valueIsBorderBox ) { + val = elem[ offsetProp ]; + } + } + + // Normalize "" and auto + val = parseFloat( val ) || 0; + + // Adjust for the element's box model + return ( val + + boxModelAdjustment( + elem, + dimension, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles, + + // Provide the current computed size to request scroll gutter calculation (gh-3589) + val + ) + ) + "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, + "gridArea": true, + "gridColumn": true, + "gridColumnEnd": true, + "gridColumnStart": true, + "gridRow": true, + "gridRowEnd": true, + "gridRowStart": 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: {}, + + // 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 = 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) + // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append + // "px" to a few hardcoded values. + if ( type === "number" && !isCustomProp ) { + 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 = 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, dimension ) { + jQuery.cssHooks[ dimension ] = { + 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, dimension, extra ); + } ) : + getWidthOrHeight( elem, dimension, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = getStyles( elem ), + + // Only read styles.position if the test has a chance to fail + // to avoid forcing a reflow. + scrollboxSizeBuggy = !support.scrollboxSize() && + styles.position === "absolute", + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) + boxSizingNeeded = scrollboxSizeBuggy || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + subtract = extra ? + boxModelAdjustment( + elem, + dimension, + extra, + isBorderBox, + styles + ) : + 0; + + // Account for unreliable border-box dimensions by comparing offset* to computed and + // faking a content-box to get border and padding (gh-3699) + if ( isBorderBox && scrollboxSizeBuggy ) { + subtract -= Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + parseFloat( styles[ dimension ] ) - + boxModelAdjustment( elem, dimension, "border", false, styles ) - + 0.5 + ); + } + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ dimension ] = value; + value = jQuery.css( elem, dimension ); + } + + 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 ( prefix !== "margin" ) { + 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 && ( + jQuery.cssHooks[ tween.prop ] || + tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { + 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 = Date.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 - 15 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY and Edge just mirrors + // the overflowX value there. + 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 = 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 ( isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + result.stop.bind( result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( 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 ( 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 || + isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !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 ( 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 = Date.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://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +function classesToArray( value ) { + if ( Array.isArray( value ) ) { + return value; + } + if ( typeof value === "string" ) { + return value.match( rnothtmlwhite ) || []; + } + return []; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classes, elem, cur, curValue, clazz, j, finalValue, + i = 0; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + 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 ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + classes = classesToArray( value ); + + if ( classes.length ) { + 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, + isValidValue = type === "string" || Array.isArray( value ); + + if ( typeof stateVal === "boolean" && isValidValue ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + if ( 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 ( isValidValue ) { + + // Toggle individual class names + i = 0; + self = jQuery( this ); + classNames = classesToArray( value ); + + 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, valueIsFunction, + 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; + } + + valueIsFunction = isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( valueIsFunction ) { + 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 + + +support.focusin = "onfocusin" in window; + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + stopPropagationCallback = function( e ) { + e.stopPropagation(); + }; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = lastElement = 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 && !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() ) { + lastElement = cur; + 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 && isFunction( elem[ type ] ) && !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; + + if ( event.isPropagationStopped() ) { + lastElement.addEventListener( type, stopPropagationCallback ); + } + + elem[ type ](); + + if ( event.isPropagationStopped() ) { + lastElement.removeEventListener( type, stopPropagationCallback ); + } + + 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 ); + } + } +} ); + + +// 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 = Date.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 && toType( 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 = isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + if ( a == null ) { + return ""; + } + + // 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 ( 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() + " " ] = + ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) + .concat( match[ 2 ] ); + } + } + match = responseHeaders[ key.toLowerCase() + " " ]; + } + return match == null ? null : match.join( ", " ); + }, + + // 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 - 15 + // 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 and should be processed, append data to url + if ( s.data && ( s.processData || typeof s.data === "string" ) ) { + 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 ( 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, options ) { + 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, + + // Only evaluate the response if it is successful (gh-4126) + // dataFilter is not invoked for failure responses, so using it instead + // of the default converter is kludgy but it works. + converters: { + "text script": function() {} + }, + dataFilter: function( response ) { + jQuery.globalEval( response, options ); + } + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( 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 ( 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 htmlIsFunction = isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( htmlIsFunction ? 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.ontimeout = + 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 = xhr.ontimeout = 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 or forced-by-attrs requests + if ( s.crossDomain || s.scriptAttrs ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( "<script>" ) + .attr( s.scriptAttrs || {} ) + .prop( { charset: s.scriptCharset, src: s.url } ) + .on( "load error", callback = function( evt ) { + script.remove(); + callback = null; + if ( evt ) { + complete( evt.type === "error" ? 404 : 200, evt.type ); + } + } ); + + // Use native DOM manipulation to avoid our domManip AJAX trickery + document.head.appendChild( script[ 0 ] ); + }, + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +var oldCallbacks = [], + rjsonp = /(=)\?(?=&|$)|\?\?/; + +// Default jsonp settings +jQuery.ajaxSetup( { + jsonp: "callback", + jsonpCallback: function() { + var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) ); + this[ callback ] = true; + return callback; + } +} ); + +// Detect, normalize options and install callbacks for jsonp requests +jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { + + var callbackName, overwritten, responseContainer, + jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ? + "url" : + typeof s.data === "string" && + ( s.contentType || "" ) + .indexOf( "application/x-www-form-urlencoded" ) === 0 && + rjsonp.test( s.data ) && "data" + ); + + // Handle iff the expected data type is "jsonp" or we have a parameter to set + if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) { + + // Get callback name, remembering preexisting value associated with it + callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ? + s.jsonpCallback() : + s.jsonpCallback; + + // Insert callback into url or form data + if ( jsonProp ) { + s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName ); + } else if ( s.jsonp !== false ) { + s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName; + } + + // Use data converter to retrieve json after script execution + s.converters[ "script json" ] = function() { + if ( !responseContainer ) { + jQuery.error( callbackName + " was not called" ); + } + return responseContainer[ 0 ]; + }; + + // Force json dataType + s.dataTypes[ 0 ] = "json"; + + // Install callback + overwritten = window[ callbackName ]; + window[ callbackName ] = function() { + responseContainer = arguments; + }; + + // Clean-up function (fires after converters) + jqXHR.always( function() { + + // If previous value didn't exist - remove it + if ( overwritten === undefined ) { + jQuery( window ).removeProp( callbackName ); + + // Otherwise restore preexisting value + } else { + window[ callbackName ] = overwritten; + } + + // Save back as free + if ( s[ callbackName ] ) { + + // Make sure that re-using the options doesn't screw things around + s.jsonpCallback = originalSettings.jsonpCallback; + + // Save the callback name for future use + oldCallbacks.push( callbackName ); + } + + // Call if it was a function and we have a response + if ( responseContainer && isFunction( overwritten ) ) { + overwritten( responseContainer[ 0 ] ); + } + + responseContainer = overwritten = undefined; + } ); + + // Delegate to script + return "script"; + } +} ); + + + + +// Support: Safari 8 only +// In Safari 8 documents created via document.implementation.createHTMLDocument +// collapse sibling forms: the second one becomes a child of the first one. +// Because of that, this security measure has to be disabled in Safari 8. +// https://bugs.webkit.org/show_bug.cgi?id=137337 +support.createHTMLDocument = ( function() { + var body = document.implementation.createHTMLDocument( "" ).body; + body.innerHTML = "<form></form><form></form>"; + return body.childNodes.length === 2; +} )(); + + +// Argument "data" should be string of html +// context (optional): If specified, the fragment will be created in this context, +// defaults to document +// keepScripts (optional): If true, will include scripts passed in the html string +jQuery.parseHTML = function( data, context, keepScripts ) { + if ( typeof data !== "string" ) { + return []; + } + if ( typeof context === "boolean" ) { + keepScripts = context; + context = false; + } + + var base, parsed, scripts; + + if ( !context ) { + + // Stop scripts or inline event handlers from being executed immediately + // by using document.implementation + if ( support.createHTMLDocument ) { + context = document.implementation.createHTMLDocument( "" ); + + // Set the base href for the created document + // so any parsed elements with URLs + // are based on the document's URL (gh-2965) + base = context.createElement( "base" ); + base.href = document.location.href; + context.head.appendChild( base ); + } else { + context = document; + } + } + + parsed = rsingleTag.exec( data ); + scripts = !keepScripts && []; + + // Single tag + if ( parsed ) { + return [ context.createElement( parsed[ 1 ] ) ]; + } + + parsed = buildFragment( [ data ], context, scripts ); + + if ( scripts && scripts.length ) { + jQuery( scripts ).remove(); + } + + return jQuery.merge( [], parsed.childNodes ); +}; + + +/** + * Load a url into a page + */ +jQuery.fn.load = function( url, params, callback ) { + var selector, type, response, + self = this, + off = url.indexOf( " " ); + + if ( off > -1 ) { + selector = stripAndCollapse( url.slice( off ) ); + url = url.slice( 0, off ); + } + + // If it's a function + if ( isFunction( params ) ) { + + // We assume that it's the callback + callback = params; + params = undefined; + + // Otherwise, build a param string + } else if ( params && typeof params === "object" ) { + type = "POST"; + } + + // If we have elements to modify, make the request + if ( self.length > 0 ) { + jQuery.ajax( { + url: url, + + // If "type" variable is undefined, then "GET" method will be used. + // Make value of this field explicit since + // user can override it through ajaxSetup method + type: type || "GET", + dataType: "html", + data: params + } ).done( function( responseText ) { + + // Save response for use in complete callback + response = arguments; + + self.html( selector ? + + // If a selector was specified, locate the right elements in a dummy div + // Exclude scripts to avoid IE 'Permission Denied' errors + jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) : + + // Otherwise use the full result + responseText ); + + // If the request succeeds, this function gets "data", "status", "jqXHR" + // but they are ignored because response was set above. + // If it fails, this function gets "jqXHR", "status", "error" + } ).always( callback && function( jqXHR, status ) { + self.each( function() { + callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] ); + } ); + } ); + } + + return this; +}; + + + + +// Attach a bunch of functions for handling common AJAX events +jQuery.each( [ + "ajaxStart", + "ajaxStop", + "ajaxComplete", + "ajaxError", + "ajaxSuccess", + "ajaxSend" +], function( i, type ) { + jQuery.fn[ type ] = function( fn ) { + return this.on( type, fn ); + }; +} ); + + + + +jQuery.expr.pseudos.animated = function( elem ) { + return jQuery.grep( jQuery.timers, function( fn ) { + return elem === fn.elem; + } ).length; +}; + + + + +jQuery.offset = { + setOffset: function( elem, options, i ) { + var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition, + position = jQuery.css( elem, "position" ), + curElem = jQuery( elem ), + props = {}; + + // Set position first, in-case top/left are set even on static elem + if ( position === "static" ) { + elem.style.position = "relative"; + } + + curOffset = curElem.offset(); + curCSSTop = jQuery.css( elem, "top" ); + curCSSLeft = jQuery.css( elem, "left" ); + calculatePosition = ( position === "absolute" || position === "fixed" ) && + ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1; + + // Need to be able to calculate position if either + // top or left is auto and position is either absolute or fixed + if ( calculatePosition ) { + curPosition = curElem.position(); + curTop = curPosition.top; + curLeft = curPosition.left; + + } else { + curTop = parseFloat( curCSSTop ) || 0; + curLeft = parseFloat( curCSSLeft ) || 0; + } + + if ( isFunction( options ) ) { + + // Use jQuery.extend here to allow modification of coordinates argument (gh-1848) + options = options.call( elem, i, jQuery.extend( {}, curOffset ) ); + } + + if ( options.top != null ) { + props.top = ( options.top - curOffset.top ) + curTop; + } + if ( options.left != null ) { + props.left = ( options.left - curOffset.left ) + curLeft; + } + + if ( "using" in options ) { + options.using.call( elem, props ); + + } else { + curElem.css( props ); + } + } +}; + +jQuery.fn.extend( { + + // offset() relates an element's border box to the document origin + offset: function( options ) { + + // Preserve chaining for setter + if ( arguments.length ) { + return options === undefined ? + this : + this.each( function( i ) { + jQuery.offset.setOffset( this, options, i ); + } ); + } + + var rect, win, + elem = this[ 0 ]; + + if ( !elem ) { + return; + } + + // Return zeros for disconnected and hidden (display: none) elements (gh-2310) + // Support: IE <=11 only + // Running getBoundingClientRect on a + // disconnected node in IE throws an error + if ( !elem.getClientRects().length ) { + return { top: 0, left: 0 }; + } + + // Get document-relative position by adding viewport scroll to viewport-relative gBCR + rect = elem.getBoundingClientRect(); + win = elem.ownerDocument.defaultView; + return { + top: rect.top + win.pageYOffset, + left: rect.left + win.pageXOffset + }; + }, + + // position() relates an element's margin box to its offset parent's padding box + // This corresponds to the behavior of CSS absolute positioning + position: function() { + if ( !this[ 0 ] ) { + return; + } + + var offsetParent, offset, doc, + elem = this[ 0 ], + parentOffset = { top: 0, left: 0 }; + + // position:fixed elements are offset from the viewport, which itself always has zero offset + if ( jQuery.css( elem, "position" ) === "fixed" ) { + + // Assume position:fixed implies availability of getBoundingClientRect + offset = elem.getBoundingClientRect(); + + } else { + offset = this.offset(); + + // Account for the *real* offset parent, which can be the document or its root element + // when a statically positioned element is identified + doc = elem.ownerDocument; + offsetParent = elem.offsetParent || doc.documentElement; + while ( offsetParent && + ( offsetParent === doc.body || offsetParent === doc.documentElement ) && + jQuery.css( offsetParent, "position" ) === "static" ) { + + offsetParent = offsetParent.parentNode; + } + if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) { + + // Incorporate borders into its offset, since they are outside its content origin + parentOffset = jQuery( offsetParent ).offset(); + parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true ); + parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true ); + } + } + + // Subtract parent offsets and element margins + return { + top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ), + left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true ) + }; + }, + + // This method will return documentElement in the following cases: + // 1) For the element inside the iframe without offsetParent, this method will return + // documentElement of the parent window + // 2) For the hidden or detached element + // 3) For body or html element, i.e. in case of the html node - it will return itself + // + // but those exceptions were never presented as a real life use-cases + // and might be considered as more preferable results. + // + // This logic, however, is not guaranteed and can change at any point in the future + offsetParent: function() { + return this.map( function() { + var offsetParent = this.offsetParent; + + while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) { + offsetParent = offsetParent.offsetParent; + } + + return offsetParent || documentElement; + } ); + } +} ); + +// Create scrollLeft and scrollTop methods +jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) { + var top = "pageYOffset" === prop; + + jQuery.fn[ method ] = function( val ) { + return access( this, function( elem, method, val ) { + + // Coalesce documents and windows + var win; + if ( isWindow( elem ) ) { + win = elem; + } else if ( elem.nodeType === 9 ) { + win = elem.defaultView; + } + + if ( val === undefined ) { + return win ? win[ prop ] : elem[ method ]; + } + + if ( win ) { + win.scrollTo( + !top ? val : win.pageXOffset, + top ? val : win.pageYOffset + ); + + } else { + elem[ method ] = val; + } + }, method, val, arguments.length ); + }; +} ); + +// Support: Safari <=7 - 9.1, Chrome <=37 - 49 +// Add the top/left cssHooks using jQuery.fn.position +// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084 +// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347 +// getComputedStyle returns percent when specified for top/left/bottom/right; +// rather than make the css module depend on the offset module, just check for it here +jQuery.each( [ "top", "left" ], function( i, prop ) { + jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition, + function( elem, computed ) { + if ( computed ) { + computed = curCSS( elem, prop ); + + // If curCSS returns percentage, fallback to offset + return rnumnonpx.test( computed ) ? + jQuery( elem ).position()[ prop ] + "px" : + computed; + } + } + ); +} ); + + +// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods +jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { + jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, + function( defaultExtra, funcName ) { + + // Margin is only for outerHeight, outerWidth + jQuery.fn[ funcName ] = function( margin, value ) { + var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ), + extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" ); + + return access( this, function( elem, type, value ) { + var doc; + + if ( isWindow( elem ) ) { + + // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729) + return funcName.indexOf( "outer" ) === 0 ? + elem[ "inner" + name ] : + elem.document.documentElement[ "client" + name ]; + } + + // Get document width or height + if ( elem.nodeType === 9 ) { + doc = elem.documentElement; + + // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], + // whichever is greatest + return Math.max( + elem.body[ "scroll" + name ], doc[ "scroll" + name ], + elem.body[ "offset" + name ], doc[ "offset" + name ], + doc[ "client" + name ] + ); + } + + return value === undefined ? + + // Get width or height on the element, requesting but not forcing parseFloat + jQuery.css( elem, type, extra ) : + + // Set width or height on the element + jQuery.style( elem, type, value, extra ); + }, type, chainable ? margin : undefined, chainable ); + }; + } ); +} ); + + +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 ); + } +} ); + + + + +jQuery.fn.extend( { + + bind: function( types, data, fn ) { + return this.on( types, null, data, fn ); + }, + unbind: function( types, fn ) { + return this.off( types, null, fn ); + }, + + delegate: function( selector, types, data, fn ) { + return this.on( types, selector, data, fn ); + }, + undelegate: function( selector, types, fn ) { + + // ( namespace ) or ( selector, types [, fn] ) + return arguments.length === 1 ? + this.off( selector, "**" ) : + this.off( types, selector || "**", fn ); + } +} ); + +// Bind a function to a context, optionally partially applying any +// arguments. +// jQuery.proxy is deprecated to promote standards (specifically Function#bind) +// However, it is not slated for removal any time soon +jQuery.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 ( !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; +}; + +jQuery.holdReady = function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } +}; +jQuery.isArray = Array.isArray; +jQuery.parseJSON = JSON.parse; +jQuery.nodeName = nodeName; +jQuery.isFunction = isFunction; +jQuery.isWindow = isWindow; +jQuery.camelCase = camelCase; +jQuery.type = toType; + +jQuery.now = Date.now; + +jQuery.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 ) ); +}; + + + + +// Register as a named AMD module, since jQuery can be concatenated with other +// files that may use define, but not via a proper concatenation script that +// understands anonymous AMD modules. A named AMD is safest and most robust +// way to register. Lowercase jquery is used because AMD module names are +// derived from file names, and jQuery is normally delivered in a lowercase +// file name. Do this after creating the global so that if an AMD module wants +// to call noConflict to hide this version of jQuery, it will work. + +// Note that for maximum portability, libraries that are not jQuery should +// declare themselves as anonymous modules, and avoid setting a global if an +// AMD loader is present. jQuery is a special case. For more information, see +// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon + +if ( typeof define === "function" && define.amd ) { + define( "jquery", [], function() { + return jQuery; + } ); +} + + + + +var + + // Map over jQuery in case of overwrite + _jQuery = window.jQuery, + + // Map over the $ in case of overwrite + _$ = window.$; + +jQuery.noConflict = function( deep ) { + if ( window.$ === jQuery ) { + window.$ = _$; + } + + if ( deep && window.jQuery === jQuery ) { + window.jQuery = _jQuery; + } + + return jQuery; +}; + +// Expose jQuery and $ identifiers, even in AMD +// (#7102#comment:10, https://github.com/jquery/jquery/pull/557) +// and CommonJS for browser emulators (#13566) +if ( !noGlobal ) { + window.jQuery = window.$ = jQuery; +} + + + + +return jQuery; +} ); +/**! + * @fileOverview Kickass library to create and place poppers near their reference elements. + * @version 1.14.5 + * @license + * Copyright (c) 2016 Federico Zivolo and contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global.Popper = factory()); +}(this, (function () { 'use strict'; + +var isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined'; + +var longerTimeoutBrowsers = ['Edge', 'Trident', 'Firefox']; +var timeoutDuration = 0; +for (var i = 0; i < longerTimeoutBrowsers.length; i += 1) { + if (isBrowser && navigator.userAgent.indexOf(longerTimeoutBrowsers[i]) >= 0) { + timeoutDuration = 1; + break; + } +} + +function microtaskDebounce(fn) { + var called = false; + return function () { + if (called) { + return; + } + called = true; + window.Promise.resolve().then(function () { + called = false; + fn(); + }); + }; +} + +function taskDebounce(fn) { + var scheduled = false; + return function () { + if (!scheduled) { + scheduled = true; + setTimeout(function () { + scheduled = false; + fn(); + }, timeoutDuration); + } + }; +} + +var supportsMicroTasks = isBrowser && window.Promise; + +/** +* Create a debounced version of a method, that's asynchronously deferred +* but called in the minimum time possible. +* +* @method +* @memberof Popper.Utils +* @argument {Function} fn +* @returns {Function} +*/ +var debounce = supportsMicroTasks ? microtaskDebounce : taskDebounce; + +/** + * Check if the given variable is a function + * @method + * @memberof Popper.Utils + * @argument {Any} functionToCheck - variable to check + * @returns {Boolean} answer to: is a function? + */ +function isFunction(functionToCheck) { + var getType = {}; + return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]'; +} + +/** + * Get CSS computed property of the given element + * @method + * @memberof Popper.Utils + * @argument {Eement} element + * @argument {String} property + */ +function getStyleComputedProperty(element, property) { + if (element.nodeType !== 1) { + return []; + } + // NOTE: 1 DOM access here + var window = element.ownerDocument.defaultView; + var css = window.getComputedStyle(element, null); + return property ? css[property] : css; +} + +/** + * Returns the parentNode or the host of the element + * @method + * @memberof Popper.Utils + * @argument {Element} element + * @returns {Element} parent + */ +function getParentNode(element) { + if (element.nodeName === 'HTML') { + return element; + } + return element.parentNode || element.host; +} + +/** + * Returns the scrolling parent of the given element + * @method + * @memberof Popper.Utils + * @argument {Element} element + * @returns {Element} scroll parent + */ +function getScrollParent(element) { + // Return body, `getScroll` will take care to get the correct `scrollTop` from it + if (!element) { + return document.body; + } + + switch (element.nodeName) { + case 'HTML': + case 'BODY': + return element.ownerDocument.body; + case '#document': + return element.body; + } + + // Firefox want us to check `-x` and `-y` variations as well + + var _getStyleComputedProp = getStyleComputedProperty(element), + overflow = _getStyleComputedProp.overflow, + overflowX = _getStyleComputedProp.overflowX, + overflowY = _getStyleComputedProp.overflowY; + + if (/(auto|scroll|overlay)/.test(overflow + overflowY + overflowX)) { + return element; + } + + return getScrollParent(getParentNode(element)); +} + +var isIE11 = isBrowser && !!(window.MSInputMethodContext && document.documentMode); +var isIE10 = isBrowser && /MSIE 10/.test(navigator.userAgent); + +/** + * Determines if the browser is Internet Explorer + * @method + * @memberof Popper.Utils + * @param {Number} version to check + * @returns {Boolean} isIE + */ +function isIE(version) { + if (version === 11) { + return isIE11; + } + if (version === 10) { + return isIE10; + } + return isIE11 || isIE10; +} + +/** + * Returns the offset parent of the given element + * @method + * @memberof Popper.Utils + * @argument {Element} element + * @returns {Element} offset parent + */ +function getOffsetParent(element) { + if (!element) { + return document.documentElement; + } + + var noOffsetParent = isIE(10) ? document.body : null; + + // NOTE: 1 DOM access here + var offsetParent = element.offsetParent || null; + // Skip hidden elements which don't have an offsetParent + while (offsetParent === noOffsetParent && element.nextElementSibling) { + offsetParent = (element = element.nextElementSibling).offsetParent; + } + + var nodeName = offsetParent && offsetParent.nodeName; + + if (!nodeName || nodeName === 'BODY' || nodeName === 'HTML') { + return element ? element.ownerDocument.documentElement : document.documentElement; + } + + // .offsetParent will return the closest TH, TD or TABLE in case + // no offsetParent is present, I hate this job... + if (['TH', 'TD', 'TABLE'].indexOf(offsetParent.nodeName) !== -1 && getStyleComputedProperty(offsetParent, 'position') === 'static') { + return getOffsetParent(offsetParent); + } + + return offsetParent; +} + +function isOffsetContainer(element) { + var nodeName = element.nodeName; + + if (nodeName === 'BODY') { + return false; + } + return nodeName === 'HTML' || getOffsetParent(element.firstElementChild) === element; +} + +/** + * Finds the root node (document, shadowDOM root) of the given element + * @method + * @memberof Popper.Utils + * @argument {Element} node + * @returns {Element} root node + */ +function getRoot(node) { + if (node.parentNode !== null) { + return getRoot(node.parentNode); + } + + return node; +} + +/** + * Finds the offset parent common to the two provided nodes + * @method + * @memberof Popper.Utils + * @argument {Element} element1 + * @argument {Element} element2 + * @returns {Element} common offset parent + */ +function findCommonOffsetParent(element1, element2) { + // This check is needed to avoid errors in case one of the elements isn't defined for any reason + if (!element1 || !element1.nodeType || !element2 || !element2.nodeType) { + return document.documentElement; + } + + // Here we make sure to give as "start" the element that comes first in the DOM + var order = element1.compareDocumentPosition(element2) & Node.DOCUMENT_POSITION_FOLLOWING; + var start = order ? element1 : element2; + var end = order ? element2 : element1; + + // Get common ancestor container + var range = document.createRange(); + range.setStart(start, 0); + range.setEnd(end, 0); + var commonAncestorContainer = range.commonAncestorContainer; + + // Both nodes are inside #document + + if (element1 !== commonAncestorContainer && element2 !== commonAncestorContainer || start.contains(end)) { + if (isOffsetContainer(commonAncestorContainer)) { + return commonAncestorContainer; + } + + return getOffsetParent(commonAncestorContainer); + } + + // one of the nodes is inside shadowDOM, find which one + var element1root = getRoot(element1); + if (element1root.host) { + return findCommonOffsetParent(element1root.host, element2); + } else { + return findCommonOffsetParent(element1, getRoot(element2).host); + } +} + +/** + * Gets the scroll value of the given element in the given side (top and left) + * @method + * @memberof Popper.Utils + * @argument {Element} element + * @argument {String} side `top` or `left` + * @returns {number} amount of scrolled pixels + */ +function getScroll(element) { + var side = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'top'; + + var upperSide = side === 'top' ? 'scrollTop' : 'scrollLeft'; + var nodeName = element.nodeName; + + if (nodeName === 'BODY' || nodeName === 'HTML') { + var html = element.ownerDocument.documentElement; + var scrollingElement = element.ownerDocument.scrollingElement || html; + return scrollingElement[upperSide]; + } + + return element[upperSide]; +} + +/* + * Sum or subtract the element scroll values (left and top) from a given rect object + * @method + * @memberof Popper.Utils + * @param {Object} rect - Rect object you want to change + * @param {HTMLElement} element - The element from the function reads the scroll values + * @param {Boolean} subtract - set to true if you want to subtract the scroll values + * @return {Object} rect - The modifier rect object + */ +function includeScroll(rect, element) { + var subtract = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + var scrollTop = getScroll(element, 'top'); + var scrollLeft = getScroll(element, 'left'); + var modifier = subtract ? -1 : 1; + rect.top += scrollTop * modifier; + rect.bottom += scrollTop * modifier; + rect.left += scrollLeft * modifier; + rect.right += scrollLeft * modifier; + return rect; +} + +/* + * Helper to detect borders of a given element + * @method + * @memberof Popper.Utils + * @param {CSSStyleDeclaration} styles + * Result of `getStyleComputedProperty` on the given element + * @param {String} axis - `x` or `y` + * @return {number} borders - The borders size of the given axis + */ + +function getBordersSize(styles, axis) { + var sideA = axis === 'x' ? 'Left' : 'Top'; + var sideB = sideA === 'Left' ? 'Right' : 'Bottom'; + + return parseFloat(styles['border' + sideA + 'Width'], 10) + parseFloat(styles['border' + sideB + 'Width'], 10); +} + +function getSize(axis, body, html, computedStyle) { + return Math.max(body['offset' + axis], body['scroll' + axis], html['client' + axis], html['offset' + axis], html['scroll' + axis], isIE(10) ? parseInt(html['offset' + axis]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Top' : 'Left')]) + parseInt(computedStyle['margin' + (axis === 'Height' ? 'Bottom' : 'Right')]) : 0); +} + +function getWindowSizes(document) { + var body = document.body; + var html = document.documentElement; + var computedStyle = isIE(10) && getComputedStyle(html); + + return { + height: getSize('Height', body, html, computedStyle), + width: getSize('Width', body, html, computedStyle) + }; +} + +var classCallCheck = function (instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +}; + +var createClass = function () { + function defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + return function (Constructor, protoProps, staticProps) { + if (protoProps) defineProperties(Constructor.prototype, protoProps); + if (staticProps) defineProperties(Constructor, staticProps); + return Constructor; + }; +}(); + + + + + +var defineProperty = function (obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +}; + +var _extends = Object.assign || function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + + return target; +}; + +/** + * Given element offsets, generate an output similar to getBoundingClientRect + * @method + * @memberof Popper.Utils + * @argument {Object} offsets + * @returns {Object} ClientRect like output + */ +function getClientRect(offsets) { + return _extends({}, offsets, { + right: offsets.left + offsets.width, + bottom: offsets.top + offsets.height + }); +} + +/** + * Get bounding client rect of given element + * @method + * @memberof Popper.Utils + * @param {HTMLElement} element + * @return {Object} client rect + */ +function getBoundingClientRect(element) { + var rect = {}; + + // IE10 10 FIX: Please, don't ask, the element isn't + // considered in DOM in some circumstances... + // This isn't reproducible in IE10 compatibility mode of IE11 + try { + if (isIE(10)) { + rect = element.getBoundingClientRect(); + var scrollTop = getScroll(element, 'top'); + var scrollLeft = getScroll(element, 'left'); + rect.top += scrollTop; + rect.left += scrollLeft; + rect.bottom += scrollTop; + rect.right += scrollLeft; + } else { + rect = element.getBoundingClientRect(); + } + } catch (e) {} + + var result = { + left: rect.left, + top: rect.top, + width: rect.right - rect.left, + height: rect.bottom - rect.top + }; + + // subtract scrollbar size from sizes + var sizes = element.nodeName === 'HTML' ? getWindowSizes(element.ownerDocument) : {}; + var width = sizes.width || element.clientWidth || result.right - result.left; + var height = sizes.height || element.clientHeight || result.bottom - result.top; + + var horizScrollbar = element.offsetWidth - width; + var vertScrollbar = element.offsetHeight - height; + + // if an hypothetical scrollbar is detected, we must be sure it's not a `border` + // we make this check conditional for performance reasons + if (horizScrollbar || vertScrollbar) { + var styles = getStyleComputedProperty(element); + horizScrollbar -= getBordersSize(styles, 'x'); + vertScrollbar -= getBordersSize(styles, 'y'); + + result.width -= horizScrollbar; + result.height -= vertScrollbar; + } + + return getClientRect(result); +} + +function getOffsetRectRelativeToArbitraryNode(children, parent) { + var fixedPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; + + var isIE10 = isIE(10); + var isHTML = parent.nodeName === 'HTML'; + var childrenRect = getBoundingClientRect(children); + var parentRect = getBoundingClientRect(parent); + var scrollParent = getScrollParent(children); + + var styles = getStyleComputedProperty(parent); + var borderTopWidth = parseFloat(styles.borderTopWidth, 10); + var borderLeftWidth = parseFloat(styles.borderLeftWidth, 10); + + // In cases where the parent is fixed, we must ignore negative scroll in offset calc + if (fixedPosition && isHTML) { + parentRect.top = Math.max(parentRect.top, 0); + parentRect.left = Math.max(parentRect.left, 0); + } + var offsets = getClientRect({ + top: childrenRect.top - parentRect.top - borderTopWidth, + left: childrenRect.left - parentRect.left - borderLeftWidth, + width: childrenRect.width, + height: childrenRect.height + }); + offsets.marginTop = 0; + offsets.marginLeft = 0; + + // Subtract margins of documentElement in case it's being used as parent + // we do this only on HTML because it's the only element that behaves + // differently when margins are applied to it. The margins are included in + // the box of the documentElement, in the other cases not. + if (!isIE10 && isHTML) { + var marginTop = parseFloat(styles.marginTop, 10); + var marginLeft = parseFloat(styles.marginLeft, 10); + + offsets.top -= borderTopWidth - marginTop; + offsets.bottom -= borderTopWidth - marginTop; + offsets.left -= borderLeftWidth - marginLeft; + offsets.right -= borderLeftWidth - marginLeft; + + // Attach marginTop and marginLeft because in some circumstances we may need them + offsets.marginTop = marginTop; + offsets.marginLeft = marginLeft; + } + + if (isIE10 && !fixedPosition ? parent.contains(scrollParent) : parent === scrollParent && scrollParent.nodeName !== 'BODY') { + offsets = includeScroll(offsets, parent); + } + + return offsets; +} + +function getViewportOffsetRectRelativeToArtbitraryNode(element) { + var excludeScroll = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + var html = element.ownerDocument.documentElement; + var relativeOffset = getOffsetRectRelativeToArbitraryNode(element, html); + var width = Math.max(html.clientWidth, window.innerWidth || 0); + var height = Math.max(html.clientHeight, window.innerHeight || 0); + + var scrollTop = !excludeScroll ? getScroll(html) : 0; + var scrollLeft = !excludeScroll ? getScroll(html, 'left') : 0; + + var offset = { + top: scrollTop - relativeOffset.top + relativeOffset.marginTop, + left: scrollLeft - relativeOffset.left + relativeOffset.marginLeft, + width: width, + height: height + }; + + return getClientRect(offset); +} + +/** + * Check if the given element is fixed or is inside a fixed parent + * @method + * @memberof Popper.Utils + * @argument {Element} element + * @argument {Element} customContainer + * @returns {Boolean} answer to "isFixed?" + */ +function isFixed(element) { + var nodeName = element.nodeName; + if (nodeName === 'BODY' || nodeName === 'HTML') { + return false; + } + if (getStyleComputedProperty(element, 'position') === 'fixed') { + return true; + } + return isFixed(getParentNode(element)); +} + +/** + * Finds the first parent of an element that has a transformed property defined + * @method + * @memberof Popper.Utils + * @argument {Element} element + * @returns {Element} first transformed parent or documentElement + */ + +function getFixedPositionOffsetParent(element) { + // This check is needed to avoid errors in case one of the elements isn't defined for any reason + if (!element || !element.parentElement || isIE()) { + return document.documentElement; + } + var el = element.parentElement; + while (el && getStyleComputedProperty(el, 'transform') === 'none') { + el = el.parentElement; + } + return el || document.documentElement; +} + +/** + * Computed the boundaries limits and return them + * @method + * @memberof Popper.Utils + * @param {HTMLElement} popper + * @param {HTMLElement} reference + * @param {number} padding + * @param {HTMLElement} boundariesElement - Element used to define the boundaries + * @param {Boolean} fixedPosition - Is in fixed position mode + * @returns {Object} Coordinates of the boundaries + */ +function getBoundaries(popper, reference, padding, boundariesElement) { + var fixedPosition = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false; + + // NOTE: 1 DOM access here + + var boundaries = { top: 0, left: 0 }; + var offsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference); + + // Handle viewport case + if (boundariesElement === 'viewport') { + boundaries = getViewportOffsetRectRelativeToArtbitraryNode(offsetParent, fixedPosition); + } else { + // Handle other cases based on DOM element used as boundaries + var boundariesNode = void 0; + if (boundariesElement === 'scrollParent') { + boundariesNode = getScrollParent(getParentNode(reference)); + if (boundariesNode.nodeName === 'BODY') { + boundariesNode = popper.ownerDocument.documentElement; + } + } else if (boundariesElement === 'window') { + boundariesNode = popper.ownerDocument.documentElement; + } else { + boundariesNode = boundariesElement; + } + + var offsets = getOffsetRectRelativeToArbitraryNode(boundariesNode, offsetParent, fixedPosition); + + // In case of HTML, we need a different computation + if (boundariesNode.nodeName === 'HTML' && !isFixed(offsetParent)) { + var _getWindowSizes = getWindowSizes(popper.ownerDocument), + height = _getWindowSizes.height, + width = _getWindowSizes.width; + + boundaries.top += offsets.top - offsets.marginTop; + boundaries.bottom = height + offsets.top; + boundaries.left += offsets.left - offsets.marginLeft; + boundaries.right = width + offsets.left; + } else { + // for all the other DOM elements, this one is good + boundaries = offsets; + } + } + + // Add paddings + padding = padding || 0; + var isPaddingNumber = typeof padding === 'number'; + boundaries.left += isPaddingNumber ? padding : padding.left || 0; + boundaries.top += isPaddingNumber ? padding : padding.top || 0; + boundaries.right -= isPaddingNumber ? padding : padding.right || 0; + boundaries.bottom -= isPaddingNumber ? padding : padding.bottom || 0; + + return boundaries; +} + +function getArea(_ref) { + var width = _ref.width, + height = _ref.height; + + return width * height; +} + +/** + * Utility used to transform the `auto` placement to the placement with more + * available space. + * @method + * @memberof Popper.Utils + * @argument {Object} data - The data object generated by update method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ +function computeAutoPlacement(placement, refRect, popper, reference, boundariesElement) { + var padding = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; + + if (placement.indexOf('auto') === -1) { + return placement; + } + + var boundaries = getBoundaries(popper, reference, padding, boundariesElement); + + var rects = { + top: { + width: boundaries.width, + height: refRect.top - boundaries.top + }, + right: { + width: boundaries.right - refRect.right, + height: boundaries.height + }, + bottom: { + width: boundaries.width, + height: boundaries.bottom - refRect.bottom + }, + left: { + width: refRect.left - boundaries.left, + height: boundaries.height + } + }; + + var sortedAreas = Object.keys(rects).map(function (key) { + return _extends({ + key: key + }, rects[key], { + area: getArea(rects[key]) + }); + }).sort(function (a, b) { + return b.area - a.area; + }); + + var filteredAreas = sortedAreas.filter(function (_ref2) { + var width = _ref2.width, + height = _ref2.height; + return width >= popper.clientWidth && height >= popper.clientHeight; + }); + + var computedPlacement = filteredAreas.length > 0 ? filteredAreas[0].key : sortedAreas[0].key; + + var variation = placement.split('-')[1]; + + return computedPlacement + (variation ? '-' + variation : ''); +} + +/** + * Get offsets to the reference element + * @method + * @memberof Popper.Utils + * @param {Object} state + * @param {Element} popper - the popper element + * @param {Element} reference - the reference element (the popper will be relative to this) + * @param {Element} fixedPosition - is in fixed position mode + * @returns {Object} An object containing the offsets which will be applied to the popper + */ +function getReferenceOffsets(state, popper, reference) { + var fixedPosition = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null; + + var commonOffsetParent = fixedPosition ? getFixedPositionOffsetParent(popper) : findCommonOffsetParent(popper, reference); + return getOffsetRectRelativeToArbitraryNode(reference, commonOffsetParent, fixedPosition); +} + +/** + * Get the outer sizes of the given element (offset size + margins) + * @method + * @memberof Popper.Utils + * @argument {Element} element + * @returns {Object} object containing width and height properties + */ +function getOuterSizes(element) { + var window = element.ownerDocument.defaultView; + var styles = window.getComputedStyle(element); + var x = parseFloat(styles.marginTop) + parseFloat(styles.marginBottom); + var y = parseFloat(styles.marginLeft) + parseFloat(styles.marginRight); + var result = { + width: element.offsetWidth + y, + height: element.offsetHeight + x + }; + return result; +} + +/** + * Get the opposite placement of the given one + * @method + * @memberof Popper.Utils + * @argument {String} placement + * @returns {String} flipped placement + */ +function getOppositePlacement(placement) { + var hash = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' }; + return placement.replace(/left|right|bottom|top/g, function (matched) { + return hash[matched]; + }); +} + +/** + * Get offsets to the popper + * @method + * @memberof Popper.Utils + * @param {Object} position - CSS position the Popper will get applied + * @param {HTMLElement} popper - the popper element + * @param {Object} referenceOffsets - the reference offsets (the popper will be relative to this) + * @param {String} placement - one of the valid placement options + * @returns {Object} popperOffsets - An object containing the offsets which will be applied to the popper + */ +function getPopperOffsets(popper, referenceOffsets, placement) { + placement = placement.split('-')[0]; + + // Get popper node sizes + var popperRect = getOuterSizes(popper); + + // Add position, width and height to our offsets object + var popperOffsets = { + width: popperRect.width, + height: popperRect.height + }; + + // depending by the popper placement we have to compute its offsets slightly differently + var isHoriz = ['right', 'left'].indexOf(placement) !== -1; + var mainSide = isHoriz ? 'top' : 'left'; + var secondarySide = isHoriz ? 'left' : 'top'; + var measurement = isHoriz ? 'height' : 'width'; + var secondaryMeasurement = !isHoriz ? 'height' : 'width'; + + popperOffsets[mainSide] = referenceOffsets[mainSide] + referenceOffsets[measurement] / 2 - popperRect[measurement] / 2; + if (placement === secondarySide) { + popperOffsets[secondarySide] = referenceOffsets[secondarySide] - popperRect[secondaryMeasurement]; + } else { + popperOffsets[secondarySide] = referenceOffsets[getOppositePlacement(secondarySide)]; + } + + return popperOffsets; +} + +/** + * Mimics the `find` method of Array + * @method + * @memberof Popper.Utils + * @argument {Array} arr + * @argument prop + * @argument value + * @returns index or -1 + */ +function find(arr, check) { + // use native find if supported + if (Array.prototype.find) { + return arr.find(check); + } + + // use `filter` to obtain the same behavior of `find` + return arr.filter(check)[0]; +} + +/** + * Return the index of the matching object + * @method + * @memberof Popper.Utils + * @argument {Array} arr + * @argument prop + * @argument value + * @returns index or -1 + */ +function findIndex(arr, prop, value) { + // use native findIndex if supported + if (Array.prototype.findIndex) { + return arr.findIndex(function (cur) { + return cur[prop] === value; + }); + } + + // use `find` + `indexOf` if `findIndex` isn't supported + var match = find(arr, function (obj) { + return obj[prop] === value; + }); + return arr.indexOf(match); +} + +/** + * Loop trough the list of modifiers and run them in order, + * each of them will then edit the data object. + * @method + * @memberof Popper.Utils + * @param {dataObject} data + * @param {Array} modifiers + * @param {String} ends - Optional modifier name used as stopper + * @returns {dataObject} + */ +function runModifiers(modifiers, data, ends) { + var modifiersToRun = ends === undefined ? modifiers : modifiers.slice(0, findIndex(modifiers, 'name', ends)); + + modifiersToRun.forEach(function (modifier) { + if (modifier['function']) { + // eslint-disable-line dot-notation + console.warn('`modifier.function` is deprecated, use `modifier.fn`!'); + } + var fn = modifier['function'] || modifier.fn; // eslint-disable-line dot-notation + if (modifier.enabled && isFunction(fn)) { + // Add properties to offsets to make them a complete clientRect object + // we do this before each modifier to make sure the previous one doesn't + // mess with these values + data.offsets.popper = getClientRect(data.offsets.popper); + data.offsets.reference = getClientRect(data.offsets.reference); + + data = fn(data, modifier); + } + }); + + return data; +} + +/** + * Updates the position of the popper, computing the new offsets and applying + * the new style.<br /> + * Prefer `scheduleUpdate` over `update` because of performance reasons. + * @method + * @memberof Popper + */ +function update() { + // if popper is destroyed, don't perform any further update + if (this.state.isDestroyed) { + return; + } + + var data = { + instance: this, + styles: {}, + arrowStyles: {}, + attributes: {}, + flipped: false, + offsets: {} + }; + + // compute reference element offsets + data.offsets.reference = getReferenceOffsets(this.state, this.popper, this.reference, this.options.positionFixed); + + // compute auto placement, store placement inside the data object, + // modifiers will be able to edit `placement` if needed + // and refer to originalPlacement to know the original value + data.placement = computeAutoPlacement(this.options.placement, data.offsets.reference, this.popper, this.reference, this.options.modifiers.flip.boundariesElement, this.options.modifiers.flip.padding); + + // store the computed placement inside `originalPlacement` + data.originalPlacement = data.placement; + + data.positionFixed = this.options.positionFixed; + + // compute the popper offsets + data.offsets.popper = getPopperOffsets(this.popper, data.offsets.reference, data.placement); + + data.offsets.popper.position = this.options.positionFixed ? 'fixed' : 'absolute'; + + // run the modifiers + data = runModifiers(this.modifiers, data); + + // the first `update` will call `onCreate` callback + // the other ones will call `onUpdate` callback + if (!this.state.isCreated) { + this.state.isCreated = true; + this.options.onCreate(data); + } else { + this.options.onUpdate(data); + } +} + +/** + * Helper used to know if the given modifier is enabled. + * @method + * @memberof Popper.Utils + * @returns {Boolean} + */ +function isModifierEnabled(modifiers, modifierName) { + return modifiers.some(function (_ref) { + var name = _ref.name, + enabled = _ref.enabled; + return enabled && name === modifierName; + }); +} + +/** + * Get the prefixed supported property name + * @method + * @memberof Popper.Utils + * @argument {String} property (camelCase) + * @returns {String} prefixed property (camelCase or PascalCase, depending on the vendor prefix) + */ +function getSupportedPropertyName(property) { + var prefixes = [false, 'ms', 'Webkit', 'Moz', 'O']; + var upperProp = property.charAt(0).toUpperCase() + property.slice(1); + + for (var i = 0; i < prefixes.length; i++) { + var prefix = prefixes[i]; + var toCheck = prefix ? '' + prefix + upperProp : property; + if (typeof document.body.style[toCheck] !== 'undefined') { + return toCheck; + } + } + return null; +} + +/** + * Destroys the popper. + * @method + * @memberof Popper + */ +function destroy() { + this.state.isDestroyed = true; + + // touch DOM only if `applyStyle` modifier is enabled + if (isModifierEnabled(this.modifiers, 'applyStyle')) { + this.popper.removeAttribute('x-placement'); + this.popper.style.position = ''; + this.popper.style.top = ''; + this.popper.style.left = ''; + this.popper.style.right = ''; + this.popper.style.bottom = ''; + this.popper.style.willChange = ''; + this.popper.style[getSupportedPropertyName('transform')] = ''; + } + + this.disableEventListeners(); + + // remove the popper if user explicity asked for the deletion on destroy + // do not use `remove` because IE11 doesn't support it + if (this.options.removeOnDestroy) { + this.popper.parentNode.removeChild(this.popper); + } + return this; +} + +/** + * Get the window associated with the element + * @argument {Element} element + * @returns {Window} + */ +function getWindow(element) { + var ownerDocument = element.ownerDocument; + return ownerDocument ? ownerDocument.defaultView : window; +} + +function attachToScrollParents(scrollParent, event, callback, scrollParents) { + var isBody = scrollParent.nodeName === 'BODY'; + var target = isBody ? scrollParent.ownerDocument.defaultView : scrollParent; + target.addEventListener(event, callback, { passive: true }); + + if (!isBody) { + attachToScrollParents(getScrollParent(target.parentNode), event, callback, scrollParents); + } + scrollParents.push(target); +} + +/** + * Setup needed event listeners used to update the popper position + * @method + * @memberof Popper.Utils + * @private + */ +function setupEventListeners(reference, options, state, updateBound) { + // Resize event listener on window + state.updateBound = updateBound; + getWindow(reference).addEventListener('resize', state.updateBound, { passive: true }); + + // Scroll event listener on scroll parents + var scrollElement = getScrollParent(reference); + attachToScrollParents(scrollElement, 'scroll', state.updateBound, state.scrollParents); + state.scrollElement = scrollElement; + state.eventsEnabled = true; + + return state; +} + +/** + * It will add resize/scroll events and start recalculating + * position of the popper element when they are triggered. + * @method + * @memberof Popper + */ +function enableEventListeners() { + if (!this.state.eventsEnabled) { + this.state = setupEventListeners(this.reference, this.options, this.state, this.scheduleUpdate); + } +} + +/** + * Remove event listeners used to update the popper position + * @method + * @memberof Popper.Utils + * @private + */ +function removeEventListeners(reference, state) { + // Remove resize event listener on window + getWindow(reference).removeEventListener('resize', state.updateBound); + + // Remove scroll event listener on scroll parents + state.scrollParents.forEach(function (target) { + target.removeEventListener('scroll', state.updateBound); + }); + + // Reset state + state.updateBound = null; + state.scrollParents = []; + state.scrollElement = null; + state.eventsEnabled = false; + return state; +} + +/** + * It will remove resize/scroll events and won't recalculate popper position + * when they are triggered. It also won't trigger `onUpdate` callback anymore, + * unless you call `update` method manually. + * @method + * @memberof Popper + */ +function disableEventListeners() { + if (this.state.eventsEnabled) { + cancelAnimationFrame(this.scheduleUpdate); + this.state = removeEventListeners(this.reference, this.state); + } +} + +/** + * Tells if a given input is a number + * @method + * @memberof Popper.Utils + * @param {*} input to check + * @return {Boolean} + */ +function isNumeric(n) { + return n !== '' && !isNaN(parseFloat(n)) && isFinite(n); +} + +/** + * Set the style to the given popper + * @method + * @memberof Popper.Utils + * @argument {Element} element - Element to apply the style to + * @argument {Object} styles + * Object with a list of properties and values which will be applied to the element + */ +function setStyles(element, styles) { + Object.keys(styles).forEach(function (prop) { + var unit = ''; + // add unit if the value is numeric and is one of the following + if (['width', 'height', 'top', 'right', 'bottom', 'left'].indexOf(prop) !== -1 && isNumeric(styles[prop])) { + unit = 'px'; + } + element.style[prop] = styles[prop] + unit; + }); +} + +/** + * Set the attributes to the given popper + * @method + * @memberof Popper.Utils + * @argument {Element} element - Element to apply the attributes to + * @argument {Object} styles + * Object with a list of properties and values which will be applied to the element + */ +function setAttributes(element, attributes) { + Object.keys(attributes).forEach(function (prop) { + var value = attributes[prop]; + if (value !== false) { + element.setAttribute(prop, attributes[prop]); + } else { + element.removeAttribute(prop); + } + }); +} + +/** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by `update` method + * @argument {Object} data.styles - List of style properties - values to apply to popper element + * @argument {Object} data.attributes - List of attribute properties - values to apply to popper element + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The same data object + */ +function applyStyle(data) { + // any property present in `data.styles` will be applied to the popper, + // in this way we can make the 3rd party modifiers add custom styles to it + // Be aware, modifiers could override the properties defined in the previous + // lines of this modifier! + setStyles(data.instance.popper, data.styles); + + // any property present in `data.attributes` will be applied to the popper, + // they will be set as HTML attributes of the element + setAttributes(data.instance.popper, data.attributes); + + // if arrowElement is defined and arrowStyles has some properties + if (data.arrowElement && Object.keys(data.arrowStyles).length) { + setStyles(data.arrowElement, data.arrowStyles); + } + + return data; +} + +/** + * Set the x-placement attribute before everything else because it could be used + * to add margins to the popper margins needs to be calculated to get the + * correct popper offsets. + * @method + * @memberof Popper.modifiers + * @param {HTMLElement} reference - The reference element used to position the popper + * @param {HTMLElement} popper - The HTML element used as popper + * @param {Object} options - Popper.js options + */ +function applyStyleOnLoad(reference, popper, options, modifierOptions, state) { + // compute reference element offsets + var referenceOffsets = getReferenceOffsets(state, popper, reference, options.positionFixed); + + // compute auto placement, store placement inside the data object, + // modifiers will be able to edit `placement` if needed + // and refer to originalPlacement to know the original value + var placement = computeAutoPlacement(options.placement, referenceOffsets, popper, reference, options.modifiers.flip.boundariesElement, options.modifiers.flip.padding); + + popper.setAttribute('x-placement', placement); + + // Apply `position` to popper before anything else because + // without the position applied we can't guarantee correct computations + setStyles(popper, { position: options.positionFixed ? 'fixed' : 'absolute' }); + + return options; +} + +/** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by `update` method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ +function computeStyle(data, options) { + var x = options.x, + y = options.y; + var popper = data.offsets.popper; + + // Remove this legacy support in Popper.js v2 + + var legacyGpuAccelerationOption = find(data.instance.modifiers, function (modifier) { + return modifier.name === 'applyStyle'; + }).gpuAcceleration; + if (legacyGpuAccelerationOption !== undefined) { + console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!'); + } + var gpuAcceleration = legacyGpuAccelerationOption !== undefined ? legacyGpuAccelerationOption : options.gpuAcceleration; + + var offsetParent = getOffsetParent(data.instance.popper); + var offsetParentRect = getBoundingClientRect(offsetParent); + + // Styles + var styles = { + position: popper.position + }; + + // Avoid blurry text by using full pixel integers. + // For pixel-perfect positioning, top/bottom prefers rounded + // values, while left/right prefers floored values. + var offsets = { + left: Math.floor(popper.left), + top: Math.round(popper.top), + bottom: Math.round(popper.bottom), + right: Math.floor(popper.right) + }; + + var sideA = x === 'bottom' ? 'top' : 'bottom'; + var sideB = y === 'right' ? 'left' : 'right'; + + // if gpuAcceleration is set to `true` and transform is supported, + // we use `translate3d` to apply the position to the popper we + // automatically use the supported prefixed version if needed + var prefixedProperty = getSupportedPropertyName('transform'); + + // now, let's make a step back and look at this code closely (wtf?) + // If the content of the popper grows once it's been positioned, it + // may happen that the popper gets misplaced because of the new content + // overflowing its reference element + // To avoid this problem, we provide two options (x and y), which allow + // the consumer to define the offset origin. + // If we position a popper on top of a reference element, we can set + // `x` to `top` to make the popper grow towards its top instead of + // its bottom. + var left = void 0, + top = void 0; + if (sideA === 'bottom') { + // when offsetParent is <html> the positioning is relative to the bottom of the screen (excluding the scrollbar) + // and not the bottom of the html element + if (offsetParent.nodeName === 'HTML') { + top = -offsetParent.clientHeight + offsets.bottom; + } else { + top = -offsetParentRect.height + offsets.bottom; + } + } else { + top = offsets.top; + } + if (sideB === 'right') { + if (offsetParent.nodeName === 'HTML') { + left = -offsetParent.clientWidth + offsets.right; + } else { + left = -offsetParentRect.width + offsets.right; + } + } else { + left = offsets.left; + } + if (gpuAcceleration && prefixedProperty) { + styles[prefixedProperty] = 'translate3d(' + left + 'px, ' + top + 'px, 0)'; + styles[sideA] = 0; + styles[sideB] = 0; + styles.willChange = 'transform'; + } else { + // othwerise, we use the standard `top`, `left`, `bottom` and `right` properties + var invertTop = sideA === 'bottom' ? -1 : 1; + var invertLeft = sideB === 'right' ? -1 : 1; + styles[sideA] = top * invertTop; + styles[sideB] = left * invertLeft; + styles.willChange = sideA + ', ' + sideB; + } + + // Attributes + var attributes = { + 'x-placement': data.placement + }; + + // Update `data` attributes, styles and arrowStyles + data.attributes = _extends({}, attributes, data.attributes); + data.styles = _extends({}, styles, data.styles); + data.arrowStyles = _extends({}, data.offsets.arrow, data.arrowStyles); + + return data; +} + +/** + * Helper used to know if the given modifier depends from another one.<br /> + * It checks if the needed modifier is listed and enabled. + * @method + * @memberof Popper.Utils + * @param {Array} modifiers - list of modifiers + * @param {String} requestingName - name of requesting modifier + * @param {String} requestedName - name of requested modifier + * @returns {Boolean} + */ +function isModifierRequired(modifiers, requestingName, requestedName) { + var requesting = find(modifiers, function (_ref) { + var name = _ref.name; + return name === requestingName; + }); + + var isRequired = !!requesting && modifiers.some(function (modifier) { + return modifier.name === requestedName && modifier.enabled && modifier.order < requesting.order; + }); + + if (!isRequired) { + var _requesting = '`' + requestingName + '`'; + var requested = '`' + requestedName + '`'; + console.warn(requested + ' modifier is required by ' + _requesting + ' modifier in order to work, be sure to include it before ' + _requesting + '!'); + } + return isRequired; +} + +/** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by update method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ +function arrow(data, options) { + var _data$offsets$arrow; + + // arrow depends on keepTogether in order to work + if (!isModifierRequired(data.instance.modifiers, 'arrow', 'keepTogether')) { + return data; + } + + var arrowElement = options.element; + + // if arrowElement is a string, suppose it's a CSS selector + if (typeof arrowElement === 'string') { + arrowElement = data.instance.popper.querySelector(arrowElement); + + // if arrowElement is not found, don't run the modifier + if (!arrowElement) { + return data; + } + } else { + // if the arrowElement isn't a query selector we must check that the + // provided DOM node is child of its popper node + if (!data.instance.popper.contains(arrowElement)) { + console.warn('WARNING: `arrow.element` must be child of its popper element!'); + return data; + } + } + + var placement = data.placement.split('-')[0]; + var _data$offsets = data.offsets, + popper = _data$offsets.popper, + reference = _data$offsets.reference; + + var isVertical = ['left', 'right'].indexOf(placement) !== -1; + + var len = isVertical ? 'height' : 'width'; + var sideCapitalized = isVertical ? 'Top' : 'Left'; + var side = sideCapitalized.toLowerCase(); + var altSide = isVertical ? 'left' : 'top'; + var opSide = isVertical ? 'bottom' : 'right'; + var arrowElementSize = getOuterSizes(arrowElement)[len]; + + // + // extends keepTogether behavior making sure the popper and its + // reference have enough pixels in conjunction + // + + // top/left side + if (reference[opSide] - arrowElementSize < popper[side]) { + data.offsets.popper[side] -= popper[side] - (reference[opSide] - arrowElementSize); + } + // bottom/right side + if (reference[side] + arrowElementSize > popper[opSide]) { + data.offsets.popper[side] += reference[side] + arrowElementSize - popper[opSide]; + } + data.offsets.popper = getClientRect(data.offsets.popper); + + // compute center of the popper + var center = reference[side] + reference[len] / 2 - arrowElementSize / 2; + + // Compute the sideValue using the updated popper offsets + // take popper margin in account because we don't have this info available + var css = getStyleComputedProperty(data.instance.popper); + var popperMarginSide = parseFloat(css['margin' + sideCapitalized], 10); + var popperBorderSide = parseFloat(css['border' + sideCapitalized + 'Width'], 10); + var sideValue = center - data.offsets.popper[side] - popperMarginSide - popperBorderSide; + + // prevent arrowElement from being placed not contiguously to its popper + sideValue = Math.max(Math.min(popper[len] - arrowElementSize, sideValue), 0); + + data.arrowElement = arrowElement; + data.offsets.arrow = (_data$offsets$arrow = {}, defineProperty(_data$offsets$arrow, side, Math.round(sideValue)), defineProperty(_data$offsets$arrow, altSide, ''), _data$offsets$arrow); + + return data; +} + +/** + * Get the opposite placement variation of the given one + * @method + * @memberof Popper.Utils + * @argument {String} placement variation + * @returns {String} flipped placement variation + */ +function getOppositeVariation(variation) { + if (variation === 'end') { + return 'start'; + } else if (variation === 'start') { + return 'end'; + } + return variation; +} + +/** + * List of accepted placements to use as values of the `placement` option.<br /> + * Valid placements are: + * - `auto` + * - `top` + * - `right` + * - `bottom` + * - `left` + * + * Each placement can have a variation from this list: + * - `-start` + * - `-end` + * + * Variations are interpreted easily if you think of them as the left to right + * written languages. Horizontally (`top` and `bottom`), `start` is left and `end` + * is right.<br /> + * Vertically (`left` and `right`), `start` is top and `end` is bottom. + * + * Some valid examples are: + * - `top-end` (on top of reference, right aligned) + * - `right-start` (on right of reference, top aligned) + * - `bottom` (on bottom, centered) + * - `auto-end` (on the side with more space available, alignment depends by placement) + * + * @static + * @type {Array} + * @enum {String} + * @readonly + * @method placements + * @memberof Popper + */ +var placements = ['auto-start', 'auto', 'auto-end', 'top-start', 'top', 'top-end', 'right-start', 'right', 'right-end', 'bottom-end', 'bottom', 'bottom-start', 'left-end', 'left', 'left-start']; + +// Get rid of `auto` `auto-start` and `auto-end` +var validPlacements = placements.slice(3); + +/** + * Given an initial placement, returns all the subsequent placements + * clockwise (or counter-clockwise). + * + * @method + * @memberof Popper.Utils + * @argument {String} placement - A valid placement (it accepts variations) + * @argument {Boolean} counter - Set to true to walk the placements counterclockwise + * @returns {Array} placements including their variations + */ +function clockwise(placement) { + var counter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + + var index = validPlacements.indexOf(placement); + var arr = validPlacements.slice(index + 1).concat(validPlacements.slice(0, index)); + return counter ? arr.reverse() : arr; +} + +var BEHAVIORS = { + FLIP: 'flip', + CLOCKWISE: 'clockwise', + COUNTERCLOCKWISE: 'counterclockwise' +}; + +/** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by update method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ +function flip(data, options) { + // if `inner` modifier is enabled, we can't use the `flip` modifier + if (isModifierEnabled(data.instance.modifiers, 'inner')) { + return data; + } + + if (data.flipped && data.placement === data.originalPlacement) { + // seems like flip is trying to loop, probably there's not enough space on any of the flippable sides + return data; + } + + var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, options.boundariesElement, data.positionFixed); + + var placement = data.placement.split('-')[0]; + var placementOpposite = getOppositePlacement(placement); + var variation = data.placement.split('-')[1] || ''; + + var flipOrder = []; + + switch (options.behavior) { + case BEHAVIORS.FLIP: + flipOrder = [placement, placementOpposite]; + break; + case BEHAVIORS.CLOCKWISE: + flipOrder = clockwise(placement); + break; + case BEHAVIORS.COUNTERCLOCKWISE: + flipOrder = clockwise(placement, true); + break; + default: + flipOrder = options.behavior; + } + + flipOrder.forEach(function (step, index) { + if (placement !== step || flipOrder.length === index + 1) { + return data; + } + + placement = data.placement.split('-')[0]; + placementOpposite = getOppositePlacement(placement); + + var popperOffsets = data.offsets.popper; + var refOffsets = data.offsets.reference; + + // using floor because the reference offsets may contain decimals we are not going to consider here + var floor = Math.floor; + var overlapsRef = placement === 'left' && floor(popperOffsets.right) > floor(refOffsets.left) || placement === 'right' && floor(popperOffsets.left) < floor(refOffsets.right) || placement === 'top' && floor(popperOffsets.bottom) > floor(refOffsets.top) || placement === 'bottom' && floor(popperOffsets.top) < floor(refOffsets.bottom); + + var overflowsLeft = floor(popperOffsets.left) < floor(boundaries.left); + var overflowsRight = floor(popperOffsets.right) > floor(boundaries.right); + var overflowsTop = floor(popperOffsets.top) < floor(boundaries.top); + var overflowsBottom = floor(popperOffsets.bottom) > floor(boundaries.bottom); + + var overflowsBoundaries = placement === 'left' && overflowsLeft || placement === 'right' && overflowsRight || placement === 'top' && overflowsTop || placement === 'bottom' && overflowsBottom; + + // flip the variation if required + var isVertical = ['top', 'bottom'].indexOf(placement) !== -1; + var flippedVariation = !!options.flipVariations && (isVertical && variation === 'start' && overflowsLeft || isVertical && variation === 'end' && overflowsRight || !isVertical && variation === 'start' && overflowsTop || !isVertical && variation === 'end' && overflowsBottom); + + if (overlapsRef || overflowsBoundaries || flippedVariation) { + // this boolean to detect any flip loop + data.flipped = true; + + if (overlapsRef || overflowsBoundaries) { + placement = flipOrder[index + 1]; + } + + if (flippedVariation) { + variation = getOppositeVariation(variation); + } + + data.placement = placement + (variation ? '-' + variation : ''); + + // this object contains `position`, we want to preserve it along with + // any additional property we may add in the future + data.offsets.popper = _extends({}, data.offsets.popper, getPopperOffsets(data.instance.popper, data.offsets.reference, data.placement)); + + data = runModifiers(data.instance.modifiers, data, 'flip'); + } + }); + return data; +} + +/** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by update method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ +function keepTogether(data) { + var _data$offsets = data.offsets, + popper = _data$offsets.popper, + reference = _data$offsets.reference; + + var placement = data.placement.split('-')[0]; + var floor = Math.floor; + var isVertical = ['top', 'bottom'].indexOf(placement) !== -1; + var side = isVertical ? 'right' : 'bottom'; + var opSide = isVertical ? 'left' : 'top'; + var measurement = isVertical ? 'width' : 'height'; + + if (popper[side] < floor(reference[opSide])) { + data.offsets.popper[opSide] = floor(reference[opSide]) - popper[measurement]; + } + if (popper[opSide] > floor(reference[side])) { + data.offsets.popper[opSide] = floor(reference[side]); + } + + return data; +} + +/** + * Converts a string containing value + unit into a px value number + * @function + * @memberof {modifiers~offset} + * @private + * @argument {String} str - Value + unit string + * @argument {String} measurement - `height` or `width` + * @argument {Object} popperOffsets + * @argument {Object} referenceOffsets + * @returns {Number|String} + * Value in pixels, or original string if no values were extracted + */ +function toValue(str, measurement, popperOffsets, referenceOffsets) { + // separate value from unit + var split = str.match(/((?:\-|\+)?\d*\.?\d*)(.*)/); + var value = +split[1]; + var unit = split[2]; + + // If it's not a number it's an operator, I guess + if (!value) { + return str; + } + + if (unit.indexOf('%') === 0) { + var element = void 0; + switch (unit) { + case '%p': + element = popperOffsets; + break; + case '%': + case '%r': + default: + element = referenceOffsets; + } + + var rect = getClientRect(element); + return rect[measurement] / 100 * value; + } else if (unit === 'vh' || unit === 'vw') { + // if is a vh or vw, we calculate the size based on the viewport + var size = void 0; + if (unit === 'vh') { + size = Math.max(document.documentElement.clientHeight, window.innerHeight || 0); + } else { + size = Math.max(document.documentElement.clientWidth, window.innerWidth || 0); + } + return size / 100 * value; + } else { + // if is an explicit pixel unit, we get rid of the unit and keep the value + // if is an implicit unit, it's px, and we return just the value + return value; + } +} + +/** + * Parse an `offset` string to extrapolate `x` and `y` numeric offsets. + * @function + * @memberof {modifiers~offset} + * @private + * @argument {String} offset + * @argument {Object} popperOffsets + * @argument {Object} referenceOffsets + * @argument {String} basePlacement + * @returns {Array} a two cells array with x and y offsets in numbers + */ +function parseOffset(offset, popperOffsets, referenceOffsets, basePlacement) { + var offsets = [0, 0]; + + // Use height if placement is left or right and index is 0 otherwise use width + // in this way the first offset will use an axis and the second one + // will use the other one + var useHeight = ['right', 'left'].indexOf(basePlacement) !== -1; + + // Split the offset string to obtain a list of values and operands + // The regex addresses values with the plus or minus sign in front (+10, -20, etc) + var fragments = offset.split(/(\+|\-)/).map(function (frag) { + return frag.trim(); + }); + + // Detect if the offset string contains a pair of values or a single one + // they could be separated by comma or space + var divider = fragments.indexOf(find(fragments, function (frag) { + return frag.search(/,|\s/) !== -1; + })); + + if (fragments[divider] && fragments[divider].indexOf(',') === -1) { + console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.'); + } + + // If divider is found, we divide the list of values and operands to divide + // them by ofset X and Y. + var splitRegex = /\s*,\s*|\s+/; + var ops = divider !== -1 ? [fragments.slice(0, divider).concat([fragments[divider].split(splitRegex)[0]]), [fragments[divider].split(splitRegex)[1]].concat(fragments.slice(divider + 1))] : [fragments]; + + // Convert the values with units to absolute pixels to allow our computations + ops = ops.map(function (op, index) { + // Most of the units rely on the orientation of the popper + var measurement = (index === 1 ? !useHeight : useHeight) ? 'height' : 'width'; + var mergeWithPrevious = false; + return op + // This aggregates any `+` or `-` sign that aren't considered operators + // e.g.: 10 + +5 => [10, +, +5] + .reduce(function (a, b) { + if (a[a.length - 1] === '' && ['+', '-'].indexOf(b) !== -1) { + a[a.length - 1] = b; + mergeWithPrevious = true; + return a; + } else if (mergeWithPrevious) { + a[a.length - 1] += b; + mergeWithPrevious = false; + return a; + } else { + return a.concat(b); + } + }, []) + // Here we convert the string values into number values (in px) + .map(function (str) { + return toValue(str, measurement, popperOffsets, referenceOffsets); + }); + }); + + // Loop trough the offsets arrays and execute the operations + ops.forEach(function (op, index) { + op.forEach(function (frag, index2) { + if (isNumeric(frag)) { + offsets[index] += frag * (op[index2 - 1] === '-' ? -1 : 1); + } + }); + }); + return offsets; +} + +/** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by update method + * @argument {Object} options - Modifiers configuration and options + * @argument {Number|String} options.offset=0 + * The offset value as described in the modifier description + * @returns {Object} The data object, properly modified + */ +function offset(data, _ref) { + var offset = _ref.offset; + var placement = data.placement, + _data$offsets = data.offsets, + popper = _data$offsets.popper, + reference = _data$offsets.reference; + + var basePlacement = placement.split('-')[0]; + + var offsets = void 0; + if (isNumeric(+offset)) { + offsets = [+offset, 0]; + } else { + offsets = parseOffset(offset, popper, reference, basePlacement); + } + + if (basePlacement === 'left') { + popper.top += offsets[0]; + popper.left -= offsets[1]; + } else if (basePlacement === 'right') { + popper.top += offsets[0]; + popper.left += offsets[1]; + } else if (basePlacement === 'top') { + popper.left += offsets[0]; + popper.top -= offsets[1]; + } else if (basePlacement === 'bottom') { + popper.left += offsets[0]; + popper.top += offsets[1]; + } + + data.popper = popper; + return data; +} + +/** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by `update` method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ +function preventOverflow(data, options) { + var boundariesElement = options.boundariesElement || getOffsetParent(data.instance.popper); + + // If offsetParent is the reference element, we really want to + // go one step up and use the next offsetParent as reference to + // avoid to make this modifier completely useless and look like broken + if (data.instance.reference === boundariesElement) { + boundariesElement = getOffsetParent(boundariesElement); + } + + // NOTE: DOM access here + // resets the popper's position so that the document size can be calculated excluding + // the size of the popper element itself + var transformProp = getSupportedPropertyName('transform'); + var popperStyles = data.instance.popper.style; // assignment to help minification + var top = popperStyles.top, + left = popperStyles.left, + transform = popperStyles[transformProp]; + + popperStyles.top = ''; + popperStyles.left = ''; + popperStyles[transformProp] = ''; + + var boundaries = getBoundaries(data.instance.popper, data.instance.reference, options.padding, boundariesElement, data.positionFixed); + + // NOTE: DOM access here + // restores the original style properties after the offsets have been computed + popperStyles.top = top; + popperStyles.left = left; + popperStyles[transformProp] = transform; + + options.boundaries = boundaries; + + var order = options.priority; + var popper = data.offsets.popper; + + var check = { + primary: function primary(placement) { + var value = popper[placement]; + if (popper[placement] < boundaries[placement] && !options.escapeWithReference) { + value = Math.max(popper[placement], boundaries[placement]); + } + return defineProperty({}, placement, value); + }, + secondary: function secondary(placement) { + var mainSide = placement === 'right' ? 'left' : 'top'; + var value = popper[mainSide]; + if (popper[placement] > boundaries[placement] && !options.escapeWithReference) { + value = Math.min(popper[mainSide], boundaries[placement] - (placement === 'right' ? popper.width : popper.height)); + } + return defineProperty({}, mainSide, value); + } + }; + + order.forEach(function (placement) { + var side = ['left', 'top'].indexOf(placement) !== -1 ? 'primary' : 'secondary'; + popper = _extends({}, popper, check[side](placement)); + }); + + data.offsets.popper = popper; + + return data; +} + +/** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by `update` method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ +function shift(data) { + var placement = data.placement; + var basePlacement = placement.split('-')[0]; + var shiftvariation = placement.split('-')[1]; + + // if shift shiftvariation is specified, run the modifier + if (shiftvariation) { + var _data$offsets = data.offsets, + reference = _data$offsets.reference, + popper = _data$offsets.popper; + + var isVertical = ['bottom', 'top'].indexOf(basePlacement) !== -1; + var side = isVertical ? 'left' : 'top'; + var measurement = isVertical ? 'width' : 'height'; + + var shiftOffsets = { + start: defineProperty({}, side, reference[side]), + end: defineProperty({}, side, reference[side] + reference[measurement] - popper[measurement]) + }; + + data.offsets.popper = _extends({}, popper, shiftOffsets[shiftvariation]); + } + + return data; +} + +/** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by update method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ +function hide(data) { + if (!isModifierRequired(data.instance.modifiers, 'hide', 'preventOverflow')) { + return data; + } + + var refRect = data.offsets.reference; + var bound = find(data.instance.modifiers, function (modifier) { + return modifier.name === 'preventOverflow'; + }).boundaries; + + if (refRect.bottom < bound.top || refRect.left > bound.right || refRect.top > bound.bottom || refRect.right < bound.left) { + // Avoid unnecessary DOM access if visibility hasn't changed + if (data.hide === true) { + return data; + } + + data.hide = true; + data.attributes['x-out-of-boundaries'] = ''; + } else { + // Avoid unnecessary DOM access if visibility hasn't changed + if (data.hide === false) { + return data; + } + + data.hide = false; + data.attributes['x-out-of-boundaries'] = false; + } + + return data; +} + +/** + * @function + * @memberof Modifiers + * @argument {Object} data - The data object generated by `update` method + * @argument {Object} options - Modifiers configuration and options + * @returns {Object} The data object, properly modified + */ +function inner(data) { + var placement = data.placement; + var basePlacement = placement.split('-')[0]; + var _data$offsets = data.offsets, + popper = _data$offsets.popper, + reference = _data$offsets.reference; + + var isHoriz = ['left', 'right'].indexOf(basePlacement) !== -1; + + var subtractLength = ['top', 'left'].indexOf(basePlacement) === -1; + + popper[isHoriz ? 'left' : 'top'] = reference[basePlacement] - (subtractLength ? popper[isHoriz ? 'width' : 'height'] : 0); + + data.placement = getOppositePlacement(placement); + data.offsets.popper = getClientRect(popper); + + return data; +} + +/** + * Modifier function, each modifier can have a function of this type assigned + * to its `fn` property.<br /> + * These functions will be called on each update, this means that you must + * make sure they are performant enough to avoid performance bottlenecks. + * + * @function ModifierFn + * @argument {dataObject} data - The data object generated by `update` method + * @argument {Object} options - Modifiers configuration and options + * @returns {dataObject} The data object, properly modified + */ + +/** + * Modifiers are plugins used to alter the behavior of your poppers.<br /> + * Popper.js uses a set of 9 modifiers to provide all the basic functionalities + * needed by the library. + * + * Usually you don't want to override the `order`, `fn` and `onLoad` props. + * All the other properties are configurations that could be tweaked. + * @namespace modifiers + */ +var modifiers = { + /** + * Modifier used to shift the popper on the start or end of its reference + * element.<br /> + * It will read the variation of the `placement` property.<br /> + * It can be one either `-end` or `-start`. + * @memberof modifiers + * @inner + */ + shift: { + /** @prop {number} order=100 - Index used to define the order of execution */ + order: 100, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: shift + }, + + /** + * The `offset` modifier can shift your popper on both its axis. + * + * It accepts the following units: + * - `px` or unit-less, interpreted as pixels + * - `%` or `%r`, percentage relative to the length of the reference element + * - `%p`, percentage relative to the length of the popper element + * - `vw`, CSS viewport width unit + * - `vh`, CSS viewport height unit + * + * For length is intended the main axis relative to the placement of the popper.<br /> + * This means that if the placement is `top` or `bottom`, the length will be the + * `width`. In case of `left` or `right`, it will be the `height`. + * + * You can provide a single value (as `Number` or `String`), or a pair of values + * as `String` divided by a comma or one (or more) white spaces.<br /> + * The latter is a deprecated method because it leads to confusion and will be + * removed in v2.<br /> + * Additionally, it accepts additions and subtractions between different units. + * Note that multiplications and divisions aren't supported. + * + * Valid examples are: + * ``` + * 10 + * '10%' + * '10, 10' + * '10%, 10' + * '10 + 10%' + * '10 - 5vh + 3%' + * '-10px + 5vh, 5px - 6%' + * ``` + * > **NB**: If you desire to apply offsets to your poppers in a way that may make them overlap + * > with their reference element, unfortunately, you will have to disable the `flip` modifier. + * > You can read more on this at this [issue](https://github.com/FezVrasta/popper.js/issues/373). + * + * @memberof modifiers + * @inner + */ + offset: { + /** @prop {number} order=200 - Index used to define the order of execution */ + order: 200, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: offset, + /** @prop {Number|String} offset=0 + * The offset value as described in the modifier description + */ + offset: 0 + }, + + /** + * Modifier used to prevent the popper from being positioned outside the boundary. + * + * A scenario exists where the reference itself is not within the boundaries.<br /> + * We can say it has "escaped the boundaries" — or just "escaped".<br /> + * In this case we need to decide whether the popper should either: + * + * - detach from the reference and remain "trapped" in the boundaries, or + * - if it should ignore the boundary and "escape with its reference" + * + * When `escapeWithReference` is set to`true` and reference is completely + * outside its boundaries, the popper will overflow (or completely leave) + * the boundaries in order to remain attached to the edge of the reference. + * + * @memberof modifiers + * @inner + */ + preventOverflow: { + /** @prop {number} order=300 - Index used to define the order of execution */ + order: 300, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: preventOverflow, + /** + * @prop {Array} [priority=['left','right','top','bottom']] + * Popper will try to prevent overflow following these priorities by default, + * then, it could overflow on the left and on top of the `boundariesElement` + */ + priority: ['left', 'right', 'top', 'bottom'], + /** + * @prop {number} padding=5 + * Amount of pixel used to define a minimum distance between the boundaries + * and the popper. This makes sure the popper always has a little padding + * between the edges of its container + */ + padding: 5, + /** + * @prop {String|HTMLElement} boundariesElement='scrollParent' + * Boundaries used by the modifier. Can be `scrollParent`, `window`, + * `viewport` or any DOM element. + */ + boundariesElement: 'scrollParent' + }, + + /** + * Modifier used to make sure the reference and its popper stay near each other + * without leaving any gap between the two. Especially useful when the arrow is + * enabled and you want to ensure that it points to its reference element. + * It cares only about the first axis. You can still have poppers with margin + * between the popper and its reference element. + * @memberof modifiers + * @inner + */ + keepTogether: { + /** @prop {number} order=400 - Index used to define the order of execution */ + order: 400, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: keepTogether + }, + + /** + * This modifier is used to move the `arrowElement` of the popper to make + * sure it is positioned between the reference element and its popper element. + * It will read the outer size of the `arrowElement` node to detect how many + * pixels of conjunction are needed. + * + * It has no effect if no `arrowElement` is provided. + * @memberof modifiers + * @inner + */ + arrow: { + /** @prop {number} order=500 - Index used to define the order of execution */ + order: 500, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: arrow, + /** @prop {String|HTMLElement} element='[x-arrow]' - Selector or node used as arrow */ + element: '[x-arrow]' + }, + + /** + * Modifier used to flip the popper's placement when it starts to overlap its + * reference element. + * + * Requires the `preventOverflow` modifier before it in order to work. + * + * **NOTE:** this modifier will interrupt the current update cycle and will + * restart it if it detects the need to flip the placement. + * @memberof modifiers + * @inner + */ + flip: { + /** @prop {number} order=600 - Index used to define the order of execution */ + order: 600, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: flip, + /** + * @prop {String|Array} behavior='flip' + * The behavior used to change the popper's placement. It can be one of + * `flip`, `clockwise`, `counterclockwise` or an array with a list of valid + * placements (with optional variations) + */ + behavior: 'flip', + /** + * @prop {number} padding=5 + * The popper will flip if it hits the edges of the `boundariesElement` + */ + padding: 5, + /** + * @prop {String|HTMLElement} boundariesElement='viewport' + * The element which will define the boundaries of the popper position. + * The popper will never be placed outside of the defined boundaries + * (except if `keepTogether` is enabled) + */ + boundariesElement: 'viewport' + }, + + /** + * Modifier used to make the popper flow toward the inner of the reference element. + * By default, when this modifier is disabled, the popper will be placed outside + * the reference element. + * @memberof modifiers + * @inner + */ + inner: { + /** @prop {number} order=700 - Index used to define the order of execution */ + order: 700, + /** @prop {Boolean} enabled=false - Whether the modifier is enabled or not */ + enabled: false, + /** @prop {ModifierFn} */ + fn: inner + }, + + /** + * Modifier used to hide the popper when its reference element is outside of the + * popper boundaries. It will set a `x-out-of-boundaries` attribute which can + * be used to hide with a CSS selector the popper when its reference is + * out of boundaries. + * + * Requires the `preventOverflow` modifier before it in order to work. + * @memberof modifiers + * @inner + */ + hide: { + /** @prop {number} order=800 - Index used to define the order of execution */ + order: 800, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: hide + }, + + /** + * Computes the style that will be applied to the popper element to gets + * properly positioned. + * + * Note that this modifier will not touch the DOM, it just prepares the styles + * so that `applyStyle` modifier can apply it. This separation is useful + * in case you need to replace `applyStyle` with a custom implementation. + * + * This modifier has `850` as `order` value to maintain backward compatibility + * with previous versions of Popper.js. Expect the modifiers ordering method + * to change in future major versions of the library. + * + * @memberof modifiers + * @inner + */ + computeStyle: { + /** @prop {number} order=850 - Index used to define the order of execution */ + order: 850, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: computeStyle, + /** + * @prop {Boolean} gpuAcceleration=true + * If true, it uses the CSS 3D transformation to position the popper. + * Otherwise, it will use the `top` and `left` properties + */ + gpuAcceleration: true, + /** + * @prop {string} [x='bottom'] + * Where to anchor the X axis (`bottom` or `top`). AKA X offset origin. + * Change this if your popper should grow in a direction different from `bottom` + */ + x: 'bottom', + /** + * @prop {string} [x='left'] + * Where to anchor the Y axis (`left` or `right`). AKA Y offset origin. + * Change this if your popper should grow in a direction different from `right` + */ + y: 'right' + }, + + /** + * Applies the computed styles to the popper element. + * + * All the DOM manipulations are limited to this modifier. This is useful in case + * you want to integrate Popper.js inside a framework or view library and you + * want to delegate all the DOM manipulations to it. + * + * Note that if you disable this modifier, you must make sure the popper element + * has its position set to `absolute` before Popper.js can do its work! + * + * Just disable this modifier and define your own to achieve the desired effect. + * + * @memberof modifiers + * @inner + */ + applyStyle: { + /** @prop {number} order=900 - Index used to define the order of execution */ + order: 900, + /** @prop {Boolean} enabled=true - Whether the modifier is enabled or not */ + enabled: true, + /** @prop {ModifierFn} */ + fn: applyStyle, + /** @prop {Function} */ + onLoad: applyStyleOnLoad, + /** + * @deprecated since version 1.10.0, the property moved to `computeStyle` modifier + * @prop {Boolean} gpuAcceleration=true + * If true, it uses the CSS 3D transformation to position the popper. + * Otherwise, it will use the `top` and `left` properties + */ + gpuAcceleration: undefined + } +}; + +/** + * The `dataObject` is an object containing all the information used by Popper.js. + * This object is passed to modifiers and to the `onCreate` and `onUpdate` callbacks. + * @name dataObject + * @property {Object} data.instance The Popper.js instance + * @property {String} data.placement Placement applied to popper + * @property {String} data.originalPlacement Placement originally defined on init + * @property {Boolean} data.flipped True if popper has been flipped by flip modifier + * @property {Boolean} data.hide True if the reference element is out of boundaries, useful to know when to hide the popper + * @property {HTMLElement} data.arrowElement Node used as arrow by arrow modifier + * @property {Object} data.styles Any CSS property defined here will be applied to the popper. It expects the JavaScript nomenclature (eg. `marginBottom`) + * @property {Object} data.arrowStyles Any CSS property defined here will be applied to the popper arrow. It expects the JavaScript nomenclature (eg. `marginBottom`) + * @property {Object} data.boundaries Offsets of the popper boundaries + * @property {Object} data.offsets The measurements of popper, reference and arrow elements + * @property {Object} data.offsets.popper `top`, `left`, `width`, `height` values + * @property {Object} data.offsets.reference `top`, `left`, `width`, `height` values + * @property {Object} data.offsets.arrow] `top` and `left` offsets, only one of them will be different from 0 + */ + +/** + * Default options provided to Popper.js constructor.<br /> + * These can be overridden using the `options` argument of Popper.js.<br /> + * To override an option, simply pass an object with the same + * structure of the `options` object, as the 3rd argument. For example: + * ``` + * new Popper(ref, pop, { + * modifiers: { + * preventOverflow: { enabled: false } + * } + * }) + * ``` + * @type {Object} + * @static + * @memberof Popper + */ +var Defaults = { + /** + * Popper's placement. + * @prop {Popper.placements} placement='bottom' + */ + placement: 'bottom', + + /** + * Set this to true if you want popper to position it self in 'fixed' mode + * @prop {Boolean} positionFixed=false + */ + positionFixed: false, + + /** + * Whether events (resize, scroll) are initially enabled. + * @prop {Boolean} eventsEnabled=true + */ + eventsEnabled: true, + + /** + * Set to true if you want to automatically remove the popper when + * you call the `destroy` method. + * @prop {Boolean} removeOnDestroy=false + */ + removeOnDestroy: false, + + /** + * Callback called when the popper is created.<br /> + * By default, it is set to no-op.<br /> + * Access Popper.js instance with `data.instance`. + * @prop {onCreate} + */ + onCreate: function onCreate() {}, + + /** + * Callback called when the popper is updated. This callback is not called + * on the initialization/creation of the popper, but only on subsequent + * updates.<br /> + * By default, it is set to no-op.<br /> + * Access Popper.js instance with `data.instance`. + * @prop {onUpdate} + */ + onUpdate: function onUpdate() {}, + + /** + * List of modifiers used to modify the offsets before they are applied to the popper. + * They provide most of the functionalities of Popper.js. + * @prop {modifiers} + */ + modifiers: modifiers +}; + +/** + * @callback onCreate + * @param {dataObject} data + */ + +/** + * @callback onUpdate + * @param {dataObject} data + */ + +// Utils +// Methods +var Popper = function () { + /** + * Creates a new Popper.js instance. + * @class Popper + * @param {HTMLElement|referenceObject} reference - The reference element used to position the popper + * @param {HTMLElement} popper - The HTML element used as the popper + * @param {Object} options - Your custom options to override the ones defined in [Defaults](#defaults) + * @return {Object} instance - The generated Popper.js instance + */ + function Popper(reference, popper) { + var _this = this; + + var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {}; + classCallCheck(this, Popper); + + this.scheduleUpdate = function () { + return requestAnimationFrame(_this.update); + }; + + // make update() debounced, so that it only runs at most once-per-tick + this.update = debounce(this.update.bind(this)); + + // with {} we create a new object with the options inside it + this.options = _extends({}, Popper.Defaults, options); + + // init state + this.state = { + isDestroyed: false, + isCreated: false, + scrollParents: [] + }; + + // get reference and popper elements (allow jQuery wrappers) + this.reference = reference && reference.jquery ? reference[0] : reference; + this.popper = popper && popper.jquery ? popper[0] : popper; + + // Deep merge modifiers options + this.options.modifiers = {}; + Object.keys(_extends({}, Popper.Defaults.modifiers, options.modifiers)).forEach(function (name) { + _this.options.modifiers[name] = _extends({}, Popper.Defaults.modifiers[name] || {}, options.modifiers ? options.modifiers[name] : {}); + }); + + // Refactoring modifiers' list (Object => Array) + this.modifiers = Object.keys(this.options.modifiers).map(function (name) { + return _extends({ + name: name + }, _this.options.modifiers[name]); + }) + // sort the modifiers by order + .sort(function (a, b) { + return a.order - b.order; + }); + + // modifiers have the ability to execute arbitrary code when Popper.js get inited + // such code is executed in the same order of its modifier + // they could add new properties to their options configuration + // BE AWARE: don't add options to `options.modifiers.name` but to `modifierOptions`! + this.modifiers.forEach(function (modifierOptions) { + if (modifierOptions.enabled && isFunction(modifierOptions.onLoad)) { + modifierOptions.onLoad(_this.reference, _this.popper, _this.options, modifierOptions, _this.state); + } + }); + + // fire the first update to position the popper in the right place + this.update(); + + var eventsEnabled = this.options.eventsEnabled; + if (eventsEnabled) { + // setup event listeners, they will take care of update the position in specific situations + this.enableEventListeners(); + } + + this.state.eventsEnabled = eventsEnabled; + } + + // We can't use class properties because they don't get listed in the + // class prototype and break stuff like Sinon stubs + + + createClass(Popper, [{ + key: 'update', + value: function update$$1() { + return update.call(this); + } + }, { + key: 'destroy', + value: function destroy$$1() { + return destroy.call(this); + } + }, { + key: 'enableEventListeners', + value: function enableEventListeners$$1() { + return enableEventListeners.call(this); + } + }, { + key: 'disableEventListeners', + value: function disableEventListeners$$1() { + return disableEventListeners.call(this); + } + + /** + * Schedules an update. It will run on the next UI update available. + * @method scheduleUpdate + * @memberof Popper + */ + + + /** + * Collection of utilities useful when writing custom modifiers. + * Starting from version 1.7, this method is available only if you + * include `popper-utils.js` before `popper.js`. + * + * **DEPRECATION**: This way to access PopperUtils is deprecated + * and will be removed in v2! Use the PopperUtils module directly instead. + * Due to the high instability of the methods contained in Utils, we can't + * guarantee them to follow semver. Use them at your own risk! + * @static + * @private + * @type {Object} + * @deprecated since version 1.8 + * @member Utils + * @memberof Popper + */ + + }]); + return Popper; +}(); + +/** + * The `referenceObject` is an object that provides an interface compatible with Popper.js + * and lets you use it as replacement of a real DOM node.<br /> + * You can use this method to position a popper relatively to a set of coordinates + * in case you don't have a DOM node to use as reference. + * + * ``` + * new Popper(referenceObject, popperNode); + * ``` + * + * NB: This feature isn't supported in Internet Explorer 10. + * @name referenceObject + * @property {Function} data.getBoundingClientRect + * A function that returns a set of coordinates compatible with the native `getBoundingClientRect` method. + * @property {number} data.clientWidth + * An ES6 getter that will return the width of the virtual reference element. + * @property {number} data.clientHeight + * An ES6 getter that will return the height of the virtual reference element. + */ + + +Popper.Utils = (typeof window !== 'undefined' ? window : global).PopperUtils; +Popper.placements = placements; +Popper.Defaults = Defaults; + +return Popper; + +}))); +/*! + * Bootstrap util.js v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery')) : + typeof define === 'function' && define.amd ? define(['jquery'], factory) : + (global = global || self, global.Util = factory(global.jQuery)); +}(this, function ($) { 'use strict'; + + $ = $ && $.hasOwnProperty('default') ? $['default'] : $; + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v4.3.1): util.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * -------------------------------------------------------------------------- + */ + /** + * ------------------------------------------------------------------------ + * Private TransitionEnd Helpers + * ------------------------------------------------------------------------ + */ + + var TRANSITION_END = 'transitionend'; + var MAX_UID = 1000000; + var MILLISECONDS_MULTIPLIER = 1000; // Shoutout AngusCroll (https://goo.gl/pxwQGp) + + function toType(obj) { + return {}.toString.call(obj).match(/\s([a-z]+)/i)[1].toLowerCase(); + } + + function getSpecialTransitionEndEvent() { + return { + bindType: TRANSITION_END, + delegateType: TRANSITION_END, + handle: function handle(event) { + if ($(event.target).is(this)) { + return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params + } + + return undefined; // eslint-disable-line no-undefined + } + }; + } + + function transitionEndEmulator(duration) { + var _this = this; + + var called = false; + $(this).one(Util.TRANSITION_END, function () { + called = true; + }); + setTimeout(function () { + if (!called) { + Util.triggerTransitionEnd(_this); + } + }, duration); + return this; + } + + function setTransitionEndSupport() { + $.fn.emulateTransitionEnd = transitionEndEmulator; + $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent(); + } + /** + * -------------------------------------------------------------------------- + * Public Util Api + * -------------------------------------------------------------------------- + */ + + + var Util = { + TRANSITION_END: 'bsTransitionEnd', + getUID: function getUID(prefix) { + do { + // eslint-disable-next-line no-bitwise + prefix += ~~(Math.random() * MAX_UID); // "~~" acts like a faster Math.floor() here + } while (document.getElementById(prefix)); + + return prefix; + }, + getSelectorFromElement: function getSelectorFromElement(element) { + var selector = element.getAttribute('data-target'); + + if (!selector || selector === '#') { + var hrefAttr = element.getAttribute('href'); + selector = hrefAttr && hrefAttr !== '#' ? hrefAttr.trim() : ''; + } + + try { + return document.querySelector(selector) ? selector : null; + } catch (err) { + return null; + } + }, + getTransitionDurationFromElement: function getTransitionDurationFromElement(element) { + if (!element) { + return 0; + } // Get transition-duration of the element + + + var transitionDuration = $(element).css('transition-duration'); + var transitionDelay = $(element).css('transition-delay'); + var floatTransitionDuration = parseFloat(transitionDuration); + var floatTransitionDelay = parseFloat(transitionDelay); // Return 0 if element or transition duration is not found + + if (!floatTransitionDuration && !floatTransitionDelay) { + return 0; + } // If multiple durations are defined, take the first + + + transitionDuration = transitionDuration.split(',')[0]; + transitionDelay = transitionDelay.split(',')[0]; + return (parseFloat(transitionDuration) + parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER; + }, + reflow: function reflow(element) { + return element.offsetHeight; + }, + triggerTransitionEnd: function triggerTransitionEnd(element) { + $(element).trigger(TRANSITION_END); + }, + // TODO: Remove in v5 + supportsTransitionEnd: function supportsTransitionEnd() { + return Boolean(TRANSITION_END); + }, + isElement: function isElement(obj) { + return (obj[0] || obj).nodeType; + }, + typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) { + for (var property in configTypes) { + if (Object.prototype.hasOwnProperty.call(configTypes, property)) { + var expectedTypes = configTypes[property]; + var value = config[property]; + var valueType = value && Util.isElement(value) ? 'element' : toType(value); + + if (!new RegExp(expectedTypes).test(valueType)) { + throw new Error(componentName.toUpperCase() + ": " + ("Option \"" + property + "\" provided type \"" + valueType + "\" ") + ("but expected type \"" + expectedTypes + "\".")); + } + } + } + }, + findShadowRoot: function findShadowRoot(element) { + if (!document.documentElement.attachShadow) { + return null; + } // Can find the shadow root otherwise it'll return the document + + + if (typeof element.getRootNode === 'function') { + var root = element.getRootNode(); + return root instanceof ShadowRoot ? root : null; + } + + if (element instanceof ShadowRoot) { + return element; + } // when we don't find a shadow root + + + if (!element.parentNode) { + return null; + } + + return Util.findShadowRoot(element.parentNode); + } + }; + setTransitionEndSupport(); + + return Util; + +})); +/*! + * Bootstrap alert.js v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery'), require('./util.js')) : + typeof define === 'function' && define.amd ? define(['jquery', './util.js'], factory) : + (global = global || self, global.Alert = factory(global.jQuery, global.Util)); +}(this, function ($, Util) { 'use strict'; + + $ = $ && $.hasOwnProperty('default') ? $['default'] : $; + Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util; + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME = 'alert'; + var VERSION = '4.3.1'; + var DATA_KEY = 'bs.alert'; + var EVENT_KEY = "." + DATA_KEY; + var DATA_API_KEY = '.data-api'; + var JQUERY_NO_CONFLICT = $.fn[NAME]; + var Selector = { + DISMISS: '[data-dismiss="alert"]' + }; + var Event = { + CLOSE: "close" + EVENT_KEY, + CLOSED: "closed" + EVENT_KEY, + CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY + }; + var ClassName = { + ALERT: 'alert', + FADE: 'fade', + SHOW: 'show' + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + }; + + var Alert = + /*#__PURE__*/ + function () { + function Alert(element) { + this._element = element; + } // Getters + + + var _proto = Alert.prototype; + + // Public + _proto.close = function close(element) { + var rootElement = this._element; + + if (element) { + rootElement = this._getRootElement(element); + } + + var customEvent = this._triggerCloseEvent(rootElement); + + if (customEvent.isDefaultPrevented()) { + return; + } + + this._removeElement(rootElement); + }; + + _proto.dispose = function dispose() { + $.removeData(this._element, DATA_KEY); + this._element = null; + } // Private + ; + + _proto._getRootElement = function _getRootElement(element) { + var selector = Util.getSelectorFromElement(element); + var parent = false; + + if (selector) { + parent = document.querySelector(selector); + } + + if (!parent) { + parent = $(element).closest("." + ClassName.ALERT)[0]; + } + + return parent; + }; + + _proto._triggerCloseEvent = function _triggerCloseEvent(element) { + var closeEvent = $.Event(Event.CLOSE); + $(element).trigger(closeEvent); + return closeEvent; + }; + + _proto._removeElement = function _removeElement(element) { + var _this = this; + + $(element).removeClass(ClassName.SHOW); + + if (!$(element).hasClass(ClassName.FADE)) { + this._destroyElement(element); + + return; + } + + var transitionDuration = Util.getTransitionDurationFromElement(element); + $(element).one(Util.TRANSITION_END, function (event) { + return _this._destroyElement(element, event); + }).emulateTransitionEnd(transitionDuration); + }; + + _proto._destroyElement = function _destroyElement(element) { + $(element).detach().trigger(Event.CLOSED).remove(); + } // Static + ; + + Alert._jQueryInterface = function _jQueryInterface(config) { + return this.each(function () { + var $element = $(this); + var data = $element.data(DATA_KEY); + + if (!data) { + data = new Alert(this); + $element.data(DATA_KEY, data); + } + + if (config === 'close') { + data[config](this); + } + }); + }; + + Alert._handleDismiss = function _handleDismiss(alertInstance) { + return function (event) { + if (event) { + event.preventDefault(); + } + + alertInstance.close(this); + }; + }; + + _createClass(Alert, null, [{ + key: "VERSION", + get: function get() { + return VERSION; + } + }]); + + return Alert; + }(); + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + $(document).on(Event.CLICK_DATA_API, Selector.DISMISS, Alert._handleDismiss(new Alert())); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + $.fn[NAME] = Alert._jQueryInterface; + $.fn[NAME].Constructor = Alert; + + $.fn[NAME].noConflict = function () { + $.fn[NAME] = JQUERY_NO_CONFLICT; + return Alert._jQueryInterface; + }; + + return Alert; + +})); +/*! + * Bootstrap button.js v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery')) : + typeof define === 'function' && define.amd ? define(['jquery'], factory) : + (global = global || self, global.Button = factory(global.jQuery)); +}(this, function ($) { 'use strict'; + + $ = $ && $.hasOwnProperty('default') ? $['default'] : $; + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME = 'button'; + var VERSION = '4.3.1'; + var DATA_KEY = 'bs.button'; + var EVENT_KEY = "." + DATA_KEY; + var DATA_API_KEY = '.data-api'; + var JQUERY_NO_CONFLICT = $.fn[NAME]; + var ClassName = { + ACTIVE: 'active', + BUTTON: 'btn', + FOCUS: 'focus' + }; + var Selector = { + DATA_TOGGLE_CARROT: '[data-toggle^="button"]', + DATA_TOGGLE: '[data-toggle="buttons"]', + INPUT: 'input:not([type="hidden"])', + ACTIVE: '.active', + BUTTON: '.btn' + }; + var Event = { + CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY, + FOCUS_BLUR_DATA_API: "focus" + EVENT_KEY + DATA_API_KEY + " " + ("blur" + EVENT_KEY + DATA_API_KEY) + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + }; + + var Button = + /*#__PURE__*/ + function () { + function Button(element) { + this._element = element; + } // Getters + + + var _proto = Button.prototype; + + // Public + _proto.toggle = function toggle() { + var triggerChangeEvent = true; + var addAriaPressed = true; + var rootElement = $(this._element).closest(Selector.DATA_TOGGLE)[0]; + + if (rootElement) { + var input = this._element.querySelector(Selector.INPUT); + + if (input) { + if (input.type === 'radio') { + if (input.checked && this._element.classList.contains(ClassName.ACTIVE)) { + triggerChangeEvent = false; + } else { + var activeElement = rootElement.querySelector(Selector.ACTIVE); + + if (activeElement) { + $(activeElement).removeClass(ClassName.ACTIVE); + } + } + } + + if (triggerChangeEvent) { + if (input.hasAttribute('disabled') || rootElement.hasAttribute('disabled') || input.classList.contains('disabled') || rootElement.classList.contains('disabled')) { + return; + } + + input.checked = !this._element.classList.contains(ClassName.ACTIVE); + $(input).trigger('change'); + } + + input.focus(); + addAriaPressed = false; + } + } + + if (addAriaPressed) { + this._element.setAttribute('aria-pressed', !this._element.classList.contains(ClassName.ACTIVE)); + } + + if (triggerChangeEvent) { + $(this._element).toggleClass(ClassName.ACTIVE); + } + }; + + _proto.dispose = function dispose() { + $.removeData(this._element, DATA_KEY); + this._element = null; + } // Static + ; + + Button._jQueryInterface = function _jQueryInterface(config) { + return this.each(function () { + var data = $(this).data(DATA_KEY); + + if (!data) { + data = new Button(this); + $(this).data(DATA_KEY, data); + } + + if (config === 'toggle') { + data[config](); + } + }); + }; + + _createClass(Button, null, [{ + key: "VERSION", + get: function get() { + return VERSION; + } + }]); + + return Button; + }(); + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) { + event.preventDefault(); + var button = event.target; + + if (!$(button).hasClass(ClassName.BUTTON)) { + button = $(button).closest(Selector.BUTTON); + } + + Button._jQueryInterface.call($(button), 'toggle'); + }).on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) { + var button = $(event.target).closest(Selector.BUTTON)[0]; + $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type)); + }); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + $.fn[NAME] = Button._jQueryInterface; + $.fn[NAME].Constructor = Button; + + $.fn[NAME].noConflict = function () { + $.fn[NAME] = JQUERY_NO_CONFLICT; + return Button._jQueryInterface; + }; + + return Button; + +})); +/*! + * Bootstrap carousel.js v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery'), require('./util.js')) : + typeof define === 'function' && define.amd ? define(['jquery', './util.js'], factory) : + (global = global || self, global.Carousel = factory(global.jQuery, global.Util)); +}(this, function ($, Util) { 'use strict'; + + $ = $ && $.hasOwnProperty('default') ? $['default'] : $; + Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util; + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } + + function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; + } + + function _objectSpread(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i] != null ? arguments[i] : {}; + var ownKeys = Object.keys(source); + + if (typeof Object.getOwnPropertySymbols === 'function') { + ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { + return Object.getOwnPropertyDescriptor(source, sym).enumerable; + })); + } + + ownKeys.forEach(function (key) { + _defineProperty(target, key, source[key]); + }); + } + + return target; + } + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME = 'carousel'; + var VERSION = '4.3.1'; + var DATA_KEY = 'bs.carousel'; + var EVENT_KEY = "." + DATA_KEY; + var DATA_API_KEY = '.data-api'; + var JQUERY_NO_CONFLICT = $.fn[NAME]; + var ARROW_LEFT_KEYCODE = 37; // KeyboardEvent.which value for left arrow key + + var ARROW_RIGHT_KEYCODE = 39; // KeyboardEvent.which value for right arrow key + + var TOUCHEVENT_COMPAT_WAIT = 500; // Time for mouse compat events to fire after touch + + var SWIPE_THRESHOLD = 40; + var Default = { + interval: 5000, + keyboard: true, + slide: false, + pause: 'hover', + wrap: true, + touch: true + }; + var DefaultType = { + interval: '(number|boolean)', + keyboard: 'boolean', + slide: '(boolean|string)', + pause: '(string|boolean)', + wrap: 'boolean', + touch: 'boolean' + }; + var Direction = { + NEXT: 'next', + PREV: 'prev', + LEFT: 'left', + RIGHT: 'right' + }; + var Event = { + SLIDE: "slide" + EVENT_KEY, + SLID: "slid" + EVENT_KEY, + KEYDOWN: "keydown" + EVENT_KEY, + MOUSEENTER: "mouseenter" + EVENT_KEY, + MOUSELEAVE: "mouseleave" + EVENT_KEY, + TOUCHSTART: "touchstart" + EVENT_KEY, + TOUCHMOVE: "touchmove" + EVENT_KEY, + TOUCHEND: "touchend" + EVENT_KEY, + POINTERDOWN: "pointerdown" + EVENT_KEY, + POINTERUP: "pointerup" + EVENT_KEY, + DRAG_START: "dragstart" + EVENT_KEY, + LOAD_DATA_API: "load" + EVENT_KEY + DATA_API_KEY, + CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY + }; + var ClassName = { + CAROUSEL: 'carousel', + ACTIVE: 'active', + SLIDE: 'slide', + RIGHT: 'carousel-item-right', + LEFT: 'carousel-item-left', + NEXT: 'carousel-item-next', + PREV: 'carousel-item-prev', + ITEM: 'carousel-item', + POINTER_EVENT: 'pointer-event' + }; + var Selector = { + ACTIVE: '.active', + ACTIVE_ITEM: '.active.carousel-item', + ITEM: '.carousel-item', + ITEM_IMG: '.carousel-item img', + NEXT_PREV: '.carousel-item-next, .carousel-item-prev', + INDICATORS: '.carousel-indicators', + DATA_SLIDE: '[data-slide], [data-slide-to]', + DATA_RIDE: '[data-ride="carousel"]' + }; + var PointerType = { + TOUCH: 'touch', + PEN: 'pen' + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + }; + + var Carousel = + /*#__PURE__*/ + function () { + function Carousel(element, config) { + this._items = null; + this._interval = null; + this._activeElement = null; + this._isPaused = false; + this._isSliding = false; + this.touchTimeout = null; + this.touchStartX = 0; + this.touchDeltaX = 0; + this._config = this._getConfig(config); + this._element = element; + this._indicatorsElement = this._element.querySelector(Selector.INDICATORS); + this._touchSupported = 'ontouchstart' in document.documentElement || navigator.maxTouchPoints > 0; + this._pointerEvent = Boolean(window.PointerEvent || window.MSPointerEvent); + + this._addEventListeners(); + } // Getters + + + var _proto = Carousel.prototype; + + // Public + _proto.next = function next() { + if (!this._isSliding) { + this._slide(Direction.NEXT); + } + }; + + _proto.nextWhenVisible = function nextWhenVisible() { + // Don't call next when the page isn't visible + // or the carousel or its parent isn't visible + if (!document.hidden && $(this._element).is(':visible') && $(this._element).css('visibility') !== 'hidden') { + this.next(); + } + }; + + _proto.prev = function prev() { + if (!this._isSliding) { + this._slide(Direction.PREV); + } + }; + + _proto.pause = function pause(event) { + if (!event) { + this._isPaused = true; + } + + if (this._element.querySelector(Selector.NEXT_PREV)) { + Util.triggerTransitionEnd(this._element); + this.cycle(true); + } + + clearInterval(this._interval); + this._interval = null; + }; + + _proto.cycle = function cycle(event) { + if (!event) { + this._isPaused = false; + } + + if (this._interval) { + clearInterval(this._interval); + this._interval = null; + } + + if (this._config.interval && !this._isPaused) { + this._interval = setInterval((document.visibilityState ? this.nextWhenVisible : this.next).bind(this), this._config.interval); + } + }; + + _proto.to = function to(index) { + var _this = this; + + this._activeElement = this._element.querySelector(Selector.ACTIVE_ITEM); + + var activeIndex = this._getItemIndex(this._activeElement); + + if (index > this._items.length - 1 || index < 0) { + return; + } + + if (this._isSliding) { + $(this._element).one(Event.SLID, function () { + return _this.to(index); + }); + return; + } + + if (activeIndex === index) { + this.pause(); + this.cycle(); + return; + } + + var direction = index > activeIndex ? Direction.NEXT : Direction.PREV; + + this._slide(direction, this._items[index]); + }; + + _proto.dispose = function dispose() { + $(this._element).off(EVENT_KEY); + $.removeData(this._element, DATA_KEY); + this._items = null; + this._config = null; + this._element = null; + this._interval = null; + this._isPaused = null; + this._isSliding = null; + this._activeElement = null; + this._indicatorsElement = null; + } // Private + ; + + _proto._getConfig = function _getConfig(config) { + config = _objectSpread({}, Default, config); + Util.typeCheckConfig(NAME, config, DefaultType); + return config; + }; + + _proto._handleSwipe = function _handleSwipe() { + var absDeltax = Math.abs(this.touchDeltaX); + + if (absDeltax <= SWIPE_THRESHOLD) { + return; + } + + var direction = absDeltax / this.touchDeltaX; // swipe left + + if (direction > 0) { + this.prev(); + } // swipe right + + + if (direction < 0) { + this.next(); + } + }; + + _proto._addEventListeners = function _addEventListeners() { + var _this2 = this; + + if (this._config.keyboard) { + $(this._element).on(Event.KEYDOWN, function (event) { + return _this2._keydown(event); + }); + } + + if (this._config.pause === 'hover') { + $(this._element).on(Event.MOUSEENTER, function (event) { + return _this2.pause(event); + }).on(Event.MOUSELEAVE, function (event) { + return _this2.cycle(event); + }); + } + + if (this._config.touch) { + this._addTouchEventListeners(); + } + }; + + _proto._addTouchEventListeners = function _addTouchEventListeners() { + var _this3 = this; + + if (!this._touchSupported) { + return; + } + + var start = function start(event) { + if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) { + _this3.touchStartX = event.originalEvent.clientX; + } else if (!_this3._pointerEvent) { + _this3.touchStartX = event.originalEvent.touches[0].clientX; + } + }; + + var move = function move(event) { + // ensure swiping with one touch and not pinching + if (event.originalEvent.touches && event.originalEvent.touches.length > 1) { + _this3.touchDeltaX = 0; + } else { + _this3.touchDeltaX = event.originalEvent.touches[0].clientX - _this3.touchStartX; + } + }; + + var end = function end(event) { + if (_this3._pointerEvent && PointerType[event.originalEvent.pointerType.toUpperCase()]) { + _this3.touchDeltaX = event.originalEvent.clientX - _this3.touchStartX; + } + + _this3._handleSwipe(); + + if (_this3._config.pause === 'hover') { + // If it's a touch-enabled device, mouseenter/leave are fired as + // part of the mouse compatibility events on first tap - the carousel + // would stop cycling until user tapped out of it; + // here, we listen for touchend, explicitly pause the carousel + // (as if it's the second time we tap on it, mouseenter compat event + // is NOT fired) and after a timeout (to allow for mouse compatibility + // events to fire) we explicitly restart cycling + _this3.pause(); + + if (_this3.touchTimeout) { + clearTimeout(_this3.touchTimeout); + } + + _this3.touchTimeout = setTimeout(function (event) { + return _this3.cycle(event); + }, TOUCHEVENT_COMPAT_WAIT + _this3._config.interval); + } + }; + + $(this._element.querySelectorAll(Selector.ITEM_IMG)).on(Event.DRAG_START, function (e) { + return e.preventDefault(); + }); + + if (this._pointerEvent) { + $(this._element).on(Event.POINTERDOWN, function (event) { + return start(event); + }); + $(this._element).on(Event.POINTERUP, function (event) { + return end(event); + }); + + this._element.classList.add(ClassName.POINTER_EVENT); + } else { + $(this._element).on(Event.TOUCHSTART, function (event) { + return start(event); + }); + $(this._element).on(Event.TOUCHMOVE, function (event) { + return move(event); + }); + $(this._element).on(Event.TOUCHEND, function (event) { + return end(event); + }); + } + }; + + _proto._keydown = function _keydown(event) { + if (/input|textarea/i.test(event.target.tagName)) { + return; + } + + switch (event.which) { + case ARROW_LEFT_KEYCODE: + event.preventDefault(); + this.prev(); + break; + + case ARROW_RIGHT_KEYCODE: + event.preventDefault(); + this.next(); + break; + + default: + } + }; + + _proto._getItemIndex = function _getItemIndex(element) { + this._items = element && element.parentNode ? [].slice.call(element.parentNode.querySelectorAll(Selector.ITEM)) : []; + return this._items.indexOf(element); + }; + + _proto._getItemByDirection = function _getItemByDirection(direction, activeElement) { + var isNextDirection = direction === Direction.NEXT; + var isPrevDirection = direction === Direction.PREV; + + var activeIndex = this._getItemIndex(activeElement); + + var lastItemIndex = this._items.length - 1; + var isGoingToWrap = isPrevDirection && activeIndex === 0 || isNextDirection && activeIndex === lastItemIndex; + + if (isGoingToWrap && !this._config.wrap) { + return activeElement; + } + + var delta = direction === Direction.PREV ? -1 : 1; + var itemIndex = (activeIndex + delta) % this._items.length; + return itemIndex === -1 ? this._items[this._items.length - 1] : this._items[itemIndex]; + }; + + _proto._triggerSlideEvent = function _triggerSlideEvent(relatedTarget, eventDirectionName) { + var targetIndex = this._getItemIndex(relatedTarget); + + var fromIndex = this._getItemIndex(this._element.querySelector(Selector.ACTIVE_ITEM)); + + var slideEvent = $.Event(Event.SLIDE, { + relatedTarget: relatedTarget, + direction: eventDirectionName, + from: fromIndex, + to: targetIndex + }); + $(this._element).trigger(slideEvent); + return slideEvent; + }; + + _proto._setActiveIndicatorElement = function _setActiveIndicatorElement(element) { + if (this._indicatorsElement) { + var indicators = [].slice.call(this._indicatorsElement.querySelectorAll(Selector.ACTIVE)); + $(indicators).removeClass(ClassName.ACTIVE); + + var nextIndicator = this._indicatorsElement.children[this._getItemIndex(element)]; + + if (nextIndicator) { + $(nextIndicator).addClass(ClassName.ACTIVE); + } + } + }; + + _proto._slide = function _slide(direction, element) { + var _this4 = this; + + var activeElement = this._element.querySelector(Selector.ACTIVE_ITEM); + + var activeElementIndex = this._getItemIndex(activeElement); + + var nextElement = element || activeElement && this._getItemByDirection(direction, activeElement); + + var nextElementIndex = this._getItemIndex(nextElement); + + var isCycling = Boolean(this._interval); + var directionalClassName; + var orderClassName; + var eventDirectionName; + + if (direction === Direction.NEXT) { + directionalClassName = ClassName.LEFT; + orderClassName = ClassName.NEXT; + eventDirectionName = Direction.LEFT; + } else { + directionalClassName = ClassName.RIGHT; + orderClassName = ClassName.PREV; + eventDirectionName = Direction.RIGHT; + } + + if (nextElement && $(nextElement).hasClass(ClassName.ACTIVE)) { + this._isSliding = false; + return; + } + + var slideEvent = this._triggerSlideEvent(nextElement, eventDirectionName); + + if (slideEvent.isDefaultPrevented()) { + return; + } + + if (!activeElement || !nextElement) { + // Some weirdness is happening, so we bail + return; + } + + this._isSliding = true; + + if (isCycling) { + this.pause(); + } + + this._setActiveIndicatorElement(nextElement); + + var slidEvent = $.Event(Event.SLID, { + relatedTarget: nextElement, + direction: eventDirectionName, + from: activeElementIndex, + to: nextElementIndex + }); + + if ($(this._element).hasClass(ClassName.SLIDE)) { + $(nextElement).addClass(orderClassName); + Util.reflow(nextElement); + $(activeElement).addClass(directionalClassName); + $(nextElement).addClass(directionalClassName); + var nextElementInterval = parseInt(nextElement.getAttribute('data-interval'), 10); + + if (nextElementInterval) { + this._config.defaultInterval = this._config.defaultInterval || this._config.interval; + this._config.interval = nextElementInterval; + } else { + this._config.interval = this._config.defaultInterval || this._config.interval; + } + + var transitionDuration = Util.getTransitionDurationFromElement(activeElement); + $(activeElement).one(Util.TRANSITION_END, function () { + $(nextElement).removeClass(directionalClassName + " " + orderClassName).addClass(ClassName.ACTIVE); + $(activeElement).removeClass(ClassName.ACTIVE + " " + orderClassName + " " + directionalClassName); + _this4._isSliding = false; + setTimeout(function () { + return $(_this4._element).trigger(slidEvent); + }, 0); + }).emulateTransitionEnd(transitionDuration); + } else { + $(activeElement).removeClass(ClassName.ACTIVE); + $(nextElement).addClass(ClassName.ACTIVE); + this._isSliding = false; + $(this._element).trigger(slidEvent); + } + + if (isCycling) { + this.cycle(); + } + } // Static + ; + + Carousel._jQueryInterface = function _jQueryInterface(config) { + return this.each(function () { + var data = $(this).data(DATA_KEY); + + var _config = _objectSpread({}, Default, $(this).data()); + + if (typeof config === 'object') { + _config = _objectSpread({}, _config, config); + } + + var action = typeof config === 'string' ? config : _config.slide; + + if (!data) { + data = new Carousel(this, _config); + $(this).data(DATA_KEY, data); + } + + if (typeof config === 'number') { + data.to(config); + } else if (typeof action === 'string') { + if (typeof data[action] === 'undefined') { + throw new TypeError("No method named \"" + action + "\""); + } + + data[action](); + } else if (_config.interval && _config.ride) { + data.pause(); + data.cycle(); + } + }); + }; + + Carousel._dataApiClickHandler = function _dataApiClickHandler(event) { + var selector = Util.getSelectorFromElement(this); + + if (!selector) { + return; + } + + var target = $(selector)[0]; + + if (!target || !$(target).hasClass(ClassName.CAROUSEL)) { + return; + } + + var config = _objectSpread({}, $(target).data(), $(this).data()); + + var slideIndex = this.getAttribute('data-slide-to'); + + if (slideIndex) { + config.interval = false; + } + + Carousel._jQueryInterface.call($(target), config); + + if (slideIndex) { + $(target).data(DATA_KEY).to(slideIndex); + } + + event.preventDefault(); + }; + + _createClass(Carousel, null, [{ + key: "VERSION", + get: function get() { + return VERSION; + } + }, { + key: "Default", + get: function get() { + return Default; + } + }]); + + return Carousel; + }(); + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + $(document).on(Event.CLICK_DATA_API, Selector.DATA_SLIDE, Carousel._dataApiClickHandler); + $(window).on(Event.LOAD_DATA_API, function () { + var carousels = [].slice.call(document.querySelectorAll(Selector.DATA_RIDE)); + + for (var i = 0, len = carousels.length; i < len; i++) { + var $carousel = $(carousels[i]); + + Carousel._jQueryInterface.call($carousel, $carousel.data()); + } + }); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + $.fn[NAME] = Carousel._jQueryInterface; + $.fn[NAME].Constructor = Carousel; + + $.fn[NAME].noConflict = function () { + $.fn[NAME] = JQUERY_NO_CONFLICT; + return Carousel._jQueryInterface; + }; + + return Carousel; + +})); +/*! + * Bootstrap collapse.js v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery'), require('./util.js')) : + typeof define === 'function' && define.amd ? define(['jquery', './util.js'], factory) : + (global = global || self, global.Collapse = factory(global.jQuery, global.Util)); +}(this, function ($, Util) { 'use strict'; + + $ = $ && $.hasOwnProperty('default') ? $['default'] : $; + Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util; + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } + + function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; + } + + function _objectSpread(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i] != null ? arguments[i] : {}; + var ownKeys = Object.keys(source); + + if (typeof Object.getOwnPropertySymbols === 'function') { + ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { + return Object.getOwnPropertyDescriptor(source, sym).enumerable; + })); + } + + ownKeys.forEach(function (key) { + _defineProperty(target, key, source[key]); + }); + } + + return target; + } + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME = 'collapse'; + var VERSION = '4.3.1'; + var DATA_KEY = 'bs.collapse'; + var EVENT_KEY = "." + DATA_KEY; + var DATA_API_KEY = '.data-api'; + var JQUERY_NO_CONFLICT = $.fn[NAME]; + var Default = { + toggle: true, + parent: '' + }; + var DefaultType = { + toggle: 'boolean', + parent: '(string|element)' + }; + var Event = { + SHOW: "show" + EVENT_KEY, + SHOWN: "shown" + EVENT_KEY, + HIDE: "hide" + EVENT_KEY, + HIDDEN: "hidden" + EVENT_KEY, + CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY + }; + var ClassName = { + SHOW: 'show', + COLLAPSE: 'collapse', + COLLAPSING: 'collapsing', + COLLAPSED: 'collapsed' + }; + var Dimension = { + WIDTH: 'width', + HEIGHT: 'height' + }; + var Selector = { + ACTIVES: '.show, .collapsing', + DATA_TOGGLE: '[data-toggle="collapse"]' + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + }; + + var Collapse = + /*#__PURE__*/ + function () { + function Collapse(element, config) { + this._isTransitioning = false; + this._element = element; + this._config = this._getConfig(config); + this._triggerArray = [].slice.call(document.querySelectorAll("[data-toggle=\"collapse\"][href=\"#" + element.id + "\"]," + ("[data-toggle=\"collapse\"][data-target=\"#" + element.id + "\"]"))); + var toggleList = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE)); + + for (var i = 0, len = toggleList.length; i < len; i++) { + var elem = toggleList[i]; + var selector = Util.getSelectorFromElement(elem); + var filterElement = [].slice.call(document.querySelectorAll(selector)).filter(function (foundElem) { + return foundElem === element; + }); + + if (selector !== null && filterElement.length > 0) { + this._selector = selector; + + this._triggerArray.push(elem); + } + } + + this._parent = this._config.parent ? this._getParent() : null; + + if (!this._config.parent) { + this._addAriaAndCollapsedClass(this._element, this._triggerArray); + } + + if (this._config.toggle) { + this.toggle(); + } + } // Getters + + + var _proto = Collapse.prototype; + + // Public + _proto.toggle = function toggle() { + if ($(this._element).hasClass(ClassName.SHOW)) { + this.hide(); + } else { + this.show(); + } + }; + + _proto.show = function show() { + var _this = this; + + if (this._isTransitioning || $(this._element).hasClass(ClassName.SHOW)) { + return; + } + + var actives; + var activesData; + + if (this._parent) { + actives = [].slice.call(this._parent.querySelectorAll(Selector.ACTIVES)).filter(function (elem) { + if (typeof _this._config.parent === 'string') { + return elem.getAttribute('data-parent') === _this._config.parent; + } + + return elem.classList.contains(ClassName.COLLAPSE); + }); + + if (actives.length === 0) { + actives = null; + } + } + + if (actives) { + activesData = $(actives).not(this._selector).data(DATA_KEY); + + if (activesData && activesData._isTransitioning) { + return; + } + } + + var startEvent = $.Event(Event.SHOW); + $(this._element).trigger(startEvent); + + if (startEvent.isDefaultPrevented()) { + return; + } + + if (actives) { + Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide'); + + if (!activesData) { + $(actives).data(DATA_KEY, null); + } + } + + var dimension = this._getDimension(); + + $(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING); + this._element.style[dimension] = 0; + + if (this._triggerArray.length) { + $(this._triggerArray).removeClass(ClassName.COLLAPSED).attr('aria-expanded', true); + } + + this.setTransitioning(true); + + var complete = function complete() { + $(_this._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.SHOW); + _this._element.style[dimension] = ''; + + _this.setTransitioning(false); + + $(_this._element).trigger(Event.SHOWN); + }; + + var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1); + var scrollSize = "scroll" + capitalizedDimension; + var transitionDuration = Util.getTransitionDurationFromElement(this._element); + $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); + this._element.style[dimension] = this._element[scrollSize] + "px"; + }; + + _proto.hide = function hide() { + var _this2 = this; + + if (this._isTransitioning || !$(this._element).hasClass(ClassName.SHOW)) { + return; + } + + var startEvent = $.Event(Event.HIDE); + $(this._element).trigger(startEvent); + + if (startEvent.isDefaultPrevented()) { + return; + } + + var dimension = this._getDimension(); + + this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + "px"; + Util.reflow(this._element); + $(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.SHOW); + var triggerArrayLength = this._triggerArray.length; + + if (triggerArrayLength > 0) { + for (var i = 0; i < triggerArrayLength; i++) { + var trigger = this._triggerArray[i]; + var selector = Util.getSelectorFromElement(trigger); + + if (selector !== null) { + var $elem = $([].slice.call(document.querySelectorAll(selector))); + + if (!$elem.hasClass(ClassName.SHOW)) { + $(trigger).addClass(ClassName.COLLAPSED).attr('aria-expanded', false); + } + } + } + } + + this.setTransitioning(true); + + var complete = function complete() { + _this2.setTransitioning(false); + + $(_this2._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN); + }; + + this._element.style[dimension] = ''; + var transitionDuration = Util.getTransitionDurationFromElement(this._element); + $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); + }; + + _proto.setTransitioning = function setTransitioning(isTransitioning) { + this._isTransitioning = isTransitioning; + }; + + _proto.dispose = function dispose() { + $.removeData(this._element, DATA_KEY); + this._config = null; + this._parent = null; + this._element = null; + this._triggerArray = null; + this._isTransitioning = null; + } // Private + ; + + _proto._getConfig = function _getConfig(config) { + config = _objectSpread({}, Default, config); + config.toggle = Boolean(config.toggle); // Coerce string values + + Util.typeCheckConfig(NAME, config, DefaultType); + return config; + }; + + _proto._getDimension = function _getDimension() { + var hasWidth = $(this._element).hasClass(Dimension.WIDTH); + return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT; + }; + + _proto._getParent = function _getParent() { + var _this3 = this; + + var parent; + + if (Util.isElement(this._config.parent)) { + parent = this._config.parent; // It's a jQuery object + + if (typeof this._config.parent.jquery !== 'undefined') { + parent = this._config.parent[0]; + } + } else { + parent = document.querySelector(this._config.parent); + } + + var selector = "[data-toggle=\"collapse\"][data-parent=\"" + this._config.parent + "\"]"; + var children = [].slice.call(parent.querySelectorAll(selector)); + $(children).each(function (i, element) { + _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]); + }); + return parent; + }; + + _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) { + var isOpen = $(element).hasClass(ClassName.SHOW); + + if (triggerArray.length) { + $(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen); + } + } // Static + ; + + Collapse._getTargetFromElement = function _getTargetFromElement(element) { + var selector = Util.getSelectorFromElement(element); + return selector ? document.querySelector(selector) : null; + }; + + Collapse._jQueryInterface = function _jQueryInterface(config) { + return this.each(function () { + var $this = $(this); + var data = $this.data(DATA_KEY); + + var _config = _objectSpread({}, Default, $this.data(), typeof config === 'object' && config ? config : {}); + + if (!data && _config.toggle && /show|hide/.test(config)) { + _config.toggle = false; + } + + if (!data) { + data = new Collapse(this, _config); + $this.data(DATA_KEY, data); + } + + if (typeof config === 'string') { + if (typeof data[config] === 'undefined') { + throw new TypeError("No method named \"" + config + "\""); + } + + data[config](); + } + }); + }; + + _createClass(Collapse, null, [{ + key: "VERSION", + get: function get() { + return VERSION; + } + }, { + key: "Default", + get: function get() { + return Default; + } + }]); + + return Collapse; + }(); + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) { + // preventDefault only for <a> elements (which change the URL) not inside the collapsible element + if (event.currentTarget.tagName === 'A') { + event.preventDefault(); + } + + var $trigger = $(this); + var selector = Util.getSelectorFromElement(this); + var selectors = [].slice.call(document.querySelectorAll(selector)); + $(selectors).each(function () { + var $target = $(this); + var data = $target.data(DATA_KEY); + var config = data ? 'toggle' : $trigger.data(); + + Collapse._jQueryInterface.call($target, config); + }); + }); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + $.fn[NAME] = Collapse._jQueryInterface; + $.fn[NAME].Constructor = Collapse; + + $.fn[NAME].noConflict = function () { + $.fn[NAME] = JQUERY_NO_CONFLICT; + return Collapse._jQueryInterface; + }; + + return Collapse; + +})); +/*! + * Bootstrap dropdown.js v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery'), require('popper.js'), require('./util.js')) : + typeof define === 'function' && define.amd ? define(['jquery', 'popper.js', './util.js'], factory) : + (global = global || self, global.Dropdown = factory(global.jQuery, global.Popper, global.Util)); +}(this, function ($, Popper, Util) { 'use strict'; + + $ = $ && $.hasOwnProperty('default') ? $['default'] : $; + Popper = Popper && Popper.hasOwnProperty('default') ? Popper['default'] : Popper; + Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util; + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } + + function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; + } + + function _objectSpread(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i] != null ? arguments[i] : {}; + var ownKeys = Object.keys(source); + + if (typeof Object.getOwnPropertySymbols === 'function') { + ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { + return Object.getOwnPropertyDescriptor(source, sym).enumerable; + })); + } + + ownKeys.forEach(function (key) { + _defineProperty(target, key, source[key]); + }); + } + + return target; + } + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME = 'dropdown'; + var VERSION = '4.3.1'; + var DATA_KEY = 'bs.dropdown'; + var EVENT_KEY = "." + DATA_KEY; + var DATA_API_KEY = '.data-api'; + var JQUERY_NO_CONFLICT = $.fn[NAME]; + var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key + + var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key + + var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key + + var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key + + var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key + + var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse) + + var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + "|" + ARROW_DOWN_KEYCODE + "|" + ESCAPE_KEYCODE); + var Event = { + HIDE: "hide" + EVENT_KEY, + HIDDEN: "hidden" + EVENT_KEY, + SHOW: "show" + EVENT_KEY, + SHOWN: "shown" + EVENT_KEY, + CLICK: "click" + EVENT_KEY, + CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY, + KEYDOWN_DATA_API: "keydown" + EVENT_KEY + DATA_API_KEY, + KEYUP_DATA_API: "keyup" + EVENT_KEY + DATA_API_KEY + }; + var ClassName = { + DISABLED: 'disabled', + SHOW: 'show', + DROPUP: 'dropup', + DROPRIGHT: 'dropright', + DROPLEFT: 'dropleft', + MENURIGHT: 'dropdown-menu-right', + MENULEFT: 'dropdown-menu-left', + POSITION_STATIC: 'position-static' + }; + var Selector = { + DATA_TOGGLE: '[data-toggle="dropdown"]', + FORM_CHILD: '.dropdown form', + MENU: '.dropdown-menu', + NAVBAR_NAV: '.navbar-nav', + VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)' + }; + var AttachmentMap = { + TOP: 'top-start', + TOPEND: 'top-end', + BOTTOM: 'bottom-start', + BOTTOMEND: 'bottom-end', + RIGHT: 'right-start', + RIGHTEND: 'right-end', + LEFT: 'left-start', + LEFTEND: 'left-end' + }; + var Default = { + offset: 0, + flip: true, + boundary: 'scrollParent', + reference: 'toggle', + display: 'dynamic' + }; + var DefaultType = { + offset: '(number|string|function)', + flip: 'boolean', + boundary: '(string|element)', + reference: '(string|element)', + display: 'string' + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + }; + + var Dropdown = + /*#__PURE__*/ + function () { + function Dropdown(element, config) { + this._element = element; + this._popper = null; + this._config = this._getConfig(config); + this._menu = this._getMenuElement(); + this._inNavbar = this._detectNavbar(); + + this._addEventListeners(); + } // Getters + + + var _proto = Dropdown.prototype; + + // Public + _proto.toggle = function toggle() { + if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED)) { + return; + } + + var parent = Dropdown._getParentFromElement(this._element); + + var isActive = $(this._menu).hasClass(ClassName.SHOW); + + Dropdown._clearMenus(); + + if (isActive) { + return; + } + + var relatedTarget = { + relatedTarget: this._element + }; + var showEvent = $.Event(Event.SHOW, relatedTarget); + $(parent).trigger(showEvent); + + if (showEvent.isDefaultPrevented()) { + return; + } // Disable totally Popper.js for Dropdown in Navbar + + + if (!this._inNavbar) { + /** + * Check for Popper dependency + * Popper - https://popper.js.org + */ + if (typeof Popper === 'undefined') { + throw new TypeError('Bootstrap\'s dropdowns require Popper.js (https://popper.js.org/)'); + } + + var referenceElement = this._element; + + if (this._config.reference === 'parent') { + referenceElement = parent; + } else if (Util.isElement(this._config.reference)) { + referenceElement = this._config.reference; // Check if it's jQuery element + + if (typeof this._config.reference.jquery !== 'undefined') { + referenceElement = this._config.reference[0]; + } + } // If boundary is not `scrollParent`, then set position to `static` + // to allow the menu to "escape" the scroll parent's boundaries + // https://github.com/twbs/bootstrap/issues/24251 + + + if (this._config.boundary !== 'scrollParent') { + $(parent).addClass(ClassName.POSITION_STATIC); + } + + this._popper = new Popper(referenceElement, this._menu, this._getPopperConfig()); + } // If this is a touch-enabled device we add extra + // empty mouseover listeners to the body's immediate children; + // only needed because of broken event delegation on iOS + // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html + + + if ('ontouchstart' in document.documentElement && $(parent).closest(Selector.NAVBAR_NAV).length === 0) { + $(document.body).children().on('mouseover', null, $.noop); + } + + this._element.focus(); + + this._element.setAttribute('aria-expanded', true); + + $(this._menu).toggleClass(ClassName.SHOW); + $(parent).toggleClass(ClassName.SHOW).trigger($.Event(Event.SHOWN, relatedTarget)); + }; + + _proto.show = function show() { + if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || $(this._menu).hasClass(ClassName.SHOW)) { + return; + } + + var relatedTarget = { + relatedTarget: this._element + }; + var showEvent = $.Event(Event.SHOW, relatedTarget); + + var parent = Dropdown._getParentFromElement(this._element); + + $(parent).trigger(showEvent); + + if (showEvent.isDefaultPrevented()) { + return; + } + + $(this._menu).toggleClass(ClassName.SHOW); + $(parent).toggleClass(ClassName.SHOW).trigger($.Event(Event.SHOWN, relatedTarget)); + }; + + _proto.hide = function hide() { + if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED) || !$(this._menu).hasClass(ClassName.SHOW)) { + return; + } + + var relatedTarget = { + relatedTarget: this._element + }; + var hideEvent = $.Event(Event.HIDE, relatedTarget); + + var parent = Dropdown._getParentFromElement(this._element); + + $(parent).trigger(hideEvent); + + if (hideEvent.isDefaultPrevented()) { + return; + } + + $(this._menu).toggleClass(ClassName.SHOW); + $(parent).toggleClass(ClassName.SHOW).trigger($.Event(Event.HIDDEN, relatedTarget)); + }; + + _proto.dispose = function dispose() { + $.removeData(this._element, DATA_KEY); + $(this._element).off(EVENT_KEY); + this._element = null; + this._menu = null; + + if (this._popper !== null) { + this._popper.destroy(); + + this._popper = null; + } + }; + + _proto.update = function update() { + this._inNavbar = this._detectNavbar(); + + if (this._popper !== null) { + this._popper.scheduleUpdate(); + } + } // Private + ; + + _proto._addEventListeners = function _addEventListeners() { + var _this = this; + + $(this._element).on(Event.CLICK, function (event) { + event.preventDefault(); + event.stopPropagation(); + + _this.toggle(); + }); + }; + + _proto._getConfig = function _getConfig(config) { + config = _objectSpread({}, this.constructor.Default, $(this._element).data(), config); + Util.typeCheckConfig(NAME, config, this.constructor.DefaultType); + return config; + }; + + _proto._getMenuElement = function _getMenuElement() { + if (!this._menu) { + var parent = Dropdown._getParentFromElement(this._element); + + if (parent) { + this._menu = parent.querySelector(Selector.MENU); + } + } + + return this._menu; + }; + + _proto._getPlacement = function _getPlacement() { + var $parentDropdown = $(this._element.parentNode); + var placement = AttachmentMap.BOTTOM; // Handle dropup + + if ($parentDropdown.hasClass(ClassName.DROPUP)) { + placement = AttachmentMap.TOP; + + if ($(this._menu).hasClass(ClassName.MENURIGHT)) { + placement = AttachmentMap.TOPEND; + } + } else if ($parentDropdown.hasClass(ClassName.DROPRIGHT)) { + placement = AttachmentMap.RIGHT; + } else if ($parentDropdown.hasClass(ClassName.DROPLEFT)) { + placement = AttachmentMap.LEFT; + } else if ($(this._menu).hasClass(ClassName.MENURIGHT)) { + placement = AttachmentMap.BOTTOMEND; + } + + return placement; + }; + + _proto._detectNavbar = function _detectNavbar() { + return $(this._element).closest('.navbar').length > 0; + }; + + _proto._getOffset = function _getOffset() { + var _this2 = this; + + var offset = {}; + + if (typeof this._config.offset === 'function') { + offset.fn = function (data) { + data.offsets = _objectSpread({}, data.offsets, _this2._config.offset(data.offsets, _this2._element) || {}); + return data; + }; + } else { + offset.offset = this._config.offset; + } + + return offset; + }; + + _proto._getPopperConfig = function _getPopperConfig() { + var popperConfig = { + placement: this._getPlacement(), + modifiers: { + offset: this._getOffset(), + flip: { + enabled: this._config.flip + }, + preventOverflow: { + boundariesElement: this._config.boundary + } + } // Disable Popper.js if we have a static display + + }; + + if (this._config.display === 'static') { + popperConfig.modifiers.applyStyle = { + enabled: false + }; + } + + return popperConfig; + } // Static + ; + + Dropdown._jQueryInterface = function _jQueryInterface(config) { + return this.each(function () { + var data = $(this).data(DATA_KEY); + + var _config = typeof config === 'object' ? config : null; + + if (!data) { + data = new Dropdown(this, _config); + $(this).data(DATA_KEY, data); + } + + if (typeof config === 'string') { + if (typeof data[config] === 'undefined') { + throw new TypeError("No method named \"" + config + "\""); + } + + data[config](); + } + }); + }; + + Dropdown._clearMenus = function _clearMenus(event) { + if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) { + return; + } + + var toggles = [].slice.call(document.querySelectorAll(Selector.DATA_TOGGLE)); + + for (var i = 0, len = toggles.length; i < len; i++) { + var parent = Dropdown._getParentFromElement(toggles[i]); + + var context = $(toggles[i]).data(DATA_KEY); + var relatedTarget = { + relatedTarget: toggles[i] + }; + + if (event && event.type === 'click') { + relatedTarget.clickEvent = event; + } + + if (!context) { + continue; + } + + var dropdownMenu = context._menu; + + if (!$(parent).hasClass(ClassName.SHOW)) { + continue; + } + + if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $.contains(parent, event.target)) { + continue; + } + + var hideEvent = $.Event(Event.HIDE, relatedTarget); + $(parent).trigger(hideEvent); + + if (hideEvent.isDefaultPrevented()) { + continue; + } // If this is a touch-enabled device we remove the extra + // empty mouseover listeners we added for iOS support + + + if ('ontouchstart' in document.documentElement) { + $(document.body).children().off('mouseover', null, $.noop); + } + + toggles[i].setAttribute('aria-expanded', 'false'); + $(dropdownMenu).removeClass(ClassName.SHOW); + $(parent).removeClass(ClassName.SHOW).trigger($.Event(Event.HIDDEN, relatedTarget)); + } + }; + + Dropdown._getParentFromElement = function _getParentFromElement(element) { + var parent; + var selector = Util.getSelectorFromElement(element); + + if (selector) { + parent = document.querySelector(selector); + } + + return parent || element.parentNode; + } // eslint-disable-next-line complexity + ; + + Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) { + // If not input/textarea: + // - And not a key in REGEXP_KEYDOWN => not a dropdown command + // If input/textarea: + // - If space key => not a dropdown command + // - If key is other than escape + // - If key is not up or down => not a dropdown command + // - If trigger inside the menu => not a dropdown command + if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $(event.target).closest(Selector.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) { + return; + } + + event.preventDefault(); + event.stopPropagation(); + + if (this.disabled || $(this).hasClass(ClassName.DISABLED)) { + return; + } + + var parent = Dropdown._getParentFromElement(this); + + var isActive = $(parent).hasClass(ClassName.SHOW); + + if (!isActive || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) { + if (event.which === ESCAPE_KEYCODE) { + var toggle = parent.querySelector(Selector.DATA_TOGGLE); + $(toggle).trigger('focus'); + } + + $(this).trigger('click'); + return; + } + + var items = [].slice.call(parent.querySelectorAll(Selector.VISIBLE_ITEMS)); + + if (items.length === 0) { + return; + } + + var index = items.indexOf(event.target); + + if (event.which === ARROW_UP_KEYCODE && index > 0) { + // Up + index--; + } + + if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) { + // Down + index++; + } + + if (index < 0) { + index = 0; + } + + items[index].focus(); + }; + + _createClass(Dropdown, null, [{ + key: "VERSION", + get: function get() { + return VERSION; + } + }, { + key: "Default", + get: function get() { + return Default; + } + }, { + key: "DefaultType", + get: function get() { + return DefaultType; + } + }]); + + return Dropdown; + }(); + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + $(document).on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler).on(Event.CLICK_DATA_API + " " + Event.KEYUP_DATA_API, Dropdown._clearMenus).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) { + event.preventDefault(); + event.stopPropagation(); + + Dropdown._jQueryInterface.call($(this), 'toggle'); + }).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) { + e.stopPropagation(); + }); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + $.fn[NAME] = Dropdown._jQueryInterface; + $.fn[NAME].Constructor = Dropdown; + + $.fn[NAME].noConflict = function () { + $.fn[NAME] = JQUERY_NO_CONFLICT; + return Dropdown._jQueryInterface; + }; + + return Dropdown; + +})); +/*! + * Bootstrap modal.js v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery'), require('./util.js')) : + typeof define === 'function' && define.amd ? define(['jquery', './util.js'], factory) : + (global = global || self, global.Modal = factory(global.jQuery, global.Util)); +}(this, function ($, Util) { 'use strict'; + + $ = $ && $.hasOwnProperty('default') ? $['default'] : $; + Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util; + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } + + function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; + } + + function _objectSpread(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i] != null ? arguments[i] : {}; + var ownKeys = Object.keys(source); + + if (typeof Object.getOwnPropertySymbols === 'function') { + ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { + return Object.getOwnPropertyDescriptor(source, sym).enumerable; + })); + } + + ownKeys.forEach(function (key) { + _defineProperty(target, key, source[key]); + }); + } + + return target; + } + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME = 'modal'; + var VERSION = '4.3.1'; + var DATA_KEY = 'bs.modal'; + var EVENT_KEY = "." + DATA_KEY; + var DATA_API_KEY = '.data-api'; + var JQUERY_NO_CONFLICT = $.fn[NAME]; + var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key + + var Default = { + backdrop: true, + keyboard: true, + focus: true, + show: true + }; + var DefaultType = { + backdrop: '(boolean|string)', + keyboard: 'boolean', + focus: 'boolean', + show: 'boolean' + }; + var Event = { + HIDE: "hide" + EVENT_KEY, + HIDDEN: "hidden" + EVENT_KEY, + SHOW: "show" + EVENT_KEY, + SHOWN: "shown" + EVENT_KEY, + FOCUSIN: "focusin" + EVENT_KEY, + RESIZE: "resize" + EVENT_KEY, + CLICK_DISMISS: "click.dismiss" + EVENT_KEY, + KEYDOWN_DISMISS: "keydown.dismiss" + EVENT_KEY, + MOUSEUP_DISMISS: "mouseup.dismiss" + EVENT_KEY, + MOUSEDOWN_DISMISS: "mousedown.dismiss" + EVENT_KEY, + CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY + }; + var ClassName = { + SCROLLABLE: 'modal-dialog-scrollable', + SCROLLBAR_MEASURER: 'modal-scrollbar-measure', + BACKDROP: 'modal-backdrop', + OPEN: 'modal-open', + FADE: 'fade', + SHOW: 'show' + }; + var Selector = { + DIALOG: '.modal-dialog', + MODAL_BODY: '.modal-body', + DATA_TOGGLE: '[data-toggle="modal"]', + DATA_DISMISS: '[data-dismiss="modal"]', + FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top', + STICKY_CONTENT: '.sticky-top' + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + }; + + var Modal = + /*#__PURE__*/ + function () { + function Modal(element, config) { + this._config = this._getConfig(config); + this._element = element; + this._dialog = element.querySelector(Selector.DIALOG); + this._backdrop = null; + this._isShown = false; + this._isBodyOverflowing = false; + this._ignoreBackdropClick = false; + this._isTransitioning = false; + this._scrollbarWidth = 0; + } // Getters + + + var _proto = Modal.prototype; + + // Public + _proto.toggle = function toggle(relatedTarget) { + return this._isShown ? this.hide() : this.show(relatedTarget); + }; + + _proto.show = function show(relatedTarget) { + var _this = this; + + if (this._isShown || this._isTransitioning) { + return; + } + + if ($(this._element).hasClass(ClassName.FADE)) { + this._isTransitioning = true; + } + + var showEvent = $.Event(Event.SHOW, { + relatedTarget: relatedTarget + }); + $(this._element).trigger(showEvent); + + if (this._isShown || showEvent.isDefaultPrevented()) { + return; + } + + this._isShown = true; + + this._checkScrollbar(); + + this._setScrollbar(); + + this._adjustDialog(); + + this._setEscapeEvent(); + + this._setResizeEvent(); + + $(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, function (event) { + return _this.hide(event); + }); + $(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () { + $(_this._element).one(Event.MOUSEUP_DISMISS, function (event) { + if ($(event.target).is(_this._element)) { + _this._ignoreBackdropClick = true; + } + }); + }); + + this._showBackdrop(function () { + return _this._showElement(relatedTarget); + }); + }; + + _proto.hide = function hide(event) { + var _this2 = this; + + if (event) { + event.preventDefault(); + } + + if (!this._isShown || this._isTransitioning) { + return; + } + + var hideEvent = $.Event(Event.HIDE); + $(this._element).trigger(hideEvent); + + if (!this._isShown || hideEvent.isDefaultPrevented()) { + return; + } + + this._isShown = false; + var transition = $(this._element).hasClass(ClassName.FADE); + + if (transition) { + this._isTransitioning = true; + } + + this._setEscapeEvent(); + + this._setResizeEvent(); + + $(document).off(Event.FOCUSIN); + $(this._element).removeClass(ClassName.SHOW); + $(this._element).off(Event.CLICK_DISMISS); + $(this._dialog).off(Event.MOUSEDOWN_DISMISS); + + if (transition) { + var transitionDuration = Util.getTransitionDurationFromElement(this._element); + $(this._element).one(Util.TRANSITION_END, function (event) { + return _this2._hideModal(event); + }).emulateTransitionEnd(transitionDuration); + } else { + this._hideModal(); + } + }; + + _proto.dispose = function dispose() { + [window, this._element, this._dialog].forEach(function (htmlElement) { + return $(htmlElement).off(EVENT_KEY); + }); + /** + * `document` has 2 events `Event.FOCUSIN` and `Event.CLICK_DATA_API` + * Do not move `document` in `htmlElements` array + * It will remove `Event.CLICK_DATA_API` event that should remain + */ + + $(document).off(Event.FOCUSIN); + $.removeData(this._element, DATA_KEY); + this._config = null; + this._element = null; + this._dialog = null; + this._backdrop = null; + this._isShown = null; + this._isBodyOverflowing = null; + this._ignoreBackdropClick = null; + this._isTransitioning = null; + this._scrollbarWidth = null; + }; + + _proto.handleUpdate = function handleUpdate() { + this._adjustDialog(); + } // Private + ; + + _proto._getConfig = function _getConfig(config) { + config = _objectSpread({}, Default, config); + Util.typeCheckConfig(NAME, config, DefaultType); + return config; + }; + + _proto._showElement = function _showElement(relatedTarget) { + var _this3 = this; + + var transition = $(this._element).hasClass(ClassName.FADE); + + if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) { + // Don't move modal's DOM position + document.body.appendChild(this._element); + } + + this._element.style.display = 'block'; + + this._element.removeAttribute('aria-hidden'); + + this._element.setAttribute('aria-modal', true); + + if ($(this._dialog).hasClass(ClassName.SCROLLABLE)) { + this._dialog.querySelector(Selector.MODAL_BODY).scrollTop = 0; + } else { + this._element.scrollTop = 0; + } + + if (transition) { + Util.reflow(this._element); + } + + $(this._element).addClass(ClassName.SHOW); + + if (this._config.focus) { + this._enforceFocus(); + } + + var shownEvent = $.Event(Event.SHOWN, { + relatedTarget: relatedTarget + }); + + var transitionComplete = function transitionComplete() { + if (_this3._config.focus) { + _this3._element.focus(); + } + + _this3._isTransitioning = false; + $(_this3._element).trigger(shownEvent); + }; + + if (transition) { + var transitionDuration = Util.getTransitionDurationFromElement(this._dialog); + $(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(transitionDuration); + } else { + transitionComplete(); + } + }; + + _proto._enforceFocus = function _enforceFocus() { + var _this4 = this; + + $(document).off(Event.FOCUSIN) // Guard against infinite focus loop + .on(Event.FOCUSIN, function (event) { + if (document !== event.target && _this4._element !== event.target && $(_this4._element).has(event.target).length === 0) { + _this4._element.focus(); + } + }); + }; + + _proto._setEscapeEvent = function _setEscapeEvent() { + var _this5 = this; + + if (this._isShown && this._config.keyboard) { + $(this._element).on(Event.KEYDOWN_DISMISS, function (event) { + if (event.which === ESCAPE_KEYCODE) { + event.preventDefault(); + + _this5.hide(); + } + }); + } else if (!this._isShown) { + $(this._element).off(Event.KEYDOWN_DISMISS); + } + }; + + _proto._setResizeEvent = function _setResizeEvent() { + var _this6 = this; + + if (this._isShown) { + $(window).on(Event.RESIZE, function (event) { + return _this6.handleUpdate(event); + }); + } else { + $(window).off(Event.RESIZE); + } + }; + + _proto._hideModal = function _hideModal() { + var _this7 = this; + + this._element.style.display = 'none'; + + this._element.setAttribute('aria-hidden', true); + + this._element.removeAttribute('aria-modal'); + + this._isTransitioning = false; + + this._showBackdrop(function () { + $(document.body).removeClass(ClassName.OPEN); + + _this7._resetAdjustments(); + + _this7._resetScrollbar(); + + $(_this7._element).trigger(Event.HIDDEN); + }); + }; + + _proto._removeBackdrop = function _removeBackdrop() { + if (this._backdrop) { + $(this._backdrop).remove(); + this._backdrop = null; + } + }; + + _proto._showBackdrop = function _showBackdrop(callback) { + var _this8 = this; + + var animate = $(this._element).hasClass(ClassName.FADE) ? ClassName.FADE : ''; + + if (this._isShown && this._config.backdrop) { + this._backdrop = document.createElement('div'); + this._backdrop.className = ClassName.BACKDROP; + + if (animate) { + this._backdrop.classList.add(animate); + } + + $(this._backdrop).appendTo(document.body); + $(this._element).on(Event.CLICK_DISMISS, function (event) { + if (_this8._ignoreBackdropClick) { + _this8._ignoreBackdropClick = false; + return; + } + + if (event.target !== event.currentTarget) { + return; + } + + if (_this8._config.backdrop === 'static') { + _this8._element.focus(); + } else { + _this8.hide(); + } + }); + + if (animate) { + Util.reflow(this._backdrop); + } + + $(this._backdrop).addClass(ClassName.SHOW); + + if (!callback) { + return; + } + + if (!animate) { + callback(); + return; + } + + var backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop); + $(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(backdropTransitionDuration); + } else if (!this._isShown && this._backdrop) { + $(this._backdrop).removeClass(ClassName.SHOW); + + var callbackRemove = function callbackRemove() { + _this8._removeBackdrop(); + + if (callback) { + callback(); + } + }; + + if ($(this._element).hasClass(ClassName.FADE)) { + var _backdropTransitionDuration = Util.getTransitionDurationFromElement(this._backdrop); + + $(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(_backdropTransitionDuration); + } else { + callbackRemove(); + } + } else if (callback) { + callback(); + } + } // ---------------------------------------------------------------------- + // the following methods are used to handle overflowing modals + // todo (fat): these should probably be refactored out of modal.js + // ---------------------------------------------------------------------- + ; + + _proto._adjustDialog = function _adjustDialog() { + var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight; + + if (!this._isBodyOverflowing && isModalOverflowing) { + this._element.style.paddingLeft = this._scrollbarWidth + "px"; + } + + if (this._isBodyOverflowing && !isModalOverflowing) { + this._element.style.paddingRight = this._scrollbarWidth + "px"; + } + }; + + _proto._resetAdjustments = function _resetAdjustments() { + this._element.style.paddingLeft = ''; + this._element.style.paddingRight = ''; + }; + + _proto._checkScrollbar = function _checkScrollbar() { + var rect = document.body.getBoundingClientRect(); + this._isBodyOverflowing = rect.left + rect.right < window.innerWidth; + this._scrollbarWidth = this._getScrollbarWidth(); + }; + + _proto._setScrollbar = function _setScrollbar() { + var _this9 = this; + + if (this._isBodyOverflowing) { + // Note: DOMNode.style.paddingRight returns the actual value or '' if not set + // while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set + var fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT)); + var stickyContent = [].slice.call(document.querySelectorAll(Selector.STICKY_CONTENT)); // Adjust fixed content padding + + $(fixedContent).each(function (index, element) { + var actualPadding = element.style.paddingRight; + var calculatedPadding = $(element).css('padding-right'); + $(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this9._scrollbarWidth + "px"); + }); // Adjust sticky content margin + + $(stickyContent).each(function (index, element) { + var actualMargin = element.style.marginRight; + var calculatedMargin = $(element).css('margin-right'); + $(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this9._scrollbarWidth + "px"); + }); // Adjust body padding + + var actualPadding = document.body.style.paddingRight; + var calculatedPadding = $(document.body).css('padding-right'); + $(document.body).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + "px"); + } + + $(document.body).addClass(ClassName.OPEN); + }; + + _proto._resetScrollbar = function _resetScrollbar() { + // Restore fixed content padding + var fixedContent = [].slice.call(document.querySelectorAll(Selector.FIXED_CONTENT)); + $(fixedContent).each(function (index, element) { + var padding = $(element).data('padding-right'); + $(element).removeData('padding-right'); + element.style.paddingRight = padding ? padding : ''; + }); // Restore sticky content + + var elements = [].slice.call(document.querySelectorAll("" + Selector.STICKY_CONTENT)); + $(elements).each(function (index, element) { + var margin = $(element).data('margin-right'); + + if (typeof margin !== 'undefined') { + $(element).css('margin-right', margin).removeData('margin-right'); + } + }); // Restore body padding + + var padding = $(document.body).data('padding-right'); + $(document.body).removeData('padding-right'); + document.body.style.paddingRight = padding ? padding : ''; + }; + + _proto._getScrollbarWidth = function _getScrollbarWidth() { + // thx d.walsh + var scrollDiv = document.createElement('div'); + scrollDiv.className = ClassName.SCROLLBAR_MEASURER; + document.body.appendChild(scrollDiv); + var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth; + document.body.removeChild(scrollDiv); + return scrollbarWidth; + } // Static + ; + + Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) { + return this.each(function () { + var data = $(this).data(DATA_KEY); + + var _config = _objectSpread({}, Default, $(this).data(), typeof config === 'object' && config ? config : {}); + + if (!data) { + data = new Modal(this, _config); + $(this).data(DATA_KEY, data); + } + + if (typeof config === 'string') { + if (typeof data[config] === 'undefined') { + throw new TypeError("No method named \"" + config + "\""); + } + + data[config](relatedTarget); + } else if (_config.show) { + data.show(relatedTarget); + } + }); + }; + + _createClass(Modal, null, [{ + key: "VERSION", + get: function get() { + return VERSION; + } + }, { + key: "Default", + get: function get() { + return Default; + } + }]); + + return Modal; + }(); + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) { + var _this10 = this; + + var target; + var selector = Util.getSelectorFromElement(this); + + if (selector) { + target = document.querySelector(selector); + } + + var config = $(target).data(DATA_KEY) ? 'toggle' : _objectSpread({}, $(target).data(), $(this).data()); + + if (this.tagName === 'A' || this.tagName === 'AREA') { + event.preventDefault(); + } + + var $target = $(target).one(Event.SHOW, function (showEvent) { + if (showEvent.isDefaultPrevented()) { + // Only register focus restorer if modal will actually get shown + return; + } + + $target.one(Event.HIDDEN, function () { + if ($(_this10).is(':visible')) { + _this10.focus(); + } + }); + }); + + Modal._jQueryInterface.call($(target), config, this); + }); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + $.fn[NAME] = Modal._jQueryInterface; + $.fn[NAME].Constructor = Modal; + + $.fn[NAME].noConflict = function () { + $.fn[NAME] = JQUERY_NO_CONFLICT; + return Modal._jQueryInterface; + }; + + return Modal; + +})); +/*! + * Bootstrap tooltip.js v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery'), require('popper.js'), require('./util.js')) : + typeof define === 'function' && define.amd ? define(['jquery', 'popper.js', './util.js'], factory) : + (global = global || self, global.Tooltip = factory(global.jQuery, global.Popper, global.Util)); +}(this, function ($, Popper, Util) { 'use strict'; + + $ = $ && $.hasOwnProperty('default') ? $['default'] : $; + Popper = Popper && Popper.hasOwnProperty('default') ? Popper['default'] : Popper; + Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util; + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } + + function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; + } + + function _objectSpread(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i] != null ? arguments[i] : {}; + var ownKeys = Object.keys(source); + + if (typeof Object.getOwnPropertySymbols === 'function') { + ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { + return Object.getOwnPropertyDescriptor(source, sym).enumerable; + })); + } + + ownKeys.forEach(function (key) { + _defineProperty(target, key, source[key]); + }); + } + + return target; + } + + /** + * -------------------------------------------------------------------------- + * Bootstrap (v4.3.1): tools/sanitizer.js + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * -------------------------------------------------------------------------- + */ + var uriAttrs = ['background', 'cite', 'href', 'itemtype', 'longdesc', 'poster', 'src', 'xlink:href']; + var ARIA_ATTRIBUTE_PATTERN = /^aria-[\w-]*$/i; + var DefaultWhitelist = { + // Global attributes allowed on any supplied element below. + '*': ['class', 'dir', 'id', 'lang', 'role', ARIA_ATTRIBUTE_PATTERN], + a: ['target', 'href', 'title', 'rel'], + area: [], + b: [], + br: [], + col: [], + code: [], + div: [], + em: [], + hr: [], + h1: [], + h2: [], + h3: [], + h4: [], + h5: [], + h6: [], + i: [], + img: ['src', 'alt', 'title', 'width', 'height'], + li: [], + ol: [], + p: [], + pre: [], + s: [], + small: [], + span: [], + sub: [], + sup: [], + strong: [], + u: [], + ul: [] + /** + * A pattern that recognizes a commonly useful subset of URLs that are safe. + * + * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts + */ + + }; + var SAFE_URL_PATTERN = /^(?:(?:https?|mailto|ftp|tel|file):|[^&:/?#]*(?:[/?#]|$))/gi; + /** + * A pattern that matches safe data URLs. Only matches image, video and audio types. + * + * Shoutout to Angular 7 https://github.com/angular/angular/blob/7.2.4/packages/core/src/sanitization/url_sanitizer.ts + */ + + var DATA_URL_PATTERN = /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[a-z0-9+/]+=*$/i; + + function allowedAttribute(attr, allowedAttributeList) { + var attrName = attr.nodeName.toLowerCase(); + + if (allowedAttributeList.indexOf(attrName) !== -1) { + if (uriAttrs.indexOf(attrName) !== -1) { + return Boolean(attr.nodeValue.match(SAFE_URL_PATTERN) || attr.nodeValue.match(DATA_URL_PATTERN)); + } + + return true; + } + + var regExp = allowedAttributeList.filter(function (attrRegex) { + return attrRegex instanceof RegExp; + }); // Check if a regular expression validates the attribute. + + for (var i = 0, l = regExp.length; i < l; i++) { + if (attrName.match(regExp[i])) { + return true; + } + } + + return false; + } + + function sanitizeHtml(unsafeHtml, whiteList, sanitizeFn) { + if (unsafeHtml.length === 0) { + return unsafeHtml; + } + + if (sanitizeFn && typeof sanitizeFn === 'function') { + return sanitizeFn(unsafeHtml); + } + + var domParser = new window.DOMParser(); + var createdDocument = domParser.parseFromString(unsafeHtml, 'text/html'); + var whitelistKeys = Object.keys(whiteList); + var elements = [].slice.call(createdDocument.body.querySelectorAll('*')); + + var _loop = function _loop(i, len) { + var el = elements[i]; + var elName = el.nodeName.toLowerCase(); + + if (whitelistKeys.indexOf(el.nodeName.toLowerCase()) === -1) { + el.parentNode.removeChild(el); + return "continue"; + } + + var attributeList = [].slice.call(el.attributes); + var whitelistedAttributes = [].concat(whiteList['*'] || [], whiteList[elName] || []); + attributeList.forEach(function (attr) { + if (!allowedAttribute(attr, whitelistedAttributes)) { + el.removeAttribute(attr.nodeName); + } + }); + }; + + for (var i = 0, len = elements.length; i < len; i++) { + var _ret = _loop(i, len); + + if (_ret === "continue") continue; + } + + return createdDocument.body.innerHTML; + } + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME = 'tooltip'; + var VERSION = '4.3.1'; + var DATA_KEY = 'bs.tooltip'; + var EVENT_KEY = "." + DATA_KEY; + var JQUERY_NO_CONFLICT = $.fn[NAME]; + var CLASS_PREFIX = 'bs-tooltip'; + var BSCLS_PREFIX_REGEX = new RegExp("(^|\\s)" + CLASS_PREFIX + "\\S+", 'g'); + var DISALLOWED_ATTRIBUTES = ['sanitize', 'whiteList', 'sanitizeFn']; + var DefaultType = { + animation: 'boolean', + template: 'string', + title: '(string|element|function)', + trigger: 'string', + delay: '(number|object)', + html: 'boolean', + selector: '(string|boolean)', + placement: '(string|function)', + offset: '(number|string|function)', + container: '(string|element|boolean)', + fallbackPlacement: '(string|array)', + boundary: '(string|element)', + sanitize: 'boolean', + sanitizeFn: '(null|function)', + whiteList: 'object' + }; + var AttachmentMap = { + AUTO: 'auto', + TOP: 'top', + RIGHT: 'right', + BOTTOM: 'bottom', + LEFT: 'left' + }; + var Default = { + animation: true, + template: '<div class="tooltip" role="tooltip">' + '<div class="arrow"></div>' + '<div class="tooltip-inner"></div></div>', + trigger: 'hover focus', + title: '', + delay: 0, + html: false, + selector: false, + placement: 'top', + offset: 0, + container: false, + fallbackPlacement: 'flip', + boundary: 'scrollParent', + sanitize: true, + sanitizeFn: null, + whiteList: DefaultWhitelist + }; + var HoverState = { + SHOW: 'show', + OUT: 'out' + }; + var Event = { + HIDE: "hide" + EVENT_KEY, + HIDDEN: "hidden" + EVENT_KEY, + SHOW: "show" + EVENT_KEY, + SHOWN: "shown" + EVENT_KEY, + INSERTED: "inserted" + EVENT_KEY, + CLICK: "click" + EVENT_KEY, + FOCUSIN: "focusin" + EVENT_KEY, + FOCUSOUT: "focusout" + EVENT_KEY, + MOUSEENTER: "mouseenter" + EVENT_KEY, + MOUSELEAVE: "mouseleave" + EVENT_KEY + }; + var ClassName = { + FADE: 'fade', + SHOW: 'show' + }; + var Selector = { + TOOLTIP: '.tooltip', + TOOLTIP_INNER: '.tooltip-inner', + ARROW: '.arrow' + }; + var Trigger = { + HOVER: 'hover', + FOCUS: 'focus', + CLICK: 'click', + MANUAL: 'manual' + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + }; + + var Tooltip = + /*#__PURE__*/ + function () { + function Tooltip(element, config) { + /** + * Check for Popper dependency + * Popper - https://popper.js.org + */ + if (typeof Popper === 'undefined') { + throw new TypeError('Bootstrap\'s tooltips require Popper.js (https://popper.js.org/)'); + } // private + + + this._isEnabled = true; + this._timeout = 0; + this._hoverState = ''; + this._activeTrigger = {}; + this._popper = null; // Protected + + this.element = element; + this.config = this._getConfig(config); + this.tip = null; + + this._setListeners(); + } // Getters + + + var _proto = Tooltip.prototype; + + // Public + _proto.enable = function enable() { + this._isEnabled = true; + }; + + _proto.disable = function disable() { + this._isEnabled = false; + }; + + _proto.toggleEnabled = function toggleEnabled() { + this._isEnabled = !this._isEnabled; + }; + + _proto.toggle = function toggle(event) { + if (!this._isEnabled) { + return; + } + + if (event) { + var dataKey = this.constructor.DATA_KEY; + var context = $(event.currentTarget).data(dataKey); + + if (!context) { + context = new this.constructor(event.currentTarget, this._getDelegateConfig()); + $(event.currentTarget).data(dataKey, context); + } + + context._activeTrigger.click = !context._activeTrigger.click; + + if (context._isWithActiveTrigger()) { + context._enter(null, context); + } else { + context._leave(null, context); + } + } else { + if ($(this.getTipElement()).hasClass(ClassName.SHOW)) { + this._leave(null, this); + + return; + } + + this._enter(null, this); + } + }; + + _proto.dispose = function dispose() { + clearTimeout(this._timeout); + $.removeData(this.element, this.constructor.DATA_KEY); + $(this.element).off(this.constructor.EVENT_KEY); + $(this.element).closest('.modal').off('hide.bs.modal'); + + if (this.tip) { + $(this.tip).remove(); + } + + this._isEnabled = null; + this._timeout = null; + this._hoverState = null; + this._activeTrigger = null; + + if (this._popper !== null) { + this._popper.destroy(); + } + + this._popper = null; + this.element = null; + this.config = null; + this.tip = null; + }; + + _proto.show = function show() { + var _this = this; + + if ($(this.element).css('display') === 'none') { + throw new Error('Please use show on visible elements'); + } + + var showEvent = $.Event(this.constructor.Event.SHOW); + + if (this.isWithContent() && this._isEnabled) { + $(this.element).trigger(showEvent); + var shadowRoot = Util.findShadowRoot(this.element); + var isInTheDom = $.contains(shadowRoot !== null ? shadowRoot : this.element.ownerDocument.documentElement, this.element); + + if (showEvent.isDefaultPrevented() || !isInTheDom) { + return; + } + + var tip = this.getTipElement(); + var tipId = Util.getUID(this.constructor.NAME); + tip.setAttribute('id', tipId); + this.element.setAttribute('aria-describedby', tipId); + this.setContent(); + + if (this.config.animation) { + $(tip).addClass(ClassName.FADE); + } + + var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement; + + var attachment = this._getAttachment(placement); + + this.addAttachmentClass(attachment); + + var container = this._getContainer(); + + $(tip).data(this.constructor.DATA_KEY, this); + + if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) { + $(tip).appendTo(container); + } + + $(this.element).trigger(this.constructor.Event.INSERTED); + this._popper = new Popper(this.element, tip, { + placement: attachment, + modifiers: { + offset: this._getOffset(), + flip: { + behavior: this.config.fallbackPlacement + }, + arrow: { + element: Selector.ARROW + }, + preventOverflow: { + boundariesElement: this.config.boundary + } + }, + onCreate: function onCreate(data) { + if (data.originalPlacement !== data.placement) { + _this._handlePopperPlacementChange(data); + } + }, + onUpdate: function onUpdate(data) { + return _this._handlePopperPlacementChange(data); + } + }); + $(tip).addClass(ClassName.SHOW); // If this is a touch-enabled device we add extra + // empty mouseover listeners to the body's immediate children; + // only needed because of broken event delegation on iOS + // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html + + if ('ontouchstart' in document.documentElement) { + $(document.body).children().on('mouseover', null, $.noop); + } + + var complete = function complete() { + if (_this.config.animation) { + _this._fixTransition(); + } + + var prevHoverState = _this._hoverState; + _this._hoverState = null; + $(_this.element).trigger(_this.constructor.Event.SHOWN); + + if (prevHoverState === HoverState.OUT) { + _this._leave(null, _this); + } + }; + + if ($(this.tip).hasClass(ClassName.FADE)) { + var transitionDuration = Util.getTransitionDurationFromElement(this.tip); + $(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); + } else { + complete(); + } + } + }; + + _proto.hide = function hide(callback) { + var _this2 = this; + + var tip = this.getTipElement(); + var hideEvent = $.Event(this.constructor.Event.HIDE); + + var complete = function complete() { + if (_this2._hoverState !== HoverState.SHOW && tip.parentNode) { + tip.parentNode.removeChild(tip); + } + + _this2._cleanTipClass(); + + _this2.element.removeAttribute('aria-describedby'); + + $(_this2.element).trigger(_this2.constructor.Event.HIDDEN); + + if (_this2._popper !== null) { + _this2._popper.destroy(); + } + + if (callback) { + callback(); + } + }; + + $(this.element).trigger(hideEvent); + + if (hideEvent.isDefaultPrevented()) { + return; + } + + $(tip).removeClass(ClassName.SHOW); // If this is a touch-enabled device we remove the extra + // empty mouseover listeners we added for iOS support + + if ('ontouchstart' in document.documentElement) { + $(document.body).children().off('mouseover', null, $.noop); + } + + this._activeTrigger[Trigger.CLICK] = false; + this._activeTrigger[Trigger.FOCUS] = false; + this._activeTrigger[Trigger.HOVER] = false; + + if ($(this.tip).hasClass(ClassName.FADE)) { + var transitionDuration = Util.getTransitionDurationFromElement(tip); + $(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); + } else { + complete(); + } + + this._hoverState = ''; + }; + + _proto.update = function update() { + if (this._popper !== null) { + this._popper.scheduleUpdate(); + } + } // Protected + ; + + _proto.isWithContent = function isWithContent() { + return Boolean(this.getTitle()); + }; + + _proto.addAttachmentClass = function addAttachmentClass(attachment) { + $(this.getTipElement()).addClass(CLASS_PREFIX + "-" + attachment); + }; + + _proto.getTipElement = function getTipElement() { + this.tip = this.tip || $(this.config.template)[0]; + return this.tip; + }; + + _proto.setContent = function setContent() { + var tip = this.getTipElement(); + this.setElementContent($(tip.querySelectorAll(Selector.TOOLTIP_INNER)), this.getTitle()); + $(tip).removeClass(ClassName.FADE + " " + ClassName.SHOW); + }; + + _proto.setElementContent = function setElementContent($element, content) { + if (typeof content === 'object' && (content.nodeType || content.jquery)) { + // Content is a DOM node or a jQuery + if (this.config.html) { + if (!$(content).parent().is($element)) { + $element.empty().append(content); + } + } else { + $element.text($(content).text()); + } + + return; + } + + if (this.config.html) { + if (this.config.sanitize) { + content = sanitizeHtml(content, this.config.whiteList, this.config.sanitizeFn); + } + + $element.html(content); + } else { + $element.text(content); + } + }; + + _proto.getTitle = function getTitle() { + var title = this.element.getAttribute('data-original-title'); + + if (!title) { + title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title; + } + + return title; + } // Private + ; + + _proto._getOffset = function _getOffset() { + var _this3 = this; + + var offset = {}; + + if (typeof this.config.offset === 'function') { + offset.fn = function (data) { + data.offsets = _objectSpread({}, data.offsets, _this3.config.offset(data.offsets, _this3.element) || {}); + return data; + }; + } else { + offset.offset = this.config.offset; + } + + return offset; + }; + + _proto._getContainer = function _getContainer() { + if (this.config.container === false) { + return document.body; + } + + if (Util.isElement(this.config.container)) { + return $(this.config.container); + } + + return $(document).find(this.config.container); + }; + + _proto._getAttachment = function _getAttachment(placement) { + return AttachmentMap[placement.toUpperCase()]; + }; + + _proto._setListeners = function _setListeners() { + var _this4 = this; + + var triggers = this.config.trigger.split(' '); + triggers.forEach(function (trigger) { + if (trigger === 'click') { + $(_this4.element).on(_this4.constructor.Event.CLICK, _this4.config.selector, function (event) { + return _this4.toggle(event); + }); + } else if (trigger !== Trigger.MANUAL) { + var eventIn = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSEENTER : _this4.constructor.Event.FOCUSIN; + var eventOut = trigger === Trigger.HOVER ? _this4.constructor.Event.MOUSELEAVE : _this4.constructor.Event.FOCUSOUT; + $(_this4.element).on(eventIn, _this4.config.selector, function (event) { + return _this4._enter(event); + }).on(eventOut, _this4.config.selector, function (event) { + return _this4._leave(event); + }); + } + }); + $(this.element).closest('.modal').on('hide.bs.modal', function () { + if (_this4.element) { + _this4.hide(); + } + }); + + if (this.config.selector) { + this.config = _objectSpread({}, this.config, { + trigger: 'manual', + selector: '' + }); + } else { + this._fixTitle(); + } + }; + + _proto._fixTitle = function _fixTitle() { + var titleType = typeof this.element.getAttribute('data-original-title'); + + if (this.element.getAttribute('title') || titleType !== 'string') { + this.element.setAttribute('data-original-title', this.element.getAttribute('title') || ''); + this.element.setAttribute('title', ''); + } + }; + + _proto._enter = function _enter(event, context) { + var dataKey = this.constructor.DATA_KEY; + context = context || $(event.currentTarget).data(dataKey); + + if (!context) { + context = new this.constructor(event.currentTarget, this._getDelegateConfig()); + $(event.currentTarget).data(dataKey, context); + } + + if (event) { + context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true; + } + + if ($(context.getTipElement()).hasClass(ClassName.SHOW) || context._hoverState === HoverState.SHOW) { + context._hoverState = HoverState.SHOW; + return; + } + + clearTimeout(context._timeout); + context._hoverState = HoverState.SHOW; + + if (!context.config.delay || !context.config.delay.show) { + context.show(); + return; + } + + context._timeout = setTimeout(function () { + if (context._hoverState === HoverState.SHOW) { + context.show(); + } + }, context.config.delay.show); + }; + + _proto._leave = function _leave(event, context) { + var dataKey = this.constructor.DATA_KEY; + context = context || $(event.currentTarget).data(dataKey); + + if (!context) { + context = new this.constructor(event.currentTarget, this._getDelegateConfig()); + $(event.currentTarget).data(dataKey, context); + } + + if (event) { + context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false; + } + + if (context._isWithActiveTrigger()) { + return; + } + + clearTimeout(context._timeout); + context._hoverState = HoverState.OUT; + + if (!context.config.delay || !context.config.delay.hide) { + context.hide(); + return; + } + + context._timeout = setTimeout(function () { + if (context._hoverState === HoverState.OUT) { + context.hide(); + } + }, context.config.delay.hide); + }; + + _proto._isWithActiveTrigger = function _isWithActiveTrigger() { + for (var trigger in this._activeTrigger) { + if (this._activeTrigger[trigger]) { + return true; + } + } + + return false; + }; + + _proto._getConfig = function _getConfig(config) { + var dataAttributes = $(this.element).data(); + Object.keys(dataAttributes).forEach(function (dataAttr) { + if (DISALLOWED_ATTRIBUTES.indexOf(dataAttr) !== -1) { + delete dataAttributes[dataAttr]; + } + }); + config = _objectSpread({}, this.constructor.Default, dataAttributes, typeof config === 'object' && config ? config : {}); + + if (typeof config.delay === 'number') { + config.delay = { + show: config.delay, + hide: config.delay + }; + } + + if (typeof config.title === 'number') { + config.title = config.title.toString(); + } + + if (typeof config.content === 'number') { + config.content = config.content.toString(); + } + + Util.typeCheckConfig(NAME, config, this.constructor.DefaultType); + + if (config.sanitize) { + config.template = sanitizeHtml(config.template, config.whiteList, config.sanitizeFn); + } + + return config; + }; + + _proto._getDelegateConfig = function _getDelegateConfig() { + var config = {}; + + if (this.config) { + for (var key in this.config) { + if (this.constructor.Default[key] !== this.config[key]) { + config[key] = this.config[key]; + } + } + } + + return config; + }; + + _proto._cleanTipClass = function _cleanTipClass() { + var $tip = $(this.getTipElement()); + var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX); + + if (tabClass !== null && tabClass.length) { + $tip.removeClass(tabClass.join('')); + } + }; + + _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(popperData) { + var popperInstance = popperData.instance; + this.tip = popperInstance.popper; + + this._cleanTipClass(); + + this.addAttachmentClass(this._getAttachment(popperData.placement)); + }; + + _proto._fixTransition = function _fixTransition() { + var tip = this.getTipElement(); + var initConfigAnimation = this.config.animation; + + if (tip.getAttribute('x-placement') !== null) { + return; + } + + $(tip).removeClass(ClassName.FADE); + this.config.animation = false; + this.hide(); + this.show(); + this.config.animation = initConfigAnimation; + } // Static + ; + + Tooltip._jQueryInterface = function _jQueryInterface(config) { + return this.each(function () { + var data = $(this).data(DATA_KEY); + + var _config = typeof config === 'object' && config; + + if (!data && /dispose|hide/.test(config)) { + return; + } + + if (!data) { + data = new Tooltip(this, _config); + $(this).data(DATA_KEY, data); + } + + if (typeof config === 'string') { + if (typeof data[config] === 'undefined') { + throw new TypeError("No method named \"" + config + "\""); + } + + data[config](); + } + }); + }; + + _createClass(Tooltip, null, [{ + key: "VERSION", + get: function get() { + return VERSION; + } + }, { + key: "Default", + get: function get() { + return Default; + } + }, { + key: "NAME", + get: function get() { + return NAME; + } + }, { + key: "DATA_KEY", + get: function get() { + return DATA_KEY; + } + }, { + key: "Event", + get: function get() { + return Event; + } + }, { + key: "EVENT_KEY", + get: function get() { + return EVENT_KEY; + } + }, { + key: "DefaultType", + get: function get() { + return DefaultType; + } + }]); + + return Tooltip; + }(); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + + $.fn[NAME] = Tooltip._jQueryInterface; + $.fn[NAME].Constructor = Tooltip; + + $.fn[NAME].noConflict = function () { + $.fn[NAME] = JQUERY_NO_CONFLICT; + return Tooltip._jQueryInterface; + }; + + return Tooltip; + +})); +/*! + * Bootstrap popover.js v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery'), require('./tooltip.js')) : + typeof define === 'function' && define.amd ? define(['jquery', './tooltip.js'], factory) : + (global = global || self, global.Popover = factory(global.jQuery, global.Tooltip)); +}(this, function ($, Tooltip) { 'use strict'; + + $ = $ && $.hasOwnProperty('default') ? $['default'] : $; + Tooltip = Tooltip && Tooltip.hasOwnProperty('default') ? Tooltip['default'] : Tooltip; + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } + + function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; + } + + function _objectSpread(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i] != null ? arguments[i] : {}; + var ownKeys = Object.keys(source); + + if (typeof Object.getOwnPropertySymbols === 'function') { + ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { + return Object.getOwnPropertyDescriptor(source, sym).enumerable; + })); + } + + ownKeys.forEach(function (key) { + _defineProperty(target, key, source[key]); + }); + } + + return target; + } + + function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + subClass.__proto__ = superClass; + } + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME = 'popover'; + var VERSION = '4.3.1'; + var DATA_KEY = 'bs.popover'; + var EVENT_KEY = "." + DATA_KEY; + var JQUERY_NO_CONFLICT = $.fn[NAME]; + var CLASS_PREFIX = 'bs-popover'; + var BSCLS_PREFIX_REGEX = new RegExp("(^|\\s)" + CLASS_PREFIX + "\\S+", 'g'); + + var Default = _objectSpread({}, Tooltip.Default, { + placement: 'right', + trigger: 'click', + content: '', + template: '<div class="popover" role="tooltip">' + '<div class="arrow"></div>' + '<h3 class="popover-header"></h3>' + '<div class="popover-body"></div></div>' + }); + + var DefaultType = _objectSpread({}, Tooltip.DefaultType, { + content: '(string|element|function)' + }); + + var ClassName = { + FADE: 'fade', + SHOW: 'show' + }; + var Selector = { + TITLE: '.popover-header', + CONTENT: '.popover-body' + }; + var Event = { + HIDE: "hide" + EVENT_KEY, + HIDDEN: "hidden" + EVENT_KEY, + SHOW: "show" + EVENT_KEY, + SHOWN: "shown" + EVENT_KEY, + INSERTED: "inserted" + EVENT_KEY, + CLICK: "click" + EVENT_KEY, + FOCUSIN: "focusin" + EVENT_KEY, + FOCUSOUT: "focusout" + EVENT_KEY, + MOUSEENTER: "mouseenter" + EVENT_KEY, + MOUSELEAVE: "mouseleave" + EVENT_KEY + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + }; + + var Popover = + /*#__PURE__*/ + function (_Tooltip) { + _inheritsLoose(Popover, _Tooltip); + + function Popover() { + return _Tooltip.apply(this, arguments) || this; + } + + var _proto = Popover.prototype; + + // Overrides + _proto.isWithContent = function isWithContent() { + return this.getTitle() || this._getContent(); + }; + + _proto.addAttachmentClass = function addAttachmentClass(attachment) { + $(this.getTipElement()).addClass(CLASS_PREFIX + "-" + attachment); + }; + + _proto.getTipElement = function getTipElement() { + this.tip = this.tip || $(this.config.template)[0]; + return this.tip; + }; + + _proto.setContent = function setContent() { + var $tip = $(this.getTipElement()); // We use append for html objects to maintain js events + + this.setElementContent($tip.find(Selector.TITLE), this.getTitle()); + + var content = this._getContent(); + + if (typeof content === 'function') { + content = content.call(this.element); + } + + this.setElementContent($tip.find(Selector.CONTENT), content); + $tip.removeClass(ClassName.FADE + " " + ClassName.SHOW); + } // Private + ; + + _proto._getContent = function _getContent() { + return this.element.getAttribute('data-content') || this.config.content; + }; + + _proto._cleanTipClass = function _cleanTipClass() { + var $tip = $(this.getTipElement()); + var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX); + + if (tabClass !== null && tabClass.length > 0) { + $tip.removeClass(tabClass.join('')); + } + } // Static + ; + + Popover._jQueryInterface = function _jQueryInterface(config) { + return this.each(function () { + var data = $(this).data(DATA_KEY); + + var _config = typeof config === 'object' ? config : null; + + if (!data && /dispose|hide/.test(config)) { + return; + } + + if (!data) { + data = new Popover(this, _config); + $(this).data(DATA_KEY, data); + } + + if (typeof config === 'string') { + if (typeof data[config] === 'undefined') { + throw new TypeError("No method named \"" + config + "\""); + } + + data[config](); + } + }); + }; + + _createClass(Popover, null, [{ + key: "VERSION", + // Getters + get: function get() { + return VERSION; + } + }, { + key: "Default", + get: function get() { + return Default; + } + }, { + key: "NAME", + get: function get() { + return NAME; + } + }, { + key: "DATA_KEY", + get: function get() { + return DATA_KEY; + } + }, { + key: "Event", + get: function get() { + return Event; + } + }, { + key: "EVENT_KEY", + get: function get() { + return EVENT_KEY; + } + }, { + key: "DefaultType", + get: function get() { + return DefaultType; + } + }]); + + return Popover; + }(Tooltip); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + + $.fn[NAME] = Popover._jQueryInterface; + $.fn[NAME].Constructor = Popover; + + $.fn[NAME].noConflict = function () { + $.fn[NAME] = JQUERY_NO_CONFLICT; + return Popover._jQueryInterface; + }; + + return Popover; + +})); +/*! + * Bootstrap scrollspy.js v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery'), require('./util.js')) : + typeof define === 'function' && define.amd ? define(['jquery', './util.js'], factory) : + (global = global || self, global.ScrollSpy = factory(global.jQuery, global.Util)); +}(this, function ($, Util) { 'use strict'; + + $ = $ && $.hasOwnProperty('default') ? $['default'] : $; + Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util; + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } + + function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; + } + + function _objectSpread(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i] != null ? arguments[i] : {}; + var ownKeys = Object.keys(source); + + if (typeof Object.getOwnPropertySymbols === 'function') { + ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { + return Object.getOwnPropertyDescriptor(source, sym).enumerable; + })); + } + + ownKeys.forEach(function (key) { + _defineProperty(target, key, source[key]); + }); + } + + return target; + } + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME = 'scrollspy'; + var VERSION = '4.3.1'; + var DATA_KEY = 'bs.scrollspy'; + var EVENT_KEY = "." + DATA_KEY; + var DATA_API_KEY = '.data-api'; + var JQUERY_NO_CONFLICT = $.fn[NAME]; + var Default = { + offset: 10, + method: 'auto', + target: '' + }; + var DefaultType = { + offset: 'number', + method: 'string', + target: '(string|element)' + }; + var Event = { + ACTIVATE: "activate" + EVENT_KEY, + SCROLL: "scroll" + EVENT_KEY, + LOAD_DATA_API: "load" + EVENT_KEY + DATA_API_KEY + }; + var ClassName = { + DROPDOWN_ITEM: 'dropdown-item', + DROPDOWN_MENU: 'dropdown-menu', + ACTIVE: 'active' + }; + var Selector = { + DATA_SPY: '[data-spy="scroll"]', + ACTIVE: '.active', + NAV_LIST_GROUP: '.nav, .list-group', + NAV_LINKS: '.nav-link', + NAV_ITEMS: '.nav-item', + LIST_ITEMS: '.list-group-item', + DROPDOWN: '.dropdown', + DROPDOWN_ITEMS: '.dropdown-item', + DROPDOWN_TOGGLE: '.dropdown-toggle' + }; + var OffsetMethod = { + OFFSET: 'offset', + POSITION: 'position' + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + }; + + var ScrollSpy = + /*#__PURE__*/ + function () { + function ScrollSpy(element, config) { + var _this = this; + + this._element = element; + this._scrollElement = element.tagName === 'BODY' ? window : element; + this._config = this._getConfig(config); + this._selector = this._config.target + " " + Selector.NAV_LINKS + "," + (this._config.target + " " + Selector.LIST_ITEMS + ",") + (this._config.target + " " + Selector.DROPDOWN_ITEMS); + this._offsets = []; + this._targets = []; + this._activeTarget = null; + this._scrollHeight = 0; + $(this._scrollElement).on(Event.SCROLL, function (event) { + return _this._process(event); + }); + this.refresh(); + + this._process(); + } // Getters + + + var _proto = ScrollSpy.prototype; + + // Public + _proto.refresh = function refresh() { + var _this2 = this; + + var autoMethod = this._scrollElement === this._scrollElement.window ? OffsetMethod.OFFSET : OffsetMethod.POSITION; + var offsetMethod = this._config.method === 'auto' ? autoMethod : this._config.method; + var offsetBase = offsetMethod === OffsetMethod.POSITION ? this._getScrollTop() : 0; + this._offsets = []; + this._targets = []; + this._scrollHeight = this._getScrollHeight(); + var targets = [].slice.call(document.querySelectorAll(this._selector)); + targets.map(function (element) { + var target; + var targetSelector = Util.getSelectorFromElement(element); + + if (targetSelector) { + target = document.querySelector(targetSelector); + } + + if (target) { + var targetBCR = target.getBoundingClientRect(); + + if (targetBCR.width || targetBCR.height) { + // TODO (fat): remove sketch reliance on jQuery position/offset + return [$(target)[offsetMethod]().top + offsetBase, targetSelector]; + } + } + + return null; + }).filter(function (item) { + return item; + }).sort(function (a, b) { + return a[0] - b[0]; + }).forEach(function (item) { + _this2._offsets.push(item[0]); + + _this2._targets.push(item[1]); + }); + }; + + _proto.dispose = function dispose() { + $.removeData(this._element, DATA_KEY); + $(this._scrollElement).off(EVENT_KEY); + this._element = null; + this._scrollElement = null; + this._config = null; + this._selector = null; + this._offsets = null; + this._targets = null; + this._activeTarget = null; + this._scrollHeight = null; + } // Private + ; + + _proto._getConfig = function _getConfig(config) { + config = _objectSpread({}, Default, typeof config === 'object' && config ? config : {}); + + if (typeof config.target !== 'string') { + var id = $(config.target).attr('id'); + + if (!id) { + id = Util.getUID(NAME); + $(config.target).attr('id', id); + } + + config.target = "#" + id; + } + + Util.typeCheckConfig(NAME, config, DefaultType); + return config; + }; + + _proto._getScrollTop = function _getScrollTop() { + return this._scrollElement === window ? this._scrollElement.pageYOffset : this._scrollElement.scrollTop; + }; + + _proto._getScrollHeight = function _getScrollHeight() { + return this._scrollElement.scrollHeight || Math.max(document.body.scrollHeight, document.documentElement.scrollHeight); + }; + + _proto._getOffsetHeight = function _getOffsetHeight() { + return this._scrollElement === window ? window.innerHeight : this._scrollElement.getBoundingClientRect().height; + }; + + _proto._process = function _process() { + var scrollTop = this._getScrollTop() + this._config.offset; + + var scrollHeight = this._getScrollHeight(); + + var maxScroll = this._config.offset + scrollHeight - this._getOffsetHeight(); + + if (this._scrollHeight !== scrollHeight) { + this.refresh(); + } + + if (scrollTop >= maxScroll) { + var target = this._targets[this._targets.length - 1]; + + if (this._activeTarget !== target) { + this._activate(target); + } + + return; + } + + if (this._activeTarget && scrollTop < this._offsets[0] && this._offsets[0] > 0) { + this._activeTarget = null; + + this._clear(); + + return; + } + + var offsetLength = this._offsets.length; + + for (var i = offsetLength; i--;) { + var isActiveTarget = this._activeTarget !== this._targets[i] && scrollTop >= this._offsets[i] && (typeof this._offsets[i + 1] === 'undefined' || scrollTop < this._offsets[i + 1]); + + if (isActiveTarget) { + this._activate(this._targets[i]); + } + } + }; + + _proto._activate = function _activate(target) { + this._activeTarget = target; + + this._clear(); + + var queries = this._selector.split(',').map(function (selector) { + return selector + "[data-target=\"" + target + "\"]," + selector + "[href=\"" + target + "\"]"; + }); + + var $link = $([].slice.call(document.querySelectorAll(queries.join(',')))); + + if ($link.hasClass(ClassName.DROPDOWN_ITEM)) { + $link.closest(Selector.DROPDOWN).find(Selector.DROPDOWN_TOGGLE).addClass(ClassName.ACTIVE); + $link.addClass(ClassName.ACTIVE); + } else { + // Set triggered link as active + $link.addClass(ClassName.ACTIVE); // Set triggered links parents as active + // With both <ul> and <nav> markup a parent is the previous sibling of any nav ancestor + + $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_LINKS + ", " + Selector.LIST_ITEMS).addClass(ClassName.ACTIVE); // Handle special case when .nav-link is inside .nav-item + + $link.parents(Selector.NAV_LIST_GROUP).prev(Selector.NAV_ITEMS).children(Selector.NAV_LINKS).addClass(ClassName.ACTIVE); + } + + $(this._scrollElement).trigger(Event.ACTIVATE, { + relatedTarget: target + }); + }; + + _proto._clear = function _clear() { + [].slice.call(document.querySelectorAll(this._selector)).filter(function (node) { + return node.classList.contains(ClassName.ACTIVE); + }).forEach(function (node) { + return node.classList.remove(ClassName.ACTIVE); + }); + } // Static + ; + + ScrollSpy._jQueryInterface = function _jQueryInterface(config) { + return this.each(function () { + var data = $(this).data(DATA_KEY); + + var _config = typeof config === 'object' && config; + + if (!data) { + data = new ScrollSpy(this, _config); + $(this).data(DATA_KEY, data); + } + + if (typeof config === 'string') { + if (typeof data[config] === 'undefined') { + throw new TypeError("No method named \"" + config + "\""); + } + + data[config](); + } + }); + }; + + _createClass(ScrollSpy, null, [{ + key: "VERSION", + get: function get() { + return VERSION; + } + }, { + key: "Default", + get: function get() { + return Default; + } + }]); + + return ScrollSpy; + }(); + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + $(window).on(Event.LOAD_DATA_API, function () { + var scrollSpys = [].slice.call(document.querySelectorAll(Selector.DATA_SPY)); + var scrollSpysLength = scrollSpys.length; + + for (var i = scrollSpysLength; i--;) { + var $spy = $(scrollSpys[i]); + + ScrollSpy._jQueryInterface.call($spy, $spy.data()); + } + }); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + $.fn[NAME] = ScrollSpy._jQueryInterface; + $.fn[NAME].Constructor = ScrollSpy; + + $.fn[NAME].noConflict = function () { + $.fn[NAME] = JQUERY_NO_CONFLICT; + return ScrollSpy._jQueryInterface; + }; + + return ScrollSpy; + +})); +/*! + * Bootstrap tab.js v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery'), require('./util.js')) : + typeof define === 'function' && define.amd ? define(['jquery', './util.js'], factory) : + (global = global || self, global.Tab = factory(global.jQuery, global.Util)); +}(this, function ($, Util) { 'use strict'; + + $ = $ && $.hasOwnProperty('default') ? $['default'] : $; + Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util; + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME = 'tab'; + var VERSION = '4.3.1'; + var DATA_KEY = 'bs.tab'; + var EVENT_KEY = "." + DATA_KEY; + var DATA_API_KEY = '.data-api'; + var JQUERY_NO_CONFLICT = $.fn[NAME]; + var Event = { + HIDE: "hide" + EVENT_KEY, + HIDDEN: "hidden" + EVENT_KEY, + SHOW: "show" + EVENT_KEY, + SHOWN: "shown" + EVENT_KEY, + CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY + }; + var ClassName = { + DROPDOWN_MENU: 'dropdown-menu', + ACTIVE: 'active', + DISABLED: 'disabled', + FADE: 'fade', + SHOW: 'show' + }; + var Selector = { + DROPDOWN: '.dropdown', + NAV_LIST_GROUP: '.nav, .list-group', + ACTIVE: '.active', + ACTIVE_UL: '> li > .active', + DATA_TOGGLE: '[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]', + DROPDOWN_TOGGLE: '.dropdown-toggle', + DROPDOWN_ACTIVE_CHILD: '> .dropdown-menu .active' + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + }; + + var Tab = + /*#__PURE__*/ + function () { + function Tab(element) { + this._element = element; + } // Getters + + + var _proto = Tab.prototype; + + // Public + _proto.show = function show() { + var _this = this; + + if (this._element.parentNode && this._element.parentNode.nodeType === Node.ELEMENT_NODE && $(this._element).hasClass(ClassName.ACTIVE) || $(this._element).hasClass(ClassName.DISABLED)) { + return; + } + + var target; + var previous; + var listElement = $(this._element).closest(Selector.NAV_LIST_GROUP)[0]; + var selector = Util.getSelectorFromElement(this._element); + + if (listElement) { + var itemSelector = listElement.nodeName === 'UL' || listElement.nodeName === 'OL' ? Selector.ACTIVE_UL : Selector.ACTIVE; + previous = $.makeArray($(listElement).find(itemSelector)); + previous = previous[previous.length - 1]; + } + + var hideEvent = $.Event(Event.HIDE, { + relatedTarget: this._element + }); + var showEvent = $.Event(Event.SHOW, { + relatedTarget: previous + }); + + if (previous) { + $(previous).trigger(hideEvent); + } + + $(this._element).trigger(showEvent); + + if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) { + return; + } + + if (selector) { + target = document.querySelector(selector); + } + + this._activate(this._element, listElement); + + var complete = function complete() { + var hiddenEvent = $.Event(Event.HIDDEN, { + relatedTarget: _this._element + }); + var shownEvent = $.Event(Event.SHOWN, { + relatedTarget: previous + }); + $(previous).trigger(hiddenEvent); + $(_this._element).trigger(shownEvent); + }; + + if (target) { + this._activate(target, target.parentNode, complete); + } else { + complete(); + } + }; + + _proto.dispose = function dispose() { + $.removeData(this._element, DATA_KEY); + this._element = null; + } // Private + ; + + _proto._activate = function _activate(element, container, callback) { + var _this2 = this; + + var activeElements = container && (container.nodeName === 'UL' || container.nodeName === 'OL') ? $(container).find(Selector.ACTIVE_UL) : $(container).children(Selector.ACTIVE); + var active = activeElements[0]; + var isTransitioning = callback && active && $(active).hasClass(ClassName.FADE); + + var complete = function complete() { + return _this2._transitionComplete(element, active, callback); + }; + + if (active && isTransitioning) { + var transitionDuration = Util.getTransitionDurationFromElement(active); + $(active).removeClass(ClassName.SHOW).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); + } else { + complete(); + } + }; + + _proto._transitionComplete = function _transitionComplete(element, active, callback) { + if (active) { + $(active).removeClass(ClassName.ACTIVE); + var dropdownChild = $(active.parentNode).find(Selector.DROPDOWN_ACTIVE_CHILD)[0]; + + if (dropdownChild) { + $(dropdownChild).removeClass(ClassName.ACTIVE); + } + + if (active.getAttribute('role') === 'tab') { + active.setAttribute('aria-selected', false); + } + } + + $(element).addClass(ClassName.ACTIVE); + + if (element.getAttribute('role') === 'tab') { + element.setAttribute('aria-selected', true); + } + + Util.reflow(element); + + if (element.classList.contains(ClassName.FADE)) { + element.classList.add(ClassName.SHOW); + } + + if (element.parentNode && $(element.parentNode).hasClass(ClassName.DROPDOWN_MENU)) { + var dropdownElement = $(element).closest(Selector.DROPDOWN)[0]; + + if (dropdownElement) { + var dropdownToggleList = [].slice.call(dropdownElement.querySelectorAll(Selector.DROPDOWN_TOGGLE)); + $(dropdownToggleList).addClass(ClassName.ACTIVE); + } + + element.setAttribute('aria-expanded', true); + } + + if (callback) { + callback(); + } + } // Static + ; + + Tab._jQueryInterface = function _jQueryInterface(config) { + return this.each(function () { + var $this = $(this); + var data = $this.data(DATA_KEY); + + if (!data) { + data = new Tab(this); + $this.data(DATA_KEY, data); + } + + if (typeof config === 'string') { + if (typeof data[config] === 'undefined') { + throw new TypeError("No method named \"" + config + "\""); + } + + data[config](); + } + }); + }; + + _createClass(Tab, null, [{ + key: "VERSION", + get: function get() { + return VERSION; + } + }]); + + return Tab; + }(); + /** + * ------------------------------------------------------------------------ + * Data Api implementation + * ------------------------------------------------------------------------ + */ + + + $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) { + event.preventDefault(); + + Tab._jQueryInterface.call($(this), 'show'); + }); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + $.fn[NAME] = Tab._jQueryInterface; + $.fn[NAME].Constructor = Tab; + + $.fn[NAME].noConflict = function () { + $.fn[NAME] = JQUERY_NO_CONFLICT; + return Tab._jQueryInterface; + }; + + return Tab; + +})); +/*! + * Bootstrap toast.js v4.3.1 (https://getbootstrap.com/) + * Copyright 2011-2019 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery'), require('./util.js')) : + typeof define === 'function' && define.amd ? define(['jquery', './util.js'], factory) : + (global = global || self, global.Toast = factory(global.jQuery, global.Util)); +}(this, function ($, Util) { 'use strict'; + + $ = $ && $.hasOwnProperty('default') ? $['default'] : $; + Util = Util && Util.hasOwnProperty('default') ? Util['default'] : Util; + + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) _defineProperties(Constructor.prototype, protoProps); + if (staticProps) _defineProperties(Constructor, staticProps); + return Constructor; + } + + function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; + } + + function _objectSpread(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i] != null ? arguments[i] : {}; + var ownKeys = Object.keys(source); + + if (typeof Object.getOwnPropertySymbols === 'function') { + ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { + return Object.getOwnPropertyDescriptor(source, sym).enumerable; + })); + } + + ownKeys.forEach(function (key) { + _defineProperty(target, key, source[key]); + }); + } + + return target; + } + + /** + * ------------------------------------------------------------------------ + * Constants + * ------------------------------------------------------------------------ + */ + + var NAME = 'toast'; + var VERSION = '4.3.1'; + var DATA_KEY = 'bs.toast'; + var EVENT_KEY = "." + DATA_KEY; + var JQUERY_NO_CONFLICT = $.fn[NAME]; + var Event = { + CLICK_DISMISS: "click.dismiss" + EVENT_KEY, + HIDE: "hide" + EVENT_KEY, + HIDDEN: "hidden" + EVENT_KEY, + SHOW: "show" + EVENT_KEY, + SHOWN: "shown" + EVENT_KEY + }; + var ClassName = { + FADE: 'fade', + HIDE: 'hide', + SHOW: 'show', + SHOWING: 'showing' + }; + var DefaultType = { + animation: 'boolean', + autohide: 'boolean', + delay: 'number' + }; + var Default = { + animation: true, + autohide: true, + delay: 500 + }; + var Selector = { + DATA_DISMISS: '[data-dismiss="toast"]' + /** + * ------------------------------------------------------------------------ + * Class Definition + * ------------------------------------------------------------------------ + */ + + }; + + var Toast = + /*#__PURE__*/ + function () { + function Toast(element, config) { + this._element = element; + this._config = this._getConfig(config); + this._timeout = null; + + this._setListeners(); + } // Getters + + + var _proto = Toast.prototype; + + // Public + _proto.show = function show() { + var _this = this; + + $(this._element).trigger(Event.SHOW); + + if (this._config.animation) { + this._element.classList.add(ClassName.FADE); + } + + var complete = function complete() { + _this._element.classList.remove(ClassName.SHOWING); + + _this._element.classList.add(ClassName.SHOW); + + $(_this._element).trigger(Event.SHOWN); + + if (_this._config.autohide) { + _this.hide(); + } + }; + + this._element.classList.remove(ClassName.HIDE); + + this._element.classList.add(ClassName.SHOWING); + + if (this._config.animation) { + var transitionDuration = Util.getTransitionDurationFromElement(this._element); + $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); + } else { + complete(); + } + }; + + _proto.hide = function hide(withoutTimeout) { + var _this2 = this; + + if (!this._element.classList.contains(ClassName.SHOW)) { + return; + } + + $(this._element).trigger(Event.HIDE); + + if (withoutTimeout) { + this._close(); + } else { + this._timeout = setTimeout(function () { + _this2._close(); + }, this._config.delay); + } + }; + + _proto.dispose = function dispose() { + clearTimeout(this._timeout); + this._timeout = null; + + if (this._element.classList.contains(ClassName.SHOW)) { + this._element.classList.remove(ClassName.SHOW); + } + + $(this._element).off(Event.CLICK_DISMISS); + $.removeData(this._element, DATA_KEY); + this._element = null; + this._config = null; + } // Private + ; + + _proto._getConfig = function _getConfig(config) { + config = _objectSpread({}, Default, $(this._element).data(), typeof config === 'object' && config ? config : {}); + Util.typeCheckConfig(NAME, config, this.constructor.DefaultType); + return config; + }; + + _proto._setListeners = function _setListeners() { + var _this3 = this; + + $(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, function () { + return _this3.hide(true); + }); + }; + + _proto._close = function _close() { + var _this4 = this; + + var complete = function complete() { + _this4._element.classList.add(ClassName.HIDE); + + $(_this4._element).trigger(Event.HIDDEN); + }; + + this._element.classList.remove(ClassName.SHOW); + + if (this._config.animation) { + var transitionDuration = Util.getTransitionDurationFromElement(this._element); + $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(transitionDuration); + } else { + complete(); + } + } // Static + ; + + Toast._jQueryInterface = function _jQueryInterface(config) { + return this.each(function () { + var $element = $(this); + var data = $element.data(DATA_KEY); + + var _config = typeof config === 'object' && config; + + if (!data) { + data = new Toast(this, _config); + $element.data(DATA_KEY, data); + } + + if (typeof config === 'string') { + if (typeof data[config] === 'undefined') { + throw new TypeError("No method named \"" + config + "\""); + } + + data[config](this); + } + }); + }; + + _createClass(Toast, null, [{ + key: "VERSION", + get: function get() { + return VERSION; + } + }, { + key: "DefaultType", + get: function get() { + return DefaultType; + } + }, { + key: "Default", + get: function get() { + return Default; + } + }]); + + return Toast; + }(); + /** + * ------------------------------------------------------------------------ + * jQuery + * ------------------------------------------------------------------------ + */ + + + $.fn[NAME] = Toast._jQueryInterface; + $.fn[NAME].Constructor = Toast; + + $.fn[NAME].noConflict = function () { + $.fn[NAME] = JQUERY_NO_CONFLICT; + return Toast._jQueryInterface; + }; + + return Toast; + +})); + + + + + + + + + + + + +/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 + * https://jqueryvalidation.org/ + * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ + +!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){a.extend(a.fn,{validate:function(b){if(!this.length)return void(b&&b.debug&&window.console&&console.warn("Nothing selected, can't validate, returning nothing."));var c=a.data(this[0],"validator");return c?c:(this.attr("novalidate","novalidate"),c=new a.validator(b,this[0]),a.data(this[0],"validator",c),c.settings.onsubmit&&(this.on("click.validate",":submit",function(b){c.submitButton=b.currentTarget,a(this).hasClass("cancel")&&(c.cancelSubmit=!0),void 0!==a(this).attr("formnovalidate")&&(c.cancelSubmit=!0)}),this.on("submit.validate",function(b){function d(){var d,e;return c.submitButton&&(c.settings.submitHandler||c.formSubmitted)&&(d=a("<input type='hidden'/>").attr("name",c.submitButton.name).val(a(c.submitButton).val()).appendTo(c.currentForm)),!(c.settings.submitHandler&&!c.settings.debug)||(e=c.settings.submitHandler.call(c,c.currentForm,b),d&&d.remove(),void 0!==e&&e)}return c.settings.debug&&b.preventDefault(),c.cancelSubmit?(c.cancelSubmit=!1,d()):c.form()?c.pendingRequest?(c.formSubmitted=!0,!1):d():(c.focusInvalid(),!1)})),c)},valid:function(){var b,c,d;return a(this[0]).is("form")?b=this.validate().form():(d=[],b=!0,c=a(this[0].form).validate(),this.each(function(){b=c.element(this)&&b,b||(d=d.concat(c.errorList))}),c.errorList=d),b},rules:function(b,c){var d,e,f,g,h,i,j=this[0],k="undefined"!=typeof this.attr("contenteditable")&&"false"!==this.attr("contenteditable");if(null!=j&&(!j.form&&k&&(j.form=this.closest("form")[0],j.name=this.attr("name")),null!=j.form)){if(b)switch(d=a.data(j.form,"validator").settings,e=d.rules,f=a.validator.staticRules(j),b){case"add":a.extend(f,a.validator.normalizeRule(c)),delete f.messages,e[j.name]=f,c.messages&&(d.messages[j.name]=a.extend(d.messages[j.name],c.messages));break;case"remove":return c?(i={},a.each(c.split(/\s/),function(a,b){i[b]=f[b],delete f[b]}),i):(delete e[j.name],f)}return g=a.validator.normalizeRules(a.extend({},a.validator.classRules(j),a.validator.attributeRules(j),a.validator.dataRules(j),a.validator.staticRules(j)),j),g.required&&(h=g.required,delete g.required,g=a.extend({required:h},g)),g.remote&&(h=g.remote,delete g.remote,g=a.extend(g,{remote:h})),g}}}),a.extend(a.expr.pseudos||a.expr[":"],{blank:function(b){return!a.trim(""+a(b).val())},filled:function(b){var c=a(b).val();return null!==c&&!!a.trim(""+c)},unchecked:function(b){return!a(b).prop("checked")}}),a.validator=function(b,c){this.settings=a.extend(!0,{},a.validator.defaults,b),this.currentForm=c,this.init()},a.validator.format=function(b,c){return 1===arguments.length?function(){var c=a.makeArray(arguments);return c.unshift(b),a.validator.format.apply(this,c)}:void 0===c?b:(arguments.length>2&&c.constructor!==Array&&(c=a.makeArray(arguments).slice(1)),c.constructor!==Array&&(c=[c]),a.each(c,function(a,c){b=b.replace(new RegExp("\\{"+a+"\\}","g"),function(){return c})}),b)},a.extend(a.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",pendingClass:"pending",validClass:"valid",errorElement:"label",focusCleanup:!1,focusInvalid:!0,errorContainer:a([]),errorLabelContainer:a([]),onsubmit:!0,ignore:":hidden",ignoreTitle:!1,onfocusin:function(a){this.lastActive=a,this.settings.focusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,a,this.settings.errorClass,this.settings.validClass),this.hideThese(this.errorsFor(a)))},onfocusout:function(a){this.checkable(a)||!(a.name in this.submitted)&&this.optional(a)||this.element(a)},onkeyup:function(b,c){var d=[16,17,18,20,35,36,37,38,39,40,45,144,225];9===c.which&&""===this.elementValue(b)||a.inArray(c.keyCode,d)!==-1||(b.name in this.submitted||b.name in this.invalid)&&this.element(b)},onclick:function(a){a.name in this.submitted?this.element(a):a.parentNode.name in this.submitted&&this.element(a.parentNode)},highlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).addClass(c).removeClass(d):a(b).addClass(c).removeClass(d)},unhighlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).removeClass(c).addClass(d):a(b).removeClass(c).addClass(d)}},setDefaults:function(b){a.extend(a.validator.defaults,b)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date (ISO).",number:"Please enter a valid number.",digits:"Please enter only digits.",equalTo:"Please enter the same value again.",maxlength:a.validator.format("Please enter no more than {0} characters."),minlength:a.validator.format("Please enter at least {0} characters."),rangelength:a.validator.format("Please enter a value between {0} and {1} characters long."),range:a.validator.format("Please enter a value between {0} and {1}."),max:a.validator.format("Please enter a value less than or equal to {0}."),min:a.validator.format("Please enter a value greater than or equal to {0}."),step:a.validator.format("Please enter a multiple of {0}.")},autoCreateRanges:!1,prototype:{init:function(){function b(b){var c="undefined"!=typeof a(this).attr("contenteditable")&&"false"!==a(this).attr("contenteditable");if(!this.form&&c&&(this.form=a(this).closest("form")[0],this.name=a(this).attr("name")),d===this.form){var e=a.data(this.form,"validator"),f="on"+b.type.replace(/^validate/,""),g=e.settings;g[f]&&!a(this).is(g.ignore)&&g[f].call(e,this,b)}}this.labelContainer=a(this.settings.errorLabelContainer),this.errorContext=this.labelContainer.length&&this.labelContainer||a(this.currentForm),this.containers=a(this.settings.errorContainer).add(this.settings.errorLabelContainer),this.submitted={},this.valueCache={},this.pendingRequest=0,this.pending={},this.invalid={},this.reset();var c,d=this.currentForm,e=this.groups={};a.each(this.settings.groups,function(b,c){"string"==typeof c&&(c=c.split(/\s/)),a.each(c,function(a,c){e[c]=b})}),c=this.settings.rules,a.each(c,function(b,d){c[b]=a.validator.normalizeRule(d)}),a(this.currentForm).on("focusin.validate focusout.validate keyup.validate",":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], [type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], [type='radio'], [type='checkbox'], [contenteditable], [type='button']",b).on("click.validate","select, option, [type='radio'], [type='checkbox']",b),this.settings.invalidHandler&&a(this.currentForm).on("invalid-form.validate",this.settings.invalidHandler)},form:function(){return this.checkForm(),a.extend(this.submitted,this.errorMap),this.invalid=a.extend({},this.errorMap),this.valid()||a(this.currentForm).triggerHandler("invalid-form",[this]),this.showErrors(),this.valid()},checkForm:function(){this.prepareForm();for(var a=0,b=this.currentElements=this.elements();b[a];a++)this.check(b[a]);return this.valid()},element:function(b){var c,d,e=this.clean(b),f=this.validationTargetFor(e),g=this,h=!0;return void 0===f?delete this.invalid[e.name]:(this.prepareElement(f),this.currentElements=a(f),d=this.groups[f.name],d&&a.each(this.groups,function(a,b){b===d&&a!==f.name&&(e=g.validationTargetFor(g.clean(g.findByName(a))),e&&e.name in g.invalid&&(g.currentElements.push(e),h=g.check(e)&&h))}),c=this.check(f)!==!1,h=h&&c,c?this.invalid[f.name]=!1:this.invalid[f.name]=!0,this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),a(b).attr("aria-invalid",!c)),h},showErrors:function(b){if(b){var c=this;a.extend(this.errorMap,b),this.errorList=a.map(this.errorMap,function(a,b){return{message:a,element:c.findByName(b)[0]}}),this.successList=a.grep(this.successList,function(a){return!(a.name in b)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){a.fn.resetForm&&a(this.currentForm).resetForm(),this.invalid={},this.submitted={},this.prepareForm(),this.hideErrors();var b=this.elements().removeData("previousValue").removeAttr("aria-invalid");this.resetElements(b)},resetElements:function(a){var b;if(this.settings.unhighlight)for(b=0;a[b];b++)this.settings.unhighlight.call(this,a[b],this.settings.errorClass,""),this.findByName(a[b].name).removeClass(this.settings.validClass);else a.removeClass(this.settings.errorClass).removeClass(this.settings.validClass)},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(a){var b,c=0;for(b in a)void 0!==a[b]&&null!==a[b]&&a[b]!==!1&&c++;return c},hideErrors:function(){this.hideThese(this.toHide)},hideThese:function(a){a.not(this.containers).text(""),this.addWrapper(a).hide()},valid:function(){return 0===this.size()},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{a(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").trigger("focus").trigger("focusin")}catch(b){}},findLastActive:function(){var b=this.lastActive;return b&&1===a.grep(this.errorList,function(a){return a.element.name===b.name}).length&&b},elements:function(){var b=this,c={};return a(this.currentForm).find("input, select, textarea, [contenteditable]").not(":submit, :reset, :image, :disabled").not(this.settings.ignore).filter(function(){var d=this.name||a(this).attr("name"),e="undefined"!=typeof a(this).attr("contenteditable")&&"false"!==a(this).attr("contenteditable");return!d&&b.settings.debug&&window.console&&console.error("%o has no name assigned",this),e&&(this.form=a(this).closest("form")[0],this.name=d),this.form===b.currentForm&&(!(d in c||!b.objectLength(a(this).rules()))&&(c[d]=!0,!0))})},clean:function(b){return a(b)[0]},errors:function(){var b=this.settings.errorClass.split(" ").join(".");return a(this.settings.errorElement+"."+b,this.errorContext)},resetInternals:function(){this.successList=[],this.errorList=[],this.errorMap={},this.toShow=a([]),this.toHide=a([])},reset:function(){this.resetInternals(),this.currentElements=a([])},prepareForm:function(){this.reset(),this.toHide=this.errors().add(this.containers)},prepareElement:function(a){this.reset(),this.toHide=this.errorsFor(a)},elementValue:function(b){var c,d,e=a(b),f=b.type,g="undefined"!=typeof e.attr("contenteditable")&&"false"!==e.attr("contenteditable");return"radio"===f||"checkbox"===f?this.findByName(b.name).filter(":checked").val():"number"===f&&"undefined"!=typeof b.validity?b.validity.badInput?"NaN":e.val():(c=g?e.text():e.val(),"file"===f?"C:\\fakepath\\"===c.substr(0,12)?c.substr(12):(d=c.lastIndexOf("/"),d>=0?c.substr(d+1):(d=c.lastIndexOf("\\"),d>=0?c.substr(d+1):c)):"string"==typeof c?c.replace(/\r/g,""):c)},check:function(b){b=this.validationTargetFor(this.clean(b));var c,d,e,f,g=a(b).rules(),h=a.map(g,function(a,b){return b}).length,i=!1,j=this.elementValue(b);"function"==typeof g.normalizer?f=g.normalizer:"function"==typeof this.settings.normalizer&&(f=this.settings.normalizer),f&&(j=f.call(b,j),delete g.normalizer);for(d in g){e={method:d,parameters:g[d]};try{if(c=a.validator.methods[d].call(this,j,b,e.parameters),"dependency-mismatch"===c&&1===h){i=!0;continue}if(i=!1,"pending"===c)return void(this.toHide=this.toHide.not(this.errorsFor(b)));if(!c)return this.formatAndAdd(b,e),!1}catch(k){throw this.settings.debug&&window.console&&console.log("Exception occurred when checking element "+b.id+", check the '"+e.method+"' method.",k),k instanceof TypeError&&(k.message+=". Exception occurred when checking element "+b.id+", check the '"+e.method+"' method."),k}}if(!i)return this.objectLength(g)&&this.successList.push(b),!0},customDataMessage:function(b,c){return a(b).data("msg"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase())||a(b).data("msg")},customMessage:function(a,b){var c=this.settings.messages[a];return c&&(c.constructor===String?c:c[b])},findDefined:function(){for(var a=0;a<arguments.length;a++)if(void 0!==arguments[a])return arguments[a]},defaultMessage:function(b,c){"string"==typeof c&&(c={method:c});var d=this.findDefined(this.customMessage(b.name,c.method),this.customDataMessage(b,c.method),!this.settings.ignoreTitle&&b.title||void 0,a.validator.messages[c.method],"<strong>Warning: No message defined for "+b.name+"</strong>"),e=/\$?\{(\d+)\}/g;return"function"==typeof d?d=d.call(this,c.parameters,b):e.test(d)&&(d=a.validator.format(d.replace(e,"{$1}"),c.parameters)),d},formatAndAdd:function(a,b){var c=this.defaultMessage(a,b);this.errorList.push({message:c,element:a,method:b.method}),this.errorMap[a.name]=c,this.submitted[a.name]=c},addWrapper:function(a){return this.settings.wrapper&&(a=a.add(a.parent(this.settings.wrapper))),a},defaultShowErrors:function(){var a,b,c;for(a=0;this.errorList[a];a++)c=this.errorList[a],this.settings.highlight&&this.settings.highlight.call(this,c.element,this.settings.errorClass,this.settings.validClass),this.showLabel(c.element,c.message);if(this.errorList.length&&(this.toShow=this.toShow.add(this.containers)),this.settings.success)for(a=0;this.successList[a];a++)this.showLabel(this.successList[a]);if(this.settings.unhighlight)for(a=0,b=this.validElements();b[a];a++)this.settings.unhighlight.call(this,b[a],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow),this.hideErrors(),this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return a(this.errorList).map(function(){return this.element})},showLabel:function(b,c){var d,e,f,g,h=this.errorsFor(b),i=this.idOrName(b),j=a(b).attr("aria-describedby");h.length?(h.removeClass(this.settings.validClass).addClass(this.settings.errorClass),h.html(c)):(h=a("<"+this.settings.errorElement+">").attr("id",i+"-error").addClass(this.settings.errorClass).html(c||""),d=h,this.settings.wrapper&&(d=h.hide().show().wrap("<"+this.settings.wrapper+"/>").parent()),this.labelContainer.length?this.labelContainer.append(d):this.settings.errorPlacement?this.settings.errorPlacement.call(this,d,a(b)):d.insertAfter(b),h.is("label")?h.attr("for",i):0===h.parents("label[for='"+this.escapeCssMeta(i)+"']").length&&(f=h.attr("id"),j?j.match(new RegExp("\\b"+this.escapeCssMeta(f)+"\\b"))||(j+=" "+f):j=f,a(b).attr("aria-describedby",j),e=this.groups[b.name],e&&(g=this,a.each(g.groups,function(b,c){c===e&&a("[name='"+g.escapeCssMeta(b)+"']",g.currentForm).attr("aria-describedby",h.attr("id"))})))),!c&&this.settings.success&&(h.text(""),"string"==typeof this.settings.success?h.addClass(this.settings.success):this.settings.success(h,b)),this.toShow=this.toShow.add(h)},errorsFor:function(b){var c=this.escapeCssMeta(this.idOrName(b)),d=a(b).attr("aria-describedby"),e="label[for='"+c+"'], label[for='"+c+"'] *";return d&&(e=e+", #"+this.escapeCssMeta(d).replace(/\s+/g,", #")),this.errors().filter(e)},escapeCssMeta:function(a){return a.replace(/([\\!"#$%&'()*+,.\/:;<=>?@\[\]^`{|}~])/g,"\\$1")},idOrName:function(a){return this.groups[a.name]||(this.checkable(a)?a.name:a.id||a.name)},validationTargetFor:function(b){return this.checkable(b)&&(b=this.findByName(b.name)),a(b).not(this.settings.ignore)[0]},checkable:function(a){return/radio|checkbox/i.test(a.type)},findByName:function(b){return a(this.currentForm).find("[name='"+this.escapeCssMeta(b)+"']")},getLength:function(b,c){switch(c.nodeName.toLowerCase()){case"select":return a("option:selected",c).length;case"input":if(this.checkable(c))return this.findByName(c.name).filter(":checked").length}return b.length},depend:function(a,b){return!this.dependTypes[typeof a]||this.dependTypes[typeof a](a,b)},dependTypes:{"boolean":function(a){return a},string:function(b,c){return!!a(b,c.form).length},"function":function(a,b){return a(b)}},optional:function(b){var c=this.elementValue(b);return!a.validator.methods.required.call(this,c,b)&&"dependency-mismatch"},startRequest:function(b){this.pending[b.name]||(this.pendingRequest++,a(b).addClass(this.settings.pendingClass),this.pending[b.name]=!0)},stopRequest:function(b,c){this.pendingRequest--,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[b.name],a(b).removeClass(this.settings.pendingClass),c&&0===this.pendingRequest&&this.formSubmitted&&this.form()?(a(this.currentForm).submit(),this.submitButton&&a("input:hidden[name='"+this.submitButton.name+"']",this.currentForm).remove(),this.formSubmitted=!1):!c&&0===this.pendingRequest&&this.formSubmitted&&(a(this.currentForm).triggerHandler("invalid-form",[this]),this.formSubmitted=!1)},previousValue:function(b,c){return c="string"==typeof c&&c||"remote",a.data(b,"previousValue")||a.data(b,"previousValue",{old:null,valid:!0,message:this.defaultMessage(b,{method:c})})},destroy:function(){this.resetForm(),a(this.currentForm).off(".validate").removeData("validator").find(".validate-equalTo-blur").off(".validate-equalTo").removeClass("validate-equalTo-blur").find(".validate-lessThan-blur").off(".validate-lessThan").removeClass("validate-lessThan-blur").find(".validate-lessThanEqual-blur").off(".validate-lessThanEqual").removeClass("validate-lessThanEqual-blur").find(".validate-greaterThanEqual-blur").off(".validate-greaterThanEqual").removeClass("validate-greaterThanEqual-blur").find(".validate-greaterThan-blur").off(".validate-greaterThan").removeClass("validate-greaterThan-blur")}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(b,c){b.constructor===String?this.classRuleSettings[b]=c:a.extend(this.classRuleSettings,b)},classRules:function(b){var c={},d=a(b).attr("class");return d&&a.each(d.split(" "),function(){this in a.validator.classRuleSettings&&a.extend(c,a.validator.classRuleSettings[this])}),c},normalizeAttributeRule:function(a,b,c,d){/min|max|step/.test(c)&&(null===b||/number|range|text/.test(b))&&(d=Number(d),isNaN(d)&&(d=void 0)),d||0===d?a[c]=d:b===c&&"range"!==b&&(a[c]=!0)},attributeRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)"required"===c?(d=b.getAttribute(c),""===d&&(d=!0),d=!!d):d=f.attr(c),this.normalizeAttributeRule(e,g,c,d);return e.maxlength&&/-1|2147483647|524288/.test(e.maxlength)&&delete e.maxlength,e},dataRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)d=f.data("rule"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase()),""===d&&(d=!0),this.normalizeAttributeRule(e,g,c,d);return e},staticRules:function(b){var c={},d=a.data(b.form,"validator");return d.settings.rules&&(c=a.validator.normalizeRule(d.settings.rules[b.name])||{}),c},normalizeRules:function(b,c){return a.each(b,function(d,e){if(e===!1)return void delete b[d];if(e.param||e.depends){var f=!0;switch(typeof e.depends){case"string":f=!!a(e.depends,c.form).length;break;case"function":f=e.depends.call(c,c)}f?b[d]=void 0===e.param||e.param:(a.data(c.form,"validator").resetElements(a(c)),delete b[d])}}),a.each(b,function(d,e){b[d]=a.isFunction(e)&&"normalizer"!==d?e(c):e}),a.each(["minlength","maxlength"],function(){b[this]&&(b[this]=Number(b[this]))}),a.each(["rangelength","range"],function(){var c;b[this]&&(a.isArray(b[this])?b[this]=[Number(b[this][0]),Number(b[this][1])]:"string"==typeof b[this]&&(c=b[this].replace(/[\[\]]/g,"").split(/[\s,]+/),b[this]=[Number(c[0]),Number(c[1])]))}),a.validator.autoCreateRanges&&(null!=b.min&&null!=b.max&&(b.range=[b.min,b.max],delete b.min,delete b.max),null!=b.minlength&&null!=b.maxlength&&(b.rangelength=[b.minlength,b.maxlength],delete b.minlength,delete b.maxlength)),b},normalizeRule:function(b){if("string"==typeof b){var c={};a.each(b.split(/\s/),function(){c[this]=!0}),b=c}return b},addMethod:function(b,c,d){a.validator.methods[b]=c,a.validator.messages[b]=void 0!==d?d:a.validator.messages[b],c.length<3&&a.validator.addClassRules(b,a.validator.normalizeRule(b))},methods:{required:function(b,c,d){if(!this.depend(d,c))return"dependency-mismatch";if("select"===c.nodeName.toLowerCase()){var e=a(c).val();return e&&e.length>0}return this.checkable(c)?this.getLength(b,c)>0:void 0!==b&&null!==b&&b.length>0},email:function(a,b){return this.optional(b)||/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(a)},url:function(a,b){return this.optional(b)||/^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[\/?#]\S*)?$/i.test(a)},date:function(){var a=!1;return function(b,c){return a||(a=!0,this.settings.debug&&window.console&&console.warn("The `date` method is deprecated and will be removed in version '2.0.0'.\nPlease don't use it, since it relies on the Date constructor, which\nbehaves very differently across browsers and locales. Use `dateISO`\ninstead or one of the locale specific methods in `localizations/`\nand `additional-methods.js`.")),this.optional(c)||!/Invalid|NaN/.test(new Date(b).toString())}}(),dateISO:function(a,b){return this.optional(b)||/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(a)},number:function(a,b){return this.optional(b)||/^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(a)},digits:function(a,b){return this.optional(b)||/^\d+$/.test(a)},minlength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e>=d},maxlength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e<=d},rangelength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e>=d[0]&&e<=d[1]},min:function(a,b,c){return this.optional(b)||a>=c},max:function(a,b,c){return this.optional(b)||a<=c},range:function(a,b,c){return this.optional(b)||a>=c[0]&&a<=c[1]},step:function(b,c,d){var e,f=a(c).attr("type"),g="Step attribute on input type "+f+" is not supported.",h=["text","number","range"],i=new RegExp("\\b"+f+"\\b"),j=f&&!i.test(h.join()),k=function(a){var b=(""+a).match(/(?:\.(\d+))?$/);return b&&b[1]?b[1].length:0},l=function(a){return Math.round(a*Math.pow(10,e))},m=!0;if(j)throw new Error(g);return e=k(d),(k(b)>e||l(b)%l(d)!==0)&&(m=!1),this.optional(c)||m},equalTo:function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.not(".validate-equalTo-blur").length&&e.addClass("validate-equalTo-blur").on("blur.validate-equalTo",function(){a(c).valid()}),b===e.val()},remote:function(b,c,d,e){if(this.optional(c))return"dependency-mismatch";e="string"==typeof e&&e||"remote";var f,g,h,i=this.previousValue(c,e);return this.settings.messages[c.name]||(this.settings.messages[c.name]={}),i.originalMessage=i.originalMessage||this.settings.messages[c.name][e],this.settings.messages[c.name][e]=i.message,d="string"==typeof d&&{url:d}||d,h=a.param(a.extend({data:b},d.data)),i.old===h?i.valid:(i.old=h,f=this,this.startRequest(c),g={},g[c.name]=b,a.ajax(a.extend(!0,{mode:"abort",port:"validate"+c.name,dataType:"json",data:g,context:f.currentForm,success:function(a){var d,g,h,j=a===!0||"true"===a;f.settings.messages[c.name][e]=i.originalMessage,j?(h=f.formSubmitted,f.resetInternals(),f.toHide=f.errorsFor(c),f.formSubmitted=h,f.successList.push(c),f.invalid[c.name]=!1,f.showErrors()):(d={},g=a||f.defaultMessage(c,{method:e,parameters:b}),d[c.name]=i.message=g,f.invalid[c.name]=!0,f.showErrors(d)),i.valid=j,f.stopRequest(c,j)}},d)),"pending")}}});var b,c={};return a.ajaxPrefilter?a.ajaxPrefilter(function(a,b,d){var e=a.port;"abort"===a.mode&&(c[e]&&c[e].abort(),c[e]=d)}):(b=a.ajax,a.ajax=function(d){var e=("mode"in d?d:a.ajaxSettings).mode,f=("port"in d?d:a.ajaxSettings).port;return"abort"===e?(c[f]&&c[f].abort(),c[f]=b.apply(this,arguments),c[f]):b.apply(this,arguments)}),a}); +/*! jQuery Validation Plugin - v1.19.1 - 6/15/2019 + * https://jqueryvalidation.org/ + * Copyright (c) 2019 Jörn Zaefferer; Licensed MIT */ + +!function(a){"function"==typeof define&&define.amd?define(["jquery","./jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return function(){function b(a){return a.replace(/<.[^<>]*?>/g," ").replace(/ | /gi," ").replace(/[.(),;:!?%#$'\"_+=\/\-“”’]*/g,"")}a.validator.addMethod("maxWords",function(a,c,d){return this.optional(c)||b(a).match(/\b\w+\b/g).length<=d},a.validator.format("Please enter {0} words or less.")),a.validator.addMethod("minWords",function(a,c,d){return this.optional(c)||b(a).match(/\b\w+\b/g).length>=d},a.validator.format("Please enter at least {0} words.")),a.validator.addMethod("rangeWords",function(a,c,d){var e=b(a),f=/\b\w+\b/g;return this.optional(c)||e.match(f).length>=d[0]&&e.match(f).length<=d[1]},a.validator.format("Please enter between {0} and {1} words."))}(),a.validator.addMethod("abaRoutingNumber",function(a){var b=0,c=a.split(""),d=c.length;if(9!==d)return!1;for(var e=0;e<d;e+=3)b+=3*parseInt(c[e],10)+7*parseInt(c[e+1],10)+parseInt(c[e+2],10);return 0!==b&&b%10===0},"Please enter a valid routing number."),a.validator.addMethod("accept",function(b,c,d){var e,f,g,h="string"==typeof d?d.replace(/\s/g,""):"image/*",i=this.optional(c);if(i)return i;if("file"===a(c).attr("type")&&(h=h.replace(/[\-\[\]\/\{\}\(\)\+\?\.\\\^\$\|]/g,"\\$&").replace(/,/g,"|").replace(/\/\*/g,"/.*"),c.files&&c.files.length))for(g=new RegExp(".?("+h+")$","i"),e=0;e<c.files.length;e++)if(f=c.files[e],!f.type.match(g))return!1;return!0},a.validator.format("Please enter a value with a valid mimetype.")),a.validator.addMethod("alphanumeric",function(a,b){return this.optional(b)||/^\w+$/i.test(a)},"Letters, numbers, and underscores only please"),a.validator.addMethod("bankaccountNL",function(a,b){if(this.optional(b))return!0;if(!/^[0-9]{9}|([0-9]{2} ){3}[0-9]{3}$/.test(a))return!1;var c,d,e,f=a.replace(/ /g,""),g=0,h=f.length;for(c=0;c<h;c++)d=h-c,e=f.substring(c,c+1),g+=d*e;return g%11===0},"Please specify a valid bank account number"),a.validator.addMethod("bankorgiroaccountNL",function(b,c){return this.optional(c)||a.validator.methods.bankaccountNL.call(this,b,c)||a.validator.methods.giroaccountNL.call(this,b,c)},"Please specify a valid bank or giro account number"),a.validator.addMethod("bic",function(a,b){return this.optional(b)||/^([A-Z]{6}[A-Z2-9][A-NP-Z1-9])(X{3}|[A-WY-Z0-9][A-Z0-9]{2})?$/.test(a.toUpperCase())},"Please specify a valid BIC code"),a.validator.addMethod("cifES",function(a,b){"use strict";function c(a){return a%2===0}if(this.optional(b))return!0;var d,e,f,g,h=new RegExp(/^([ABCDEFGHJKLMNPQRSUVW])(\d{7})([0-9A-J])$/gi),i=a.substring(0,1),j=a.substring(1,8),k=a.substring(8,9),l=0,m=0,n=0;if(9!==a.length||!h.test(a))return!1;for(d=0;d<j.length;d++)e=parseInt(j[d],10),c(d)?(e*=2,n+=e<10?e:e-9):m+=e;return l=m+n,f=(10-l.toString().substr(-1)).toString(),f=parseInt(f,10)>9?"0":f,g="JABCDEFGHI".substr(f,1).toString(),i.match(/[ABEH]/)?k===f:i.match(/[KPQS]/)?k===g:k===f||k===g},"Please specify a valid CIF number."),a.validator.addMethod("cnhBR",function(a){if(a=a.replace(/([~!@#$%^&*()_+=`{}\[\]\-|\\:;'<>,.\/? ])+/g,""),11!==a.length)return!1;var b,c,d,e,f,g,h=0,i=0;if(b=a.charAt(0),new Array(12).join(b)===a)return!1;for(e=0,f=9,g=0;e<9;++e,--f)h+=+(a.charAt(e)*f);for(c=h%11,c>=10&&(c=0,i=2),h=0,e=0,f=1,g=0;e<9;++e,++f)h+=+(a.charAt(e)*f);return d=h%11,d>=10?d=0:d-=i,String(c).concat(d)===a.substr(-2)},"Please specify a valid CNH number"),a.validator.addMethod("cnpjBR",function(a,b){"use strict";if(this.optional(b))return!0;if(a=a.replace(/[^\d]+/g,""),14!==a.length)return!1;if("00000000000000"===a||"11111111111111"===a||"22222222222222"===a||"33333333333333"===a||"44444444444444"===a||"55555555555555"===a||"66666666666666"===a||"77777777777777"===a||"88888888888888"===a||"99999999999999"===a)return!1;for(var c=a.length-2,d=a.substring(0,c),e=a.substring(c),f=0,g=c-7,h=c;h>=1;h--)f+=d.charAt(c-h)*g--,g<2&&(g=9);var i=f%11<2?0:11-f%11;if(i!==parseInt(e.charAt(0),10))return!1;c+=1,d=a.substring(0,c),f=0,g=c-7;for(var j=c;j>=1;j--)f+=d.charAt(c-j)*g--,g<2&&(g=9);return i=f%11<2?0:11-f%11,i===parseInt(e.charAt(1),10)},"Please specify a CNPJ value number"),a.validator.addMethod("cpfBR",function(a,b){"use strict";if(this.optional(b))return!0;if(a=a.replace(/([~!@#$%^&*()_+=`{}\[\]\-|\\:;'<>,.\/? ])+/g,""),11!==a.length)return!1;var c,d,e,f,g=0;if(c=parseInt(a.substring(9,10),10),d=parseInt(a.substring(10,11),10),e=function(a,b){var c=10*a%11;return 10!==c&&11!==c||(c=0),c===b},""===a||"00000000000"===a||"11111111111"===a||"22222222222"===a||"33333333333"===a||"44444444444"===a||"55555555555"===a||"66666666666"===a||"77777777777"===a||"88888888888"===a||"99999999999"===a)return!1;for(f=1;f<=9;f++)g+=parseInt(a.substring(f-1,f),10)*(11-f);if(e(g,c)){for(g=0,f=1;f<=10;f++)g+=parseInt(a.substring(f-1,f),10)*(12-f);return e(g,d)}return!1},"Please specify a valid CPF number"),a.validator.addMethod("creditcard",function(a,b){if(this.optional(b))return"dependency-mismatch";if(/[^0-9 \-]+/.test(a))return!1;var c,d,e=0,f=0,g=!1;if(a=a.replace(/\D/g,""),a.length<13||a.length>19)return!1;for(c=a.length-1;c>=0;c--)d=a.charAt(c),f=parseInt(d,10),g&&(f*=2)>9&&(f-=9),e+=f,g=!g;return e%10===0},"Please enter a valid credit card number."),a.validator.addMethod("creditcardtypes",function(a,b,c){if(/[^0-9\-]+/.test(a))return!1;a=a.replace(/\D/g,"");var d=0;return c.mastercard&&(d|=1),c.visa&&(d|=2),c.amex&&(d|=4),c.dinersclub&&(d|=8),c.enroute&&(d|=16),c.discover&&(d|=32),c.jcb&&(d|=64),c.unknown&&(d|=128),c.all&&(d=255),1&d&&(/^(5[12345])/.test(a)||/^(2[234567])/.test(a))?16===a.length:2&d&&/^(4)/.test(a)?16===a.length:4&d&&/^(3[47])/.test(a)?15===a.length:8&d&&/^(3(0[012345]|[68]))/.test(a)?14===a.length:16&d&&/^(2(014|149))/.test(a)?15===a.length:32&d&&/^(6011)/.test(a)?16===a.length:64&d&&/^(3)/.test(a)?16===a.length:64&d&&/^(2131|1800)/.test(a)?15===a.length:!!(128&d)},"Please enter a valid credit card number."),a.validator.addMethod("currency",function(a,b,c){var d,e="string"==typeof c,f=e?c:c[0],g=!!e||c[1];return f=f.replace(/,/g,""),f=g?f+"]":f+"]?",d="^["+f+"([1-9]{1}[0-9]{0,2}(\\,[0-9]{3})*(\\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\\.[0-9]{0,2})?|0(\\.[0-9]{0,2})?|(\\.[0-9]{1,2})?)$",d=new RegExp(d),this.optional(b)||d.test(a)},"Please specify a valid currency"),a.validator.addMethod("dateFA",function(a,b){return this.optional(b)||/^[1-4]\d{3}\/((0?[1-6]\/((3[0-1])|([1-2][0-9])|(0?[1-9])))|((1[0-2]|(0?[7-9]))\/(30|([1-2][0-9])|(0?[1-9]))))$/.test(a)},a.validator.messages.date),a.validator.addMethod("dateITA",function(a,b){var c,d,e,f,g,h=!1,i=/^\d{1,2}\/\d{1,2}\/\d{4}$/;return i.test(a)?(c=a.split("/"),d=parseInt(c[0],10),e=parseInt(c[1],10),f=parseInt(c[2],10),g=new Date(Date.UTC(f,e-1,d,12,0,0,0)),h=g.getUTCFullYear()===f&&g.getUTCMonth()===e-1&&g.getUTCDate()===d):h=!1,this.optional(b)||h},a.validator.messages.date),a.validator.addMethod("dateNL",function(a,b){return this.optional(b)||/^(0?[1-9]|[12]\d|3[01])[\.\/\-](0?[1-9]|1[012])[\.\/\-]([12]\d)?(\d\d)$/.test(a)},a.validator.messages.date),a.validator.addMethod("extension",function(a,b,c){return c="string"==typeof c?c.replace(/,/g,"|"):"png|jpe?g|gif",this.optional(b)||a.match(new RegExp("\\.("+c+")$","i"))},a.validator.format("Please enter a value with a valid extension.")),a.validator.addMethod("giroaccountNL",function(a,b){return this.optional(b)||/^[0-9]{1,7}$/.test(a)},"Please specify a valid giro account number"),a.validator.addMethod("greaterThan",function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.not(".validate-greaterThan-blur").length&&e.addClass("validate-greaterThan-blur").on("blur.validate-greaterThan",function(){a(c).valid()}),b>e.val()},"Please enter a greater value."),a.validator.addMethod("greaterThanEqual",function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.not(".validate-greaterThanEqual-blur").length&&e.addClass("validate-greaterThanEqual-blur").on("blur.validate-greaterThanEqual",function(){a(c).valid()}),b>=e.val()},"Please enter a greater value."),a.validator.addMethod("iban",function(a,b){if(this.optional(b))return!0;var c,d,e,f,g,h,i,j,k,l=a.replace(/ /g,"").toUpperCase(),m="",n=!0,o="",p="",q=5;if(l.length<q)return!1;if(c=l.substring(0,2),h={AL:"\\d{8}[\\dA-Z]{16}",AD:"\\d{8}[\\dA-Z]{12}",AT:"\\d{16}",AZ:"[\\dA-Z]{4}\\d{20}",BE:"\\d{12}",BH:"[A-Z]{4}[\\dA-Z]{14}",BA:"\\d{16}",BR:"\\d{23}[A-Z][\\dA-Z]",BG:"[A-Z]{4}\\d{6}[\\dA-Z]{8}",CR:"\\d{17}",HR:"\\d{17}",CY:"\\d{8}[\\dA-Z]{16}",CZ:"\\d{20}",DK:"\\d{14}",DO:"[A-Z]{4}\\d{20}",EE:"\\d{16}",FO:"\\d{14}",FI:"\\d{14}",FR:"\\d{10}[\\dA-Z]{11}\\d{2}",GE:"[\\dA-Z]{2}\\d{16}",DE:"\\d{18}",GI:"[A-Z]{4}[\\dA-Z]{15}",GR:"\\d{7}[\\dA-Z]{16}",GL:"\\d{14}",GT:"[\\dA-Z]{4}[\\dA-Z]{20}",HU:"\\d{24}",IS:"\\d{22}",IE:"[\\dA-Z]{4}\\d{14}",IL:"\\d{19}",IT:"[A-Z]\\d{10}[\\dA-Z]{12}",KZ:"\\d{3}[\\dA-Z]{13}",KW:"[A-Z]{4}[\\dA-Z]{22}",LV:"[A-Z]{4}[\\dA-Z]{13}",LB:"\\d{4}[\\dA-Z]{20}",LI:"\\d{5}[\\dA-Z]{12}",LT:"\\d{16}",LU:"\\d{3}[\\dA-Z]{13}",MK:"\\d{3}[\\dA-Z]{10}\\d{2}",MT:"[A-Z]{4}\\d{5}[\\dA-Z]{18}",MR:"\\d{23}",MU:"[A-Z]{4}\\d{19}[A-Z]{3}",MC:"\\d{10}[\\dA-Z]{11}\\d{2}",MD:"[\\dA-Z]{2}\\d{18}",ME:"\\d{18}",NL:"[A-Z]{4}\\d{10}",NO:"\\d{11}",PK:"[\\dA-Z]{4}\\d{16}",PS:"[\\dA-Z]{4}\\d{21}",PL:"\\d{24}",PT:"\\d{21}",RO:"[A-Z]{4}[\\dA-Z]{16}",SM:"[A-Z]\\d{10}[\\dA-Z]{12}",SA:"\\d{2}[\\dA-Z]{18}",RS:"\\d{18}",SK:"\\d{20}",SI:"\\d{15}",ES:"\\d{20}",SE:"\\d{20}",CH:"\\d{5}[\\dA-Z]{12}",TN:"\\d{20}",TR:"\\d{5}[\\dA-Z]{17}",AE:"\\d{3}\\d{16}",GB:"[A-Z]{4}\\d{14}",VG:"[\\dA-Z]{4}\\d{16}"},g=h[c],"undefined"!=typeof g&&(i=new RegExp("^[A-Z]{2}\\d{2}"+g+"$",""),!i.test(l)))return!1;for(d=l.substring(4,l.length)+l.substring(0,4),j=0;j<d.length;j++)e=d.charAt(j),"0"!==e&&(n=!1),n||(m+="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf(e));for(k=0;k<m.length;k++)f=m.charAt(k),p=""+o+f,o=p%97;return 1===o},"Please specify a valid IBAN"),a.validator.addMethod("integer",function(a,b){return this.optional(b)||/^-?\d+$/.test(a)},"A positive or negative non-decimal number please"),a.validator.addMethod("ipv4",function(a,b){return this.optional(b)||/^(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)$/i.test(a)},"Please enter a valid IP v4 address."),a.validator.addMethod("ipv6",function(a,b){return this.optional(b)||/^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/i.test(a)},"Please enter a valid IP v6 address."),a.validator.addMethod("lessThan",function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.not(".validate-lessThan-blur").length&&e.addClass("validate-lessThan-blur").on("blur.validate-lessThan",function(){a(c).valid()}),b<e.val()},"Please enter a lesser value."),a.validator.addMethod("lessThanEqual",function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.not(".validate-lessThanEqual-blur").length&&e.addClass("validate-lessThanEqual-blur").on("blur.validate-lessThanEqual",function(){a(c).valid()}),b<=e.val()},"Please enter a lesser value."),a.validator.addMethod("lettersonly",function(a,b){return this.optional(b)||/^[a-z]+$/i.test(a)},"Letters only please"),a.validator.addMethod("letterswithbasicpunc",function(a,b){return this.optional(b)||/^[a-z\-.,()'"\s]+$/i.test(a)},"Letters or punctuation only please"),a.validator.addMethod("maxfiles",function(b,c,d){return!!this.optional(c)||!("file"===a(c).attr("type")&&c.files&&c.files.length>d)},a.validator.format("Please select no more than {0} files.")),a.validator.addMethod("maxsize",function(b,c,d){if(this.optional(c))return!0;if("file"===a(c).attr("type")&&c.files&&c.files.length)for(var e=0;e<c.files.length;e++)if(c.files[e].size>d)return!1;return!0},a.validator.format("File size must not exceed {0} bytes each.")),a.validator.addMethod("maxsizetotal",function(b,c,d){if(this.optional(c))return!0;if("file"===a(c).attr("type")&&c.files&&c.files.length)for(var e=0,f=0;f<c.files.length;f++)if(e+=c.files[f].size,e>d)return!1;return!0},a.validator.format("Total size of all files must not exceed {0} bytes.")),a.validator.addMethod("mobileNL",function(a,b){return this.optional(b)||/^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)6((\s|\s?\-\s?)?[0-9]){8}$/.test(a)},"Please specify a valid mobile number"),a.validator.addMethod("mobileRU",function(a,b){var c=a.replace(/\(|\)|\s+|-/g,"");return this.optional(b)||c.length>9&&/^((\+7|7|8)+([0-9]){10})$/.test(c)},"Please specify a valid mobile number"),a.validator.addMethod("mobileUK",function(a,b){return a=a.replace(/\(|\)|\s+|-/g,""),this.optional(b)||a.length>9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?|0)7(?:[1345789]\d{2}|624)\s?\d{3}\s?\d{3})$/)},"Please specify a valid mobile number"),a.validator.addMethod("netmask",function(a,b){return this.optional(b)||/^(254|252|248|240|224|192|128)\.0\.0\.0|255\.(254|252|248|240|224|192|128|0)\.0\.0|255\.255\.(254|252|248|240|224|192|128|0)\.0|255\.255\.255\.(254|252|248|240|224|192|128|0)/i.test(a)},"Please enter a valid netmask."),a.validator.addMethod("nieES",function(a,b){"use strict";if(this.optional(b))return!0;var c,d=new RegExp(/^[MXYZ]{1}[0-9]{7,8}[TRWAGMYFPDXBNJZSQVHLCKET]{1}$/gi),e="TRWAGMYFPDXBNJZSQVHLCKET",f=a.substr(a.length-1).toUpperCase();return a=a.toString().toUpperCase(),!(a.length>10||a.length<9||!d.test(a))&&(a=a.replace(/^[X]/,"0").replace(/^[Y]/,"1").replace(/^[Z]/,"2"),c=9===a.length?a.substr(0,8):a.substr(0,9),e.charAt(parseInt(c,10)%23)===f)},"Please specify a valid NIE number."),a.validator.addMethod("nifES",function(a,b){"use strict";return!!this.optional(b)||(a=a.toUpperCase(),!!a.match("((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)")&&(/^[0-9]{8}[A-Z]{1}$/.test(a)?"TRWAGMYFPDXBNJZSQVHLCKE".charAt(a.substring(8,0)%23)===a.charAt(8):!!/^[KLM]{1}/.test(a)&&a[8]==="TRWAGMYFPDXBNJZSQVHLCKE".charAt(a.substring(8,1)%23)))},"Please specify a valid NIF number."),a.validator.addMethod("nipPL",function(a){"use strict";if(a=a.replace(/[^0-9]/g,""),10!==a.length)return!1;for(var b=[6,5,7,2,3,4,5,6,7],c=0,d=0;d<9;d++)c+=b[d]*a[d];var e=c%11,f=10===e?0:e;return f===parseInt(a[9],10)},"Please specify a valid NIP number."),a.validator.addMethod("nisBR",function(a){var b,c,d,e,f,g=0;if(a=a.replace(/([~!@#$%^&*()_+=`{}\[\]\-|\\:;'<>,.\/? ])+/g,""),11!==a.length)return!1;for(c=parseInt(a.substring(10,11),10),b=parseInt(a.substring(0,10),10),e=2;e<12;e++)f=e,10===e&&(f=2),11===e&&(f=3),g+=b%10*f,b=parseInt(b/10,10);return d=g%11,d=d>1?11-d:0,c===d},"Please specify a valid NIS/PIS number"),a.validator.addMethod("notEqualTo",function(b,c,d){return this.optional(c)||!a.validator.methods.equalTo.call(this,b,c,d)},"Please enter a different value, values must not be the same."),a.validator.addMethod("nowhitespace",function(a,b){return this.optional(b)||/^\S+$/i.test(a)},"No white space please"),a.validator.addMethod("pattern",function(a,b,c){return!!this.optional(b)||("string"==typeof c&&(c=new RegExp("^(?:"+c+")$")),c.test(a))},"Invalid format."),a.validator.addMethod("phoneNL",function(a,b){return this.optional(b)||/^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)[1-9]((\s|\s?\-\s?)?[0-9]){8}$/.test(a)},"Please specify a valid phone number."),a.validator.addMethod("phonePL",function(a,b){a=a.replace(/\s+/g,"");var c=/^(?:(?:(?:\+|00)?48)|(?:\(\+?48\)))?(?:1[2-8]|2[2-69]|3[2-49]|4[1-68]|5[0-9]|6[0-35-9]|[7-8][1-9]|9[145])\d{7}$/;return this.optional(b)||c.test(a)},"Please specify a valid phone number"),a.validator.addMethod("phonesUK",function(a,b){return a=a.replace(/\(|\)|\s+|-/g,""),this.optional(b)||a.length>9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?|0)(?:1\d{8,9}|[23]\d{9}|7(?:[1345789]\d{8}|624\d{6})))$/)},"Please specify a valid uk phone number"),a.validator.addMethod("phoneUK",function(a,b){return a=a.replace(/\(|\)|\s+|-/g,""),this.optional(b)||a.length>9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?)|(?:\(?0))(?:\d{2}\)?\s?\d{4}\s?\d{4}|\d{3}\)?\s?\d{3}\s?\d{3,4}|\d{4}\)?\s?(?:\d{5}|\d{3}\s?\d{3})|\d{5}\)?\s?\d{4,5})$/)},"Please specify a valid phone number"),a.validator.addMethod("phoneUS",function(a,b){return a=a.replace(/\s+/g,""),this.optional(b)||a.length>9&&a.match(/^(\+?1-?)?(\([2-9]([02-9]\d|1[02-9])\)|[2-9]([02-9]\d|1[02-9]))-?[2-9]\d{2}-?\d{4}$/)},"Please specify a valid phone number"),a.validator.addMethod("postalcodeBR",function(a,b){return this.optional(b)||/^\d{2}.\d{3}-\d{3}?$|^\d{5}-?\d{3}?$/.test(a)},"Informe um CEP válido."),a.validator.addMethod("postalCodeCA",function(a,b){return this.optional(b)||/^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ] *\d[ABCEGHJKLMNPRSTVWXYZ]\d$/i.test(a)},"Please specify a valid postal code"),a.validator.addMethod("postalcodeIT",function(a,b){return this.optional(b)||/^\d{5}$/.test(a)},"Please specify a valid postal code"),a.validator.addMethod("postalcodeNL",function(a,b){return this.optional(b)||/^[1-9][0-9]{3}\s?[a-zA-Z]{2}$/.test(a)},"Please specify a valid postal code"),a.validator.addMethod("postcodeUK",function(a,b){return this.optional(b)||/^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))\s?([0-9][ABD-HJLNP-UW-Z]{2})|(GIR)\s?(0AA))$/i.test(a)},"Please specify a valid UK postcode"),a.validator.addMethod("require_from_group",function(b,c,d){var e=a(d[1],c.form),f=e.eq(0),g=f.data("valid_req_grp")?f.data("valid_req_grp"):a.extend({},this),h=e.filter(function(){return g.elementValue(this)}).length>=d[0];return f.data("valid_req_grp",g),a(c).data("being_validated")||(e.data("being_validated",!0),e.each(function(){g.element(this)}),e.data("being_validated",!1)),h},a.validator.format("Please fill at least {0} of these fields.")),a.validator.addMethod("skip_or_fill_minimum",function(b,c,d){var e=a(d[1],c.form),f=e.eq(0),g=f.data("valid_skip")?f.data("valid_skip"):a.extend({},this),h=e.filter(function(){return g.elementValue(this)}).length,i=0===h||h>=d[0];return f.data("valid_skip",g),a(c).data("being_validated")||(e.data("being_validated",!0),e.each(function(){g.element(this)}),e.data("being_validated",!1)),i},a.validator.format("Please either skip these fields or fill at least {0} of them.")),a.validator.addMethod("stateUS",function(a,b,c){var d,e="undefined"==typeof c,f=!e&&"undefined"!=typeof c.caseSensitive&&c.caseSensitive,g=!e&&"undefined"!=typeof c.includeTerritories&&c.includeTerritories,h=!e&&"undefined"!=typeof c.includeMilitary&&c.includeMilitary;return d=g||h?g&&h?"^(A[AEKLPRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$":g?"^(A[KLRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$":"^(A[AEKLPRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$":"^(A[KLRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$",d=f?new RegExp(d):new RegExp(d,"i"),this.optional(b)||d.test(a)},"Please specify a valid state"),a.validator.addMethod("strippedminlength",function(b,c,d){return a(b).text().length>=d},a.validator.format("Please enter at least {0} characters")),a.validator.addMethod("time",function(a,b){return this.optional(b)||/^([01]\d|2[0-3]|[0-9])(:[0-5]\d){1,2}$/.test(a)},"Please enter a valid time, between 00:00 and 23:59"),a.validator.addMethod("time12h",function(a,b){return this.optional(b)||/^((0?[1-9]|1[012])(:[0-5]\d){1,2}(\ ?[AP]M))$/i.test(a)},"Please enter a valid time in 12-hour am/pm format"),a.validator.addMethod("url2",function(a,b){return this.optional(b)||/^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(a)},a.validator.messages.url),a.validator.addMethod("vinUS",function(a){if(17!==a.length)return!1;var b,c,d,e,f,g,h=["A","B","C","D","E","F","G","H","J","K","L","M","N","P","R","S","T","U","V","W","X","Y","Z"],i=[1,2,3,4,5,6,7,8,1,2,3,4,5,7,9,2,3,4,5,6,7,8,9],j=[8,7,6,5,4,3,2,10,0,9,8,7,6,5,4,3,2],k=0;for(b=0;b<17;b++){if(e=j[b],d=a.slice(b,b+1),8===b&&(g=d),isNaN(d)){for(c=0;c<h.length;c++)if(d.toUpperCase()===h[c]){d=i[c],d*=e,isNaN(g)&&8===c&&(g=h[c]);break}}else d*=e;k+=d}return f=k%11,10===f&&(f="X"),f===g},"The specified vehicle identification number (VIN) is invalid."),a.validator.addMethod("zipcodeUS",function(a,b){return this.optional(b)||/^\d{5}(-\d{4})?$/.test(a)},"The specified US ZIP Code is invalid"),a.validator.addMethod("ziprange",function(a,b){return this.optional(b)||/^90[2-5]\d\{2\}-\d{4}$/.test(a)},"Your ZIP-code must be in the range 902xx-xxxx to 905xx-xxxx"),a}); +/* +* Project: Bootstrap Notify = v3.1.3 +* Description: Turns standard Bootstrap alerts into "Growl-like" notifications. +* Author: Mouse0270 aka Robert McIntosh +* License: MIT License +* Website: https://github.com/mouse0270/bootstrap-growl +*/ + +(function (factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['jquery'], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS + factory(require('jquery')); + } else { + // Browser globals + factory(jQuery); + } +}(function ($) { + // Create the defaults once + var defaults = { + element: 'body', + position: null, + type: "info", + allow_dismiss: true, + newest_on_top: false, + showProgressbar: false, + placement: { + from: "top", + align: "right" + }, + offset: 20, + spacing: 10, + z_index: 1031, + delay: 1000, + timer: 1000, + url_target: '_blank', + mouse_over: null, + animate: { + enter: 'animated fadeInDown', + exit: 'animated fadeOutUp' + }, + onShow: null, + onShown: null, + onClose: null, + onClosed: null, + icon_type: 'class', + template: '<div data-notify="container" class="col-xs-4 col-sm-2 alert alert-{0}" role="alert"><button type="button" aria-hidden="true" class="close" data-notify="dismiss">×</button><span data-notify="icon"></span> <span data-notify="title">{1}</span> <span data-notify="message">{2}</span><div class="progress" data-notify="progressbar"><div class="progress-bar progress-bar-{0}" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%;"></div></div><a href="{3}" target="{4}" data-notify="url"></a></div>' + }; + + String.format = function() { + var str = arguments[0]; + for (var i = 1; i < arguments.length; i++) { + str = str.replace(RegExp("\\{" + (i - 1) + "\\}", "gm"), arguments[i]); + } + return str; + }; + + function Notify ( element, content, options ) { + // Setup Content of Notify + var content = { + content: { + message: typeof content == 'object' ? content.message : content, + title: content.title ? content.title : '', + icon: content.icon ? content.icon : '', + url: content.url ? content.url : '#', + target: content.target ? content.target : '-' + } + }; + + options = $.extend(true, {}, content, options); + this.settings = $.extend(true, {}, defaults, options); + this._defaults = defaults; + if (this.settings.content.target == "-") { + this.settings.content.target = this.settings.url_target; + } + this.animations = { + start: 'webkitAnimationStart oanimationstart MSAnimationStart animationstart', + end: 'webkitAnimationEnd oanimationend MSAnimationEnd animationend' + } + + if (typeof this.settings.offset == 'number') { + this.settings.offset = { + x: this.settings.offset, + y: this.settings.offset + }; + } + + this.init(); + }; + + $.extend(Notify.prototype, { + init: function () { + var self = this; + + this.buildNotify(); + if (this.settings.content.icon) { + this.setIcon(); + } + if (this.settings.content.url != "#") { + this.styleURL(); + } + this.placement(); + this.bind(); + + this.notify = { + $ele: this.$ele, + update: function(command, update) { + var commands = {}; + if (typeof command == "string") { + commands[command] = update; + }else{ + commands = command; + } + for (var command in commands) { + switch (command) { + case "type": + this.$ele.removeClass('alert-' + self.settings.type); + this.$ele.find('[data-notify="progressbar"] > .progress-bar').removeClass('progress-bar-' + self.settings.type); + self.settings.type = commands[command]; + this.$ele.addClass('alert-' + commands[command]).find('[data-notify="progressbar"] > .progress-bar').addClass('progress-bar-' + commands[command]); + break; + case "icon": + var $icon = this.$ele.find('[data-notify="icon"]'); + if (self.settings.icon_type.toLowerCase() == 'class') { + $icon.removeClass(self.settings.content.icon).addClass(commands[command]); + }else{ + if (!$icon.is('img')) { + $icon.find('img'); + } + $icon.attr('src', commands[command]); + } + break; + case "progress": + var newDelay = self.settings.delay - (self.settings.delay * (commands[command] / 100)); + this.$ele.data('notify-delay', newDelay); + this.$ele.find('[data-notify="progressbar"] > div').attr('aria-valuenow', commands[command]).css('width', commands[command] + '%'); + break; + case "url": + this.$ele.find('[data-notify="url"]').attr('href', commands[command]); + break; + case "target": + this.$ele.find('[data-notify="url"]').attr('target', commands[command]); + break; + default: + this.$ele.find('[data-notify="' + command +'"]').html(commands[command]); + }; + } + var posX = this.$ele.outerHeight() + parseInt(self.settings.spacing) + parseInt(self.settings.offset.y); + self.reposition(posX); + }, + close: function() { + self.close(); + } + }; + }, + buildNotify: function () { + var content = this.settings.content; + this.$ele = $(String.format(this.settings.template, this.settings.type, content.title, content.message, content.url, content.target)); + this.$ele.attr('data-notify-position', this.settings.placement.from + '-' + this.settings.placement.align); + if (!this.settings.allow_dismiss) { + this.$ele.find('[data-notify="dismiss"]').css('display', 'none'); + } + if ((this.settings.delay <= 0 && !this.settings.showProgressbar) || !this.settings.showProgressbar) { + this.$ele.find('[data-notify="progressbar"]').remove(); + } + }, + setIcon: function() { + if (this.settings.icon_type.toLowerCase() == 'class') { + this.$ele.find('[data-notify="icon"]').addClass(this.settings.content.icon); + }else{ + if (this.$ele.find('[data-notify="icon"]').is('img')) { + this.$ele.find('[data-notify="icon"]').attr('src', this.settings.content.icon); + }else{ + this.$ele.find('[data-notify="icon"]').append('<img src="'+this.settings.content.icon+'" alt="Notify Icon" />'); + } + } + }, + styleURL: function() { + this.$ele.find('[data-notify="url"]').css({ + backgroundImage: 'url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)', + height: '100%', + left: '0px', + position: 'absolute', + top: '0px', + width: '100%', + zIndex: this.settings.z_index + 1 + }); + this.$ele.find('[data-notify="dismiss"]').css({ + position: 'absolute', + right: '10px', + top: '5px', + zIndex: this.settings.z_index + 2 + }); + }, + placement: function() { + var self = this, + offsetAmt = this.settings.offset.y, + css = { + display: 'inline-block', + margin: '0px auto', + position: this.settings.position ? this.settings.position : (this.settings.element === 'body' ? 'fixed' : 'absolute'), + transition: 'all .5s ease-in-out', + zIndex: this.settings.z_index + }, + hasAnimation = false, + settings = this.settings; + + $('[data-notify-position="' + this.settings.placement.from + '-' + this.settings.placement.align + '"]:not([data-closing="true"])').each(function() { + return offsetAmt = Math.max(offsetAmt, parseInt($(this).css(settings.placement.from)) + parseInt($(this).outerHeight()) + parseInt(settings.spacing)); + }); + if (this.settings.newest_on_top == true) { + offsetAmt = this.settings.offset.y; + } + css[this.settings.placement.from] = offsetAmt+'px'; + + switch (this.settings.placement.align) { + case "left": + case "right": + css[this.settings.placement.align] = this.settings.offset.x+'px'; + break; + case "center": + css.left = 0; + css.right = 0; + break; + } + this.$ele.css(css).addClass(this.settings.animate.enter); + $.each(Array('webkit', 'moz', 'o', 'ms', ''), function(index, prefix) { + self.$ele[0].style[prefix+'AnimationIterationCount'] = 1; + }); + + $(this.settings.element).append(this.$ele); + + if (this.settings.newest_on_top == true) { + offsetAmt = (parseInt(offsetAmt)+parseInt(this.settings.spacing)) + this.$ele.outerHeight(); + this.reposition(offsetAmt); + } + + if ($.isFunction(self.settings.onShow)) { + self.settings.onShow.call(this.$ele); + } + + this.$ele.one(this.animations.start, function(event) { + hasAnimation = true; + }).one(this.animations.end, function(event) { + if ($.isFunction(self.settings.onShown)) { + self.settings.onShown.call(this); + } + }); + + setTimeout(function() { + if (!hasAnimation) { + if ($.isFunction(self.settings.onShown)) { + self.settings.onShown.call(this); + } + } + }, 600); + }, + bind: function() { + var self = this; + + this.$ele.find('[data-notify="dismiss"]').on('click', function() { + self.close(); + }) + + this.$ele.mouseover(function(e) { + $(this).data('data-hover', "true"); + }).mouseout(function(e) { + $(this).data('data-hover', "false"); + }); + this.$ele.data('data-hover', "false"); + + if (this.settings.delay > 0) { + self.$ele.data('notify-delay', self.settings.delay); + var timer = setInterval(function() { + var delay = parseInt(self.$ele.data('notify-delay')) - self.settings.timer; + if ((self.$ele.data('data-hover') === 'false' && self.settings.mouse_over == "pause") || self.settings.mouse_over != "pause") { + var percent = ((self.settings.delay - delay) / self.settings.delay) * 100; + self.$ele.data('notify-delay', delay); + self.$ele.find('[data-notify="progressbar"] > div').attr('aria-valuenow', percent).css('width', percent + '%'); + } + if (delay <= -(self.settings.timer)) { + clearInterval(timer); + self.close(); + } + }, self.settings.timer); + } + }, + close: function() { + var self = this, + $successors = null, + posX = parseInt(this.$ele.css(this.settings.placement.from)), + hasAnimation = false; + + this.$ele.data('closing', 'true').addClass(this.settings.animate.exit); + self.reposition(posX); + + if ($.isFunction(self.settings.onClose)) { + self.settings.onClose.call(this.$ele); + } + + this.$ele.one(this.animations.start, function(event) { + hasAnimation = true; + }).one(this.animations.end, function(event) { + $(this).remove(); + if ($.isFunction(self.settings.onClosed)) { + self.settings.onClosed.call(this); + } + }); + + setTimeout(function() { + if (!hasAnimation) { + self.$ele.remove(); + if (self.settings.onClosed) { + self.settings.onClosed(self.$ele); + } + } + }, 600); + }, + reposition: function(posX) { + var self = this, + notifies = '[data-notify-position="' + this.settings.placement.from + '-' + this.settings.placement.align + '"]:not([data-closing="true"])', + $elements = this.$ele.nextAll(notifies); + if (this.settings.newest_on_top == true) { + $elements = this.$ele.prevAll(notifies); + } + $elements.each(function() { + $(this).css(self.settings.placement.from, posX); + posX = (parseInt(posX)+parseInt(self.settings.spacing)) + $(this).outerHeight(); + }); + } + }); + + $.notify = function ( content, options ) { + var plugin = new Notify( this, content, options ); + return plugin.notify; + }; + $.notifyDefaults = function( options ) { + defaults = $.extend(true, {}, defaults, options); + return defaults; + }; + $.notifyClose = function( command ) { + if (typeof command === "undefined" || command == "all") { + $('[data-notify]').find('[data-notify="dismiss"]').trigger('click'); + }else{ + $('[data-notify-position="'+command+'"]').find('[data-notify="dismiss"]').trigger('click'); + } + }; + +})); +/*! jquery.cookie v1.4.1 | MIT */ + +!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof exports?a(require("jquery")):a(jQuery)}(function(a){function b(a){return h.raw?a:encodeURIComponent(a)}function c(a){return h.raw?a:decodeURIComponent(a)}function d(a){return b(h.json?JSON.stringify(a):String(a))}function e(a){0===a.indexOf('"')&&(a=a.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\"));try{return a=decodeURIComponent(a.replace(g," ")),h.json?JSON.parse(a):a}catch(b){}}function f(b,c){var d=h.raw?b:e(b);return a.isFunction(c)?c(d):d}var g=/\+/g,h=a.cookie=function(e,g,i){if(void 0!==g&&!a.isFunction(g)){if(i=a.extend({},h.defaults,i),"number"==typeof i.expires){var j=i.expires,k=i.expires=new Date;k.setTime(+k+864e5*j)}return document.cookie=[b(e),"=",d(g),i.expires?"; expires="+i.expires.toUTCString():"",i.path?"; path="+i.path:"",i.domain?"; domain="+i.domain:"",i.secure?"; secure":""].join("")}for(var l=e?void 0:{},m=document.cookie?document.cookie.split("; "):[],n=0,o=m.length;o>n;n++){var p=m[n].split("="),q=c(p.shift()),r=p.join("=");if(e&&e===q){l=f(r,g);break}e||void 0===(r=f(r))||(l[q]=r)}return l};h.defaults={},a.removeCookie=function(b,c){return void 0===a.cookie(b)?!1:(a.cookie(b,"",a.extend({},c,{expires:-1})),!a.cookie(b))}}); +/*! + * Select2 4.0.8 + * https://select2.github.io + * + * Released under the MIT license + * https://github.com/select2/select2/blob/master/LICENSE.md + */ + +;(function (factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['jquery'], factory); + } else if (typeof module === 'object' && module.exports) { + // Node/CommonJS + module.exports = function (root, jQuery) { + if (jQuery === undefined) { + // require('jQuery') returns a factory that requires window to + // build a jQuery instance, we normalize how we use modules + // that require this pattern but the window provided is a noop + // if it's defined (how jquery works) + if (typeof window !== 'undefined') { + jQuery = require('jquery'); + } + else { + jQuery = require('jquery')(root); + } + } + factory(jQuery); + return jQuery; + }; + } else { + // Browser globals + factory(jQuery); + } +} (function (jQuery) { + // This is needed so we can catch the AMD loader configuration and use it + // The inner file should be wrapped (by `banner.start.js`) in a function that + // returns the AMD loader references. + var S2 =(function () { + // Restore the Select2 AMD loader so it can be used + // Needed mostly in the language files, where the loader is not inserted + if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) { + var S2 = jQuery.fn.select2.amd; + } +var S2;(function () { if (!S2 || !S2.requirejs) { +if (!S2) { S2 = {}; } else { require = S2; } +/** + * @license almond 0.3.3 Copyright jQuery Foundation and other contributors. + * Released under MIT license, http://github.com/requirejs/almond/LICENSE + */ +//Going sloppy to avoid 'use strict' string cost, but strict practices should +//be followed. +/*global setTimeout: false */ + +var requirejs, require, define; +(function (undef) { + var main, req, makeMap, handlers, + defined = {}, + waiting = {}, + config = {}, + defining = {}, + hasOwn = Object.prototype.hasOwnProperty, + aps = [].slice, + jsSuffixRegExp = /\.js$/; + + function hasProp(obj, prop) { + return hasOwn.call(obj, prop); + } + + /** + * Given a relative module name, like ./something, normalize it to + * a real name that can be mapped to a path. + * @param {String} name the relative name + * @param {String} baseName a real name that the name arg is relative + * to. + * @returns {String} normalized name + */ + function normalize(name, baseName) { + var nameParts, nameSegment, mapValue, foundMap, lastIndex, + foundI, foundStarMap, starI, i, j, part, normalizedBaseParts, + baseParts = baseName && baseName.split("/"), + map = config.map, + starMap = (map && map['*']) || {}; + + //Adjust any relative paths. + if (name) { + name = name.split('/'); + lastIndex = name.length - 1; + + // If wanting node ID compatibility, strip .js from end + // of IDs. Have to do this here, and not in nameToUrl + // because node allows either .js or non .js to map + // to same file. + if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) { + name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, ''); + } + + // Starts with a '.' so need the baseName + if (name[0].charAt(0) === '.' && baseParts) { + //Convert baseName to array, and lop off the last part, + //so that . matches that 'directory' and not name of the baseName's + //module. For instance, baseName of 'one/two/three', maps to + //'one/two/three.js', but we want the directory, 'one/two' for + //this normalization. + normalizedBaseParts = baseParts.slice(0, baseParts.length - 1); + name = normalizedBaseParts.concat(name); + } + + //start trimDots + for (i = 0; i < name.length; i++) { + part = name[i]; + if (part === '.') { + name.splice(i, 1); + i -= 1; + } else if (part === '..') { + // If at the start, or previous value is still .., + // keep them so that when converted to a path it may + // still work when converted to a path, even though + // as an ID it is less than ideal. In larger point + // releases, may be better to just kick out an error. + if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') { + continue; + } else if (i > 0) { + name.splice(i - 1, 2); + i -= 2; + } + } + } + //end trimDots + + name = name.join('/'); + } + + //Apply map config if available. + if ((baseParts || starMap) && map) { + nameParts = name.split('/'); + + for (i = nameParts.length; i > 0; i -= 1) { + nameSegment = nameParts.slice(0, i).join("/"); + + if (baseParts) { + //Find the longest baseName segment match in the config. + //So, do joins on the biggest to smallest lengths of baseParts. + for (j = baseParts.length; j > 0; j -= 1) { + mapValue = map[baseParts.slice(0, j).join('/')]; + + //baseName segment has config, find if it has one for + //this name. + if (mapValue) { + mapValue = mapValue[nameSegment]; + if (mapValue) { + //Match, update name to the new value. + foundMap = mapValue; + foundI = i; + break; + } + } + } + } + + if (foundMap) { + break; + } + + //Check for a star map match, but just hold on to it, + //if there is a shorter segment match later in a matching + //config, then favor over this star map. + if (!foundStarMap && starMap && starMap[nameSegment]) { + foundStarMap = starMap[nameSegment]; + starI = i; + } + } + + if (!foundMap && foundStarMap) { + foundMap = foundStarMap; + foundI = starI; + } + + if (foundMap) { + nameParts.splice(0, foundI, foundMap); + name = nameParts.join('/'); + } + } + + return name; + } + + function makeRequire(relName, forceSync) { + return function () { + //A version of a require function that passes a moduleName + //value for items that may need to + //look up paths relative to the moduleName + var args = aps.call(arguments, 0); + + //If first arg is not require('string'), and there is only + //one arg, it is the array form without a callback. Insert + //a null so that the following concat is correct. + if (typeof args[0] !== 'string' && args.length === 1) { + args.push(null); + } + return req.apply(undef, args.concat([relName, forceSync])); + }; + } + + function makeNormalize(relName) { + return function (name) { + return normalize(name, relName); + }; + } + + function makeLoad(depName) { + return function (value) { + defined[depName] = value; + }; + } + + function callDep(name) { + if (hasProp(waiting, name)) { + var args = waiting[name]; + delete waiting[name]; + defining[name] = true; + main.apply(undef, args); + } + + if (!hasProp(defined, name) && !hasProp(defining, name)) { + throw new Error('No ' + name); + } + return defined[name]; + } + + //Turns a plugin!resource to [plugin, resource] + //with the plugin being undefined if the name + //did not have a plugin prefix. + function splitPrefix(name) { + var prefix, + index = name ? name.indexOf('!') : -1; + if (index > -1) { + prefix = name.substring(0, index); + name = name.substring(index + 1, name.length); + } + return [prefix, name]; + } + + //Creates a parts array for a relName where first part is plugin ID, + //second part is resource ID. Assumes relName has already been normalized. + function makeRelParts(relName) { + return relName ? splitPrefix(relName) : []; + } + + /** + * Makes a name map, normalizing the name, and using a plugin + * for normalization if necessary. Grabs a ref to plugin + * too, as an optimization. + */ + makeMap = function (name, relParts) { + var plugin, + parts = splitPrefix(name), + prefix = parts[0], + relResourceName = relParts[1]; + + name = parts[1]; + + if (prefix) { + prefix = normalize(prefix, relResourceName); + plugin = callDep(prefix); + } + + //Normalize according + if (prefix) { + if (plugin && plugin.normalize) { + name = plugin.normalize(name, makeNormalize(relResourceName)); + } else { + name = normalize(name, relResourceName); + } + } else { + name = normalize(name, relResourceName); + parts = splitPrefix(name); + prefix = parts[0]; + name = parts[1]; + if (prefix) { + plugin = callDep(prefix); + } + } + + //Using ridiculous property names for space reasons + return { + f: prefix ? prefix + '!' + name : name, //fullName + n: name, + pr: prefix, + p: plugin + }; + }; + + function makeConfig(name) { + return function () { + return (config && config.config && config.config[name]) || {}; + }; + } + + handlers = { + require: function (name) { + return makeRequire(name); + }, + exports: function (name) { + var e = defined[name]; + if (typeof e !== 'undefined') { + return e; + } else { + return (defined[name] = {}); + } + }, + module: function (name) { + return { + id: name, + uri: '', + exports: defined[name], + config: makeConfig(name) + }; + } + }; + + main = function (name, deps, callback, relName) { + var cjsModule, depName, ret, map, i, relParts, + args = [], + callbackType = typeof callback, + usingExports; + + //Use name if no relName + relName = relName || name; + relParts = makeRelParts(relName); + + //Call the callback to define the module, if necessary. + if (callbackType === 'undefined' || callbackType === 'function') { + //Pull out the defined dependencies and pass the ordered + //values to the callback. + //Default to [require, exports, module] if no deps + deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps; + for (i = 0; i < deps.length; i += 1) { + map = makeMap(deps[i], relParts); + depName = map.f; + + //Fast path CommonJS standard dependencies. + if (depName === "require") { + args[i] = handlers.require(name); + } else if (depName === "exports") { + //CommonJS module spec 1.1 + args[i] = handlers.exports(name); + usingExports = true; + } else if (depName === "module") { + //CommonJS module spec 1.1 + cjsModule = args[i] = handlers.module(name); + } else if (hasProp(defined, depName) || + hasProp(waiting, depName) || + hasProp(defining, depName)) { + args[i] = callDep(depName); + } else if (map.p) { + map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {}); + args[i] = defined[depName]; + } else { + throw new Error(name + ' missing ' + depName); + } + } + + ret = callback ? callback.apply(defined[name], args) : undefined; + + if (name) { + //If setting exports via "module" is in play, + //favor that over return value and exports. After that, + //favor a non-undefined return value over exports use. + if (cjsModule && cjsModule.exports !== undef && + cjsModule.exports !== defined[name]) { + defined[name] = cjsModule.exports; + } else if (ret !== undef || !usingExports) { + //Use the return value from the function. + defined[name] = ret; + } + } + } else if (name) { + //May just be an object definition for the module. Only + //worry about defining if have a module name. + defined[name] = callback; + } + }; + + requirejs = require = req = function (deps, callback, relName, forceSync, alt) { + if (typeof deps === "string") { + if (handlers[deps]) { + //callback in this case is really relName + return handlers[deps](callback); + } + //Just return the module wanted. In this scenario, the + //deps arg is the module name, and second arg (if passed) + //is just the relName. + //Normalize module name, if it contains . or .. + return callDep(makeMap(deps, makeRelParts(callback)).f); + } else if (!deps.splice) { + //deps is a config object, not an array. + config = deps; + if (config.deps) { + req(config.deps, config.callback); + } + if (!callback) { + return; + } + + if (callback.splice) { + //callback is an array, which means it is a dependency list. + //Adjust args if there are dependencies + deps = callback; + callback = relName; + relName = null; + } else { + deps = undef; + } + } + + //Support require(['a']) + callback = callback || function () {}; + + //If relName is a function, it is an errback handler, + //so remove it. + if (typeof relName === 'function') { + relName = forceSync; + forceSync = alt; + } + + //Simulate async callback; + if (forceSync) { + main(undef, deps, callback, relName); + } else { + //Using a non-zero value because of concern for what old browsers + //do, and latest browsers "upgrade" to 4 if lower value is used: + //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout: + //If want a value immediately, use require('id') instead -- something + //that works in almond on the global level, but not guaranteed and + //unlikely to work in other AMD implementations. + setTimeout(function () { + main(undef, deps, callback, relName); + }, 4); + } + + return req; + }; + + /** + * Just drops the config on the floor, but returns req in case + * the config return value is used. + */ + req.config = function (cfg) { + return req(cfg); + }; + + /** + * Expose module registry for debugging and tooling + */ + requirejs._defined = defined; + + define = function (name, deps, callback) { + if (typeof name !== 'string') { + throw new Error('See almond README: incorrect module build, no module name'); + } + + //This module may not have dependencies + if (!deps.splice) { + //deps is not an array, so probably means + //an object literal or factory function for + //the value. Adjust args. + callback = deps; + deps = []; + } + + if (!hasProp(defined, name) && !hasProp(waiting, name)) { + waiting[name] = [name, deps, callback]; + } + }; + + define.amd = { + jQuery: true + }; +}()); + +S2.requirejs = requirejs;S2.require = require;S2.define = define; +} +}()); +S2.define("almond", function(){}); + +/* global jQuery:false, $:false */ +S2.define('jquery',[],function () { + var _$ = jQuery || $; + + if (_$ == null && console && console.error) { + console.error( + 'Select2: An instance of jQuery or a jQuery-compatible library was not ' + + 'found. Make sure that you are including jQuery before Select2 on your ' + + 'web page.' + ); + } + + return _$; +}); + +S2.define('select2/utils',[ + 'jquery' +], function ($) { + var Utils = {}; + + Utils.Extend = function (ChildClass, SuperClass) { + var __hasProp = {}.hasOwnProperty; + + function BaseConstructor () { + this.constructor = ChildClass; + } + + for (var key in SuperClass) { + if (__hasProp.call(SuperClass, key)) { + ChildClass[key] = SuperClass[key]; + } + } + + BaseConstructor.prototype = SuperClass.prototype; + ChildClass.prototype = new BaseConstructor(); + ChildClass.__super__ = SuperClass.prototype; + + return ChildClass; + }; + + function getMethods (theClass) { + var proto = theClass.prototype; + + var methods = []; + + for (var methodName in proto) { + var m = proto[methodName]; + + if (typeof m !== 'function') { + continue; + } + + if (methodName === 'constructor') { + continue; + } + + methods.push(methodName); + } + + return methods; + } + + Utils.Decorate = function (SuperClass, DecoratorClass) { + var decoratedMethods = getMethods(DecoratorClass); + var superMethods = getMethods(SuperClass); + + function DecoratedClass () { + var unshift = Array.prototype.unshift; + + var argCount = DecoratorClass.prototype.constructor.length; + + var calledConstructor = SuperClass.prototype.constructor; + + if (argCount > 0) { + unshift.call(arguments, SuperClass.prototype.constructor); + + calledConstructor = DecoratorClass.prototype.constructor; + } + + calledConstructor.apply(this, arguments); + } + + DecoratorClass.displayName = SuperClass.displayName; + + function ctr () { + this.constructor = DecoratedClass; + } + + DecoratedClass.prototype = new ctr(); + + for (var m = 0; m < superMethods.length; m++) { + var superMethod = superMethods[m]; + + DecoratedClass.prototype[superMethod] = + SuperClass.prototype[superMethod]; + } + + var calledMethod = function (methodName) { + // Stub out the original method if it's not decorating an actual method + var originalMethod = function () {}; + + if (methodName in DecoratedClass.prototype) { + originalMethod = DecoratedClass.prototype[methodName]; + } + + var decoratedMethod = DecoratorClass.prototype[methodName]; + + return function () { + var unshift = Array.prototype.unshift; + + unshift.call(arguments, originalMethod); + + return decoratedMethod.apply(this, arguments); + }; + }; + + for (var d = 0; d < decoratedMethods.length; d++) { + var decoratedMethod = decoratedMethods[d]; + + DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod); + } + + return DecoratedClass; + }; + + var Observable = function () { + this.listeners = {}; + }; + + Observable.prototype.on = function (event, callback) { + this.listeners = this.listeners || {}; + + if (event in this.listeners) { + this.listeners[event].push(callback); + } else { + this.listeners[event] = [callback]; + } + }; + + Observable.prototype.trigger = function (event) { + var slice = Array.prototype.slice; + var params = slice.call(arguments, 1); + + this.listeners = this.listeners || {}; + + // Params should always come in as an array + if (params == null) { + params = []; + } + + // If there are no arguments to the event, use a temporary object + if (params.length === 0) { + params.push({}); + } + + // Set the `_type` of the first object to the event + params[0]._type = event; + + if (event in this.listeners) { + this.invoke(this.listeners[event], slice.call(arguments, 1)); + } + + if ('*' in this.listeners) { + this.invoke(this.listeners['*'], arguments); + } + }; + + Observable.prototype.invoke = function (listeners, params) { + for (var i = 0, len = listeners.length; i < len; i++) { + listeners[i].apply(this, params); + } + }; + + Utils.Observable = Observable; + + Utils.generateChars = function (length) { + var chars = ''; + + for (var i = 0; i < length; i++) { + var randomChar = Math.floor(Math.random() * 36); + chars += randomChar.toString(36); + } + + return chars; + }; + + Utils.bind = function (func, context) { + return function () { + func.apply(context, arguments); + }; + }; + + Utils._convertData = function (data) { + for (var originalKey in data) { + var keys = originalKey.split('-'); + + var dataLevel = data; + + if (keys.length === 1) { + continue; + } + + for (var k = 0; k < keys.length; k++) { + var key = keys[k]; + + // Lowercase the first letter + // By default, dash-separated becomes camelCase + key = key.substring(0, 1).toLowerCase() + key.substring(1); + + if (!(key in dataLevel)) { + dataLevel[key] = {}; + } + + if (k == keys.length - 1) { + dataLevel[key] = data[originalKey]; + } + + dataLevel = dataLevel[key]; + } + + delete data[originalKey]; + } + + return data; + }; + + Utils.hasScroll = function (index, el) { + // Adapted from the function created by @ShadowScripter + // and adapted by @BillBarry on the Stack Exchange Code Review website. + // The original code can be found at + // http://codereview.stackexchange.com/q/13338 + // and was designed to be used with the Sizzle selector engine. + + var $el = $(el); + var overflowX = el.style.overflowX; + var overflowY = el.style.overflowY; + + //Check both x and y declarations + if (overflowX === overflowY && + (overflowY === 'hidden' || overflowY === 'visible')) { + return false; + } + + if (overflowX === 'scroll' || overflowY === 'scroll') { + return true; + } + + return ($el.innerHeight() < el.scrollHeight || + $el.innerWidth() < el.scrollWidth); + }; + + Utils.escapeMarkup = function (markup) { + var replaceMap = { + '\\': '\', + '&': '&', + '<': '<', + '>': '>', + '"': '"', + '\'': ''', + '/': '/' + }; + + // Do not try to escape the markup if it's not a string + if (typeof markup !== 'string') { + return markup; + } + + return String(markup).replace(/[&<>"'\/\\]/g, function (match) { + return replaceMap[match]; + }); + }; + + // Append an array of jQuery nodes to a given element. + Utils.appendMany = function ($element, $nodes) { + // jQuery 1.7.x does not support $.fn.append() with an array + // Fall back to a jQuery object collection using $.fn.add() + if ($.fn.jquery.substr(0, 3) === '1.7') { + var $jqNodes = $(); + + $.map($nodes, function (node) { + $jqNodes = $jqNodes.add(node); + }); + + $nodes = $jqNodes; + } + + $element.append($nodes); + }; + + // Cache objects in Utils.__cache instead of $.data (see #4346) + Utils.__cache = {}; + + var id = 0; + Utils.GetUniqueElementId = function (element) { + // Get a unique element Id. If element has no id, + // creates a new unique number, stores it in the id + // attribute and returns the new id. + // If an id already exists, it simply returns it. + + var select2Id = element.getAttribute('data-select2-id'); + if (select2Id == null) { + // If element has id, use it. + if (element.id) { + select2Id = element.id; + element.setAttribute('data-select2-id', select2Id); + } else { + element.setAttribute('data-select2-id', ++id); + select2Id = id.toString(); + } + } + return select2Id; + }; + + Utils.StoreData = function (element, name, value) { + // Stores an item in the cache for a specified element. + // name is the cache key. + var id = Utils.GetUniqueElementId(element); + if (!Utils.__cache[id]) { + Utils.__cache[id] = {}; + } + + Utils.__cache[id][name] = value; + }; + + Utils.GetData = function (element, name) { + // Retrieves a value from the cache by its key (name) + // name is optional. If no name specified, return + // all cache items for the specified element. + // and for a specified element. + var id = Utils.GetUniqueElementId(element); + if (name) { + if (Utils.__cache[id]) { + if (Utils.__cache[id][name] != null) { + return Utils.__cache[id][name]; + } + return $(element).data(name); // Fallback to HTML5 data attribs. + } + return $(element).data(name); // Fallback to HTML5 data attribs. + } else { + return Utils.__cache[id]; + } + }; + + Utils.RemoveData = function (element) { + // Removes all cached items for a specified element. + var id = Utils.GetUniqueElementId(element); + if (Utils.__cache[id] != null) { + delete Utils.__cache[id]; + } + }; + + return Utils; +}); + +S2.define('select2/results',[ + 'jquery', + './utils' +], function ($, Utils) { + function Results ($element, options, dataAdapter) { + this.$element = $element; + this.data = dataAdapter; + this.options = options; + + Results.__super__.constructor.call(this); + } + + Utils.Extend(Results, Utils.Observable); + + Results.prototype.render = function () { + var $results = $( + '<ul class="select2-results__options" role="tree"></ul>' + ); + + if (this.options.get('multiple')) { + $results.attr('aria-multiselectable', 'true'); + } + + this.$results = $results; + + return $results; + }; + + Results.prototype.clear = function () { + this.$results.empty(); + }; + + Results.prototype.displayMessage = function (params) { + var escapeMarkup = this.options.get('escapeMarkup'); + + this.clear(); + this.hideLoading(); + + var $message = $( + '<li role="treeitem" aria-live="assertive"' + + ' class="select2-results__option"></li>' + ); + + var message = this.options.get('translations').get(params.message); + + $message.append( + escapeMarkup( + message(params.args) + ) + ); + + $message[0].className += ' select2-results__message'; + + this.$results.append($message); + }; + + Results.prototype.hideMessages = function () { + this.$results.find('.select2-results__message').remove(); + }; + + Results.prototype.append = function (data) { + this.hideLoading(); + + var $options = []; + + if (data.results == null || data.results.length === 0) { + if (this.$results.children().length === 0) { + this.trigger('results:message', { + message: 'noResults' + }); + } + + return; + } + + data.results = this.sort(data.results); + + for (var d = 0; d < data.results.length; d++) { + var item = data.results[d]; + + var $option = this.option(item); + + $options.push($option); + } + + this.$results.append($options); + }; + + Results.prototype.position = function ($results, $dropdown) { + var $resultsContainer = $dropdown.find('.select2-results'); + $resultsContainer.append($results); + }; + + Results.prototype.sort = function (data) { + var sorter = this.options.get('sorter'); + + return sorter(data); + }; + + Results.prototype.highlightFirstItem = function () { + var $options = this.$results + .find('.select2-results__option[aria-selected]'); + + var $selected = $options.filter('[aria-selected=true]'); + + // Check if there are any selected options + if ($selected.length > 0) { + // If there are selected options, highlight the first + $selected.first().trigger('mouseenter'); + } else { + // If there are no selected options, highlight the first option + // in the dropdown + $options.first().trigger('mouseenter'); + } + + this.ensureHighlightVisible(); + }; + + Results.prototype.setClasses = function () { + var self = this; + + this.data.current(function (selected) { + var selectedIds = $.map(selected, function (s) { + return s.id.toString(); + }); + + var $options = self.$results + .find('.select2-results__option[aria-selected]'); + + $options.each(function () { + var $option = $(this); + + var item = Utils.GetData(this, 'data'); + + // id needs to be converted to a string when comparing + var id = '' + item.id; + + if ((item.element != null && item.element.selected) || + (item.element == null && $.inArray(id, selectedIds) > -1)) { + $option.attr('aria-selected', 'true'); + } else { + $option.attr('aria-selected', 'false'); + } + }); + + }); + }; + + Results.prototype.showLoading = function (params) { + this.hideLoading(); + + var loadingMore = this.options.get('translations').get('searching'); + + var loading = { + disabled: true, + loading: true, + text: loadingMore(params) + }; + var $loading = this.option(loading); + $loading.className += ' loading-results'; + + this.$results.prepend($loading); + }; + + Results.prototype.hideLoading = function () { + this.$results.find('.loading-results').remove(); + }; + + Results.prototype.option = function (data) { + var option = document.createElement('li'); + option.className = 'select2-results__option'; + + var attrs = { + 'role': 'treeitem', + 'aria-selected': 'false' + }; + + var matches = window.Element.prototype.matches || + window.Element.prototype.msMatchesSelector || + window.Element.prototype.webkitMatchesSelector; + + if ((data.element != null && matches.call(data.element, ':disabled')) || + (data.element == null && data.disabled)) { + delete attrs['aria-selected']; + attrs['aria-disabled'] = 'true'; + } + + if (data.id == null) { + delete attrs['aria-selected']; + } + + if (data._resultId != null) { + option.id = data._resultId; + } + + if (data.title) { + option.title = data.title; + } + + if (data.children) { + attrs.role = 'group'; + attrs['aria-label'] = data.text; + delete attrs['aria-selected']; + } + + for (var attr in attrs) { + var val = attrs[attr]; + + option.setAttribute(attr, val); + } + + if (data.children) { + var $option = $(option); + + var label = document.createElement('strong'); + label.className = 'select2-results__group'; + + var $label = $(label); + this.template(data, label); + + var $children = []; + + for (var c = 0; c < data.children.length; c++) { + var child = data.children[c]; + + var $child = this.option(child); + + $children.push($child); + } + + var $childrenContainer = $('<ul></ul>', { + 'class': 'select2-results__options select2-results__options--nested' + }); + + $childrenContainer.append($children); + + $option.append(label); + $option.append($childrenContainer); + } else { + this.template(data, option); + } + + Utils.StoreData(option, 'data', data); + + return option; + }; + + Results.prototype.bind = function (container, $container) { + var self = this; + + var id = container.id + '-results'; + + this.$results.attr('id', id); + + container.on('results:all', function (params) { + self.clear(); + self.append(params.data); + + if (container.isOpen()) { + self.setClasses(); + self.highlightFirstItem(); + } + }); + + container.on('results:append', function (params) { + self.append(params.data); + + if (container.isOpen()) { + self.setClasses(); + } + }); + + container.on('query', function (params) { + self.hideMessages(); + self.showLoading(params); + }); + + container.on('select', function () { + if (!container.isOpen()) { + return; + } + + self.setClasses(); + + if (self.options.get('scrollAfterSelect')) { + self.highlightFirstItem(); + } + }); + + container.on('unselect', function () { + if (!container.isOpen()) { + return; + } + + self.setClasses(); + + if (self.options.get('scrollAfterSelect')) { + self.highlightFirstItem(); + } + }); + + container.on('open', function () { + // When the dropdown is open, aria-expended="true" + self.$results.attr('aria-expanded', 'true'); + self.$results.attr('aria-hidden', 'false'); + + self.setClasses(); + self.ensureHighlightVisible(); + }); + + container.on('close', function () { + // When the dropdown is closed, aria-expended="false" + self.$results.attr('aria-expanded', 'false'); + self.$results.attr('aria-hidden', 'true'); + self.$results.removeAttr('aria-activedescendant'); + }); + + container.on('results:toggle', function () { + var $highlighted = self.getHighlightedResults(); + + if ($highlighted.length === 0) { + return; + } + + $highlighted.trigger('mouseup'); + }); + + container.on('results:select', function () { + var $highlighted = self.getHighlightedResults(); + + if ($highlighted.length === 0) { + return; + } + + var data = Utils.GetData($highlighted[0], 'data'); + + if ($highlighted.attr('aria-selected') == 'true') { + self.trigger('close', {}); + } else { + self.trigger('select', { + data: data + }); + } + }); + + container.on('results:previous', function () { + var $highlighted = self.getHighlightedResults(); + + var $options = self.$results.find('[aria-selected]'); + + var currentIndex = $options.index($highlighted); + + // If we are already at the top, don't move further + // If no options, currentIndex will be -1 + if (currentIndex <= 0) { + return; + } + + var nextIndex = currentIndex - 1; + + // If none are highlighted, highlight the first + if ($highlighted.length === 0) { + nextIndex = 0; + } + + var $next = $options.eq(nextIndex); + + $next.trigger('mouseenter'); + + var currentOffset = self.$results.offset().top; + var nextTop = $next.offset().top; + var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset); + + if (nextIndex === 0) { + self.$results.scrollTop(0); + } else if (nextTop - currentOffset < 0) { + self.$results.scrollTop(nextOffset); + } + }); + + container.on('results:next', function () { + var $highlighted = self.getHighlightedResults(); + + var $options = self.$results.find('[aria-selected]'); + + var currentIndex = $options.index($highlighted); + + var nextIndex = currentIndex + 1; + + // If we are at the last option, stay there + if (nextIndex >= $options.length) { + return; + } + + var $next = $options.eq(nextIndex); + + $next.trigger('mouseenter'); + + var currentOffset = self.$results.offset().top + + self.$results.outerHeight(false); + var nextBottom = $next.offset().top + $next.outerHeight(false); + var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset; + + if (nextIndex === 0) { + self.$results.scrollTop(0); + } else if (nextBottom > currentOffset) { + self.$results.scrollTop(nextOffset); + } + }); + + container.on('results:focus', function (params) { + params.element.addClass('select2-results__option--highlighted'); + }); + + container.on('results:message', function (params) { + self.displayMessage(params); + }); + + if ($.fn.mousewheel) { + this.$results.on('mousewheel', function (e) { + var top = self.$results.scrollTop(); + + var bottom = self.$results.get(0).scrollHeight - top + e.deltaY; + + var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0; + var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height(); + + if (isAtTop) { + self.$results.scrollTop(0); + + e.preventDefault(); + e.stopPropagation(); + } else if (isAtBottom) { + self.$results.scrollTop( + self.$results.get(0).scrollHeight - self.$results.height() + ); + + e.preventDefault(); + e.stopPropagation(); + } + }); + } + + this.$results.on('mouseup', '.select2-results__option[aria-selected]', + function (evt) { + var $this = $(this); + + var data = Utils.GetData(this, 'data'); + + if ($this.attr('aria-selected') === 'true') { + if (self.options.get('multiple')) { + self.trigger('unselect', { + originalEvent: evt, + data: data + }); + } else { + self.trigger('close', {}); + } + + return; + } + + self.trigger('select', { + originalEvent: evt, + data: data + }); + }); + + this.$results.on('mouseenter', '.select2-results__option[aria-selected]', + function (evt) { + var data = Utils.GetData(this, 'data'); + + self.getHighlightedResults() + .removeClass('select2-results__option--highlighted'); + + self.trigger('results:focus', { + data: data, + element: $(this) + }); + }); + }; + + Results.prototype.getHighlightedResults = function () { + var $highlighted = this.$results + .find('.select2-results__option--highlighted'); + + return $highlighted; + }; + + Results.prototype.destroy = function () { + this.$results.remove(); + }; + + Results.prototype.ensureHighlightVisible = function () { + var $highlighted = this.getHighlightedResults(); + + if ($highlighted.length === 0) { + return; + } + + var $options = this.$results.find('[aria-selected]'); + + var currentIndex = $options.index($highlighted); + + var currentOffset = this.$results.offset().top; + var nextTop = $highlighted.offset().top; + var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset); + + var offsetDelta = nextTop - currentOffset; + nextOffset -= $highlighted.outerHeight(false) * 2; + + if (currentIndex <= 2) { + this.$results.scrollTop(0); + } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) { + this.$results.scrollTop(nextOffset); + } + }; + + Results.prototype.template = function (result, container) { + var template = this.options.get('templateResult'); + var escapeMarkup = this.options.get('escapeMarkup'); + + var content = template(result, container); + + if (content == null) { + container.style.display = 'none'; + } else if (typeof content === 'string') { + container.innerHTML = escapeMarkup(content); + } else { + $(container).append(content); + } + }; + + return Results; +}); + +S2.define('select2/keys',[ + +], function () { + var KEYS = { + BACKSPACE: 8, + TAB: 9, + ENTER: 13, + SHIFT: 16, + CTRL: 17, + ALT: 18, + ESC: 27, + SPACE: 32, + PAGE_UP: 33, + PAGE_DOWN: 34, + END: 35, + HOME: 36, + LEFT: 37, + UP: 38, + RIGHT: 39, + DOWN: 40, + DELETE: 46 + }; + + return KEYS; +}); + +S2.define('select2/selection/base',[ + 'jquery', + '../utils', + '../keys' +], function ($, Utils, KEYS) { + function BaseSelection ($element, options) { + this.$element = $element; + this.options = options; + + BaseSelection.__super__.constructor.call(this); + } + + Utils.Extend(BaseSelection, Utils.Observable); + + BaseSelection.prototype.render = function () { + var $selection = $( + '<span class="select2-selection" role="combobox" ' + + ' aria-haspopup="true" aria-expanded="false">' + + '</span>' + ); + + this._tabindex = 0; + + if (Utils.GetData(this.$element[0], 'old-tabindex') != null) { + this._tabindex = Utils.GetData(this.$element[0], 'old-tabindex'); + } else if (this.$element.attr('tabindex') != null) { + this._tabindex = this.$element.attr('tabindex'); + } + + $selection.attr('title', this.$element.attr('title')); + $selection.attr('tabindex', this._tabindex); + + this.$selection = $selection; + + return $selection; + }; + + BaseSelection.prototype.bind = function (container, $container) { + var self = this; + + var id = container.id + '-container'; + var resultsId = container.id + '-results'; + + this.container = container; + + this.$selection.on('focus', function (evt) { + self.trigger('focus', evt); + }); + + this.$selection.on('blur', function (evt) { + self._handleBlur(evt); + }); + + this.$selection.on('keydown', function (evt) { + self.trigger('keypress', evt); + + if (evt.which === KEYS.SPACE) { + evt.preventDefault(); + } + }); + + container.on('results:focus', function (params) { + self.$selection.attr('aria-activedescendant', params.data._resultId); + }); + + container.on('selection:update', function (params) { + self.update(params.data); + }); + + container.on('open', function () { + // When the dropdown is open, aria-expanded="true" + self.$selection.attr('aria-expanded', 'true'); + self.$selection.attr('aria-owns', resultsId); + + self._attachCloseHandler(container); + }); + + container.on('close', function () { + // When the dropdown is closed, aria-expanded="false" + self.$selection.attr('aria-expanded', 'false'); + self.$selection.removeAttr('aria-activedescendant'); + self.$selection.removeAttr('aria-owns'); + + self.$selection.trigger('focus'); + + self._detachCloseHandler(container); + }); + + container.on('enable', function () { + self.$selection.attr('tabindex', self._tabindex); + }); + + container.on('disable', function () { + self.$selection.attr('tabindex', '-1'); + }); + }; + + BaseSelection.prototype._handleBlur = function (evt) { + var self = this; + + // This needs to be delayed as the active element is the body when the tab + // key is pressed, possibly along with others. + window.setTimeout(function () { + // Don't trigger `blur` if the focus is still in the selection + if ( + (document.activeElement == self.$selection[0]) || + ($.contains(self.$selection[0], document.activeElement)) + ) { + return; + } + + self.trigger('blur', evt); + }, 1); + }; + + BaseSelection.prototype._attachCloseHandler = function (container) { + var self = this; + + $(document.body).on('mousedown.select2.' + container.id, function (e) { + var $target = $(e.target); + + var $select = $target.closest('.select2'); + + var $all = $('.select2.select2-container--open'); + + $all.each(function () { + var $this = $(this); + + if (this == $select[0]) { + return; + } + + var $element = Utils.GetData(this, 'element'); + + $element.select2('close'); + }); + }); + }; + + BaseSelection.prototype._detachCloseHandler = function (container) { + $(document.body).off('mousedown.select2.' + container.id); + }; + + BaseSelection.prototype.position = function ($selection, $container) { + var $selectionContainer = $container.find('.selection'); + $selectionContainer.append($selection); + }; + + BaseSelection.prototype.destroy = function () { + this._detachCloseHandler(this.container); + }; + + BaseSelection.prototype.update = function (data) { + throw new Error('The `update` method must be defined in child classes.'); + }; + + return BaseSelection; +}); + +S2.define('select2/selection/single',[ + 'jquery', + './base', + '../utils', + '../keys' +], function ($, BaseSelection, Utils, KEYS) { + function SingleSelection () { + SingleSelection.__super__.constructor.apply(this, arguments); + } + + Utils.Extend(SingleSelection, BaseSelection); + + SingleSelection.prototype.render = function () { + var $selection = SingleSelection.__super__.render.call(this); + + $selection.addClass('select2-selection--single'); + + $selection.html( + '<span class="select2-selection__rendered"></span>' + + '<span class="select2-selection__arrow" role="presentation">' + + '<b role="presentation"></b>' + + '</span>' + ); + + return $selection; + }; + + SingleSelection.prototype.bind = function (container, $container) { + var self = this; + + SingleSelection.__super__.bind.apply(this, arguments); + + var id = container.id + '-container'; + + this.$selection.find('.select2-selection__rendered') + .attr('id', id) + .attr('role', 'textbox') + .attr('aria-readonly', 'true'); + this.$selection.attr('aria-labelledby', id); + + this.$selection.on('mousedown', function (evt) { + // Only respond to left clicks + if (evt.which !== 1) { + return; + } + + self.trigger('toggle', { + originalEvent: evt + }); + }); + + this.$selection.on('focus', function (evt) { + // User focuses on the container + }); + + this.$selection.on('blur', function (evt) { + // User exits the container + }); + + container.on('focus', function (evt) { + if (!container.isOpen()) { + self.$selection.trigger('focus'); + } + }); + }; + + SingleSelection.prototype.clear = function () { + var $rendered = this.$selection.find('.select2-selection__rendered'); + $rendered.empty(); + $rendered.removeAttr('title'); // clear tooltip on empty + }; + + SingleSelection.prototype.display = function (data, container) { + var template = this.options.get('templateSelection'); + var escapeMarkup = this.options.get('escapeMarkup'); + + return escapeMarkup(template(data, container)); + }; + + SingleSelection.prototype.selectionContainer = function () { + return $('<span></span>'); + }; + + SingleSelection.prototype.update = function (data) { + if (data.length === 0) { + this.clear(); + return; + } + + var selection = data[0]; + + var $rendered = this.$selection.find('.select2-selection__rendered'); + var formatted = this.display(selection, $rendered); + + $rendered.empty().append(formatted); + $rendered.attr('title', selection.title || selection.text); + }; + + return SingleSelection; +}); + +S2.define('select2/selection/multiple',[ + 'jquery', + './base', + '../utils' +], function ($, BaseSelection, Utils) { + function MultipleSelection ($element, options) { + MultipleSelection.__super__.constructor.apply(this, arguments); + } + + Utils.Extend(MultipleSelection, BaseSelection); + + MultipleSelection.prototype.render = function () { + var $selection = MultipleSelection.__super__.render.call(this); + + $selection.addClass('select2-selection--multiple'); + + $selection.html( + '<ul class="select2-selection__rendered"></ul>' + ); + + return $selection; + }; + + MultipleSelection.prototype.bind = function (container, $container) { + var self = this; + + MultipleSelection.__super__.bind.apply(this, arguments); + + this.$selection.on('click', function (evt) { + self.trigger('toggle', { + originalEvent: evt + }); + }); + + this.$selection.on( + 'click', + '.select2-selection__choice__remove', + function (evt) { + // Ignore the event if it is disabled + if (self.options.get('disabled')) { + return; + } + + var $remove = $(this); + var $selection = $remove.parent(); + + var data = Utils.GetData($selection[0], 'data'); + + self.trigger('unselect', { + originalEvent: evt, + data: data + }); + } + ); + }; + + MultipleSelection.prototype.clear = function () { + var $rendered = this.$selection.find('.select2-selection__rendered'); + $rendered.empty(); + $rendered.removeAttr('title'); + }; + + MultipleSelection.prototype.display = function (data, container) { + var template = this.options.get('templateSelection'); + var escapeMarkup = this.options.get('escapeMarkup'); + + return escapeMarkup(template(data, container)); + }; + + MultipleSelection.prototype.selectionContainer = function () { + var $container = $( + '<li class="select2-selection__choice">' + + '<span class="select2-selection__choice__remove" role="presentation">' + + '×' + + '</span>' + + '</li>' + ); + + return $container; + }; + + MultipleSelection.prototype.update = function (data) { + this.clear(); + + if (data.length === 0) { + return; + } + + var $selections = []; + + for (var d = 0; d < data.length; d++) { + var selection = data[d]; + + var $selection = this.selectionContainer(); + var formatted = this.display(selection, $selection); + + $selection.append(formatted); + $selection.attr('title', selection.title || selection.text); + + Utils.StoreData($selection[0], 'data', selection); + + $selections.push($selection); + } + + var $rendered = this.$selection.find('.select2-selection__rendered'); + + Utils.appendMany($rendered, $selections); + }; + + return MultipleSelection; +}); + +S2.define('select2/selection/placeholder',[ + '../utils' +], function (Utils) { + function Placeholder (decorated, $element, options) { + this.placeholder = this.normalizePlaceholder(options.get('placeholder')); + + decorated.call(this, $element, options); + } + + Placeholder.prototype.normalizePlaceholder = function (_, placeholder) { + if (typeof placeholder === 'string') { + placeholder = { + id: '', + text: placeholder + }; + } + + return placeholder; + }; + + Placeholder.prototype.createPlaceholder = function (decorated, placeholder) { + var $placeholder = this.selectionContainer(); + + $placeholder.html(this.display(placeholder)); + $placeholder.addClass('select2-selection__placeholder') + .removeClass('select2-selection__choice'); + + return $placeholder; + }; + + Placeholder.prototype.update = function (decorated, data) { + var singlePlaceholder = ( + data.length == 1 && data[0].id != this.placeholder.id + ); + var multipleSelections = data.length > 1; + + if (multipleSelections || singlePlaceholder) { + return decorated.call(this, data); + } + + this.clear(); + + var $placeholder = this.createPlaceholder(this.placeholder); + + this.$selection.find('.select2-selection__rendered').append($placeholder); + }; + + return Placeholder; +}); + +S2.define('select2/selection/allowClear',[ + 'jquery', + '../keys', + '../utils' +], function ($, KEYS, Utils) { + function AllowClear () { } + + AllowClear.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + if (this.placeholder == null) { + if (this.options.get('debug') && window.console && console.error) { + console.error( + 'Select2: The `allowClear` option should be used in combination ' + + 'with the `placeholder` option.' + ); + } + } + + this.$selection.on('mousedown', '.select2-selection__clear', + function (evt) { + self._handleClear(evt); + }); + + container.on('keypress', function (evt) { + self._handleKeyboardClear(evt, container); + }); + }; + + AllowClear.prototype._handleClear = function (_, evt) { + // Ignore the event if it is disabled + if (this.options.get('disabled')) { + return; + } + + var $clear = this.$selection.find('.select2-selection__clear'); + + // Ignore the event if nothing has been selected + if ($clear.length === 0) { + return; + } + + evt.stopPropagation(); + + var data = Utils.GetData($clear[0], 'data'); + + var previousVal = this.$element.val(); + this.$element.val(this.placeholder.id); + + var unselectData = { + data: data + }; + this.trigger('clear', unselectData); + if (unselectData.prevented) { + this.$element.val(previousVal); + return; + } + + for (var d = 0; d < data.length; d++) { + unselectData = { + data: data[d] + }; + + // Trigger the `unselect` event, so people can prevent it from being + // cleared. + this.trigger('unselect', unselectData); + + // If the event was prevented, don't clear it out. + if (unselectData.prevented) { + this.$element.val(previousVal); + return; + } + } + + this.$element.trigger('change'); + + this.trigger('toggle', {}); + }; + + AllowClear.prototype._handleKeyboardClear = function (_, evt, container) { + if (container.isOpen()) { + return; + } + + if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) { + this._handleClear(evt); + } + }; + + AllowClear.prototype.update = function (decorated, data) { + decorated.call(this, data); + + if (this.$selection.find('.select2-selection__placeholder').length > 0 || + data.length === 0) { + return; + } + + var removeAll = this.options.get('translations').get('removeAllItems'); + + var $remove = $( + '<span class="select2-selection__clear" title="' + removeAll() +'">' + + '×' + + '</span>' + ); + Utils.StoreData($remove[0], 'data', data); + + this.$selection.find('.select2-selection__rendered').prepend($remove); + }; + + return AllowClear; +}); + +S2.define('select2/selection/search',[ + 'jquery', + '../utils', + '../keys' +], function ($, Utils, KEYS) { + function Search (decorated, $element, options) { + decorated.call(this, $element, options); + } + + Search.prototype.render = function (decorated) { + var $search = $( + '<li class="select2-search select2-search--inline">' + + '<input class="select2-search__field" type="search" tabindex="-1"' + + ' autocomplete="off" autocorrect="off" autocapitalize="none"' + + ' spellcheck="false" role="textbox" aria-autocomplete="list" />' + + '</li>' + ); + + this.$searchContainer = $search; + this.$search = $search.find('input'); + + var $rendered = decorated.call(this); + + this._transferTabIndex(); + + return $rendered; + }; + + Search.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('open', function () { + self.$search.trigger('focus'); + }); + + container.on('close', function () { + self.$search.val(''); + self.$search.removeAttr('aria-activedescendant'); + self.$search.trigger('focus'); + }); + + container.on('enable', function () { + self.$search.prop('disabled', false); + + self._transferTabIndex(); + }); + + container.on('disable', function () { + self.$search.prop('disabled', true); + }); + + container.on('focus', function (evt) { + self.$search.trigger('focus'); + }); + + container.on('results:focus', function (params) { + self.$search.attr('aria-activedescendant', params.id); + }); + + this.$selection.on('focusin', '.select2-search--inline', function (evt) { + self.trigger('focus', evt); + }); + + this.$selection.on('focusout', '.select2-search--inline', function (evt) { + self._handleBlur(evt); + }); + + this.$selection.on('keydown', '.select2-search--inline', function (evt) { + evt.stopPropagation(); + + self.trigger('keypress', evt); + + self._keyUpPrevented = evt.isDefaultPrevented(); + + var key = evt.which; + + if (key === KEYS.BACKSPACE && self.$search.val() === '') { + var $previousChoice = self.$searchContainer + .prev('.select2-selection__choice'); + + if ($previousChoice.length > 0) { + var item = Utils.GetData($previousChoice[0], 'data'); + + self.searchRemoveChoice(item); + + evt.preventDefault(); + } + } + }); + + // Try to detect the IE version should the `documentMode` property that + // is stored on the document. This is only implemented in IE and is + // slightly cleaner than doing a user agent check. + // This property is not available in Edge, but Edge also doesn't have + // this bug. + var msie = document.documentMode; + var disableInputEvents = msie && msie <= 11; + + // Workaround for browsers which do not support the `input` event + // This will prevent double-triggering of events for browsers which support + // both the `keyup` and `input` events. + this.$selection.on( + 'input.searchcheck', + '.select2-search--inline', + function (evt) { + // IE will trigger the `input` event when a placeholder is used on a + // search box. To get around this issue, we are forced to ignore all + // `input` events in IE and keep using `keyup`. + if (disableInputEvents) { + self.$selection.off('input.search input.searchcheck'); + return; + } + + // Unbind the duplicated `keyup` event + self.$selection.off('keyup.search'); + } + ); + + this.$selection.on( + 'keyup.search input.search', + '.select2-search--inline', + function (evt) { + // IE will trigger the `input` event when a placeholder is used on a + // search box. To get around this issue, we are forced to ignore all + // `input` events in IE and keep using `keyup`. + if (disableInputEvents && evt.type === 'input') { + self.$selection.off('input.search input.searchcheck'); + return; + } + + var key = evt.which; + + // We can freely ignore events from modifier keys + if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) { + return; + } + + // Tabbing will be handled during the `keydown` phase + if (key == KEYS.TAB) { + return; + } + + self.handleSearch(evt); + } + ); + }; + + /** + * This method will transfer the tabindex attribute from the rendered + * selection to the search box. This allows for the search box to be used as + * the primary focus instead of the selection container. + * + * @private + */ + Search.prototype._transferTabIndex = function (decorated) { + this.$search.attr('tabindex', this.$selection.attr('tabindex')); + this.$selection.attr('tabindex', '-1'); + }; + + Search.prototype.createPlaceholder = function (decorated, placeholder) { + this.$search.attr('placeholder', placeholder.text); + }; + + Search.prototype.update = function (decorated, data) { + var searchHadFocus = this.$search[0] == document.activeElement; + + this.$search.attr('placeholder', ''); + + decorated.call(this, data); + + this.$selection.find('.select2-selection__rendered') + .append(this.$searchContainer); + + this.resizeSearch(); + if (searchHadFocus) { + this.$search.trigger('focus'); + } + }; + + Search.prototype.handleSearch = function () { + this.resizeSearch(); + + if (!this._keyUpPrevented) { + var input = this.$search.val(); + + this.trigger('query', { + term: input + }); + } + + this._keyUpPrevented = false; + }; + + Search.prototype.searchRemoveChoice = function (decorated, item) { + this.trigger('unselect', { + data: item + }); + + this.$search.val(item.text); + this.handleSearch(); + }; + + Search.prototype.resizeSearch = function () { + this.$search.css('width', '25px'); + + var width = ''; + + if (this.$search.attr('placeholder') !== '') { + width = this.$selection.find('.select2-selection__rendered').innerWidth(); + } else { + var minimumWidth = this.$search.val().length + 1; + + width = (minimumWidth * 0.75) + 'em'; + } + + this.$search.css('width', width); + }; + + return Search; +}); + +S2.define('select2/selection/eventRelay',[ + 'jquery' +], function ($) { + function EventRelay () { } + + EventRelay.prototype.bind = function (decorated, container, $container) { + var self = this; + var relayEvents = [ + 'open', 'opening', + 'close', 'closing', + 'select', 'selecting', + 'unselect', 'unselecting', + 'clear', 'clearing' + ]; + + var preventableEvents = [ + 'opening', 'closing', 'selecting', 'unselecting', 'clearing' + ]; + + decorated.call(this, container, $container); + + container.on('*', function (name, params) { + // Ignore events that should not be relayed + if ($.inArray(name, relayEvents) === -1) { + return; + } + + // The parameters should always be an object + params = params || {}; + + // Generate the jQuery event for the Select2 event + var evt = $.Event('select2:' + name, { + params: params + }); + + self.$element.trigger(evt); + + // Only handle preventable events if it was one + if ($.inArray(name, preventableEvents) === -1) { + return; + } + + params.prevented = evt.isDefaultPrevented(); + }); + }; + + return EventRelay; +}); + +S2.define('select2/translation',[ + 'jquery', + 'require' +], function ($, require) { + function Translation (dict) { + this.dict = dict || {}; + } + + Translation.prototype.all = function () { + return this.dict; + }; + + Translation.prototype.get = function (key) { + return this.dict[key]; + }; + + Translation.prototype.extend = function (translation) { + this.dict = $.extend({}, translation.all(), this.dict); + }; + + // Static functions + + Translation._cache = {}; + + Translation.loadPath = function (path) { + if (!(path in Translation._cache)) { + var translations = require(path); + + Translation._cache[path] = translations; + } + + return new Translation(Translation._cache[path]); + }; + + return Translation; +}); + +S2.define('select2/diacritics',[ + +], function () { + var diacritics = { + '\u24B6': 'A', + '\uFF21': 'A', + '\u00C0': 'A', + '\u00C1': 'A', + '\u00C2': 'A', + '\u1EA6': 'A', + '\u1EA4': 'A', + '\u1EAA': 'A', + '\u1EA8': 'A', + '\u00C3': 'A', + '\u0100': 'A', + '\u0102': 'A', + '\u1EB0': 'A', + '\u1EAE': 'A', + '\u1EB4': 'A', + '\u1EB2': 'A', + '\u0226': 'A', + '\u01E0': 'A', + '\u00C4': 'A', + '\u01DE': 'A', + '\u1EA2': 'A', + '\u00C5': 'A', + '\u01FA': 'A', + '\u01CD': 'A', + '\u0200': 'A', + '\u0202': 'A', + '\u1EA0': 'A', + '\u1EAC': 'A', + '\u1EB6': 'A', + '\u1E00': 'A', + '\u0104': 'A', + '\u023A': 'A', + '\u2C6F': 'A', + '\uA732': 'AA', + '\u00C6': 'AE', + '\u01FC': 'AE', + '\u01E2': 'AE', + '\uA734': 'AO', + '\uA736': 'AU', + '\uA738': 'AV', + '\uA73A': 'AV', + '\uA73C': 'AY', + '\u24B7': 'B', + '\uFF22': 'B', + '\u1E02': 'B', + '\u1E04': 'B', + '\u1E06': 'B', + '\u0243': 'B', + '\u0182': 'B', + '\u0181': 'B', + '\u24B8': 'C', + '\uFF23': 'C', + '\u0106': 'C', + '\u0108': 'C', + '\u010A': 'C', + '\u010C': 'C', + '\u00C7': 'C', + '\u1E08': 'C', + '\u0187': 'C', + '\u023B': 'C', + '\uA73E': 'C', + '\u24B9': 'D', + '\uFF24': 'D', + '\u1E0A': 'D', + '\u010E': 'D', + '\u1E0C': 'D', + '\u1E10': 'D', + '\u1E12': 'D', + '\u1E0E': 'D', + '\u0110': 'D', + '\u018B': 'D', + '\u018A': 'D', + '\u0189': 'D', + '\uA779': 'D', + '\u01F1': 'DZ', + '\u01C4': 'DZ', + '\u01F2': 'Dz', + '\u01C5': 'Dz', + '\u24BA': 'E', + '\uFF25': 'E', + '\u00C8': 'E', + '\u00C9': 'E', + '\u00CA': 'E', + '\u1EC0': 'E', + '\u1EBE': 'E', + '\u1EC4': 'E', + '\u1EC2': 'E', + '\u1EBC': 'E', + '\u0112': 'E', + '\u1E14': 'E', + '\u1E16': 'E', + '\u0114': 'E', + '\u0116': 'E', + '\u00CB': 'E', + '\u1EBA': 'E', + '\u011A': 'E', + '\u0204': 'E', + '\u0206': 'E', + '\u1EB8': 'E', + '\u1EC6': 'E', + '\u0228': 'E', + '\u1E1C': 'E', + '\u0118': 'E', + '\u1E18': 'E', + '\u1E1A': 'E', + '\u0190': 'E', + '\u018E': 'E', + '\u24BB': 'F', + '\uFF26': 'F', + '\u1E1E': 'F', + '\u0191': 'F', + '\uA77B': 'F', + '\u24BC': 'G', + '\uFF27': 'G', + '\u01F4': 'G', + '\u011C': 'G', + '\u1E20': 'G', + '\u011E': 'G', + '\u0120': 'G', + '\u01E6': 'G', + '\u0122': 'G', + '\u01E4': 'G', + '\u0193': 'G', + '\uA7A0': 'G', + '\uA77D': 'G', + '\uA77E': 'G', + '\u24BD': 'H', + '\uFF28': 'H', + '\u0124': 'H', + '\u1E22': 'H', + '\u1E26': 'H', + '\u021E': 'H', + '\u1E24': 'H', + '\u1E28': 'H', + '\u1E2A': 'H', + '\u0126': 'H', + '\u2C67': 'H', + '\u2C75': 'H', + '\uA78D': 'H', + '\u24BE': 'I', + '\uFF29': 'I', + '\u00CC': 'I', + '\u00CD': 'I', + '\u00CE': 'I', + '\u0128': 'I', + '\u012A': 'I', + '\u012C': 'I', + '\u0130': 'I', + '\u00CF': 'I', + '\u1E2E': 'I', + '\u1EC8': 'I', + '\u01CF': 'I', + '\u0208': 'I', + '\u020A': 'I', + '\u1ECA': 'I', + '\u012E': 'I', + '\u1E2C': 'I', + '\u0197': 'I', + '\u24BF': 'J', + '\uFF2A': 'J', + '\u0134': 'J', + '\u0248': 'J', + '\u24C0': 'K', + '\uFF2B': 'K', + '\u1E30': 'K', + '\u01E8': 'K', + '\u1E32': 'K', + '\u0136': 'K', + '\u1E34': 'K', + '\u0198': 'K', + '\u2C69': 'K', + '\uA740': 'K', + '\uA742': 'K', + '\uA744': 'K', + '\uA7A2': 'K', + '\u24C1': 'L', + '\uFF2C': 'L', + '\u013F': 'L', + '\u0139': 'L', + '\u013D': 'L', + '\u1E36': 'L', + '\u1E38': 'L', + '\u013B': 'L', + '\u1E3C': 'L', + '\u1E3A': 'L', + '\u0141': 'L', + '\u023D': 'L', + '\u2C62': 'L', + '\u2C60': 'L', + '\uA748': 'L', + '\uA746': 'L', + '\uA780': 'L', + '\u01C7': 'LJ', + '\u01C8': 'Lj', + '\u24C2': 'M', + '\uFF2D': 'M', + '\u1E3E': 'M', + '\u1E40': 'M', + '\u1E42': 'M', + '\u2C6E': 'M', + '\u019C': 'M', + '\u24C3': 'N', + '\uFF2E': 'N', + '\u01F8': 'N', + '\u0143': 'N', + '\u00D1': 'N', + '\u1E44': 'N', + '\u0147': 'N', + '\u1E46': 'N', + '\u0145': 'N', + '\u1E4A': 'N', + '\u1E48': 'N', + '\u0220': 'N', + '\u019D': 'N', + '\uA790': 'N', + '\uA7A4': 'N', + '\u01CA': 'NJ', + '\u01CB': 'Nj', + '\u24C4': 'O', + '\uFF2F': 'O', + '\u00D2': 'O', + '\u00D3': 'O', + '\u00D4': 'O', + '\u1ED2': 'O', + '\u1ED0': 'O', + '\u1ED6': 'O', + '\u1ED4': 'O', + '\u00D5': 'O', + '\u1E4C': 'O', + '\u022C': 'O', + '\u1E4E': 'O', + '\u014C': 'O', + '\u1E50': 'O', + '\u1E52': 'O', + '\u014E': 'O', + '\u022E': 'O', + '\u0230': 'O', + '\u00D6': 'O', + '\u022A': 'O', + '\u1ECE': 'O', + '\u0150': 'O', + '\u01D1': 'O', + '\u020C': 'O', + '\u020E': 'O', + '\u01A0': 'O', + '\u1EDC': 'O', + '\u1EDA': 'O', + '\u1EE0': 'O', + '\u1EDE': 'O', + '\u1EE2': 'O', + '\u1ECC': 'O', + '\u1ED8': 'O', + '\u01EA': 'O', + '\u01EC': 'O', + '\u00D8': 'O', + '\u01FE': 'O', + '\u0186': 'O', + '\u019F': 'O', + '\uA74A': 'O', + '\uA74C': 'O', + '\u0152': 'OE', + '\u01A2': 'OI', + '\uA74E': 'OO', + '\u0222': 'OU', + '\u24C5': 'P', + '\uFF30': 'P', + '\u1E54': 'P', + '\u1E56': 'P', + '\u01A4': 'P', + '\u2C63': 'P', + '\uA750': 'P', + '\uA752': 'P', + '\uA754': 'P', + '\u24C6': 'Q', + '\uFF31': 'Q', + '\uA756': 'Q', + '\uA758': 'Q', + '\u024A': 'Q', + '\u24C7': 'R', + '\uFF32': 'R', + '\u0154': 'R', + '\u1E58': 'R', + '\u0158': 'R', + '\u0210': 'R', + '\u0212': 'R', + '\u1E5A': 'R', + '\u1E5C': 'R', + '\u0156': 'R', + '\u1E5E': 'R', + '\u024C': 'R', + '\u2C64': 'R', + '\uA75A': 'R', + '\uA7A6': 'R', + '\uA782': 'R', + '\u24C8': 'S', + '\uFF33': 'S', + '\u1E9E': 'S', + '\u015A': 'S', + '\u1E64': 'S', + '\u015C': 'S', + '\u1E60': 'S', + '\u0160': 'S', + '\u1E66': 'S', + '\u1E62': 'S', + '\u1E68': 'S', + '\u0218': 'S', + '\u015E': 'S', + '\u2C7E': 'S', + '\uA7A8': 'S', + '\uA784': 'S', + '\u24C9': 'T', + '\uFF34': 'T', + '\u1E6A': 'T', + '\u0164': 'T', + '\u1E6C': 'T', + '\u021A': 'T', + '\u0162': 'T', + '\u1E70': 'T', + '\u1E6E': 'T', + '\u0166': 'T', + '\u01AC': 'T', + '\u01AE': 'T', + '\u023E': 'T', + '\uA786': 'T', + '\uA728': 'TZ', + '\u24CA': 'U', + '\uFF35': 'U', + '\u00D9': 'U', + '\u00DA': 'U', + '\u00DB': 'U', + '\u0168': 'U', + '\u1E78': 'U', + '\u016A': 'U', + '\u1E7A': 'U', + '\u016C': 'U', + '\u00DC': 'U', + '\u01DB': 'U', + '\u01D7': 'U', + '\u01D5': 'U', + '\u01D9': 'U', + '\u1EE6': 'U', + '\u016E': 'U', + '\u0170': 'U', + '\u01D3': 'U', + '\u0214': 'U', + '\u0216': 'U', + '\u01AF': 'U', + '\u1EEA': 'U', + '\u1EE8': 'U', + '\u1EEE': 'U', + '\u1EEC': 'U', + '\u1EF0': 'U', + '\u1EE4': 'U', + '\u1E72': 'U', + '\u0172': 'U', + '\u1E76': 'U', + '\u1E74': 'U', + '\u0244': 'U', + '\u24CB': 'V', + '\uFF36': 'V', + '\u1E7C': 'V', + '\u1E7E': 'V', + '\u01B2': 'V', + '\uA75E': 'V', + '\u0245': 'V', + '\uA760': 'VY', + '\u24CC': 'W', + '\uFF37': 'W', + '\u1E80': 'W', + '\u1E82': 'W', + '\u0174': 'W', + '\u1E86': 'W', + '\u1E84': 'W', + '\u1E88': 'W', + '\u2C72': 'W', + '\u24CD': 'X', + '\uFF38': 'X', + '\u1E8A': 'X', + '\u1E8C': 'X', + '\u24CE': 'Y', + '\uFF39': 'Y', + '\u1EF2': 'Y', + '\u00DD': 'Y', + '\u0176': 'Y', + '\u1EF8': 'Y', + '\u0232': 'Y', + '\u1E8E': 'Y', + '\u0178': 'Y', + '\u1EF6': 'Y', + '\u1EF4': 'Y', + '\u01B3': 'Y', + '\u024E': 'Y', + '\u1EFE': 'Y', + '\u24CF': 'Z', + '\uFF3A': 'Z', + '\u0179': 'Z', + '\u1E90': 'Z', + '\u017B': 'Z', + '\u017D': 'Z', + '\u1E92': 'Z', + '\u1E94': 'Z', + '\u01B5': 'Z', + '\u0224': 'Z', + '\u2C7F': 'Z', + '\u2C6B': 'Z', + '\uA762': 'Z', + '\u24D0': 'a', + '\uFF41': 'a', + '\u1E9A': 'a', + '\u00E0': 'a', + '\u00E1': 'a', + '\u00E2': 'a', + '\u1EA7': 'a', + '\u1EA5': 'a', + '\u1EAB': 'a', + '\u1EA9': 'a', + '\u00E3': 'a', + '\u0101': 'a', + '\u0103': 'a', + '\u1EB1': 'a', + '\u1EAF': 'a', + '\u1EB5': 'a', + '\u1EB3': 'a', + '\u0227': 'a', + '\u01E1': 'a', + '\u00E4': 'a', + '\u01DF': 'a', + '\u1EA3': 'a', + '\u00E5': 'a', + '\u01FB': 'a', + '\u01CE': 'a', + '\u0201': 'a', + '\u0203': 'a', + '\u1EA1': 'a', + '\u1EAD': 'a', + '\u1EB7': 'a', + '\u1E01': 'a', + '\u0105': 'a', + '\u2C65': 'a', + '\u0250': 'a', + '\uA733': 'aa', + '\u00E6': 'ae', + '\u01FD': 'ae', + '\u01E3': 'ae', + '\uA735': 'ao', + '\uA737': 'au', + '\uA739': 'av', + '\uA73B': 'av', + '\uA73D': 'ay', + '\u24D1': 'b', + '\uFF42': 'b', + '\u1E03': 'b', + '\u1E05': 'b', + '\u1E07': 'b', + '\u0180': 'b', + '\u0183': 'b', + '\u0253': 'b', + '\u24D2': 'c', + '\uFF43': 'c', + '\u0107': 'c', + '\u0109': 'c', + '\u010B': 'c', + '\u010D': 'c', + '\u00E7': 'c', + '\u1E09': 'c', + '\u0188': 'c', + '\u023C': 'c', + '\uA73F': 'c', + '\u2184': 'c', + '\u24D3': 'd', + '\uFF44': 'd', + '\u1E0B': 'd', + '\u010F': 'd', + '\u1E0D': 'd', + '\u1E11': 'd', + '\u1E13': 'd', + '\u1E0F': 'd', + '\u0111': 'd', + '\u018C': 'd', + '\u0256': 'd', + '\u0257': 'd', + '\uA77A': 'd', + '\u01F3': 'dz', + '\u01C6': 'dz', + '\u24D4': 'e', + '\uFF45': 'e', + '\u00E8': 'e', + '\u00E9': 'e', + '\u00EA': 'e', + '\u1EC1': 'e', + '\u1EBF': 'e', + '\u1EC5': 'e', + '\u1EC3': 'e', + '\u1EBD': 'e', + '\u0113': 'e', + '\u1E15': 'e', + '\u1E17': 'e', + '\u0115': 'e', + '\u0117': 'e', + '\u00EB': 'e', + '\u1EBB': 'e', + '\u011B': 'e', + '\u0205': 'e', + '\u0207': 'e', + '\u1EB9': 'e', + '\u1EC7': 'e', + '\u0229': 'e', + '\u1E1D': 'e', + '\u0119': 'e', + '\u1E19': 'e', + '\u1E1B': 'e', + '\u0247': 'e', + '\u025B': 'e', + '\u01DD': 'e', + '\u24D5': 'f', + '\uFF46': 'f', + '\u1E1F': 'f', + '\u0192': 'f', + '\uA77C': 'f', + '\u24D6': 'g', + '\uFF47': 'g', + '\u01F5': 'g', + '\u011D': 'g', + '\u1E21': 'g', + '\u011F': 'g', + '\u0121': 'g', + '\u01E7': 'g', + '\u0123': 'g', + '\u01E5': 'g', + '\u0260': 'g', + '\uA7A1': 'g', + '\u1D79': 'g', + '\uA77F': 'g', + '\u24D7': 'h', + '\uFF48': 'h', + '\u0125': 'h', + '\u1E23': 'h', + '\u1E27': 'h', + '\u021F': 'h', + '\u1E25': 'h', + '\u1E29': 'h', + '\u1E2B': 'h', + '\u1E96': 'h', + '\u0127': 'h', + '\u2C68': 'h', + '\u2C76': 'h', + '\u0265': 'h', + '\u0195': 'hv', + '\u24D8': 'i', + '\uFF49': 'i', + '\u00EC': 'i', + '\u00ED': 'i', + '\u00EE': 'i', + '\u0129': 'i', + '\u012B': 'i', + '\u012D': 'i', + '\u00EF': 'i', + '\u1E2F': 'i', + '\u1EC9': 'i', + '\u01D0': 'i', + '\u0209': 'i', + '\u020B': 'i', + '\u1ECB': 'i', + '\u012F': 'i', + '\u1E2D': 'i', + '\u0268': 'i', + '\u0131': 'i', + '\u24D9': 'j', + '\uFF4A': 'j', + '\u0135': 'j', + '\u01F0': 'j', + '\u0249': 'j', + '\u24DA': 'k', + '\uFF4B': 'k', + '\u1E31': 'k', + '\u01E9': 'k', + '\u1E33': 'k', + '\u0137': 'k', + '\u1E35': 'k', + '\u0199': 'k', + '\u2C6A': 'k', + '\uA741': 'k', + '\uA743': 'k', + '\uA745': 'k', + '\uA7A3': 'k', + '\u24DB': 'l', + '\uFF4C': 'l', + '\u0140': 'l', + '\u013A': 'l', + '\u013E': 'l', + '\u1E37': 'l', + '\u1E39': 'l', + '\u013C': 'l', + '\u1E3D': 'l', + '\u1E3B': 'l', + '\u017F': 'l', + '\u0142': 'l', + '\u019A': 'l', + '\u026B': 'l', + '\u2C61': 'l', + '\uA749': 'l', + '\uA781': 'l', + '\uA747': 'l', + '\u01C9': 'lj', + '\u24DC': 'm', + '\uFF4D': 'm', + '\u1E3F': 'm', + '\u1E41': 'm', + '\u1E43': 'm', + '\u0271': 'm', + '\u026F': 'm', + '\u24DD': 'n', + '\uFF4E': 'n', + '\u01F9': 'n', + '\u0144': 'n', + '\u00F1': 'n', + '\u1E45': 'n', + '\u0148': 'n', + '\u1E47': 'n', + '\u0146': 'n', + '\u1E4B': 'n', + '\u1E49': 'n', + '\u019E': 'n', + '\u0272': 'n', + '\u0149': 'n', + '\uA791': 'n', + '\uA7A5': 'n', + '\u01CC': 'nj', + '\u24DE': 'o', + '\uFF4F': 'o', + '\u00F2': 'o', + '\u00F3': 'o', + '\u00F4': 'o', + '\u1ED3': 'o', + '\u1ED1': 'o', + '\u1ED7': 'o', + '\u1ED5': 'o', + '\u00F5': 'o', + '\u1E4D': 'o', + '\u022D': 'o', + '\u1E4F': 'o', + '\u014D': 'o', + '\u1E51': 'o', + '\u1E53': 'o', + '\u014F': 'o', + '\u022F': 'o', + '\u0231': 'o', + '\u00F6': 'o', + '\u022B': 'o', + '\u1ECF': 'o', + '\u0151': 'o', + '\u01D2': 'o', + '\u020D': 'o', + '\u020F': 'o', + '\u01A1': 'o', + '\u1EDD': 'o', + '\u1EDB': 'o', + '\u1EE1': 'o', + '\u1EDF': 'o', + '\u1EE3': 'o', + '\u1ECD': 'o', + '\u1ED9': 'o', + '\u01EB': 'o', + '\u01ED': 'o', + '\u00F8': 'o', + '\u01FF': 'o', + '\u0254': 'o', + '\uA74B': 'o', + '\uA74D': 'o', + '\u0275': 'o', + '\u0153': 'oe', + '\u01A3': 'oi', + '\u0223': 'ou', + '\uA74F': 'oo', + '\u24DF': 'p', + '\uFF50': 'p', + '\u1E55': 'p', + '\u1E57': 'p', + '\u01A5': 'p', + '\u1D7D': 'p', + '\uA751': 'p', + '\uA753': 'p', + '\uA755': 'p', + '\u24E0': 'q', + '\uFF51': 'q', + '\u024B': 'q', + '\uA757': 'q', + '\uA759': 'q', + '\u24E1': 'r', + '\uFF52': 'r', + '\u0155': 'r', + '\u1E59': 'r', + '\u0159': 'r', + '\u0211': 'r', + '\u0213': 'r', + '\u1E5B': 'r', + '\u1E5D': 'r', + '\u0157': 'r', + '\u1E5F': 'r', + '\u024D': 'r', + '\u027D': 'r', + '\uA75B': 'r', + '\uA7A7': 'r', + '\uA783': 'r', + '\u24E2': 's', + '\uFF53': 's', + '\u00DF': 's', + '\u015B': 's', + '\u1E65': 's', + '\u015D': 's', + '\u1E61': 's', + '\u0161': 's', + '\u1E67': 's', + '\u1E63': 's', + '\u1E69': 's', + '\u0219': 's', + '\u015F': 's', + '\u023F': 's', + '\uA7A9': 's', + '\uA785': 's', + '\u1E9B': 's', + '\u24E3': 't', + '\uFF54': 't', + '\u1E6B': 't', + '\u1E97': 't', + '\u0165': 't', + '\u1E6D': 't', + '\u021B': 't', + '\u0163': 't', + '\u1E71': 't', + '\u1E6F': 't', + '\u0167': 't', + '\u01AD': 't', + '\u0288': 't', + '\u2C66': 't', + '\uA787': 't', + '\uA729': 'tz', + '\u24E4': 'u', + '\uFF55': 'u', + '\u00F9': 'u', + '\u00FA': 'u', + '\u00FB': 'u', + '\u0169': 'u', + '\u1E79': 'u', + '\u016B': 'u', + '\u1E7B': 'u', + '\u016D': 'u', + '\u00FC': 'u', + '\u01DC': 'u', + '\u01D8': 'u', + '\u01D6': 'u', + '\u01DA': 'u', + '\u1EE7': 'u', + '\u016F': 'u', + '\u0171': 'u', + '\u01D4': 'u', + '\u0215': 'u', + '\u0217': 'u', + '\u01B0': 'u', + '\u1EEB': 'u', + '\u1EE9': 'u', + '\u1EEF': 'u', + '\u1EED': 'u', + '\u1EF1': 'u', + '\u1EE5': 'u', + '\u1E73': 'u', + '\u0173': 'u', + '\u1E77': 'u', + '\u1E75': 'u', + '\u0289': 'u', + '\u24E5': 'v', + '\uFF56': 'v', + '\u1E7D': 'v', + '\u1E7F': 'v', + '\u028B': 'v', + '\uA75F': 'v', + '\u028C': 'v', + '\uA761': 'vy', + '\u24E6': 'w', + '\uFF57': 'w', + '\u1E81': 'w', + '\u1E83': 'w', + '\u0175': 'w', + '\u1E87': 'w', + '\u1E85': 'w', + '\u1E98': 'w', + '\u1E89': 'w', + '\u2C73': 'w', + '\u24E7': 'x', + '\uFF58': 'x', + '\u1E8B': 'x', + '\u1E8D': 'x', + '\u24E8': 'y', + '\uFF59': 'y', + '\u1EF3': 'y', + '\u00FD': 'y', + '\u0177': 'y', + '\u1EF9': 'y', + '\u0233': 'y', + '\u1E8F': 'y', + '\u00FF': 'y', + '\u1EF7': 'y', + '\u1E99': 'y', + '\u1EF5': 'y', + '\u01B4': 'y', + '\u024F': 'y', + '\u1EFF': 'y', + '\u24E9': 'z', + '\uFF5A': 'z', + '\u017A': 'z', + '\u1E91': 'z', + '\u017C': 'z', + '\u017E': 'z', + '\u1E93': 'z', + '\u1E95': 'z', + '\u01B6': 'z', + '\u0225': 'z', + '\u0240': 'z', + '\u2C6C': 'z', + '\uA763': 'z', + '\u0386': '\u0391', + '\u0388': '\u0395', + '\u0389': '\u0397', + '\u038A': '\u0399', + '\u03AA': '\u0399', + '\u038C': '\u039F', + '\u038E': '\u03A5', + '\u03AB': '\u03A5', + '\u038F': '\u03A9', + '\u03AC': '\u03B1', + '\u03AD': '\u03B5', + '\u03AE': '\u03B7', + '\u03AF': '\u03B9', + '\u03CA': '\u03B9', + '\u0390': '\u03B9', + '\u03CC': '\u03BF', + '\u03CD': '\u03C5', + '\u03CB': '\u03C5', + '\u03B0': '\u03C5', + '\u03CE': '\u03C9', + '\u03C2': '\u03C3', + '\u2019': '\'' + }; + + return diacritics; +}); + +S2.define('select2/data/base',[ + '../utils' +], function (Utils) { + function BaseAdapter ($element, options) { + BaseAdapter.__super__.constructor.call(this); + } + + Utils.Extend(BaseAdapter, Utils.Observable); + + BaseAdapter.prototype.current = function (callback) { + throw new Error('The `current` method must be defined in child classes.'); + }; + + BaseAdapter.prototype.query = function (params, callback) { + throw new Error('The `query` method must be defined in child classes.'); + }; + + BaseAdapter.prototype.bind = function (container, $container) { + // Can be implemented in subclasses + }; + + BaseAdapter.prototype.destroy = function () { + // Can be implemented in subclasses + }; + + BaseAdapter.prototype.generateResultId = function (container, data) { + var id = container.id + '-result-'; + + id += Utils.generateChars(4); + + if (data.id != null) { + id += '-' + data.id.toString(); + } else { + id += '-' + Utils.generateChars(4); + } + return id; + }; + + return BaseAdapter; +}); + +S2.define('select2/data/select',[ + './base', + '../utils', + 'jquery' +], function (BaseAdapter, Utils, $) { + function SelectAdapter ($element, options) { + this.$element = $element; + this.options = options; + + SelectAdapter.__super__.constructor.call(this); + } + + Utils.Extend(SelectAdapter, BaseAdapter); + + SelectAdapter.prototype.current = function (callback) { + var data = []; + var self = this; + + this.$element.find(':selected').each(function () { + var $option = $(this); + + var option = self.item($option); + + data.push(option); + }); + + callback(data); + }; + + SelectAdapter.prototype.select = function (data) { + var self = this; + + data.selected = true; + + // If data.element is a DOM node, use it instead + if ($(data.element).is('option')) { + data.element.selected = true; + + this.$element.trigger('change'); + + return; + } + + if (this.$element.prop('multiple')) { + this.current(function (currentData) { + var val = []; + + data = [data]; + data.push.apply(data, currentData); + + for (var d = 0; d < data.length; d++) { + var id = data[d].id; + + if ($.inArray(id, val) === -1) { + val.push(id); + } + } + + self.$element.val(val); + self.$element.trigger('change'); + }); + } else { + var val = data.id; + + this.$element.val(val); + this.$element.trigger('change'); + } + }; + + SelectAdapter.prototype.unselect = function (data) { + var self = this; + + if (!this.$element.prop('multiple')) { + return; + } + + data.selected = false; + + if ($(data.element).is('option')) { + data.element.selected = false; + + this.$element.trigger('change'); + + return; + } + + this.current(function (currentData) { + var val = []; + + for (var d = 0; d < currentData.length; d++) { + var id = currentData[d].id; + + if (id !== data.id && $.inArray(id, val) === -1) { + val.push(id); + } + } + + self.$element.val(val); + + self.$element.trigger('change'); + }); + }; + + SelectAdapter.prototype.bind = function (container, $container) { + var self = this; + + this.container = container; + + container.on('select', function (params) { + self.select(params.data); + }); + + container.on('unselect', function (params) { + self.unselect(params.data); + }); + }; + + SelectAdapter.prototype.destroy = function () { + // Remove anything added to child elements + this.$element.find('*').each(function () { + // Remove any custom data set by Select2 + Utils.RemoveData(this); + }); + }; + + SelectAdapter.prototype.query = function (params, callback) { + var data = []; + var self = this; + + var $options = this.$element.children(); + + $options.each(function () { + var $option = $(this); + + if (!$option.is('option') && !$option.is('optgroup')) { + return; + } + + var option = self.item($option); + + var matches = self.matches(params, option); + + if (matches !== null) { + data.push(matches); + } + }); + + callback({ + results: data + }); + }; + + SelectAdapter.prototype.addOptions = function ($options) { + Utils.appendMany(this.$element, $options); + }; + + SelectAdapter.prototype.option = function (data) { + var option; + + if (data.children) { + option = document.createElement('optgroup'); + option.label = data.text; + } else { + option = document.createElement('option'); + + if (option.textContent !== undefined) { + option.textContent = data.text; + } else { + option.innerText = data.text; + } + } + + if (data.id !== undefined) { + option.value = data.id; + } + + if (data.disabled) { + option.disabled = true; + } + + if (data.selected) { + option.selected = true; + } + + if (data.title) { + option.title = data.title; + } + + var $option = $(option); + + var normalizedData = this._normalizeItem(data); + normalizedData.element = option; + + // Override the option's data with the combined data + Utils.StoreData(option, 'data', normalizedData); + + return $option; + }; + + SelectAdapter.prototype.item = function ($option) { + var data = {}; + + data = Utils.GetData($option[0], 'data'); + + if (data != null) { + return data; + } + + if ($option.is('option')) { + data = { + id: $option.val(), + text: $option.text(), + disabled: $option.prop('disabled'), + selected: $option.prop('selected'), + title: $option.prop('title') + }; + } else if ($option.is('optgroup')) { + data = { + text: $option.prop('label'), + children: [], + title: $option.prop('title') + }; + + var $children = $option.children('option'); + var children = []; + + for (var c = 0; c < $children.length; c++) { + var $child = $($children[c]); + + var child = this.item($child); + + children.push(child); + } + + data.children = children; + } + + data = this._normalizeItem(data); + data.element = $option[0]; + + Utils.StoreData($option[0], 'data', data); + + return data; + }; + + SelectAdapter.prototype._normalizeItem = function (item) { + if (item !== Object(item)) { + item = { + id: item, + text: item + }; + } + + item = $.extend({}, { + text: '' + }, item); + + var defaults = { + selected: false, + disabled: false + }; + + if (item.id != null) { + item.id = item.id.toString(); + } + + if (item.text != null) { + item.text = item.text.toString(); + } + + if (item._resultId == null && item.id && this.container != null) { + item._resultId = this.generateResultId(this.container, item); + } + + return $.extend({}, defaults, item); + }; + + SelectAdapter.prototype.matches = function (params, data) { + var matcher = this.options.get('matcher'); + + return matcher(params, data); + }; + + return SelectAdapter; +}); + +S2.define('select2/data/array',[ + './select', + '../utils', + 'jquery' +], function (SelectAdapter, Utils, $) { + function ArrayAdapter ($element, options) { + var data = options.get('data') || []; + + ArrayAdapter.__super__.constructor.call(this, $element, options); + + this.addOptions(this.convertToOptions(data)); + } + + Utils.Extend(ArrayAdapter, SelectAdapter); + + ArrayAdapter.prototype.select = function (data) { + var $option = this.$element.find('option').filter(function (i, elm) { + return elm.value == data.id.toString(); + }); + + if ($option.length === 0) { + $option = this.option(data); + + this.addOptions($option); + } + + ArrayAdapter.__super__.select.call(this, data); + }; + + ArrayAdapter.prototype.convertToOptions = function (data) { + var self = this; + + var $existing = this.$element.find('option'); + var existingIds = $existing.map(function () { + return self.item($(this)).id; + }).get(); + + var $options = []; + + // Filter out all items except for the one passed in the argument + function onlyItem (item) { + return function () { + return $(this).val() == item.id; + }; + } + + for (var d = 0; d < data.length; d++) { + var item = this._normalizeItem(data[d]); + + // Skip items which were pre-loaded, only merge the data + if ($.inArray(item.id, existingIds) >= 0) { + var $existingOption = $existing.filter(onlyItem(item)); + + var existingData = this.item($existingOption); + var newData = $.extend(true, {}, item, existingData); + + var $newOption = this.option(newData); + + $existingOption.replaceWith($newOption); + + continue; + } + + var $option = this.option(item); + + if (item.children) { + var $children = this.convertToOptions(item.children); + + Utils.appendMany($option, $children); + } + + $options.push($option); + } + + return $options; + }; + + return ArrayAdapter; +}); + +S2.define('select2/data/ajax',[ + './array', + '../utils', + 'jquery' +], function (ArrayAdapter, Utils, $) { + function AjaxAdapter ($element, options) { + this.ajaxOptions = this._applyDefaults(options.get('ajax')); + + if (this.ajaxOptions.processResults != null) { + this.processResults = this.ajaxOptions.processResults; + } + + AjaxAdapter.__super__.constructor.call(this, $element, options); + } + + Utils.Extend(AjaxAdapter, ArrayAdapter); + + AjaxAdapter.prototype._applyDefaults = function (options) { + var defaults = { + data: function (params) { + return $.extend({}, params, { + q: params.term + }); + }, + transport: function (params, success, failure) { + var $request = $.ajax(params); + + $request.then(success); + $request.fail(failure); + + return $request; + } + }; + + return $.extend({}, defaults, options, true); + }; + + AjaxAdapter.prototype.processResults = function (results) { + return results; + }; + + AjaxAdapter.prototype.query = function (params, callback) { + var matches = []; + var self = this; + + if (this._request != null) { + // JSONP requests cannot always be aborted + if ($.isFunction(this._request.abort)) { + this._request.abort(); + } + + this._request = null; + } + + var options = $.extend({ + type: 'GET' + }, this.ajaxOptions); + + if (typeof options.url === 'function') { + options.url = options.url.call(this.$element, params); + } + + if (typeof options.data === 'function') { + options.data = options.data.call(this.$element, params); + } + + function request () { + var $request = options.transport(options, function (data) { + var results = self.processResults(data, params); + + if (self.options.get('debug') && window.console && console.error) { + // Check to make sure that the response included a `results` key. + if (!results || !results.results || !$.isArray(results.results)) { + console.error( + 'Select2: The AJAX results did not return an array in the ' + + '`results` key of the response.' + ); + } + } + + callback(results); + }, function () { + // Attempt to detect if a request was aborted + // Only works if the transport exposes a status property + if ('status' in $request && + ($request.status === 0 || $request.status === '0')) { + return; + } + + self.trigger('results:message', { + message: 'errorLoading' + }); + }); + + self._request = $request; + } + + if (this.ajaxOptions.delay && params.term != null) { + if (this._queryTimeout) { + window.clearTimeout(this._queryTimeout); + } + + this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay); + } else { + request(); + } + }; + + return AjaxAdapter; +}); + +S2.define('select2/data/tags',[ + 'jquery' +], function ($) { + function Tags (decorated, $element, options) { + var tags = options.get('tags'); + + var createTag = options.get('createTag'); + + if (createTag !== undefined) { + this.createTag = createTag; + } + + var insertTag = options.get('insertTag'); + + if (insertTag !== undefined) { + this.insertTag = insertTag; + } + + decorated.call(this, $element, options); + + if ($.isArray(tags)) { + for (var t = 0; t < tags.length; t++) { + var tag = tags[t]; + var item = this._normalizeItem(tag); + + var $option = this.option(item); + + this.$element.append($option); + } + } + } + + Tags.prototype.query = function (decorated, params, callback) { + var self = this; + + this._removeOldTags(); + + if (params.term == null || params.page != null) { + decorated.call(this, params, callback); + return; + } + + function wrapper (obj, child) { + var data = obj.results; + + for (var i = 0; i < data.length; i++) { + var option = data[i]; + + var checkChildren = ( + option.children != null && + !wrapper({ + results: option.children + }, true) + ); + + var optionText = (option.text || '').toUpperCase(); + var paramsTerm = (params.term || '').toUpperCase(); + + var checkText = optionText === paramsTerm; + + if (checkText || checkChildren) { + if (child) { + return false; + } + + obj.data = data; + callback(obj); + + return; + } + } + + if (child) { + return true; + } + + var tag = self.createTag(params); + + if (tag != null) { + var $option = self.option(tag); + $option.attr('data-select2-tag', true); + + self.addOptions([$option]); + + self.insertTag(data, tag); + } + + obj.results = data; + + callback(obj); + } + + decorated.call(this, params, wrapper); + }; + + Tags.prototype.createTag = function (decorated, params) { + var term = $.trim(params.term); + + if (term === '') { + return null; + } + + return { + id: term, + text: term + }; + }; + + Tags.prototype.insertTag = function (_, data, tag) { + data.unshift(tag); + }; + + Tags.prototype._removeOldTags = function (_) { + var tag = this._lastTag; + + var $options = this.$element.find('option[data-select2-tag]'); + + $options.each(function () { + if (this.selected) { + return; + } + + $(this).remove(); + }); + }; + + return Tags; +}); + +S2.define('select2/data/tokenizer',[ + 'jquery' +], function ($) { + function Tokenizer (decorated, $element, options) { + var tokenizer = options.get('tokenizer'); + + if (tokenizer !== undefined) { + this.tokenizer = tokenizer; + } + + decorated.call(this, $element, options); + } + + Tokenizer.prototype.bind = function (decorated, container, $container) { + decorated.call(this, container, $container); + + this.$search = container.dropdown.$search || container.selection.$search || + $container.find('.select2-search__field'); + }; + + Tokenizer.prototype.query = function (decorated, params, callback) { + var self = this; + + function createAndSelect (data) { + // Normalize the data object so we can use it for checks + var item = self._normalizeItem(data); + + // Check if the data object already exists as a tag + // Select it if it doesn't + var $existingOptions = self.$element.find('option').filter(function () { + return $(this).val() === item.id; + }); + + // If an existing option wasn't found for it, create the option + if (!$existingOptions.length) { + var $option = self.option(item); + $option.attr('data-select2-tag', true); + + self._removeOldTags(); + self.addOptions([$option]); + } + + // Select the item, now that we know there is an option for it + select(item); + } + + function select (data) { + self.trigger('select', { + data: data + }); + } + + params.term = params.term || ''; + + var tokenData = this.tokenizer(params, this.options, createAndSelect); + + if (tokenData.term !== params.term) { + // Replace the search term if we have the search box + if (this.$search.length) { + this.$search.val(tokenData.term); + this.$search.trigger('focus'); + } + + params.term = tokenData.term; + } + + decorated.call(this, params, callback); + }; + + Tokenizer.prototype.tokenizer = function (_, params, options, callback) { + var separators = options.get('tokenSeparators') || []; + var term = params.term; + var i = 0; + + var createTag = this.createTag || function (params) { + return { + id: params.term, + text: params.term + }; + }; + + while (i < term.length) { + var termChar = term[i]; + + if ($.inArray(termChar, separators) === -1) { + i++; + + continue; + } + + var part = term.substr(0, i); + var partParams = $.extend({}, params, { + term: part + }); + + var data = createTag(partParams); + + if (data == null) { + i++; + continue; + } + + callback(data); + + // Reset the term to not include the tokenized portion + term = term.substr(i + 1) || ''; + i = 0; + } + + return { + term: term + }; + }; + + return Tokenizer; +}); + +S2.define('select2/data/minimumInputLength',[ + +], function () { + function MinimumInputLength (decorated, $e, options) { + this.minimumInputLength = options.get('minimumInputLength'); + + decorated.call(this, $e, options); + } + + MinimumInputLength.prototype.query = function (decorated, params, callback) { + params.term = params.term || ''; + + if (params.term.length < this.minimumInputLength) { + this.trigger('results:message', { + message: 'inputTooShort', + args: { + minimum: this.minimumInputLength, + input: params.term, + params: params + } + }); + + return; + } + + decorated.call(this, params, callback); + }; + + return MinimumInputLength; +}); + +S2.define('select2/data/maximumInputLength',[ + +], function () { + function MaximumInputLength (decorated, $e, options) { + this.maximumInputLength = options.get('maximumInputLength'); + + decorated.call(this, $e, options); + } + + MaximumInputLength.prototype.query = function (decorated, params, callback) { + params.term = params.term || ''; + + if (this.maximumInputLength > 0 && + params.term.length > this.maximumInputLength) { + this.trigger('results:message', { + message: 'inputTooLong', + args: { + maximum: this.maximumInputLength, + input: params.term, + params: params + } + }); + + return; + } + + decorated.call(this, params, callback); + }; + + return MaximumInputLength; +}); + +S2.define('select2/data/maximumSelectionLength',[ + +], function (){ + function MaximumSelectionLength (decorated, $e, options) { + this.maximumSelectionLength = options.get('maximumSelectionLength'); + + decorated.call(this, $e, options); + } + + MaximumSelectionLength.prototype.query = + function (decorated, params, callback) { + var self = this; + + this.current(function (currentData) { + var count = currentData != null ? currentData.length : 0; + if (self.maximumSelectionLength > 0 && + count >= self.maximumSelectionLength) { + self.trigger('results:message', { + message: 'maximumSelected', + args: { + maximum: self.maximumSelectionLength + } + }); + return; + } + decorated.call(self, params, callback); + }); + }; + + return MaximumSelectionLength; +}); + +S2.define('select2/dropdown',[ + 'jquery', + './utils' +], function ($, Utils) { + function Dropdown ($element, options) { + this.$element = $element; + this.options = options; + + Dropdown.__super__.constructor.call(this); + } + + Utils.Extend(Dropdown, Utils.Observable); + + Dropdown.prototype.render = function () { + var $dropdown = $( + '<span class="select2-dropdown">' + + '<span class="select2-results"></span>' + + '</span>' + ); + + $dropdown.attr('dir', this.options.get('dir')); + + this.$dropdown = $dropdown; + + return $dropdown; + }; + + Dropdown.prototype.bind = function () { + // Should be implemented in subclasses + }; + + Dropdown.prototype.position = function ($dropdown, $container) { + // Should be implemented in subclasses + }; + + Dropdown.prototype.destroy = function () { + // Remove the dropdown from the DOM + this.$dropdown.remove(); + }; + + return Dropdown; +}); + +S2.define('select2/dropdown/search',[ + 'jquery', + '../utils' +], function ($, Utils) { + function Search () { } + + Search.prototype.render = function (decorated) { + var $rendered = decorated.call(this); + + var $search = $( + '<span class="select2-search select2-search--dropdown">' + + '<input class="select2-search__field" type="search" tabindex="-1"' + + ' autocomplete="off" autocorrect="off" autocapitalize="none"' + + ' spellcheck="false" role="textbox" />' + + '</span>' + ); + + this.$searchContainer = $search; + this.$search = $search.find('input'); + + $rendered.prepend($search); + + return $rendered; + }; + + Search.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + this.$search.on('keydown', function (evt) { + self.trigger('keypress', evt); + + self._keyUpPrevented = evt.isDefaultPrevented(); + }); + + // Workaround for browsers which do not support the `input` event + // This will prevent double-triggering of events for browsers which support + // both the `keyup` and `input` events. + this.$search.on('input', function (evt) { + // Unbind the duplicated `keyup` event + $(this).off('keyup'); + }); + + this.$search.on('keyup input', function (evt) { + self.handleSearch(evt); + }); + + container.on('open', function () { + self.$search.attr('tabindex', 0); + + self.$search.trigger('focus'); + + window.setTimeout(function () { + self.$search.trigger('focus'); + }, 0); + }); + + container.on('close', function () { + self.$search.attr('tabindex', -1); + + self.$search.val(''); + self.$search.trigger('blur'); + }); + + container.on('focus', function () { + if (!container.isOpen()) { + self.$search.trigger('focus'); + } + }); + + container.on('results:all', function (params) { + if (params.query.term == null || params.query.term === '') { + var showSearch = self.showSearch(params); + + if (showSearch) { + self.$searchContainer.removeClass('select2-search--hide'); + } else { + self.$searchContainer.addClass('select2-search--hide'); + } + } + }); + }; + + Search.prototype.handleSearch = function (evt) { + if (!this._keyUpPrevented) { + var input = this.$search.val(); + + this.trigger('query', { + term: input + }); + } + + this._keyUpPrevented = false; + }; + + Search.prototype.showSearch = function (_, params) { + return true; + }; + + return Search; +}); + +S2.define('select2/dropdown/hidePlaceholder',[ + +], function () { + function HidePlaceholder (decorated, $element, options, dataAdapter) { + this.placeholder = this.normalizePlaceholder(options.get('placeholder')); + + decorated.call(this, $element, options, dataAdapter); + } + + HidePlaceholder.prototype.append = function (decorated, data) { + data.results = this.removePlaceholder(data.results); + + decorated.call(this, data); + }; + + HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) { + if (typeof placeholder === 'string') { + placeholder = { + id: '', + text: placeholder + }; + } + + return placeholder; + }; + + HidePlaceholder.prototype.removePlaceholder = function (_, data) { + var modifiedData = data.slice(0); + + for (var d = data.length - 1; d >= 0; d--) { + var item = data[d]; + + if (this.placeholder.id === item.id) { + modifiedData.splice(d, 1); + } + } + + return modifiedData; + }; + + return HidePlaceholder; +}); + +S2.define('select2/dropdown/infiniteScroll',[ + 'jquery' +], function ($) { + function InfiniteScroll (decorated, $element, options, dataAdapter) { + this.lastParams = {}; + + decorated.call(this, $element, options, dataAdapter); + + this.$loadingMore = this.createLoadingMore(); + this.loading = false; + } + + InfiniteScroll.prototype.append = function (decorated, data) { + this.$loadingMore.remove(); + this.loading = false; + + decorated.call(this, data); + + if (this.showLoadingMore(data)) { + this.$results.append(this.$loadingMore); + this.loadMoreIfNeeded(); + } + }; + + InfiniteScroll.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('query', function (params) { + self.lastParams = params; + self.loading = true; + }); + + container.on('query:append', function (params) { + self.lastParams = params; + self.loading = true; + }); + + this.$results.on('scroll', this.loadMoreIfNeeded.bind(this)); + }; + + InfiniteScroll.prototype.loadMoreIfNeeded = function () { + var isLoadMoreVisible = $.contains( + document.documentElement, + this.$loadingMore[0] + ); + + if (this.loading || !isLoadMoreVisible) { + return; + } + + var currentOffset = this.$results.offset().top + + this.$results.outerHeight(false); + var loadingMoreOffset = this.$loadingMore.offset().top + + this.$loadingMore.outerHeight(false); + + if (currentOffset + 50 >= loadingMoreOffset) { + this.loadMore(); + } + }; + + InfiniteScroll.prototype.loadMore = function () { + this.loading = true; + + var params = $.extend({}, {page: 1}, this.lastParams); + + params.page++; + + this.trigger('query:append', params); + }; + + InfiniteScroll.prototype.showLoadingMore = function (_, data) { + return data.pagination && data.pagination.more; + }; + + InfiniteScroll.prototype.createLoadingMore = function () { + var $option = $( + '<li ' + + 'class="select2-results__option select2-results__option--load-more"' + + 'role="treeitem" aria-disabled="true"></li>' + ); + + var message = this.options.get('translations').get('loadingMore'); + + $option.html(message(this.lastParams)); + + return $option; + }; + + return InfiniteScroll; +}); + +S2.define('select2/dropdown/attachBody',[ + 'jquery', + '../utils' +], function ($, Utils) { + function AttachBody (decorated, $element, options) { + this.$dropdownParent = options.get('dropdownParent') || $(document.body); + + decorated.call(this, $element, options); + } + + AttachBody.prototype.bind = function (decorated, container, $container) { + var self = this; + + var setupResultsEvents = false; + + decorated.call(this, container, $container); + + container.on('open', function () { + self._showDropdown(); + self._attachPositioningHandler(container); + + if (!setupResultsEvents) { + setupResultsEvents = true; + + container.on('results:all', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('results:append', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + } + }); + + container.on('close', function () { + self._hideDropdown(); + self._detachPositioningHandler(container); + }); + + this.$dropdownContainer.on('mousedown', function (evt) { + evt.stopPropagation(); + }); + }; + + AttachBody.prototype.destroy = function (decorated) { + decorated.call(this); + + this.$dropdownContainer.remove(); + }; + + AttachBody.prototype.position = function (decorated, $dropdown, $container) { + // Clone all of the container classes + $dropdown.attr('class', $container.attr('class')); + + $dropdown.removeClass('select2'); + $dropdown.addClass('select2-container--open'); + + $dropdown.css({ + position: 'absolute', + top: -999999 + }); + + this.$container = $container; + }; + + AttachBody.prototype.render = function (decorated) { + var $container = $('<span></span>'); + + var $dropdown = decorated.call(this); + $container.append($dropdown); + + this.$dropdownContainer = $container; + + return $container; + }; + + AttachBody.prototype._hideDropdown = function (decorated) { + this.$dropdownContainer.detach(); + }; + + AttachBody.prototype._attachPositioningHandler = + function (decorated, container) { + var self = this; + + var scrollEvent = 'scroll.select2.' + container.id; + var resizeEvent = 'resize.select2.' + container.id; + var orientationEvent = 'orientationchange.select2.' + container.id; + + var $watchers = this.$container.parents().filter(Utils.hasScroll); + $watchers.each(function () { + Utils.StoreData(this, 'select2-scroll-position', { + x: $(this).scrollLeft(), + y: $(this).scrollTop() + }); + }); + + $watchers.on(scrollEvent, function (ev) { + var position = Utils.GetData(this, 'select2-scroll-position'); + $(this).scrollTop(position.y); + }); + + $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent, + function (e) { + self._positionDropdown(); + self._resizeDropdown(); + }); + }; + + AttachBody.prototype._detachPositioningHandler = + function (decorated, container) { + var scrollEvent = 'scroll.select2.' + container.id; + var resizeEvent = 'resize.select2.' + container.id; + var orientationEvent = 'orientationchange.select2.' + container.id; + + var $watchers = this.$container.parents().filter(Utils.hasScroll); + $watchers.off(scrollEvent); + + $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent); + }; + + AttachBody.prototype._positionDropdown = function () { + var $window = $(window); + + var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above'); + var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below'); + + var newDirection = null; + + var offset = this.$container.offset(); + + offset.bottom = offset.top + this.$container.outerHeight(false); + + var container = { + height: this.$container.outerHeight(false) + }; + + container.top = offset.top; + container.bottom = offset.top + container.height; + + var dropdown = { + height: this.$dropdown.outerHeight(false) + }; + + var viewport = { + top: $window.scrollTop(), + bottom: $window.scrollTop() + $window.height() + }; + + var enoughRoomAbove = viewport.top < (offset.top - dropdown.height); + var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height); + + var css = { + left: offset.left, + top: container.bottom + }; + + // Determine what the parent element is to use for calculating the offset + var $offsetParent = this.$dropdownParent; + + // For statically positioned elements, we need to get the element + // that is determining the offset + if ($offsetParent.css('position') === 'static') { + $offsetParent = $offsetParent.offsetParent(); + } + + var parentOffset = $offsetParent.offset(); + + css.top -= parentOffset.top; + css.left -= parentOffset.left; + + if (!isCurrentlyAbove && !isCurrentlyBelow) { + newDirection = 'below'; + } + + if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) { + newDirection = 'above'; + } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) { + newDirection = 'below'; + } + + if (newDirection == 'above' || + (isCurrentlyAbove && newDirection !== 'below')) { + css.top = container.top - parentOffset.top - dropdown.height; + } + + if (newDirection != null) { + this.$dropdown + .removeClass('select2-dropdown--below select2-dropdown--above') + .addClass('select2-dropdown--' + newDirection); + this.$container + .removeClass('select2-container--below select2-container--above') + .addClass('select2-container--' + newDirection); + } + + this.$dropdownContainer.css(css); + }; + + AttachBody.prototype._resizeDropdown = function () { + var css = { + width: this.$container.outerWidth(false) + 'px' + }; + + if (this.options.get('dropdownAutoWidth')) { + css.minWidth = css.width; + css.position = 'relative'; + css.width = 'auto'; + } + + this.$dropdown.css(css); + }; + + AttachBody.prototype._showDropdown = function (decorated) { + this.$dropdownContainer.appendTo(this.$dropdownParent); + + this._positionDropdown(); + this._resizeDropdown(); + }; + + return AttachBody; +}); + +S2.define('select2/dropdown/minimumResultsForSearch',[ + +], function () { + function countResults (data) { + var count = 0; + + for (var d = 0; d < data.length; d++) { + var item = data[d]; + + if (item.children) { + count += countResults(item.children); + } else { + count++; + } + } + + return count; + } + + function MinimumResultsForSearch (decorated, $element, options, dataAdapter) { + this.minimumResultsForSearch = options.get('minimumResultsForSearch'); + + if (this.minimumResultsForSearch < 0) { + this.minimumResultsForSearch = Infinity; + } + + decorated.call(this, $element, options, dataAdapter); + } + + MinimumResultsForSearch.prototype.showSearch = function (decorated, params) { + if (countResults(params.data.results) < this.minimumResultsForSearch) { + return false; + } + + return decorated.call(this, params); + }; + + return MinimumResultsForSearch; +}); + +S2.define('select2/dropdown/selectOnClose',[ + '../utils' +], function (Utils) { + function SelectOnClose () { } + + SelectOnClose.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('close', function (params) { + self._handleSelectOnClose(params); + }); + }; + + SelectOnClose.prototype._handleSelectOnClose = function (_, params) { + if (params && params.originalSelect2Event != null) { + var event = params.originalSelect2Event; + + // Don't select an item if the close event was triggered from a select or + // unselect event + if (event._type === 'select' || event._type === 'unselect') { + return; + } + } + + var $highlightedResults = this.getHighlightedResults(); + + // Only select highlighted results + if ($highlightedResults.length < 1) { + return; + } + + var data = Utils.GetData($highlightedResults[0], 'data'); + + // Don't re-select already selected resulte + if ( + (data.element != null && data.element.selected) || + (data.element == null && data.selected) + ) { + return; + } + + this.trigger('select', { + data: data + }); + }; + + return SelectOnClose; +}); + +S2.define('select2/dropdown/closeOnSelect',[ + +], function () { + function CloseOnSelect () { } + + CloseOnSelect.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('select', function (evt) { + self._selectTriggered(evt); + }); + + container.on('unselect', function (evt) { + self._selectTriggered(evt); + }); + }; + + CloseOnSelect.prototype._selectTriggered = function (_, evt) { + var originalEvent = evt.originalEvent; + + // Don't close if the control key is being held + if (originalEvent && (originalEvent.ctrlKey || originalEvent.metaKey)) { + return; + } + + this.trigger('close', { + originalEvent: originalEvent, + originalSelect2Event: evt + }); + }; + + return CloseOnSelect; +}); + +S2.define('select2/i18n/en',[],function () { + // English + return { + errorLoading: function () { + return 'The results could not be loaded.'; + }, + inputTooLong: function (args) { + var overChars = args.input.length - args.maximum; + + var message = 'Please delete ' + overChars + ' character'; + + if (overChars != 1) { + message += 's'; + } + + return message; + }, + inputTooShort: function (args) { + var remainingChars = args.minimum - args.input.length; + + var message = 'Please enter ' + remainingChars + ' or more characters'; + + return message; + }, + loadingMore: function () { + return 'Loading more results…'; + }, + maximumSelected: function (args) { + var message = 'You can only select ' + args.maximum + ' item'; + + if (args.maximum != 1) { + message += 's'; + } + + return message; + }, + noResults: function () { + return 'No results found'; + }, + searching: function () { + return 'Searching…'; + }, + removeAllItems: function () { + return 'Remove all items'; + } + }; +}); + +S2.define('select2/defaults',[ + 'jquery', + 'require', + + './results', + + './selection/single', + './selection/multiple', + './selection/placeholder', + './selection/allowClear', + './selection/search', + './selection/eventRelay', + + './utils', + './translation', + './diacritics', + + './data/select', + './data/array', + './data/ajax', + './data/tags', + './data/tokenizer', + './data/minimumInputLength', + './data/maximumInputLength', + './data/maximumSelectionLength', + + './dropdown', + './dropdown/search', + './dropdown/hidePlaceholder', + './dropdown/infiniteScroll', + './dropdown/attachBody', + './dropdown/minimumResultsForSearch', + './dropdown/selectOnClose', + './dropdown/closeOnSelect', + + './i18n/en' +], function ($, require, + + ResultsList, + + SingleSelection, MultipleSelection, Placeholder, AllowClear, + SelectionSearch, EventRelay, + + Utils, Translation, DIACRITICS, + + SelectData, ArrayData, AjaxData, Tags, Tokenizer, + MinimumInputLength, MaximumInputLength, MaximumSelectionLength, + + Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll, + AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect, + + EnglishTranslation) { + function Defaults () { + this.reset(); + } + + Defaults.prototype.apply = function (options) { + options = $.extend(true, {}, this.defaults, options); + + if (options.dataAdapter == null) { + if (options.ajax != null) { + options.dataAdapter = AjaxData; + } else if (options.data != null) { + options.dataAdapter = ArrayData; + } else { + options.dataAdapter = SelectData; + } + + if (options.minimumInputLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MinimumInputLength + ); + } + + if (options.maximumInputLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MaximumInputLength + ); + } + + if (options.maximumSelectionLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MaximumSelectionLength + ); + } + + if (options.tags) { + options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags); + } + + if (options.tokenSeparators != null || options.tokenizer != null) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + Tokenizer + ); + } + + if (options.query != null) { + var Query = require(options.amdBase + 'compat/query'); + + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + Query + ); + } + + if (options.initSelection != null) { + var InitSelection = require(options.amdBase + 'compat/initSelection'); + + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + InitSelection + ); + } + } + + if (options.resultsAdapter == null) { + options.resultsAdapter = ResultsList; + + if (options.ajax != null) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + InfiniteScroll + ); + } + + if (options.placeholder != null) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + HidePlaceholder + ); + } + + if (options.selectOnClose) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + SelectOnClose + ); + } + } + + if (options.dropdownAdapter == null) { + if (options.multiple) { + options.dropdownAdapter = Dropdown; + } else { + var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch); + + options.dropdownAdapter = SearchableDropdown; + } + + if (options.minimumResultsForSearch !== 0) { + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + MinimumResultsForSearch + ); + } + + if (options.closeOnSelect) { + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + CloseOnSelect + ); + } + + if ( + options.dropdownCssClass != null || + options.dropdownCss != null || + options.adaptDropdownCssClass != null + ) { + var DropdownCSS = require(options.amdBase + 'compat/dropdownCss'); + + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + DropdownCSS + ); + } + + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + AttachBody + ); + } + + if (options.selectionAdapter == null) { + if (options.multiple) { + options.selectionAdapter = MultipleSelection; + } else { + options.selectionAdapter = SingleSelection; + } + + // Add the placeholder mixin if a placeholder was specified + if (options.placeholder != null) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + Placeholder + ); + } + + if (options.allowClear) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + AllowClear + ); + } + + if (options.multiple) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + SelectionSearch + ); + } + + if ( + options.containerCssClass != null || + options.containerCss != null || + options.adaptContainerCssClass != null + ) { + var ContainerCSS = require(options.amdBase + 'compat/containerCss'); + + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + ContainerCSS + ); + } + + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + EventRelay + ); + } + + if (typeof options.language === 'string') { + // Check if the language is specified with a region + if (options.language.indexOf('-') > 0) { + // Extract the region information if it is included + var languageParts = options.language.split('-'); + var baseLanguage = languageParts[0]; + + options.language = [options.language, baseLanguage]; + } else { + options.language = [options.language]; + } + } + + if ($.isArray(options.language)) { + var languages = new Translation(); + options.language.push('en'); + + var languageNames = options.language; + + for (var l = 0; l < languageNames.length; l++) { + var name = languageNames[l]; + var language = {}; + + try { + // Try to load it with the original name + language = Translation.loadPath(name); + } catch (e) { + try { + // If we couldn't load it, check if it wasn't the full path + name = this.defaults.amdLanguageBase + name; + language = Translation.loadPath(name); + } catch (ex) { + // The translation could not be loaded at all. Sometimes this is + // because of a configuration problem, other times this can be + // because of how Select2 helps load all possible translation files. + if (options.debug && window.console && console.warn) { + console.warn( + 'Select2: The language file for "' + name + '" could not be ' + + 'automatically loaded. A fallback will be used instead.' + ); + } + + continue; + } + } + + languages.extend(language); + } + + options.translations = languages; + } else { + var baseTranslation = Translation.loadPath( + this.defaults.amdLanguageBase + 'en' + ); + var customTranslation = new Translation(options.language); + + customTranslation.extend(baseTranslation); + + options.translations = customTranslation; + } + + return options; + }; + + Defaults.prototype.reset = function () { + function stripDiacritics (text) { + // Used 'uni range + named function' from http://jsperf.com/diacritics/18 + function match(a) { + return DIACRITICS[a] || a; + } + + return text.replace(/[^\u0000-\u007E]/g, match); + } + + function matcher (params, data) { + // Always return the object if there is nothing to compare + if ($.trim(params.term) === '') { + return data; + } + + // Do a recursive check for options with children + if (data.children && data.children.length > 0) { + // Clone the data object if there are children + // This is required as we modify the object to remove any non-matches + var match = $.extend(true, {}, data); + + // Check each child of the option + for (var c = data.children.length - 1; c >= 0; c--) { + var child = data.children[c]; + + var matches = matcher(params, child); + + // If there wasn't a match, remove the object in the array + if (matches == null) { + match.children.splice(c, 1); + } + } + + // If any children matched, return the new object + if (match.children.length > 0) { + return match; + } + + // If there were no matching children, check just the plain object + return matcher(params, match); + } + + var original = stripDiacritics(data.text).toUpperCase(); + var term = stripDiacritics(params.term).toUpperCase(); + + // Check if the text contains the term + if (original.indexOf(term) > -1) { + return data; + } + + // If it doesn't contain the term, don't return anything + return null; + } + + this.defaults = { + amdBase: './', + amdLanguageBase: './i18n/', + closeOnSelect: true, + debug: false, + dropdownAutoWidth: false, + escapeMarkup: Utils.escapeMarkup, + language: EnglishTranslation, + matcher: matcher, + minimumInputLength: 0, + maximumInputLength: 0, + maximumSelectionLength: 0, + minimumResultsForSearch: 0, + selectOnClose: false, + scrollAfterSelect: false, + sorter: function (data) { + return data; + }, + templateResult: function (result) { + return result.text; + }, + templateSelection: function (selection) { + return selection.text; + }, + theme: 'default', + width: 'resolve' + }; + }; + + Defaults.prototype.set = function (key, value) { + var camelKey = $.camelCase(key); + + var data = {}; + data[camelKey] = value; + + var convertedData = Utils._convertData(data); + + $.extend(true, this.defaults, convertedData); + }; + + var defaults = new Defaults(); + + return defaults; +}); + +S2.define('select2/options',[ + 'require', + 'jquery', + './defaults', + './utils' +], function (require, $, Defaults, Utils) { + function Options (options, $element) { + this.options = options; + + if ($element != null) { + this.fromElement($element); + } + + this.options = Defaults.apply(this.options); + + if ($element && $element.is('input')) { + var InputCompat = require(this.get('amdBase') + 'compat/inputData'); + + this.options.dataAdapter = Utils.Decorate( + this.options.dataAdapter, + InputCompat + ); + } + } + + Options.prototype.fromElement = function ($e) { + var excludedData = ['select2']; + + if (this.options.multiple == null) { + this.options.multiple = $e.prop('multiple'); + } + + if (this.options.disabled == null) { + this.options.disabled = $e.prop('disabled'); + } + + if (this.options.language == null) { + if ($e.prop('lang')) { + this.options.language = $e.prop('lang').toLowerCase(); + } else if ($e.closest('[lang]').prop('lang')) { + this.options.language = $e.closest('[lang]').prop('lang'); + } + } + + if (this.options.dir == null) { + if ($e.prop('dir')) { + this.options.dir = $e.prop('dir'); + } else if ($e.closest('[dir]').prop('dir')) { + this.options.dir = $e.closest('[dir]').prop('dir'); + } else { + this.options.dir = 'ltr'; + } + } + + $e.prop('disabled', this.options.disabled); + $e.prop('multiple', this.options.multiple); + + if (Utils.GetData($e[0], 'select2Tags')) { + if (this.options.debug && window.console && console.warn) { + console.warn( + 'Select2: The `data-select2-tags` attribute has been changed to ' + + 'use the `data-data` and `data-tags="true"` attributes and will be ' + + 'removed in future versions of Select2.' + ); + } + + Utils.StoreData($e[0], 'data', Utils.GetData($e[0], 'select2Tags')); + Utils.StoreData($e[0], 'tags', true); + } + + if (Utils.GetData($e[0], 'ajaxUrl')) { + if (this.options.debug && window.console && console.warn) { + console.warn( + 'Select2: The `data-ajax-url` attribute has been changed to ' + + '`data-ajax--url` and support for the old attribute will be removed' + + ' in future versions of Select2.' + ); + } + + $e.attr('ajax--url', Utils.GetData($e[0], 'ajaxUrl')); + Utils.StoreData($e[0], 'ajax-Url', Utils.GetData($e[0], 'ajaxUrl')); + } + + var dataset = {}; + + function upperCaseLetter(_, letter) { + return letter.toUpperCase(); + } + + // Pre-load all of the attributes which are prefixed with `data-` + for (var attr = 0; attr < $e[0].attributes.length; attr++) { + var attributeName = $e[0].attributes[attr].name; + var prefix = 'data-'; + + if (attributeName.substr(0, prefix.length) == prefix) { + // Get the contents of the attribute after `data-` + var dataName = attributeName.substring(prefix.length); + + // Get the data contents from the consistent source + // This is more than likely the jQuery data helper + var dataValue = Utils.GetData($e[0], dataName); + + // camelCase the attribute name to match the spec + var camelDataName = dataName.replace(/-([a-z])/g, upperCaseLetter); + + // Store the data attribute contents into the dataset since + dataset[camelDataName] = dataValue; + } + } + + // Prefer the element's `dataset` attribute if it exists + // jQuery 1.x does not correctly handle data attributes with multiple dashes + if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) { + dataset = $.extend(true, {}, $e[0].dataset, dataset); + } + + // Prefer our internal data cache if it exists + var data = $.extend(true, {}, Utils.GetData($e[0]), dataset); + + data = Utils._convertData(data); + + for (var key in data) { + if ($.inArray(key, excludedData) > -1) { + continue; + } + + if ($.isPlainObject(this.options[key])) { + $.extend(this.options[key], data[key]); + } else { + this.options[key] = data[key]; + } + } + + return this; + }; + + Options.prototype.get = function (key) { + return this.options[key]; + }; + + Options.prototype.set = function (key, val) { + this.options[key] = val; + }; + + return Options; +}); + +S2.define('select2/core',[ + 'jquery', + './options', + './utils', + './keys' +], function ($, Options, Utils, KEYS) { + var Select2 = function ($element, options) { + if (Utils.GetData($element[0], 'select2') != null) { + Utils.GetData($element[0], 'select2').destroy(); + } + + this.$element = $element; + + this.id = this._generateId($element); + + options = options || {}; + + this.options = new Options(options, $element); + + Select2.__super__.constructor.call(this); + + // Set up the tabindex + + var tabindex = $element.attr('tabindex') || 0; + Utils.StoreData($element[0], 'old-tabindex', tabindex); + $element.attr('tabindex', '-1'); + + // Set up containers and adapters + + var DataAdapter = this.options.get('dataAdapter'); + this.dataAdapter = new DataAdapter($element, this.options); + + var $container = this.render(); + + this._placeContainer($container); + + var SelectionAdapter = this.options.get('selectionAdapter'); + this.selection = new SelectionAdapter($element, this.options); + this.$selection = this.selection.render(); + + this.selection.position(this.$selection, $container); + + var DropdownAdapter = this.options.get('dropdownAdapter'); + this.dropdown = new DropdownAdapter($element, this.options); + this.$dropdown = this.dropdown.render(); + + this.dropdown.position(this.$dropdown, $container); + + var ResultsAdapter = this.options.get('resultsAdapter'); + this.results = new ResultsAdapter($element, this.options, this.dataAdapter); + this.$results = this.results.render(); + + this.results.position(this.$results, this.$dropdown); + + // Bind events + + var self = this; + + // Bind the container to all of the adapters + this._bindAdapters(); + + // Register any DOM event handlers + this._registerDomEvents(); + + // Register any internal event handlers + this._registerDataEvents(); + this._registerSelectionEvents(); + this._registerDropdownEvents(); + this._registerResultsEvents(); + this._registerEvents(); + + // Set the initial state + this.dataAdapter.current(function (initialData) { + self.trigger('selection:update', { + data: initialData + }); + }); + + // Hide the original select + $element.addClass('select2-hidden-accessible'); + $element.attr('aria-hidden', 'true'); + + // Synchronize any monitored attributes + this._syncAttributes(); + + Utils.StoreData($element[0], 'select2', this); + + // Ensure backwards compatibility with $element.data('select2'). + $element.data('select2', this); + }; + + Utils.Extend(Select2, Utils.Observable); + + Select2.prototype._generateId = function ($element) { + var id = ''; + + if ($element.attr('id') != null) { + id = $element.attr('id'); + } else if ($element.attr('name') != null) { + id = $element.attr('name') + '-' + Utils.generateChars(2); + } else { + id = Utils.generateChars(4); + } + + id = id.replace(/(:|\.|\[|\]|,)/g, ''); + id = 'select2-' + id; + + return id; + }; + + Select2.prototype._placeContainer = function ($container) { + $container.insertAfter(this.$element); + + var width = this._resolveWidth(this.$element, this.options.get('width')); + + if (width != null) { + $container.css('width', width); + } + }; + + Select2.prototype._resolveWidth = function ($element, method) { + var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i; + + if (method == 'resolve') { + var styleWidth = this._resolveWidth($element, 'style'); + + if (styleWidth != null) { + return styleWidth; + } + + return this._resolveWidth($element, 'element'); + } + + if (method == 'element') { + var elementWidth = $element.outerWidth(false); + + if (elementWidth <= 0) { + return 'auto'; + } + + return elementWidth + 'px'; + } + + if (method == 'style') { + var style = $element.attr('style'); + + if (typeof(style) !== 'string') { + return null; + } + + var attrs = style.split(';'); + + for (var i = 0, l = attrs.length; i < l; i = i + 1) { + var attr = attrs[i].replace(/\s/g, ''); + var matches = attr.match(WIDTH); + + if (matches !== null && matches.length >= 1) { + return matches[1]; + } + } + + return null; + } + + if (method == 'computedstyle') { + var computedStyle = window.getComputedStyle($element[0]); + + return computedStyle.width; + } + + return method; + }; + + Select2.prototype._bindAdapters = function () { + this.dataAdapter.bind(this, this.$container); + this.selection.bind(this, this.$container); + + this.dropdown.bind(this, this.$container); + this.results.bind(this, this.$container); + }; + + Select2.prototype._registerDomEvents = function () { + var self = this; + + this.$element.on('change.select2', function () { + self.dataAdapter.current(function (data) { + self.trigger('selection:update', { + data: data + }); + }); + }); + + this.$element.on('focus.select2', function (evt) { + self.trigger('focus', evt); + }); + + this._syncA = Utils.bind(this._syncAttributes, this); + this._syncS = Utils.bind(this._syncSubtree, this); + + if (this.$element[0].attachEvent) { + this.$element[0].attachEvent('onpropertychange', this._syncA); + } + + var observer = window.MutationObserver || + window.WebKitMutationObserver || + window.MozMutationObserver + ; + + if (observer != null) { + this._observer = new observer(function (mutations) { + $.each(mutations, self._syncA); + $.each(mutations, self._syncS); + }); + this._observer.observe(this.$element[0], { + attributes: true, + childList: true, + subtree: false + }); + } else if (this.$element[0].addEventListener) { + this.$element[0].addEventListener( + 'DOMAttrModified', + self._syncA, + false + ); + this.$element[0].addEventListener( + 'DOMNodeInserted', + self._syncS, + false + ); + this.$element[0].addEventListener( + 'DOMNodeRemoved', + self._syncS, + false + ); + } + }; + + Select2.prototype._registerDataEvents = function () { + var self = this; + + this.dataAdapter.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerSelectionEvents = function () { + var self = this; + var nonRelayEvents = ['toggle', 'focus']; + + this.selection.on('toggle', function () { + self.toggleDropdown(); + }); + + this.selection.on('focus', function (params) { + self.focus(params); + }); + + this.selection.on('*', function (name, params) { + if ($.inArray(name, nonRelayEvents) !== -1) { + return; + } + + self.trigger(name, params); + }); + }; + + Select2.prototype._registerDropdownEvents = function () { + var self = this; + + this.dropdown.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerResultsEvents = function () { + var self = this; + + this.results.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerEvents = function () { + var self = this; + + this.on('open', function () { + self.$container.addClass('select2-container--open'); + }); + + this.on('close', function () { + self.$container.removeClass('select2-container--open'); + }); + + this.on('enable', function () { + self.$container.removeClass('select2-container--disabled'); + }); + + this.on('disable', function () { + self.$container.addClass('select2-container--disabled'); + }); + + this.on('blur', function () { + self.$container.removeClass('select2-container--focus'); + }); + + this.on('query', function (params) { + if (!self.isOpen()) { + self.trigger('open', {}); + } + + this.dataAdapter.query(params, function (data) { + self.trigger('results:all', { + data: data, + query: params + }); + }); + }); + + this.on('query:append', function (params) { + this.dataAdapter.query(params, function (data) { + self.trigger('results:append', { + data: data, + query: params + }); + }); + }); + + this.on('keypress', function (evt) { + var key = evt.which; + + if (self.isOpen()) { + if (key === KEYS.ESC || key === KEYS.TAB || + (key === KEYS.UP && evt.altKey)) { + self.close(); + + evt.preventDefault(); + } else if (key === KEYS.ENTER) { + self.trigger('results:select', {}); + + evt.preventDefault(); + } else if ((key === KEYS.SPACE && evt.ctrlKey)) { + self.trigger('results:toggle', {}); + + evt.preventDefault(); + } else if (key === KEYS.UP) { + self.trigger('results:previous', {}); + + evt.preventDefault(); + } else if (key === KEYS.DOWN) { + self.trigger('results:next', {}); + + evt.preventDefault(); + } + } else { + if (key === KEYS.ENTER || key === KEYS.SPACE || + (key === KEYS.DOWN && evt.altKey)) { + self.open(); + + evt.preventDefault(); + } + } + }); + }; + + Select2.prototype._syncAttributes = function () { + this.options.set('disabled', this.$element.prop('disabled')); + + if (this.options.get('disabled')) { + if (this.isOpen()) { + this.close(); + } + + this.trigger('disable', {}); + } else { + this.trigger('enable', {}); + } + }; + + Select2.prototype._syncSubtree = function (evt, mutations) { + var changed = false; + var self = this; + + // Ignore any mutation events raised for elements that aren't options or + // optgroups. This handles the case when the select element is destroyed + if ( + evt && evt.target && ( + evt.target.nodeName !== 'OPTION' && evt.target.nodeName !== 'OPTGROUP' + ) + ) { + return; + } + + if (!mutations) { + // If mutation events aren't supported, then we can only assume that the + // change affected the selections + changed = true; + } else if (mutations.addedNodes && mutations.addedNodes.length > 0) { + for (var n = 0; n < mutations.addedNodes.length; n++) { + var node = mutations.addedNodes[n]; + + if (node.selected) { + changed = true; + } + } + } else if (mutations.removedNodes && mutations.removedNodes.length > 0) { + changed = true; + } + + // Only re-pull the data if we think there is a change + if (changed) { + this.dataAdapter.current(function (currentData) { + self.trigger('selection:update', { + data: currentData + }); + }); + } + }; + + /** + * Override the trigger method to automatically trigger pre-events when + * there are events that can be prevented. + */ + Select2.prototype.trigger = function (name, args) { + var actualTrigger = Select2.__super__.trigger; + var preTriggerMap = { + 'open': 'opening', + 'close': 'closing', + 'select': 'selecting', + 'unselect': 'unselecting', + 'clear': 'clearing' + }; + + if (args === undefined) { + args = {}; + } + + if (name in preTriggerMap) { + var preTriggerName = preTriggerMap[name]; + var preTriggerArgs = { + prevented: false, + name: name, + args: args + }; + + actualTrigger.call(this, preTriggerName, preTriggerArgs); + + if (preTriggerArgs.prevented) { + args.prevented = true; + + return; + } + } + + actualTrigger.call(this, name, args); + }; + + Select2.prototype.toggleDropdown = function () { + if (this.options.get('disabled')) { + return; + } + + if (this.isOpen()) { + this.close(); + } else { + this.open(); + } + }; + + Select2.prototype.open = function () { + if (this.isOpen()) { + return; + } + + this.trigger('query', {}); + }; + + Select2.prototype.close = function () { + if (!this.isOpen()) { + return; + } + + this.trigger('close', {}); + }; + + Select2.prototype.isOpen = function () { + return this.$container.hasClass('select2-container--open'); + }; + + Select2.prototype.hasFocus = function () { + return this.$container.hasClass('select2-container--focus'); + }; + + Select2.prototype.focus = function (data) { + // No need to re-trigger focus events if we are already focused + if (this.hasFocus()) { + return; + } + + this.$container.addClass('select2-container--focus'); + this.trigger('focus', {}); + }; + + Select2.prototype.enable = function (args) { + if (this.options.get('debug') && window.console && console.warn) { + console.warn( + 'Select2: The `select2("enable")` method has been deprecated and will' + + ' be removed in later Select2 versions. Use $element.prop("disabled")' + + ' instead.' + ); + } + + if (args == null || args.length === 0) { + args = [true]; + } + + var disabled = !args[0]; + + this.$element.prop('disabled', disabled); + }; + + Select2.prototype.data = function () { + if (this.options.get('debug') && + arguments.length > 0 && window.console && console.warn) { + console.warn( + 'Select2: Data can no longer be set using `select2("data")`. You ' + + 'should consider setting the value instead using `$element.val()`.' + ); + } + + var data = []; + + this.dataAdapter.current(function (currentData) { + data = currentData; + }); + + return data; + }; + + Select2.prototype.val = function (args) { + if (this.options.get('debug') && window.console && console.warn) { + console.warn( + 'Select2: The `select2("val")` method has been deprecated and will be' + + ' removed in later Select2 versions. Use $element.val() instead.' + ); + } + + if (args == null || args.length === 0) { + return this.$element.val(); + } + + var newVal = args[0]; + + if ($.isArray(newVal)) { + newVal = $.map(newVal, function (obj) { + return obj.toString(); + }); + } + + this.$element.val(newVal).trigger('change'); + }; + + Select2.prototype.destroy = function () { + this.$container.remove(); + + if (this.$element[0].detachEvent) { + this.$element[0].detachEvent('onpropertychange', this._syncA); + } + + if (this._observer != null) { + this._observer.disconnect(); + this._observer = null; + } else if (this.$element[0].removeEventListener) { + this.$element[0] + .removeEventListener('DOMAttrModified', this._syncA, false); + this.$element[0] + .removeEventListener('DOMNodeInserted', this._syncS, false); + this.$element[0] + .removeEventListener('DOMNodeRemoved', this._syncS, false); + } + + this._syncA = null; + this._syncS = null; + + this.$element.off('.select2'); + this.$element.attr('tabindex', + Utils.GetData(this.$element[0], 'old-tabindex')); + + this.$element.removeClass('select2-hidden-accessible'); + this.$element.attr('aria-hidden', 'false'); + Utils.RemoveData(this.$element[0]); + this.$element.removeData('select2'); + + this.dataAdapter.destroy(); + this.selection.destroy(); + this.dropdown.destroy(); + this.results.destroy(); + + this.dataAdapter = null; + this.selection = null; + this.dropdown = null; + this.results = null; + }; + + Select2.prototype.render = function () { + var $container = $( + '<span class="select2 select2-container">' + + '<span class="selection"></span>' + + '<span class="dropdown-wrapper" aria-hidden="true"></span>' + + '</span>' + ); + + $container.attr('dir', this.options.get('dir')); + + this.$container = $container; + + this.$container.addClass('select2-container--' + this.options.get('theme')); + + Utils.StoreData($container[0], 'element', this.$element); + + return $container; + }; + + return Select2; +}); + +S2.define('jquery-mousewheel',[ + 'jquery' +], function ($) { + // Used to shim jQuery.mousewheel for non-full builds. + return $; +}); + +S2.define('jquery.select2',[ + 'jquery', + 'jquery-mousewheel', + + './select2/core', + './select2/defaults', + './select2/utils' +], function ($, _, Select2, Defaults, Utils) { + if ($.fn.select2 == null) { + // All methods that should return the element + var thisMethods = ['open', 'close', 'destroy']; + + $.fn.select2 = function (options) { + options = options || {}; + + if (typeof options === 'object') { + this.each(function () { + var instanceOptions = $.extend(true, {}, options); + + var instance = new Select2($(this), instanceOptions); + }); + + return this; + } else if (typeof options === 'string') { + var ret; + var args = Array.prototype.slice.call(arguments, 1); + + this.each(function () { + var instance = Utils.GetData(this, 'select2'); + + if (instance == null && window.console && console.error) { + console.error( + 'The select2(\'' + options + '\') method was called on an ' + + 'element that is not using Select2.' + ); + } + + ret = instance[options].apply(instance, args); + }); + + // Check if we should be returning `this` + if ($.inArray(options, thisMethods) > -1) { + return this; + } + + return ret; + } else { + throw new Error('Invalid arguments for Select2: ' + options); + } + }; + } + + if ($.fn.select2.defaults == null) { + $.fn.select2.defaults = Defaults; + } + + return Select2; +}); + + // Return the AMD loader configuration so it can be used outside of this file + return { + define: S2.define, + require: S2.require + }; +}()); + + // Autoload the jQuery bindings + // We know that all of the modules exist above this, so we're safe + var select2 = S2.require('jquery.select2'); + + // Hold the AMD module references on the jQuery function that was just loaded + // This allows Select2 to use the internal loader outside of this file, such + // as in the language files. + jQuery.fn.select2.amd = S2; + + // Return the Select2 instance for anyone who is importing it. + return select2; +})); +/*! + * jQuery cxSelect + * @name jquery.cxselect.js + * @version 1.4.1 + * @date 2016-11-02 + * @author ciaoca + * @email ciaoca@gmail.com + * @site https://github.com/ciaoca/cxSelect + * @license Released under the MIT license + */ + +(function(factory) { + if (typeof define === 'function' && define.amd) { + define(['jquery'], factory); + } else { + factory(window.jQuery || window.Zepto || window.$); + }; +}(function($) { + var cxSelect = function() { + var self = this; + var dom, settings, callback; + + // 分配参数 + for (var i = 0, l = arguments.length; i < l; i++) { + if (cxSelect.isJquery(arguments[i]) || cxSelect.isZepto(arguments[i])) { + dom = arguments[i]; + } else if (cxSelect.isElement(arguments[i])) { + dom = $(arguments[i]); + } else if (typeof arguments[i] === 'function') { + callback = arguments[i]; + } else if (typeof arguments[i] === 'object') { + settings = arguments[i]; + }; + }; + + var api = new cxSelect.init(dom, settings); + + if (typeof callback === 'function') { + callback(api); + }; + + return api; + }; + + cxSelect.isElement = function(o){ + if (o && (typeof HTMLElement === 'function' || typeof HTMLElement === 'object') && o instanceof HTMLElement) { + return true; + } else { + return (o && o.nodeType && o.nodeType === 1) ? true : false; + }; + }; + + cxSelect.isJquery = function(o){ + return (o && o.length && (typeof jQuery === 'function' || typeof jQuery === 'object') && o instanceof jQuery) ? true : false; + }; + + cxSelect.isZepto = function(o){ + return (o && o.length && (typeof Zepto === 'function' || typeof Zepto === 'object') && Zepto.zepto.isZ(o)) ? true : false; + }; + + cxSelect.getIndex = function(n, required) { + return required ? n : n - 1; + }; + + cxSelect.getData = function(data, space) { + if (typeof space === 'string' && space.length) { + space = space.split('.'); + for (var i = 0, l = space.length; i < l; i++) { + data = data[space[i]]; + }; + }; + return data; + }; + + cxSelect.init = function(dom, settings) { + var self = this; + + if (!cxSelect.isJquery(dom) && !cxSelect.isZepto(dom)) {return}; + + var theSelect = { + dom: { + box: dom + } + }; + + self.attach = cxSelect.attach.bind(theSelect); + self.detach = cxSelect.detach.bind(theSelect); + self.setOptions = cxSelect.setOptions.bind(theSelect); + self.clear = cxSelect.clear.bind(theSelect); + + theSelect.changeEvent = function() { + cxSelect.selectChange.call(theSelect, this.className); + }; + + theSelect.settings = $.extend({}, $.cxSelect.defaults, settings, { + url: theSelect.dom.box.data('url'), + emptyStyle: theSelect.dom.box.data('emptyStyle'), + required: theSelect.dom.box.data('required'), + firstTitle: theSelect.dom.box.data('firstTitle'), + firstValue: theSelect.dom.box.data('firstValue'), + jsonSpace: theSelect.dom.box.data('jsonSpace'), + jsonName: theSelect.dom.box.data('jsonName'), + jsonValue: theSelect.dom.box.data('jsonValue'), + jsonSub: theSelect.dom.box.data('jsonSub') + }); + + var _dataSelects = theSelect.dom.box.data('selects'); + + if (typeof _dataSelects === 'string' && _dataSelects.length) { + theSelect.settings.selects = _dataSelects.split(','); + }; + + self.setOptions(); + self.attach(); + + // 使用独立接口获取数据 + if (!theSelect.settings.url && !theSelect.settings.data) { + cxSelect.start.apply(theSelect); + + // 设置自定义数据 + } else if ($.isArray(theSelect.settings.data)) { + cxSelect.start.call(theSelect, theSelect.settings.data); + + // 设置 URL,通过 Ajax 获取数据 + } else if (typeof theSelect.settings.url === 'string' && theSelect.settings.url.length) { + $.getJSON(theSelect.settings.url, function(json) { + cxSelect.start.call(theSelect, json); + }); + }; + }; + + // 设置参数 + cxSelect.setOptions = function(opts) { + var self = this; + + if (opts) { + $.extend(self.settings, opts); + }; + + // 初次或重设选择器组 + if (!$.isArray(self.selectArray) || !self.selectArray.length || (opts && opts.selects)) { + self.selectArray = []; + + if ($.isArray(self.settings.selects) && self.settings.selects.length) { + var _tempSelect; + + for (var i = 0, l = self.settings.selects.length; i < l; i++) { + _tempSelect = self.dom.box.find('select.' + self.settings.selects[i]); + + if (!_tempSelect || !_tempSelect.length) {break}; + + self.selectArray.push(_tempSelect); + }; + }; + }; + + if (opts) { + if (!$.isArray(opts.data) && typeof opts.url === 'string' && opts.url.length) { + $.getJSON(self.settings.url, function(json) { + cxSelect.start.call(self, json); + }); + + } else { + cxSelect.start.call(self, opts.data); + }; + }; + }; + + // 绑定 + cxSelect.attach = function() { + var self = this; + + if (!self.attachStatus) { + self.dom.box.on('change', 'select', self.changeEvent); + }; + + if (typeof self.attachStatus === 'boolean') { + cxSelect.start.call(self); + }; + + self.attachStatus = true; + }; + + // 移除绑定 + cxSelect.detach = function() { + var self = this; + self.dom.box.off('change', 'select', self.changeEvent); + self.attachStatus = false; + }; + + // 清空选项 + cxSelect.clear = function(index) { + var self = this; + var _style = { + display: '', + visibility: '' + }; + + index = isNaN(index) ? 0 : index; + + // 清空后面的 select + for (var i = index, l = self.selectArray.length; i < l; i++) { + self.selectArray[i].empty().prop('disabled', true); + + if (self.settings.emptyStyle === 'none') { + _style.display = 'none'; + } else if (self.settings.emptyStyle === 'hidden') { + _style.visibility = 'hidden'; + }; + + self.selectArray[i].css(_style); + }; + }; + + cxSelect.start = function(data) { + var self = this; + + if ($.isArray(data)) { + self.settings.data = cxSelect.getData(data, self.settings.jsonSpace); + }; + + if (!self.selectArray.length) {return}; + + // 保存默认值 + for (var i = 0, l = self.selectArray.length; i < l; i++) { + if (typeof self.selectArray[i].attr('data-value') !== 'string' && self.selectArray[i][0].options.length) { + self.selectArray[i].attr('data-value', self.selectArray[i].val()); + }; + }; + + if (self.settings.data || (typeof self.selectArray[0].data('url') === 'string' && self.selectArray[0].data('url').length)) { + cxSelect.getOptionData.call(self, 0); + } else { + self.selectArray[0].prop('disabled', false).css({ + 'display': '', + 'visibility': '' + }); + }; + }; + + // 获取选项数据 + cxSelect.getOptionData = function(index) { + var self = this; + + if (typeof index !== 'number' || isNaN(index) || index < 0 || index >= self.selectArray.length) {return}; + + var _indexPrev = index - 1; + var _select = self.selectArray[index]; + var _selectData; + var _valueIndex; + var _dataUrl = _select.data('url'); + var _jsonSpace = typeof _select.data('jsonSpace') === 'undefined' ? self.settings.jsonSpace : _select.data('jsonSpace'); + var _query = {}; + var _queryName; + var _selectName; + var _selectValue; + + cxSelect.clear.call(self, index); + + // 使用独立接口 + if (typeof _dataUrl === 'string' && _dataUrl.length) { + if (index > 0) { + for (var i = 0, j = 1; i < index; i++, j++) { + _queryName = self.selectArray[j].data('queryName'); + _selectName = self.selectArray[i].attr('name'); + _selectValue = self.selectArray[i].val(); + + if (typeof _queryName === 'string' && _queryName.length) { + _query[_queryName] = _selectValue; + } else if (typeof _selectName === 'string' && _selectName.length) { + _query[_selectName] = _selectValue; + }; + }; + }; + + $.getJSON(_dataUrl, _query, function(json) { + _selectData = cxSelect.getData(json, _jsonSpace); + + cxSelect.buildOption.call(self, index, _selectData); + }); + + // 使用整合数据 + } else if (self.settings.data && typeof self.settings.data === 'object') { + _selectData = self.settings.data; + + for (var i = 0; i < index; i++) { + _valueIndex = cxSelect.getIndex(self.selectArray[i][0].selectedIndex, typeof self.selectArray[i].data('required') === 'boolean' ? self.selectArray[i].data('required') : self.settings.required); + + if (typeof _selectData[_valueIndex] === 'object' && $.isArray(_selectData[_valueIndex][self.settings.jsonSub]) && _selectData[_valueIndex][self.settings.jsonSub].length) { + _selectData = _selectData[_valueIndex][self.settings.jsonSub]; + } else { + _selectData = null; + break; + }; + }; + + cxSelect.buildOption.call(self, index, _selectData); + }; + }; + + // 构建选项列表 + cxSelect.buildOption = function(index, data) { + var self = this; + + var _select = self.selectArray[index]; + var _required = typeof _select.data('required') === 'boolean' ? _select.data('required') : self.settings.required; + var _firstTitle = typeof _select.data('firstTitle') === 'undefined' ? self.settings.firstTitle : _select.data('firstTitle'); + var _firstValue = typeof _select.data('firstValue') === 'undefined' ? self.settings.firstValue : _select.data('firstValue'); + var _jsonName = typeof _select.data('jsonName') === 'undefined' ? self.settings.jsonName : _select.data('jsonName'); + var _jsonValue = typeof _select.data('jsonValue') === 'undefined' ? self.settings.jsonValue : _select.data('jsonValue'); + + if (!$.isArray(data)) {return}; + + var _html = !_required ? '<option value="' + String(_firstValue) + '">' + String(_firstTitle) + '</option>' : ''; + + // 区分标题、值的数据 + if (typeof _jsonName === 'string' && _jsonName.length) { + // 无值字段时使用标题作为值 + if (typeof _jsonValue !== 'string' || !_jsonValue.length) { + _jsonValue = _jsonName; + }; + + for (var i = 0, l = data.length; i < l; i++) { + _html += '<option value="' + String(data[i][_jsonValue]) + '">' + String(data[i][_jsonName]) + '</option>'; + }; + + // 数组即为值的数据 + } else { + for (var i = 0, l = data.length; i < l; i++) { + _html += '<option value="' + String(data[i]) + '">' + String(data[i]) + '</option>'; + }; + }; + + _select.html(_html).prop('disabled', false).css({ + 'display': '', + 'visibility': '' + }); + + // 初次加载设置默认值 + if (typeof _select.attr('data-value') === 'string') { + _select.val(String(_select.attr('data-value'))).removeAttr('data-value'); + + if (_select[0].selectedIndex < 0) { + _select[0].options[0].selected = true; + }; + }; + + if (_required || _select[0].selectedIndex > 0) { + _select.trigger('change'); + }; + + }; + + // 改变选择时的处理 + cxSelect.selectChange = function(name) { + var self = this; + + if (typeof name !== 'string' || !name.length) {return}; + + var index; + + name = name.replace(/\s+/g, ','); + name = ',' + name + ','; + + // 获取当前 select 位置 + for (var i = 0, l = self.selectArray.length; i < l; i++) { + if (name.indexOf(',' + self.settings.selects[i] + ',') > -1) { + index = i; + break; + }; + }; + + if (typeof index === 'number' && index > -1) { + index += 1; + cxSelect.getOptionData.call(self, index); + }; + }; + + $.cxSelect = function() { + return cxSelect.apply(this, arguments); + }; + + // 默认值 + $.cxSelect.defaults = { + selects: [], // 下拉选框组 + url: null, // 列表数据文件路径(URL)或数组数据 + data: null, // 自定义数据 + emptyStyle: null, // 无数据状态显示方式 + required: false, // 是否为必选 + firstTitle: '请选择', // 第一个选项的标题 + firstValue: '', // 第一个选项的值 + jsonSpace: '', // 数据命名空间 + jsonName: 'n', // 数据标题字段名称 + jsonValue: '', // 数据值字段名称 + jsonSub: 's' // 子集数据字段名称 + }; + + $.fn.cxSelect = function(settings, callback) { + this.each(function(i) { + $.cxSelect(this, settings, callback); + }); + return this; + }; +})); +/*! + * Datepicker for Bootstrap v1.9.0 (https://github.com/uxsolutions/bootstrap-datepicker) + * + * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) + */ + + +(function(factory){ + if (typeof define === 'function' && define.amd) { + define(['jquery'], factory); + } else if (typeof exports === 'object') { + factory(require('jquery')); + } else { + factory(jQuery); + } +}(function($, undefined){ + function UTCDate(){ + return new Date(Date.UTC.apply(Date, arguments)); + } + function UTCToday(){ + var today = new Date(); + return UTCDate(today.getFullYear(), today.getMonth(), today.getDate()); + } + function isUTCEquals(date1, date2) { + return ( + date1.getUTCFullYear() === date2.getUTCFullYear() && + date1.getUTCMonth() === date2.getUTCMonth() && + date1.getUTCDate() === date2.getUTCDate() + ); + } + function alias(method, deprecationMsg){ + return function(){ + if (deprecationMsg !== undefined) { + $.fn.datepicker.deprecated(deprecationMsg); + } + + return this[method].apply(this, arguments); + }; + } + function isValidDate(d) { + return d && !isNaN(d.getTime()); + } + + var DateArray = (function(){ + var extras = { + get: function(i){ + return this.slice(i)[0]; + }, + contains: function(d){ + // Array.indexOf is not cross-browser; + // $.inArray doesn't work with Dates + var val = d && d.valueOf(); + for (var i=0, l=this.length; i < l; i++) + // Use date arithmetic to allow dates with different times to match + if (0 <= this[i].valueOf() - val && this[i].valueOf() - val < 1000*60*60*24) + return i; + return -1; + }, + remove: function(i){ + this.splice(i,1); + }, + replace: function(new_array){ + if (!new_array) + return; + if (!$.isArray(new_array)) + new_array = [new_array]; + this.clear(); + this.push.apply(this, new_array); + }, + clear: function(){ + this.length = 0; + }, + copy: function(){ + var a = new DateArray(); + a.replace(this); + return a; + } + }; + + return function(){ + var a = []; + a.push.apply(a, arguments); + $.extend(a, extras); + return a; + }; + })(); + + + // Picker object + + var Datepicker = function(element, options){ + $.data(element, 'datepicker', this); + + this._events = []; + this._secondaryEvents = []; + + this._process_options(options); + + this.dates = new DateArray(); + this.viewDate = this.o.defaultViewDate; + this.focusDate = null; + + this.element = $(element); + this.isInput = this.element.is('input'); + this.inputField = this.isInput ? this.element : this.element.find('input'); + this.component = this.element.hasClass('date') ? this.element.find('.add-on, .input-group-addon, .input-group-append, .input-group-prepend, .btn') : false; + if (this.component && this.component.length === 0) + this.component = false; + this.isInline = !this.component && this.element.is('div'); + + this.picker = $(DPGlobal.template); + + // Checking templates and inserting + if (this._check_template(this.o.templates.leftArrow)) { + this.picker.find('.prev').html(this.o.templates.leftArrow); + } + + if (this._check_template(this.o.templates.rightArrow)) { + this.picker.find('.next').html(this.o.templates.rightArrow); + } + + this._buildEvents(); + this._attachEvents(); + + if (this.isInline){ + this.picker.addClass('datepicker-inline').appendTo(this.element); + } + else { + this.picker.addClass('datepicker-dropdown dropdown-menu'); + } + + if (this.o.rtl){ + this.picker.addClass('datepicker-rtl'); + } + + if (this.o.calendarWeeks) { + this.picker.find('.datepicker-days .datepicker-switch, thead .datepicker-title, tfoot .today, tfoot .clear') + .attr('colspan', function(i, val){ + return Number(val) + 1; + }); + } + + this._process_options({ + startDate: this._o.startDate, + endDate: this._o.endDate, + daysOfWeekDisabled: this.o.daysOfWeekDisabled, + daysOfWeekHighlighted: this.o.daysOfWeekHighlighted, + datesDisabled: this.o.datesDisabled + }); + + this._allow_update = false; + this.setViewMode(this.o.startView); + this._allow_update = true; + + this.fillDow(); + this.fillMonths(); + + this.update(); + + if (this.isInline){ + this.show(); + } + }; + + Datepicker.prototype = { + constructor: Datepicker, + + _resolveViewName: function(view){ + $.each(DPGlobal.viewModes, function(i, viewMode){ + if (view === i || $.inArray(view, viewMode.names) !== -1){ + view = i; + return false; + } + }); + + return view; + }, + + _resolveDaysOfWeek: function(daysOfWeek){ + if (!$.isArray(daysOfWeek)) + daysOfWeek = daysOfWeek.split(/[,\s]*/); + return $.map(daysOfWeek, Number); + }, + + _check_template: function(tmp){ + try { + // If empty + if (tmp === undefined || tmp === "") { + return false; + } + // If no html, everything ok + if ((tmp.match(/[<>]/g) || []).length <= 0) { + return true; + } + // Checking if html is fine + var jDom = $(tmp); + return jDom.length > 0; + } + catch (ex) { + return false; + } + }, + + _process_options: function(opts){ + // Store raw options for reference + this._o = $.extend({}, this._o, opts); + // Processed options + var o = this.o = $.extend({}, this._o); + + // Check if "de-DE" style date is available, if not language should + // fallback to 2 letter code eg "de" + var lang = o.language; + if (!dates[lang]){ + lang = lang.split('-')[0]; + if (!dates[lang]) + lang = defaults.language; + } + o.language = lang; + + // Retrieve view index from any aliases + o.startView = this._resolveViewName(o.startView); + o.minViewMode = this._resolveViewName(o.minViewMode); + o.maxViewMode = this._resolveViewName(o.maxViewMode); + + // Check view is between min and max + o.startView = Math.max(this.o.minViewMode, Math.min(this.o.maxViewMode, o.startView)); + + // true, false, or Number > 0 + if (o.multidate !== true){ + o.multidate = Number(o.multidate) || false; + if (o.multidate !== false) + o.multidate = Math.max(0, o.multidate); + } + o.multidateSeparator = String(o.multidateSeparator); + + o.weekStart %= 7; + o.weekEnd = (o.weekStart + 6) % 7; + + var format = DPGlobal.parseFormat(o.format); + if (o.startDate !== -Infinity){ + if (!!o.startDate){ + if (o.startDate instanceof Date) + o.startDate = this._local_to_utc(this._zero_time(o.startDate)); + else + o.startDate = DPGlobal.parseDate(o.startDate, format, o.language, o.assumeNearbyYear); + } + else { + o.startDate = -Infinity; + } + } + if (o.endDate !== Infinity){ + if (!!o.endDate){ + if (o.endDate instanceof Date) + o.endDate = this._local_to_utc(this._zero_time(o.endDate)); + else + o.endDate = DPGlobal.parseDate(o.endDate, format, o.language, o.assumeNearbyYear); + } + else { + o.endDate = Infinity; + } + } + + o.daysOfWeekDisabled = this._resolveDaysOfWeek(o.daysOfWeekDisabled||[]); + o.daysOfWeekHighlighted = this._resolveDaysOfWeek(o.daysOfWeekHighlighted||[]); + + o.datesDisabled = o.datesDisabled||[]; + if (!$.isArray(o.datesDisabled)) { + o.datesDisabled = o.datesDisabled.split(','); + } + o.datesDisabled = $.map(o.datesDisabled, function(d){ + return DPGlobal.parseDate(d, format, o.language, o.assumeNearbyYear); + }); + + var plc = String(o.orientation).toLowerCase().split(/\s+/g), + _plc = o.orientation.toLowerCase(); + plc = $.grep(plc, function(word){ + return /^auto|left|right|top|bottom$/.test(word); + }); + o.orientation = {x: 'auto', y: 'auto'}; + if (!_plc || _plc === 'auto') + ; // no action + else if (plc.length === 1){ + switch (plc[0]){ + case 'top': + case 'bottom': + o.orientation.y = plc[0]; + break; + case 'left': + case 'right': + o.orientation.x = plc[0]; + break; + } + } + else { + _plc = $.grep(plc, function(word){ + return /^left|right$/.test(word); + }); + o.orientation.x = _plc[0] || 'auto'; + + _plc = $.grep(plc, function(word){ + return /^top|bottom$/.test(word); + }); + o.orientation.y = _plc[0] || 'auto'; + } + if (o.defaultViewDate instanceof Date || typeof o.defaultViewDate === 'string') { + o.defaultViewDate = DPGlobal.parseDate(o.defaultViewDate, format, o.language, o.assumeNearbyYear); + } else if (o.defaultViewDate) { + var year = o.defaultViewDate.year || new Date().getFullYear(); + var month = o.defaultViewDate.month || 0; + var day = o.defaultViewDate.day || 1; + o.defaultViewDate = UTCDate(year, month, day); + } else { + o.defaultViewDate = UTCToday(); + } + }, + _applyEvents: function(evs){ + for (var i=0, el, ch, ev; i < evs.length; i++){ + el = evs[i][0]; + if (evs[i].length === 2){ + ch = undefined; + ev = evs[i][1]; + } else if (evs[i].length === 3){ + ch = evs[i][1]; + ev = evs[i][2]; + } + el.on(ev, ch); + } + }, + _unapplyEvents: function(evs){ + for (var i=0, el, ev, ch; i < evs.length; i++){ + el = evs[i][0]; + if (evs[i].length === 2){ + ch = undefined; + ev = evs[i][1]; + } else if (evs[i].length === 3){ + ch = evs[i][1]; + ev = evs[i][2]; + } + el.off(ev, ch); + } + }, + _buildEvents: function(){ + var events = { + keyup: $.proxy(function(e){ + if ($.inArray(e.keyCode, [27, 37, 39, 38, 40, 32, 13, 9]) === -1) + this.update(); + }, this), + keydown: $.proxy(this.keydown, this), + paste: $.proxy(this.paste, this) + }; + + if (this.o.showOnFocus === true) { + events.focus = $.proxy(this.show, this); + } + + if (this.isInput) { // single input + this._events = [ + [this.element, events] + ]; + } + // component: input + button + else if (this.component && this.inputField.length) { + this._events = [ + // For components that are not readonly, allow keyboard nav + [this.inputField, events], + [this.component, { + click: $.proxy(this.show, this) + }] + ]; + } + else { + this._events = [ + [this.element, { + click: $.proxy(this.show, this), + keydown: $.proxy(this.keydown, this) + }] + ]; + } + this._events.push( + // Component: listen for blur on element descendants + [this.element, '*', { + blur: $.proxy(function(e){ + this._focused_from = e.target; + }, this) + }], + // Input: listen for blur on element + [this.element, { + blur: $.proxy(function(e){ + this._focused_from = e.target; + }, this) + }] + ); + + if (this.o.immediateUpdates) { + // Trigger input updates immediately on changed year/month + this._events.push([this.element, { + 'changeYear changeMonth': $.proxy(function(e){ + this.update(e.date); + }, this) + }]); + } + + this._secondaryEvents = [ + [this.picker, { + click: $.proxy(this.click, this) + }], + [this.picker, '.prev, .next', { + click: $.proxy(this.navArrowsClick, this) + }], + [this.picker, '.day:not(.disabled)', { + click: $.proxy(this.dayCellClick, this) + }], + [$(window), { + resize: $.proxy(this.place, this) + }], + [$(document), { + 'mousedown touchstart': $.proxy(function(e){ + // Clicked outside the datepicker, hide it + if (!( + this.element.is(e.target) || + this.element.find(e.target).length || + this.picker.is(e.target) || + this.picker.find(e.target).length || + this.isInline + )){ + this.hide(); + } + }, this) + }] + ]; + }, + _attachEvents: function(){ + this._detachEvents(); + this._applyEvents(this._events); + }, + _detachEvents: function(){ + this._unapplyEvents(this._events); + }, + _attachSecondaryEvents: function(){ + this._detachSecondaryEvents(); + this._applyEvents(this._secondaryEvents); + }, + _detachSecondaryEvents: function(){ + this._unapplyEvents(this._secondaryEvents); + }, + _trigger: function(event, altdate){ + var date = altdate || this.dates.get(-1), + local_date = this._utc_to_local(date); + + this.element.trigger({ + type: event, + date: local_date, + viewMode: this.viewMode, + dates: $.map(this.dates, this._utc_to_local), + format: $.proxy(function(ix, format){ + if (arguments.length === 0){ + ix = this.dates.length - 1; + format = this.o.format; + } else if (typeof ix === 'string'){ + format = ix; + ix = this.dates.length - 1; + } + format = format || this.o.format; + var date = this.dates.get(ix); + return DPGlobal.formatDate(date, format, this.o.language); + }, this) + }); + }, + + show: function(){ + if (this.inputField.is(':disabled') || (this.inputField.prop('readonly') && this.o.enableOnReadonly === false)) + return; + if (!this.isInline) + this.picker.appendTo(this.o.container); + this.place(); + this.picker.show(); + this._attachSecondaryEvents(); + this._trigger('show'); + if ((window.navigator.msMaxTouchPoints || 'ontouchstart' in document) && this.o.disableTouchKeyboard) { + $(this.element).blur(); + } + return this; + }, + + hide: function(){ + if (this.isInline || !this.picker.is(':visible')) + return this; + this.focusDate = null; + this.picker.hide().detach(); + this._detachSecondaryEvents(); + this.setViewMode(this.o.startView); + + if (this.o.forceParse && this.inputField.val()) + this.setValue(); + this._trigger('hide'); + return this; + }, + + destroy: function(){ + this.hide(); + this._detachEvents(); + this._detachSecondaryEvents(); + this.picker.remove(); + delete this.element.data().datepicker; + if (!this.isInput){ + delete this.element.data().date; + } + return this; + }, + + paste: function(e){ + var dateString; + if (e.originalEvent.clipboardData && e.originalEvent.clipboardData.types + && $.inArray('text/plain', e.originalEvent.clipboardData.types) !== -1) { + dateString = e.originalEvent.clipboardData.getData('text/plain'); + } else if (window.clipboardData) { + dateString = window.clipboardData.getData('Text'); + } else { + return; + } + this.setDate(dateString); + this.update(); + e.preventDefault(); + }, + + _utc_to_local: function(utc){ + if (!utc) { + return utc; + } + + var local = new Date(utc.getTime() + (utc.getTimezoneOffset() * 60000)); + + if (local.getTimezoneOffset() !== utc.getTimezoneOffset()) { + local = new Date(utc.getTime() + (local.getTimezoneOffset() * 60000)); + } + + return local; + }, + _local_to_utc: function(local){ + return local && new Date(local.getTime() - (local.getTimezoneOffset()*60000)); + }, + _zero_time: function(local){ + return local && new Date(local.getFullYear(), local.getMonth(), local.getDate()); + }, + _zero_utc_time: function(utc){ + return utc && UTCDate(utc.getUTCFullYear(), utc.getUTCMonth(), utc.getUTCDate()); + }, + + getDates: function(){ + return $.map(this.dates, this._utc_to_local); + }, + + getUTCDates: function(){ + return $.map(this.dates, function(d){ + return new Date(d); + }); + }, + + getDate: function(){ + return this._utc_to_local(this.getUTCDate()); + }, + + getUTCDate: function(){ + var selected_date = this.dates.get(-1); + if (selected_date !== undefined) { + return new Date(selected_date); + } else { + return null; + } + }, + + clearDates: function(){ + this.inputField.val(''); + this.update(); + this._trigger('changeDate'); + + if (this.o.autoclose) { + this.hide(); + } + }, + + setDates: function(){ + var args = $.isArray(arguments[0]) ? arguments[0] : arguments; + this.update.apply(this, args); + this._trigger('changeDate'); + this.setValue(); + return this; + }, + + setUTCDates: function(){ + var args = $.isArray(arguments[0]) ? arguments[0] : arguments; + this.setDates.apply(this, $.map(args, this._utc_to_local)); + return this; + }, + + setDate: alias('setDates'), + setUTCDate: alias('setUTCDates'), + remove: alias('destroy', 'Method `remove` is deprecated and will be removed in version 2.0. Use `destroy` instead'), + + setValue: function(){ + var formatted = this.getFormattedDate(); + this.inputField.val(formatted); + return this; + }, + + getFormattedDate: function(format){ + if (format === undefined) + format = this.o.format; + + var lang = this.o.language; + return $.map(this.dates, function(d){ + return DPGlobal.formatDate(d, format, lang); + }).join(this.o.multidateSeparator); + }, + + getStartDate: function(){ + return this.o.startDate; + }, + + setStartDate: function(startDate){ + this._process_options({startDate: startDate}); + this.update(); + this.updateNavArrows(); + return this; + }, + + getEndDate: function(){ + return this.o.endDate; + }, + + setEndDate: function(endDate){ + this._process_options({endDate: endDate}); + this.update(); + this.updateNavArrows(); + return this; + }, + + setDaysOfWeekDisabled: function(daysOfWeekDisabled){ + this._process_options({daysOfWeekDisabled: daysOfWeekDisabled}); + this.update(); + return this; + }, + + setDaysOfWeekHighlighted: function(daysOfWeekHighlighted){ + this._process_options({daysOfWeekHighlighted: daysOfWeekHighlighted}); + this.update(); + return this; + }, + + setDatesDisabled: function(datesDisabled){ + this._process_options({datesDisabled: datesDisabled}); + this.update(); + return this; + }, + + place: function(){ + if (this.isInline) + return this; + var calendarWidth = this.picker.outerWidth(), + calendarHeight = this.picker.outerHeight(), + visualPadding = 10, + container = $(this.o.container), + windowWidth = container.width(), + scrollTop = this.o.container === 'body' ? $(document).scrollTop() : container.scrollTop(), + appendOffset = container.offset(); + + var parentsZindex = [0]; + this.element.parents().each(function(){ + var itemZIndex = $(this).css('z-index'); + if (itemZIndex !== 'auto' && Number(itemZIndex) !== 0) parentsZindex.push(Number(itemZIndex)); + }); + var zIndex = Math.max.apply(Math, parentsZindex) + this.o.zIndexOffset; + var offset = this.component ? this.component.parent().offset() : this.element.offset(); + var height = this.component ? this.component.outerHeight(true) : this.element.outerHeight(false); + var width = this.component ? this.component.outerWidth(true) : this.element.outerWidth(false); + var left = offset.left - appendOffset.left; + var top = offset.top - appendOffset.top; + + if (this.o.container !== 'body') { + top += scrollTop; + } + + this.picker.removeClass( + 'datepicker-orient-top datepicker-orient-bottom '+ + 'datepicker-orient-right datepicker-orient-left' + ); + + if (this.o.orientation.x !== 'auto'){ + this.picker.addClass('datepicker-orient-' + this.o.orientation.x); + if (this.o.orientation.x === 'right') + left -= calendarWidth - width; + } + // auto x orientation is best-placement: if it crosses a window + // edge, fudge it sideways + else { + if (offset.left < 0) { + // component is outside the window on the left side. Move it into visible range + this.picker.addClass('datepicker-orient-left'); + left -= offset.left - visualPadding; + } else if (left + calendarWidth > windowWidth) { + // the calendar passes the widow right edge. Align it to component right side + this.picker.addClass('datepicker-orient-right'); + left += width - calendarWidth; + } else { + if (this.o.rtl) { + // Default to right + this.picker.addClass('datepicker-orient-right'); + } else { + // Default to left + this.picker.addClass('datepicker-orient-left'); + } + } + } + + // auto y orientation is best-situation: top or bottom, no fudging, + // decision based on which shows more of the calendar + var yorient = this.o.orientation.y, + top_overflow; + if (yorient === 'auto'){ + top_overflow = -scrollTop + top - calendarHeight; + yorient = top_overflow < 0 ? 'bottom' : 'top'; + } + + this.picker.addClass('datepicker-orient-' + yorient); + if (yorient === 'top') + top -= calendarHeight + parseInt(this.picker.css('padding-top')); + else + top += height; + + if (this.o.rtl) { + var right = windowWidth - (left + width); + this.picker.css({ + top: top, + right: right, + zIndex: zIndex + }); + } else { + this.picker.css({ + top: top, + left: left, + zIndex: zIndex + }); + } + return this; + }, + + _allow_update: true, + update: function(){ + if (!this._allow_update) + return this; + + var oldDates = this.dates.copy(), + dates = [], + fromArgs = false; + if (arguments.length){ + $.each(arguments, $.proxy(function(i, date){ + if (date instanceof Date) + date = this._local_to_utc(date); + dates.push(date); + }, this)); + fromArgs = true; + } else { + dates = this.isInput + ? this.element.val() + : this.element.data('date') || this.inputField.val(); + if (dates && this.o.multidate) + dates = dates.split(this.o.multidateSeparator); + else + dates = [dates]; + delete this.element.data().date; + } + + dates = $.map(dates, $.proxy(function(date){ + return DPGlobal.parseDate(date, this.o.format, this.o.language, this.o.assumeNearbyYear); + }, this)); + dates = $.grep(dates, $.proxy(function(date){ + return ( + !this.dateWithinRange(date) || + !date + ); + }, this), true); + this.dates.replace(dates); + + if (this.o.updateViewDate) { + if (this.dates.length) + this.viewDate = new Date(this.dates.get(-1)); + else if (this.viewDate < this.o.startDate) + this.viewDate = new Date(this.o.startDate); + else if (this.viewDate > this.o.endDate) + this.viewDate = new Date(this.o.endDate); + else + this.viewDate = this.o.defaultViewDate; + } + + if (fromArgs){ + // setting date by clicking + this.setValue(); + this.element.change(); + } + else if (this.dates.length){ + // setting date by typing + if (String(oldDates) !== String(this.dates) && fromArgs) { + this._trigger('changeDate'); + this.element.change(); + } + } + if (!this.dates.length && oldDates.length) { + this._trigger('clearDate'); + this.element.change(); + } + + this.fill(); + return this; + }, + + fillDow: function(){ + if (this.o.showWeekDays) { + var dowCnt = this.o.weekStart, + html = '<tr>'; + if (this.o.calendarWeeks){ + html += '<th class="cw"> </th>'; + } + while (dowCnt < this.o.weekStart + 7){ + html += '<th class="dow'; + if ($.inArray(dowCnt, this.o.daysOfWeekDisabled) !== -1) + html += ' disabled'; + html += '">'+dates[this.o.language].daysMin[(dowCnt++)%7]+'</th>'; + } + html += '</tr>'; + this.picker.find('.datepicker-days thead').append(html); + } + }, + + fillMonths: function(){ + var localDate = this._utc_to_local(this.viewDate); + var html = ''; + var focused; + for (var i = 0; i < 12; i++){ + focused = localDate && localDate.getMonth() === i ? ' focused' : ''; + html += '<span class="month' + focused + '">' + dates[this.o.language].monthsShort[i] + '</span>'; + } + this.picker.find('.datepicker-months td').html(html); + }, + + setRange: function(range){ + if (!range || !range.length) + delete this.range; + else + this.range = $.map(range, function(d){ + return d.valueOf(); + }); + this.fill(); + }, + + getClassNames: function(date){ + var cls = [], + year = this.viewDate.getUTCFullYear(), + month = this.viewDate.getUTCMonth(), + today = UTCToday(); + if (date.getUTCFullYear() < year || (date.getUTCFullYear() === year && date.getUTCMonth() < month)){ + cls.push('old'); + } else if (date.getUTCFullYear() > year || (date.getUTCFullYear() === year && date.getUTCMonth() > month)){ + cls.push('new'); + } + if (this.focusDate && date.valueOf() === this.focusDate.valueOf()) + cls.push('focused'); + // Compare internal UTC date with UTC today, not local today + if (this.o.todayHighlight && isUTCEquals(date, today)) { + cls.push('today'); + } + if (this.dates.contains(date) !== -1) + cls.push('active'); + if (!this.dateWithinRange(date)){ + cls.push('disabled'); + } + if (this.dateIsDisabled(date)){ + cls.push('disabled', 'disabled-date'); + } + if ($.inArray(date.getUTCDay(), this.o.daysOfWeekHighlighted) !== -1){ + cls.push('highlighted'); + } + + if (this.range){ + if (date > this.range[0] && date < this.range[this.range.length-1]){ + cls.push('range'); + } + if ($.inArray(date.valueOf(), this.range) !== -1){ + cls.push('selected'); + } + if (date.valueOf() === this.range[0]){ + cls.push('range-start'); + } + if (date.valueOf() === this.range[this.range.length-1]){ + cls.push('range-end'); + } + } + return cls; + }, + + _fill_yearsView: function(selector, cssClass, factor, year, startYear, endYear, beforeFn){ + var html = ''; + var step = factor / 10; + var view = this.picker.find(selector); + var startVal = Math.floor(year / factor) * factor; + var endVal = startVal + step * 9; + var focusedVal = Math.floor(this.viewDate.getFullYear() / step) * step; + var selected = $.map(this.dates, function(d){ + return Math.floor(d.getUTCFullYear() / step) * step; + }); + + var classes, tooltip, before; + for (var currVal = startVal - step; currVal <= endVal + step; currVal += step) { + classes = [cssClass]; + tooltip = null; + + if (currVal === startVal - step) { + classes.push('old'); + } else if (currVal === endVal + step) { + classes.push('new'); + } + if ($.inArray(currVal, selected) !== -1) { + classes.push('active'); + } + if (currVal < startYear || currVal > endYear) { + classes.push('disabled'); + } + if (currVal === focusedVal) { + classes.push('focused'); + } + + if (beforeFn !== $.noop) { + before = beforeFn(new Date(currVal, 0, 1)); + if (before === undefined) { + before = {}; + } else if (typeof before === 'boolean') { + before = {enabled: before}; + } else if (typeof before === 'string') { + before = {classes: before}; + } + if (before.enabled === false) { + classes.push('disabled'); + } + if (before.classes) { + classes = classes.concat(before.classes.split(/\s+/)); + } + if (before.tooltip) { + tooltip = before.tooltip; + } + } + + html += '<span class="' + classes.join(' ') + '"' + (tooltip ? ' title="' + tooltip + '"' : '') + '>' + currVal + '</span>'; + } + + view.find('.datepicker-switch').text(startVal + '-' + endVal); + view.find('td').html(html); + }, + + fill: function(){ + var d = new Date(this.viewDate), + year = d.getUTCFullYear(), + month = d.getUTCMonth(), + startYear = this.o.startDate !== -Infinity ? this.o.startDate.getUTCFullYear() : -Infinity, + startMonth = this.o.startDate !== -Infinity ? this.o.startDate.getUTCMonth() : -Infinity, + endYear = this.o.endDate !== Infinity ? this.o.endDate.getUTCFullYear() : Infinity, + endMonth = this.o.endDate !== Infinity ? this.o.endDate.getUTCMonth() : Infinity, + todaytxt = dates[this.o.language].today || dates['en'].today || '', + cleartxt = dates[this.o.language].clear || dates['en'].clear || '', + titleFormat = dates[this.o.language].titleFormat || dates['en'].titleFormat, + todayDate = UTCToday(), + titleBtnVisible = (this.o.todayBtn === true || this.o.todayBtn === 'linked') && todayDate >= this.o.startDate && todayDate <= this.o.endDate && !this.weekOfDateIsDisabled(todayDate), + tooltip, + before; + if (isNaN(year) || isNaN(month)) + return; + this.picker.find('.datepicker-days .datepicker-switch') + .text(DPGlobal.formatDate(d, titleFormat, this.o.language)); + this.picker.find('tfoot .today') + .text(todaytxt) + .css('display', titleBtnVisible ? 'table-cell' : 'none'); + this.picker.find('tfoot .clear') + .text(cleartxt) + .css('display', this.o.clearBtn === true ? 'table-cell' : 'none'); + this.picker.find('thead .datepicker-title') + .text(this.o.title) + .css('display', typeof this.o.title === 'string' && this.o.title !== '' ? 'table-cell' : 'none'); + this.updateNavArrows(); + this.fillMonths(); + var prevMonth = UTCDate(year, month, 0), + day = prevMonth.getUTCDate(); + prevMonth.setUTCDate(day - (prevMonth.getUTCDay() - this.o.weekStart + 7)%7); + var nextMonth = new Date(prevMonth); + if (prevMonth.getUTCFullYear() < 100){ + nextMonth.setUTCFullYear(prevMonth.getUTCFullYear()); + } + nextMonth.setUTCDate(nextMonth.getUTCDate() + 42); + nextMonth = nextMonth.valueOf(); + var html = []; + var weekDay, clsName; + while (prevMonth.valueOf() < nextMonth){ + weekDay = prevMonth.getUTCDay(); + if (weekDay === this.o.weekStart){ + html.push('<tr>'); + if (this.o.calendarWeeks){ + // ISO 8601: First week contains first thursday. + // ISO also states week starts on Monday, but we can be more abstract here. + var + // Start of current week: based on weekstart/current date + ws = new Date(+prevMonth + (this.o.weekStart - weekDay - 7) % 7 * 864e5), + // Thursday of this week + th = new Date(Number(ws) + (7 + 4 - ws.getUTCDay()) % 7 * 864e5), + // First Thursday of year, year from thursday + yth = new Date(Number(yth = UTCDate(th.getUTCFullYear(), 0, 1)) + (7 + 4 - yth.getUTCDay()) % 7 * 864e5), + // Calendar week: ms between thursdays, div ms per day, div 7 days + calWeek = (th - yth) / 864e5 / 7 + 1; + html.push('<td class="cw">'+ calWeek +'</td>'); + } + } + clsName = this.getClassNames(prevMonth); + clsName.push('day'); + + var content = prevMonth.getUTCDate(); + + if (this.o.beforeShowDay !== $.noop){ + before = this.o.beforeShowDay(this._utc_to_local(prevMonth)); + if (before === undefined) + before = {}; + else if (typeof before === 'boolean') + before = {enabled: before}; + else if (typeof before === 'string') + before = {classes: before}; + if (before.enabled === false) + clsName.push('disabled'); + if (before.classes) + clsName = clsName.concat(before.classes.split(/\s+/)); + if (before.tooltip) + tooltip = before.tooltip; + if (before.content) + content = before.content; + } + + //Check if uniqueSort exists (supported by jquery >=1.12 and >=2.2) + //Fallback to unique function for older jquery versions + if ($.isFunction($.uniqueSort)) { + clsName = $.uniqueSort(clsName); + } else { + clsName = $.unique(clsName); + } + + html.push('<td class="'+clsName.join(' ')+'"' + (tooltip ? ' title="'+tooltip+'"' : '') + ' data-date="' + prevMonth.getTime().toString() + '">' + content + '</td>'); + tooltip = null; + if (weekDay === this.o.weekEnd){ + html.push('</tr>'); + } + prevMonth.setUTCDate(prevMonth.getUTCDate() + 1); + } + this.picker.find('.datepicker-days tbody').html(html.join('')); + + var monthsTitle = dates[this.o.language].monthsTitle || dates['en'].monthsTitle || 'Months'; + var months = this.picker.find('.datepicker-months') + .find('.datepicker-switch') + .text(this.o.maxViewMode < 2 ? monthsTitle : year) + .end() + .find('tbody span').removeClass('active'); + + $.each(this.dates, function(i, d){ + if (d.getUTCFullYear() === year) + months.eq(d.getUTCMonth()).addClass('active'); + }); + + if (year < startYear || year > endYear){ + months.addClass('disabled'); + } + if (year === startYear){ + months.slice(0, startMonth).addClass('disabled'); + } + if (year === endYear){ + months.slice(endMonth+1).addClass('disabled'); + } + + if (this.o.beforeShowMonth !== $.noop){ + var that = this; + $.each(months, function(i, month){ + var moDate = new Date(year, i, 1); + var before = that.o.beforeShowMonth(moDate); + if (before === undefined) + before = {}; + else if (typeof before === 'boolean') + before = {enabled: before}; + else if (typeof before === 'string') + before = {classes: before}; + if (before.enabled === false && !$(month).hasClass('disabled')) + $(month).addClass('disabled'); + if (before.classes) + $(month).addClass(before.classes); + if (before.tooltip) + $(month).prop('title', before.tooltip); + }); + } + + // Generating decade/years picker + this._fill_yearsView( + '.datepicker-years', + 'year', + 10, + year, + startYear, + endYear, + this.o.beforeShowYear + ); + + // Generating century/decades picker + this._fill_yearsView( + '.datepicker-decades', + 'decade', + 100, + year, + startYear, + endYear, + this.o.beforeShowDecade + ); + + // Generating millennium/centuries picker + this._fill_yearsView( + '.datepicker-centuries', + 'century', + 1000, + year, + startYear, + endYear, + this.o.beforeShowCentury + ); + }, + + updateNavArrows: function(){ + if (!this._allow_update) + return; + + var d = new Date(this.viewDate), + year = d.getUTCFullYear(), + month = d.getUTCMonth(), + startYear = this.o.startDate !== -Infinity ? this.o.startDate.getUTCFullYear() : -Infinity, + startMonth = this.o.startDate !== -Infinity ? this.o.startDate.getUTCMonth() : -Infinity, + endYear = this.o.endDate !== Infinity ? this.o.endDate.getUTCFullYear() : Infinity, + endMonth = this.o.endDate !== Infinity ? this.o.endDate.getUTCMonth() : Infinity, + prevIsDisabled, + nextIsDisabled, + factor = 1; + switch (this.viewMode){ + case 4: + factor *= 10; + /* falls through */ + case 3: + factor *= 10; + /* falls through */ + case 2: + factor *= 10; + /* falls through */ + case 1: + prevIsDisabled = Math.floor(year / factor) * factor <= startYear; + nextIsDisabled = Math.floor(year / factor) * factor + factor > endYear; + break; + case 0: + prevIsDisabled = year <= startYear && month <= startMonth; + nextIsDisabled = year >= endYear && month >= endMonth; + break; + } + + this.picker.find('.prev').toggleClass('disabled', prevIsDisabled); + this.picker.find('.next').toggleClass('disabled', nextIsDisabled); + }, + + click: function(e){ + e.preventDefault(); + e.stopPropagation(); + + var target, dir, day, year, month; + target = $(e.target); + + // Clicked on the switch + if (target.hasClass('datepicker-switch') && this.viewMode !== this.o.maxViewMode){ + this.setViewMode(this.viewMode + 1); + } + + // Clicked on today button + if (target.hasClass('today') && !target.hasClass('day')){ + this.setViewMode(0); + this._setDate(UTCToday(), this.o.todayBtn === 'linked' ? null : 'view'); + } + + // Clicked on clear button + if (target.hasClass('clear')){ + this.clearDates(); + } + + if (!target.hasClass('disabled')){ + // Clicked on a month, year, decade, century + if (target.hasClass('month') + || target.hasClass('year') + || target.hasClass('decade') + || target.hasClass('century')) { + this.viewDate.setUTCDate(1); + + day = 1; + if (this.viewMode === 1){ + month = target.parent().find('span').index(target); + year = this.viewDate.getUTCFullYear(); + this.viewDate.setUTCMonth(month); + } else { + month = 0; + year = Number(target.text()); + this.viewDate.setUTCFullYear(year); + } + + this._trigger(DPGlobal.viewModes[this.viewMode - 1].e, this.viewDate); + + if (this.viewMode === this.o.minViewMode){ + this._setDate(UTCDate(year, month, day)); + } else { + this.setViewMode(this.viewMode - 1); + this.fill(); + } + } + } + + if (this.picker.is(':visible') && this._focused_from){ + this._focused_from.focus(); + } + delete this._focused_from; + }, + + dayCellClick: function(e){ + var $target = $(e.currentTarget); + var timestamp = $target.data('date'); + var date = new Date(timestamp); + + if (this.o.updateViewDate) { + if (date.getUTCFullYear() !== this.viewDate.getUTCFullYear()) { + this._trigger('changeYear', this.viewDate); + } + + if (date.getUTCMonth() !== this.viewDate.getUTCMonth()) { + this._trigger('changeMonth', this.viewDate); + } + } + this._setDate(date); + }, + + // Clicked on prev or next + navArrowsClick: function(e){ + var $target = $(e.currentTarget); + var dir = $target.hasClass('prev') ? -1 : 1; + if (this.viewMode !== 0){ + dir *= DPGlobal.viewModes[this.viewMode].navStep * 12; + } + this.viewDate = this.moveMonth(this.viewDate, dir); + this._trigger(DPGlobal.viewModes[this.viewMode].e, this.viewDate); + this.fill(); + }, + + _toggle_multidate: function(date){ + var ix = this.dates.contains(date); + if (!date){ + this.dates.clear(); + } + + if (ix !== -1){ + if (this.o.multidate === true || this.o.multidate > 1 || this.o.toggleActive){ + this.dates.remove(ix); + } + } else if (this.o.multidate === false) { + this.dates.clear(); + this.dates.push(date); + } + else { + this.dates.push(date); + } + + if (typeof this.o.multidate === 'number') + while (this.dates.length > this.o.multidate) + this.dates.remove(0); + }, + + _setDate: function(date, which){ + if (!which || which === 'date') + this._toggle_multidate(date && new Date(date)); + if ((!which && this.o.updateViewDate) || which === 'view') + this.viewDate = date && new Date(date); + + this.fill(); + this.setValue(); + if (!which || which !== 'view') { + this._trigger('changeDate'); + } + this.inputField.trigger('change'); + if (this.o.autoclose && (!which || which === 'date')){ + this.hide(); + } + }, + + moveDay: function(date, dir){ + var newDate = new Date(date); + newDate.setUTCDate(date.getUTCDate() + dir); + + return newDate; + }, + + moveWeek: function(date, dir){ + return this.moveDay(date, dir * 7); + }, + + moveMonth: function(date, dir){ + if (!isValidDate(date)) + return this.o.defaultViewDate; + if (!dir) + return date; + var new_date = new Date(date.valueOf()), + day = new_date.getUTCDate(), + month = new_date.getUTCMonth(), + mag = Math.abs(dir), + new_month, test; + dir = dir > 0 ? 1 : -1; + if (mag === 1){ + test = dir === -1 + // If going back one month, make sure month is not current month + // (eg, Mar 31 -> Feb 31 == Feb 28, not Mar 02) + ? function(){ + return new_date.getUTCMonth() === month; + } + // If going forward one month, make sure month is as expected + // (eg, Jan 31 -> Feb 31 == Feb 28, not Mar 02) + : function(){ + return new_date.getUTCMonth() !== new_month; + }; + new_month = month + dir; + new_date.setUTCMonth(new_month); + // Dec -> Jan (12) or Jan -> Dec (-1) -- limit expected date to 0-11 + new_month = (new_month + 12) % 12; + } + else { + // For magnitudes >1, move one month at a time... + for (var i=0; i < mag; i++) + // ...which might decrease the day (eg, Jan 31 to Feb 28, etc)... + new_date = this.moveMonth(new_date, dir); + // ...then reset the day, keeping it in the new month + new_month = new_date.getUTCMonth(); + new_date.setUTCDate(day); + test = function(){ + return new_month !== new_date.getUTCMonth(); + }; + } + // Common date-resetting loop -- if date is beyond end of month, make it + // end of month + while (test()){ + new_date.setUTCDate(--day); + new_date.setUTCMonth(new_month); + } + return new_date; + }, + + moveYear: function(date, dir){ + return this.moveMonth(date, dir*12); + }, + + moveAvailableDate: function(date, dir, fn){ + do { + date = this[fn](date, dir); + + if (!this.dateWithinRange(date)) + return false; + + fn = 'moveDay'; + } + while (this.dateIsDisabled(date)); + + return date; + }, + + weekOfDateIsDisabled: function(date){ + return $.inArray(date.getUTCDay(), this.o.daysOfWeekDisabled) !== -1; + }, + + dateIsDisabled: function(date){ + return ( + this.weekOfDateIsDisabled(date) || + $.grep(this.o.datesDisabled, function(d){ + return isUTCEquals(date, d); + }).length > 0 + ); + }, + + dateWithinRange: function(date){ + return date >= this.o.startDate && date <= this.o.endDate; + }, + + keydown: function(e){ + if (!this.picker.is(':visible')){ + if (e.keyCode === 40 || e.keyCode === 27) { // allow down to re-show picker + this.show(); + e.stopPropagation(); + } + return; + } + var dateChanged = false, + dir, newViewDate, + focusDate = this.focusDate || this.viewDate; + switch (e.keyCode){ + case 27: // escape + if (this.focusDate){ + this.focusDate = null; + this.viewDate = this.dates.get(-1) || this.viewDate; + this.fill(); + } + else + this.hide(); + e.preventDefault(); + e.stopPropagation(); + break; + case 37: // left + case 38: // up + case 39: // right + case 40: // down + if (!this.o.keyboardNavigation || this.o.daysOfWeekDisabled.length === 7) + break; + dir = e.keyCode === 37 || e.keyCode === 38 ? -1 : 1; + if (this.viewMode === 0) { + if (e.ctrlKey){ + newViewDate = this.moveAvailableDate(focusDate, dir, 'moveYear'); + + if (newViewDate) + this._trigger('changeYear', this.viewDate); + } else if (e.shiftKey){ + newViewDate = this.moveAvailableDate(focusDate, dir, 'moveMonth'); + + if (newViewDate) + this._trigger('changeMonth', this.viewDate); + } else if (e.keyCode === 37 || e.keyCode === 39){ + newViewDate = this.moveAvailableDate(focusDate, dir, 'moveDay'); + } else if (!this.weekOfDateIsDisabled(focusDate)){ + newViewDate = this.moveAvailableDate(focusDate, dir, 'moveWeek'); + } + } else if (this.viewMode === 1) { + if (e.keyCode === 38 || e.keyCode === 40) { + dir = dir * 4; + } + newViewDate = this.moveAvailableDate(focusDate, dir, 'moveMonth'); + } else if (this.viewMode === 2) { + if (e.keyCode === 38 || e.keyCode === 40) { + dir = dir * 4; + } + newViewDate = this.moveAvailableDate(focusDate, dir, 'moveYear'); + } + if (newViewDate){ + this.focusDate = this.viewDate = newViewDate; + this.setValue(); + this.fill(); + e.preventDefault(); + } + break; + case 13: // enter + if (!this.o.forceParse) + break; + focusDate = this.focusDate || this.dates.get(-1) || this.viewDate; + if (this.o.keyboardNavigation) { + this._toggle_multidate(focusDate); + dateChanged = true; + } + this.focusDate = null; + this.viewDate = this.dates.get(-1) || this.viewDate; + this.setValue(); + this.fill(); + if (this.picker.is(':visible')){ + e.preventDefault(); + e.stopPropagation(); + if (this.o.autoclose) + this.hide(); + } + break; + case 9: // tab + this.focusDate = null; + this.viewDate = this.dates.get(-1) || this.viewDate; + this.fill(); + this.hide(); + break; + } + if (dateChanged){ + if (this.dates.length) + this._trigger('changeDate'); + else + this._trigger('clearDate'); + this.inputField.trigger('change'); + } + }, + + setViewMode: function(viewMode){ + this.viewMode = viewMode; + this.picker + .children('div') + .hide() + .filter('.datepicker-' + DPGlobal.viewModes[this.viewMode].clsName) + .show(); + this.updateNavArrows(); + this._trigger('changeViewMode', new Date(this.viewDate)); + } + }; + + var DateRangePicker = function(element, options){ + $.data(element, 'datepicker', this); + this.element = $(element); + this.inputs = $.map(options.inputs, function(i){ + return i.jquery ? i[0] : i; + }); + delete options.inputs; + + this.keepEmptyValues = options.keepEmptyValues; + delete options.keepEmptyValues; + + datepickerPlugin.call($(this.inputs), options) + .on('changeDate', $.proxy(this.dateUpdated, this)); + + this.pickers = $.map(this.inputs, function(i){ + return $.data(i, 'datepicker'); + }); + this.updateDates(); + }; + DateRangePicker.prototype = { + updateDates: function(){ + this.dates = $.map(this.pickers, function(i){ + return i.getUTCDate(); + }); + this.updateRanges(); + }, + updateRanges: function(){ + var range = $.map(this.dates, function(d){ + return d.valueOf(); + }); + $.each(this.pickers, function(i, p){ + p.setRange(range); + }); + }, + clearDates: function(){ + $.each(this.pickers, function(i, p){ + p.clearDates(); + }); + }, + dateUpdated: function(e){ + // `this.updating` is a workaround for preventing infinite recursion + // between `changeDate` triggering and `setUTCDate` calling. Until + // there is a better mechanism. + if (this.updating) + return; + this.updating = true; + + var dp = $.data(e.target, 'datepicker'); + + if (dp === undefined) { + return; + } + + var new_date = dp.getUTCDate(), + keep_empty_values = this.keepEmptyValues, + i = $.inArray(e.target, this.inputs), + j = i - 1, + k = i + 1, + l = this.inputs.length; + if (i === -1) + return; + + $.each(this.pickers, function(i, p){ + if (!p.getUTCDate() && (p === dp || !keep_empty_values)) + p.setUTCDate(new_date); + }); + + if (new_date < this.dates[j]){ + // Date being moved earlier/left + while (j >= 0 && new_date < this.dates[j]){ + this.pickers[j--].setUTCDate(new_date); + } + } else if (new_date > this.dates[k]){ + // Date being moved later/right + while (k < l && new_date > this.dates[k]){ + this.pickers[k++].setUTCDate(new_date); + } + } + this.updateDates(); + + delete this.updating; + }, + destroy: function(){ + $.map(this.pickers, function(p){ p.destroy(); }); + $(this.inputs).off('changeDate', this.dateUpdated); + delete this.element.data().datepicker; + }, + remove: alias('destroy', 'Method `remove` is deprecated and will be removed in version 2.0. Use `destroy` instead') + }; + + function opts_from_el(el, prefix){ + // Derive options from element data-attrs + var data = $(el).data(), + out = {}, inkey, + replace = new RegExp('^' + prefix.toLowerCase() + '([A-Z])'); + prefix = new RegExp('^' + prefix.toLowerCase()); + function re_lower(_,a){ + return a.toLowerCase(); + } + for (var key in data) + if (prefix.test(key)){ + inkey = key.replace(replace, re_lower); + out[inkey] = data[key]; + } + return out; + } + + function opts_from_locale(lang){ + // Derive options from locale plugins + var out = {}; + // Check if "de-DE" style date is available, if not language should + // fallback to 2 letter code eg "de" + if (!dates[lang]){ + lang = lang.split('-')[0]; + if (!dates[lang]) + return; + } + var d = dates[lang]; + $.each(locale_opts, function(i,k){ + if (k in d) + out[k] = d[k]; + }); + return out; + } + + var old = $.fn.datepicker; + var datepickerPlugin = function(option){ + var args = Array.apply(null, arguments); + args.shift(); + var internal_return; + this.each(function(){ + var $this = $(this), + data = $this.data('datepicker'), + options = typeof option === 'object' && option; + if (!data){ + var elopts = opts_from_el(this, 'date'), + // Preliminary otions + xopts = $.extend({}, defaults, elopts, options), + locopts = opts_from_locale(xopts.language), + // Options priority: js args, data-attrs, locales, defaults + opts = $.extend({}, defaults, locopts, elopts, options); + if ($this.hasClass('input-daterange') || opts.inputs){ + $.extend(opts, { + inputs: opts.inputs || $this.find('input').toArray() + }); + data = new DateRangePicker(this, opts); + } + else { + data = new Datepicker(this, opts); + } + $this.data('datepicker', data); + } + if (typeof option === 'string' && typeof data[option] === 'function'){ + internal_return = data[option].apply(data, args); + } + }); + + if ( + internal_return === undefined || + internal_return instanceof Datepicker || + internal_return instanceof DateRangePicker + ) + return this; + + if (this.length > 1) + throw new Error('Using only allowed for the collection of a single element (' + option + ' function)'); + else + return internal_return; + }; + $.fn.datepicker = datepickerPlugin; + + var defaults = $.fn.datepicker.defaults = { + assumeNearbyYear: false, + autoclose: false, + beforeShowDay: $.noop, + beforeShowMonth: $.noop, + beforeShowYear: $.noop, + beforeShowDecade: $.noop, + beforeShowCentury: $.noop, + calendarWeeks: false, + clearBtn: false, + toggleActive: false, + daysOfWeekDisabled: [], + daysOfWeekHighlighted: [], + datesDisabled: [], + endDate: Infinity, + forceParse: true, + format: 'mm/dd/yyyy', + keepEmptyValues: false, + keyboardNavigation: true, + language: 'en', + minViewMode: 0, + maxViewMode: 4, + multidate: false, + multidateSeparator: ',', + orientation: "auto", + rtl: false, + startDate: -Infinity, + startView: 0, + todayBtn: false, + todayHighlight: false, + updateViewDate: true, + weekStart: 0, + disableTouchKeyboard: false, + enableOnReadonly: true, + showOnFocus: true, + zIndexOffset: 10, + container: 'body', + immediateUpdates: false, + title: '', + templates: { + leftArrow: '«', + rightArrow: '»' + }, + showWeekDays: true + }; + var locale_opts = $.fn.datepicker.locale_opts = [ + 'format', + 'rtl', + 'weekStart' + ]; + $.fn.datepicker.Constructor = Datepicker; + var dates = $.fn.datepicker.dates = { + en: { + days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], + daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], + daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"], + months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], + today: "Today", + clear: "Clear", + titleFormat: "MM yyyy" + } + }; + + var DPGlobal = { + viewModes: [ + { + names: ['days', 'month'], + clsName: 'days', + e: 'changeMonth' + }, + { + names: ['months', 'year'], + clsName: 'months', + e: 'changeYear', + navStep: 1 + }, + { + names: ['years', 'decade'], + clsName: 'years', + e: 'changeDecade', + navStep: 10 + }, + { + names: ['decades', 'century'], + clsName: 'decades', + e: 'changeCentury', + navStep: 100 + }, + { + names: ['centuries', 'millennium'], + clsName: 'centuries', + e: 'changeMillennium', + navStep: 1000 + } + ], + validParts: /dd?|DD?|mm?|MM?|yy(?:yy)?/g, + nonpunctuation: /[^ -\/:-@\u5e74\u6708\u65e5\[-`{-~\t\n\r]+/g, + parseFormat: function(format){ + if (typeof format.toValue === 'function' && typeof format.toDisplay === 'function') + return format; + // IE treats \0 as a string end in inputs (truncating the value), + // so it's a bad format delimiter, anyway + var separators = format.replace(this.validParts, '\0').split('\0'), + parts = format.match(this.validParts); + if (!separators || !separators.length || !parts || parts.length === 0){ + throw new Error("Invalid date format."); + } + return {separators: separators, parts: parts}; + }, + parseDate: function(date, format, language, assumeNearby){ + if (!date) + return undefined; + if (date instanceof Date) + return date; + if (typeof format === 'string') + format = DPGlobal.parseFormat(format); + if (format.toValue) + return format.toValue(date, format, language); + var fn_map = { + d: 'moveDay', + m: 'moveMonth', + w: 'moveWeek', + y: 'moveYear' + }, + dateAliases = { + yesterday: '-1d', + today: '+0d', + tomorrow: '+1d' + }, + parts, part, dir, i, fn; + if (date in dateAliases){ + date = dateAliases[date]; + } + if (/^[\-+]\d+[dmwy]([\s,]+[\-+]\d+[dmwy])*$/i.test(date)){ + parts = date.match(/([\-+]\d+)([dmwy])/gi); + date = new Date(); + for (i=0; i < parts.length; i++){ + part = parts[i].match(/([\-+]\d+)([dmwy])/i); + dir = Number(part[1]); + fn = fn_map[part[2].toLowerCase()]; + date = Datepicker.prototype[fn](date, dir); + } + return Datepicker.prototype._zero_utc_time(date); + } + + parts = date && date.match(this.nonpunctuation) || []; + + function applyNearbyYear(year, threshold){ + if (threshold === true) + threshold = 10; + + // if year is 2 digits or less, than the user most likely is trying to get a recent century + if (year < 100){ + year += 2000; + // if the new year is more than threshold years in advance, use last century + if (year > ((new Date()).getFullYear()+threshold)){ + year -= 100; + } + } + + return year; + } + + var parsed = {}, + setters_order = ['yyyy', 'yy', 'M', 'MM', 'm', 'mm', 'd', 'dd'], + setters_map = { + yyyy: function(d,v){ + return d.setUTCFullYear(assumeNearby ? applyNearbyYear(v, assumeNearby) : v); + }, + m: function(d,v){ + if (isNaN(d)) + return d; + v -= 1; + while (v < 0) v += 12; + v %= 12; + d.setUTCMonth(v); + while (d.getUTCMonth() !== v) + d.setUTCDate(d.getUTCDate()-1); + return d; + }, + d: function(d,v){ + return d.setUTCDate(v); + } + }, + val, filtered; + setters_map['yy'] = setters_map['yyyy']; + setters_map['M'] = setters_map['MM'] = setters_map['mm'] = setters_map['m']; + setters_map['dd'] = setters_map['d']; + date = UTCToday(); + var fparts = format.parts.slice(); + // Remove noop parts + if (parts.length !== fparts.length){ + fparts = $(fparts).filter(function(i,p){ + return $.inArray(p, setters_order) !== -1; + }).toArray(); + } + // Process remainder + function match_part(){ + var m = this.slice(0, parts[i].length), + p = parts[i].slice(0, m.length); + return m.toLowerCase() === p.toLowerCase(); + } + if (parts.length === fparts.length){ + var cnt; + for (i=0, cnt = fparts.length; i < cnt; i++){ + val = parseInt(parts[i], 10); + part = fparts[i]; + if (isNaN(val)){ + switch (part){ + case 'MM': + filtered = $(dates[language].months).filter(match_part); + val = $.inArray(filtered[0], dates[language].months) + 1; + break; + case 'M': + filtered = $(dates[language].monthsShort).filter(match_part); + val = $.inArray(filtered[0], dates[language].monthsShort) + 1; + break; + } + } + parsed[part] = val; + } + var _date, s; + for (i=0; i < setters_order.length; i++){ + s = setters_order[i]; + if (s in parsed && !isNaN(parsed[s])){ + _date = new Date(date); + setters_map[s](_date, parsed[s]); + if (!isNaN(_date)) + date = _date; + } + } + } + return date; + }, + formatDate: function(date, format, language){ + if (!date) + return ''; + if (typeof format === 'string') + format = DPGlobal.parseFormat(format); + if (format.toDisplay) + return format.toDisplay(date, format, language); + var val = { + d: date.getUTCDate(), + D: dates[language].daysShort[date.getUTCDay()], + DD: dates[language].days[date.getUTCDay()], + m: date.getUTCMonth() + 1, + M: dates[language].monthsShort[date.getUTCMonth()], + MM: dates[language].months[date.getUTCMonth()], + yy: date.getUTCFullYear().toString().substring(2), + yyyy: date.getUTCFullYear() + }; + val.dd = (val.d < 10 ? '0' : '') + val.d; + val.mm = (val.m < 10 ? '0' : '') + val.m; + date = []; + var seps = $.extend([], format.separators); + for (var i=0, cnt = format.parts.length; i <= cnt; i++){ + if (seps.length) + date.push(seps.shift()); + date.push(val[format.parts[i]]); + } + return date.join(''); + }, + headTemplate: '<thead>'+ + '<tr>'+ + '<th colspan="7" class="datepicker-title"></th>'+ + '</tr>'+ + '<tr>'+ + '<th class="prev">'+defaults.templates.leftArrow+'</th>'+ + '<th colspan="5" class="datepicker-switch"></th>'+ + '<th class="next">'+defaults.templates.rightArrow+'</th>'+ + '</tr>'+ + '</thead>', + contTemplate: '<tbody><tr><td colspan="7"></td></tr></tbody>', + footTemplate: '<tfoot>'+ + '<tr>'+ + '<th colspan="7" class="today"></th>'+ + '</tr>'+ + '<tr>'+ + '<th colspan="7" class="clear"></th>'+ + '</tr>'+ + '</tfoot>' + }; + DPGlobal.template = '<div class="datepicker">'+ + '<div class="datepicker-days">'+ + '<table class="table-condensed">'+ + DPGlobal.headTemplate+ + '<tbody></tbody>'+ + DPGlobal.footTemplate+ + '</table>'+ + '</div>'+ + '<div class="datepicker-months">'+ + '<table class="table-condensed">'+ + DPGlobal.headTemplate+ + DPGlobal.contTemplate+ + DPGlobal.footTemplate+ + '</table>'+ + '</div>'+ + '<div class="datepicker-years">'+ + '<table class="table-condensed">'+ + DPGlobal.headTemplate+ + DPGlobal.contTemplate+ + DPGlobal.footTemplate+ + '</table>'+ + '</div>'+ + '<div class="datepicker-decades">'+ + '<table class="table-condensed">'+ + DPGlobal.headTemplate+ + DPGlobal.contTemplate+ + DPGlobal.footTemplate+ + '</table>'+ + '</div>'+ + '<div class="datepicker-centuries">'+ + '<table class="table-condensed">'+ + DPGlobal.headTemplate+ + DPGlobal.contTemplate+ + DPGlobal.footTemplate+ + '</table>'+ + '</div>'+ + '</div>'; + + $.fn.datepicker.DPGlobal = DPGlobal; + + + /* DATEPICKER NO CONFLICT + * =================== */ + + $.fn.datepicker.noConflict = function(){ + $.fn.datepicker = old; + return this; + }; + + /* DATEPICKER VERSION + * =================== */ + $.fn.datepicker.version = '1.9.0'; + + $.fn.datepicker.deprecated = function(msg){ + var console = window.console; + if (console && console.warn) { + console.warn('DEPRECATED: ' + msg); + } + }; + + + /* DATEPICKER DATA-API + * ================== */ + + $(document).on( + 'focus.datepicker.data-api click.datepicker.data-api', + '[data-provide="datepicker"]', + function(e){ + var $this = $(this); + if ($this.data('datepicker')) + return; + e.preventDefault(); + // component click requires us to explicitly show it + datepickerPlugin.call($this, 'show'); + } + ); + $(function(){ + datepickerPlugin.call($('[data-provide="datepicker-inline"]')); + }); + +})); +/* ========================================================= + * bootstrap-datetimepicker.js + * ========================================================= + * Copyright 2012 Stefan Petre + * + * Improvements by Andrew Rowls + * Improvements by Sébastien Malot + * Improvements by Yun Lai + * Improvements by Kenneth Henderick + * Improvements by CuGBabyBeaR + * Improvements by Christian Vaas <auspex@auspex.eu> + * + * Project URL : http://www.malot.fr/bootstrap-datetimepicker + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ========================================================= */ + + +(function(factory){ + if (typeof define === 'function' && define.amd) + define(['jquery'], factory); + else if (typeof exports === 'object') + factory(require('jquery')); + else + factory(jQuery); + +}(function($, undefined){ + + // Add ECMA262-5 Array methods if not supported natively (IE8) + if (!('indexOf' in Array.prototype)) { + Array.prototype.indexOf = function (find, i) { + if (i === undefined) i = 0; + if (i < 0) i += this.length; + if (i < 0) i = 0; + for (var n = this.length; i < n; i++) { + if (i in this && this[i] === find) { + return i; + } + } + return -1; + } + } + + // Add timezone abbreviation support for ie6+, Chrome, Firefox + function timeZoneAbbreviation() { + var abbreviation, date, formattedStr, i, len, matchedStrings, ref, str; + date = (new Date()).toString(); + formattedStr = ((ref = date.split('(')[1]) != null ? ref.slice(0, -1) : 0) || date.split(' '); + if (formattedStr instanceof Array) { + matchedStrings = []; + for (var i = 0, len = formattedStr.length; i < len; i++) { + str = formattedStr[i]; + if ((abbreviation = (ref = str.match(/\b[A-Z]+\b/)) !== null) ? ref[0] : 0) { + matchedStrings.push(abbreviation); + } + } + formattedStr = matchedStrings.pop(); + } + return formattedStr; + } + + function UTCDate() { + return new Date(Date.UTC.apply(Date, arguments)); + } + + // Picker object + var Datetimepicker = function (element, options) { + var that = this; + + this.element = $(element); + + // add container for single page application + // when page switch the datetimepicker div will be removed also. + this.container = options.container || 'body'; + + this.language = options.language || this.element.data('date-language') || 'en'; + this.language = this.language in dates ? this.language : this.language.split('-')[0]; // fr-CA fallback to fr + this.language = this.language in dates ? this.language : 'en'; + this.isRTL = dates[this.language].rtl || false; + this.formatType = options.formatType || this.element.data('format-type') || 'standard'; + this.format = DPGlobal.parseFormat(options.format || this.element.data('date-format') || dates[this.language].format || DPGlobal.getDefaultFormat(this.formatType, 'input'), this.formatType); + this.isInline = false; + this.isVisible = false; + this.isInput = this.element.is('input'); + this.fontAwesome = options.fontAwesome || this.element.data('font-awesome') || false; + + this.bootcssVer = options.bootcssVer || (this.isInput ? (this.element.is('.form-control') ? 3 : 2) : ( this.bootcssVer = this.element.is('.input-group') ? 3 : 2 )); + + this.component = this.element.is('.date') ? ( this.bootcssVer === 3 ? this.element.find('.input-group-addon .glyphicon-th, .input-group-addon .glyphicon-time, .input-group-addon .glyphicon-remove, .input-group-addon .glyphicon-calendar, .input-group-addon .fa-calendar, .input-group-addon .fa-clock-o').parent() : this.element.find('.add-on .icon-th, .add-on .icon-time, .add-on .icon-calendar, .add-on .fa-calendar, .add-on .fa-clock-o').parent()) : false; + this.componentReset = this.element.is('.date') ? ( this.bootcssVer === 3 ? this.element.find('.input-group-addon .glyphicon-remove, .input-group-addon .fa-times').parent():this.element.find('.add-on .icon-remove, .add-on .fa-times').parent()) : false; + this.hasInput = this.component && this.element.find('input').length; + if (this.component && this.component.length === 0) { + this.component = false; + } + this.linkField = options.linkField || this.element.data('link-field') || false; + this.linkFormat = DPGlobal.parseFormat(options.linkFormat || this.element.data('link-format') || DPGlobal.getDefaultFormat(this.formatType, 'link'), this.formatType); + this.minuteStep = options.minuteStep || this.element.data('minute-step') || 5; + this.pickerPosition = options.pickerPosition || this.element.data('picker-position') || 'bottom-right'; + this.showMeridian = options.showMeridian || this.element.data('show-meridian') || false; + this.initialDate = options.initialDate || new Date(); + this.zIndex = options.zIndex || this.element.data('z-index') || undefined; + this.title = typeof options.title === 'undefined' ? false : options.title; + this.timezone = options.timezone || timeZoneAbbreviation(); + + this.icons = { + leftArrow: this.fontAwesome ? 'fa-arrow-left' : (this.bootcssVer === 3 ? 'glyphicon-arrow-left' : 'icon-arrow-left'), + rightArrow: this.fontAwesome ? 'fa-arrow-right' : (this.bootcssVer === 3 ? 'glyphicon-arrow-right' : 'icon-arrow-right') + } + this.icontype = this.fontAwesome ? 'fa' : 'glyphicon'; + + this._attachEvents(); + + this.clickedOutside = function (e) { + // Clicked outside the datetimepicker, hide it + if ($(e.target).closest('.datetimepicker').length === 0) { + that.hide(); + } + } + + this.formatViewType = 'datetime'; + if ('formatViewType' in options) { + this.formatViewType = options.formatViewType; + } else if ('formatViewType' in this.element.data()) { + this.formatViewType = this.element.data('formatViewType'); + } + + this.minView = 0; + if ('minView' in options) { + this.minView = options.minView; + } else if ('minView' in this.element.data()) { + this.minView = this.element.data('min-view'); + } + this.minView = DPGlobal.convertViewMode(this.minView); + + this.maxView = DPGlobal.modes.length - 1; + if ('maxView' in options) { + this.maxView = options.maxView; + } else if ('maxView' in this.element.data()) { + this.maxView = this.element.data('max-view'); + } + this.maxView = DPGlobal.convertViewMode(this.maxView); + + this.wheelViewModeNavigation = false; + if ('wheelViewModeNavigation' in options) { + this.wheelViewModeNavigation = options.wheelViewModeNavigation; + } else if ('wheelViewModeNavigation' in this.element.data()) { + this.wheelViewModeNavigation = this.element.data('view-mode-wheel-navigation'); + } + + this.wheelViewModeNavigationInverseDirection = false; + + if ('wheelViewModeNavigationInverseDirection' in options) { + this.wheelViewModeNavigationInverseDirection = options.wheelViewModeNavigationInverseDirection; + } else if ('wheelViewModeNavigationInverseDirection' in this.element.data()) { + this.wheelViewModeNavigationInverseDirection = this.element.data('view-mode-wheel-navigation-inverse-dir'); + } + + this.wheelViewModeNavigationDelay = 100; + if ('wheelViewModeNavigationDelay' in options) { + this.wheelViewModeNavigationDelay = options.wheelViewModeNavigationDelay; + } else if ('wheelViewModeNavigationDelay' in this.element.data()) { + this.wheelViewModeNavigationDelay = this.element.data('view-mode-wheel-navigation-delay'); + } + + this.startViewMode = 2; + if ('startView' in options) { + this.startViewMode = options.startView; + } else if ('startView' in this.element.data()) { + this.startViewMode = this.element.data('start-view'); + } + this.startViewMode = DPGlobal.convertViewMode(this.startViewMode); + this.viewMode = this.startViewMode; + + this.viewSelect = this.minView; + if ('viewSelect' in options) { + this.viewSelect = options.viewSelect; + } else if ('viewSelect' in this.element.data()) { + this.viewSelect = this.element.data('view-select'); + } + this.viewSelect = DPGlobal.convertViewMode(this.viewSelect); + + this.forceParse = true; + if ('forceParse' in options) { + this.forceParse = options.forceParse; + } else if ('dateForceParse' in this.element.data()) { + this.forceParse = this.element.data('date-force-parse'); + } + var template = this.bootcssVer === 3 ? DPGlobal.templateV3 : DPGlobal.template; + while (template.indexOf('{iconType}') !== -1) { + template = template.replace('{iconType}', this.icontype); + } + while (template.indexOf('{leftArrow}') !== -1) { + template = template.replace('{leftArrow}', this.icons.leftArrow); + } + while (template.indexOf('{rightArrow}') !== -1) { + template = template.replace('{rightArrow}', this.icons.rightArrow); + } + this.picker = $(template) + .appendTo(this.isInline ? this.element : this.container) // 'body') + .on({ + click: $.proxy(this.click, this), + mousedown: $.proxy(this.mousedown, this) + }); + + if (this.wheelViewModeNavigation) { + if ($.fn.mousewheel) { + this.picker.on({mousewheel: $.proxy(this.mousewheel, this)}); + } else { + console.log('Mouse Wheel event is not supported. Please include the jQuery Mouse Wheel plugin before enabling this option'); + } + } + + if (this.isInline) { + this.picker.addClass('datetimepicker-inline'); + } else { + this.picker.addClass('datetimepicker-dropdown-' + this.pickerPosition + ' dropdown-menu'); + } + if (this.isRTL) { + this.picker.addClass('datetimepicker-rtl'); + var selector = this.bootcssVer === 3 ? '.prev span, .next span' : '.prev i, .next i'; + this.picker.find(selector).toggleClass(this.icons.leftArrow + ' ' + this.icons.rightArrow); + } + + $(document).on('mousedown touchend', this.clickedOutside); + + this.autoclose = false; + if ('autoclose' in options) { + this.autoclose = options.autoclose; + } else if ('dateAutoclose' in this.element.data()) { + this.autoclose = this.element.data('date-autoclose'); + } + + this.keyboardNavigation = true; + if ('keyboardNavigation' in options) { + this.keyboardNavigation = options.keyboardNavigation; + } else if ('dateKeyboardNavigation' in this.element.data()) { + this.keyboardNavigation = this.element.data('date-keyboard-navigation'); + } + + this.todayBtn = (options.todayBtn || this.element.data('date-today-btn') || false); + this.clearBtn = (options.clearBtn || this.element.data('date-clear-btn') || false); + this.todayHighlight = (options.todayHighlight || this.element.data('date-today-highlight') || false); + + this.weekStart = 0; + if (typeof options.weekStart !== 'undefined') { + this.weekStart = options.weekStart; + } else if (typeof this.element.data('date-weekstart') !== 'undefined') { + this.weekStart = this.element.data('date-weekstart'); + } else if (typeof dates[this.language].weekStart !== 'undefined') { + this.weekStart = dates[this.language].weekStart; + } + this.weekStart = this.weekStart % 7; + this.weekEnd = ((this.weekStart + 6) % 7); + this.onRenderDay = function (date) { + var render = (options.onRenderDay || function () { return []; })(date); + if (typeof render === 'string') { + render = [render]; + } + var res = ['day']; + return res.concat((render ? render : [])); + }; + this.onRenderHour = function (date) { + var render = (options.onRenderHour || function () { return []; })(date); + var res = ['hour']; + if (typeof render === 'string') { + render = [render]; + } + return res.concat((render ? render : [])); + }; + this.onRenderMinute = function (date) { + var render = (options.onRenderMinute || function () { return []; })(date); + var res = ['minute']; + if (typeof render === 'string') { + render = [render]; + } + if (date < this.startDate || date > this.endDate) { + res.push('disabled'); + } else if (Math.floor(this.date.getUTCMinutes() / this.minuteStep) === Math.floor(date.getUTCMinutes() / this.minuteStep)) { + res.push('active'); + } + return res.concat((render ? render : [])); + }; + this.onRenderYear = function (date) { + var render = (options.onRenderYear || function () { return []; })(date); + var res = ['year']; + if (typeof render === 'string') { + render = [render]; + } + if (this.date.getUTCFullYear() === date.getUTCFullYear()) { + res.push('active'); + } + var currentYear = date.getUTCFullYear(); + var endYear = this.endDate.getUTCFullYear(); + if (date < this.startDate || currentYear > endYear) { + res.push('disabled'); + } + return res.concat((render ? render : [])); + } + this.onRenderMonth = function (date) { + var render = (options.onRenderMonth || function () { return []; })(date); + var res = ['month']; + if (typeof render === 'string') { + render = [render]; + } + return res.concat((render ? render : [])); + } + this.startDate = new Date(-8639968443048000); + this.endDate = new Date(8639968443048000); + this.datesDisabled = []; + this.daysOfWeekDisabled = []; + this.setStartDate(options.startDate || this.element.data('date-startdate')); + this.setEndDate(options.endDate || this.element.data('date-enddate')); + this.setDatesDisabled(options.datesDisabled || this.element.data('date-dates-disabled')); + this.setDaysOfWeekDisabled(options.daysOfWeekDisabled || this.element.data('date-days-of-week-disabled')); + this.setMinutesDisabled(options.minutesDisabled || this.element.data('date-minute-disabled')); + this.setHoursDisabled(options.hoursDisabled || this.element.data('date-hour-disabled')); + this.fillDow(); + this.fillMonths(); + this.update(); + this.showMode(); + + if (this.isInline) { + this.show(); + } + }; + + Datetimepicker.prototype = { + constructor: Datetimepicker, + + _events: [], + _attachEvents: function () { + this._detachEvents(); + if (this.isInput) { // single input + this._events = [ + [this.element, { + focus: $.proxy(this.show, this), + keyup: $.proxy(this.update, this), + keydown: $.proxy(this.keydown, this) + }] + ]; + } + else if (this.component && this.hasInput) { // component: input + button + this._events = [ + // For components that are not readonly, allow keyboard nav + [this.element.find('input'), { + focus: $.proxy(this.show, this), + keyup: $.proxy(this.update, this), + keydown: $.proxy(this.keydown, this) + }], + [this.component, { + click: $.proxy(this.show, this) + }] + ]; + if (this.componentReset) { + this._events.push([ + this.componentReset, + {click: $.proxy(this.reset, this)} + ]); + } + } + else if (this.element.is('div')) { // inline datetimepicker + this.isInline = true; + } + else { + this._events = [ + [this.element, { + click: $.proxy(this.show, this) + }] + ]; + } + for (var i = 0, el, ev; i < this._events.length; i++) { + el = this._events[i][0]; + ev = this._events[i][1]; + el.on(ev); + } + }, + + _detachEvents: function () { + for (var i = 0, el, ev; i < this._events.length; i++) { + el = this._events[i][0]; + ev = this._events[i][1]; + el.off(ev); + } + this._events = []; + }, + + show: function (e) { + this.picker.show(); + this.height = this.component ? this.component.outerHeight() : this.element.outerHeight(); + if (this.forceParse) { + this.update(); + } + this.place(); + $(window).on('resize', $.proxy(this.place, this)); + if (e) { + e.stopPropagation(); + e.preventDefault(); + } + this.isVisible = true; + this.element.trigger({ + type: 'show', + date: this.date + }); + }, + + hide: function () { + if (!this.isVisible) return; + if (this.isInline) return; + this.picker.hide(); + $(window).off('resize', this.place); + this.viewMode = this.startViewMode; + this.showMode(); + if (!this.isInput) { + $(document).off('mousedown', this.hide); + } + + if ( + this.forceParse && + ( + this.isInput && this.element.val() || + this.hasInput && this.element.find('input').val() + ) + ) + this.setValue(); + this.isVisible = false; + this.element.trigger({ + type: 'hide', + date: this.date + }); + }, + + remove: function () { + this._detachEvents(); + $(document).off('mousedown', this.clickedOutside); + this.picker.remove(); + delete this.picker; + delete this.element.data().datetimepicker; + }, + + getDate: function () { + var d = this.getUTCDate(); + if (d === null) { + return null; + } + return new Date(d.getTime() + (d.getTimezoneOffset() * 60000)); + }, + + getUTCDate: function () { + return this.date; + }, + + getInitialDate: function () { + return this.initialDate + }, + + setInitialDate: function (initialDate) { + this.initialDate = initialDate; + }, + + setDate: function (d) { + this.setUTCDate(new Date(d.getTime() - (d.getTimezoneOffset() * 60000))); + }, + + setUTCDate: function (d) { + if (d >= this.startDate && d <= this.endDate) { + this.date = d; + this.setValue(); + this.viewDate = this.date; + this.fill(); + } else { + this.element.trigger({ + type: 'outOfRange', + date: d, + startDate: this.startDate, + endDate: this.endDate + }); + } + }, + + setFormat: function (format) { + this.format = DPGlobal.parseFormat(format, this.formatType); + var element; + if (this.isInput) { + element = this.element; + } else if (this.component) { + element = this.element.find('input'); + } + if (element && element.val()) { + this.setValue(); + } + }, + + setValue: function () { + var formatted = this.getFormattedDate(); + if (!this.isInput) { + if (this.component) { + this.element.find('input').val(formatted); + } + this.element.data('date', formatted); + } else { + this.element.val(formatted); + } + if (this.linkField) { + $('#' + this.linkField).val(this.getFormattedDate(this.linkFormat)); + } + }, + + getFormattedDate: function (format) { + format = format || this.format; + return DPGlobal.formatDate(this.date, format, this.language, this.formatType, this.timezone); + }, + + setStartDate: function (startDate) { + this.startDate = startDate || this.startDate; + if (this.startDate.valueOf() !== 8639968443048000) { + this.startDate = DPGlobal.parseDate(this.startDate, this.format, this.language, this.formatType, this.timezone); + } + this.update(); + this.updateNavArrows(); + }, + + setEndDate: function (endDate) { + this.endDate = endDate || this.endDate; + if (this.endDate.valueOf() !== 8639968443048000) { + this.endDate = DPGlobal.parseDate(this.endDate, this.format, this.language, this.formatType, this.timezone); + } + this.update(); + this.updateNavArrows(); + }, + + setDatesDisabled: function (datesDisabled) { + this.datesDisabled = datesDisabled || []; + if (!$.isArray(this.datesDisabled)) { + this.datesDisabled = this.datesDisabled.split(/,\s*/); + } + var mThis = this; + this.datesDisabled = $.map(this.datesDisabled, function (d) { + return DPGlobal.parseDate(d, mThis.format, mThis.language, mThis.formatType, mThis.timezone).toDateString(); + }); + this.update(); + this.updateNavArrows(); + }, + + setTitle: function (selector, value) { + return this.picker.find(selector) + .find('th:eq(1)') + .text(this.title === false ? value : this.title); + }, + + setDaysOfWeekDisabled: function (daysOfWeekDisabled) { + this.daysOfWeekDisabled = daysOfWeekDisabled || []; + if (!$.isArray(this.daysOfWeekDisabled)) { + this.daysOfWeekDisabled = this.daysOfWeekDisabled.split(/,\s*/); + } + this.daysOfWeekDisabled = $.map(this.daysOfWeekDisabled, function (d) { + return parseInt(d, 10); + }); + this.update(); + this.updateNavArrows(); + }, + + setMinutesDisabled: function (minutesDisabled) { + this.minutesDisabled = minutesDisabled || []; + if (!$.isArray(this.minutesDisabled)) { + this.minutesDisabled = this.minutesDisabled.split(/,\s*/); + } + this.minutesDisabled = $.map(this.minutesDisabled, function (d) { + return parseInt(d, 10); + }); + this.update(); + this.updateNavArrows(); + }, + + setHoursDisabled: function (hoursDisabled) { + this.hoursDisabled = hoursDisabled || []; + if (!$.isArray(this.hoursDisabled)) { + this.hoursDisabled = this.hoursDisabled.split(/,\s*/); + } + this.hoursDisabled = $.map(this.hoursDisabled, function (d) { + return parseInt(d, 10); + }); + this.update(); + this.updateNavArrows(); + }, + + place: function () { + if (this.isInline) return; + + if (!this.zIndex) { + var index_highest = 0; + $('div').each(function () { + var index_current = parseInt($(this).css('zIndex'), 10); + if (index_current > index_highest) { + index_highest = index_current; + } + }); + this.zIndex = index_highest + 10; + } + + var offset, top, left, containerOffset; + if (this.container instanceof $) { + containerOffset = this.container.offset(); + } else { + containerOffset = $(this.container).offset(); + } + + if (this.component) { + offset = this.component.offset(); + left = offset.left; + if (this.pickerPosition === 'bottom-left' || this.pickerPosition === 'top-left') { + left += this.component.outerWidth() - this.picker.outerWidth(); + } + } else { + offset = this.element.offset(); + left = offset.left; + if (this.pickerPosition === 'bottom-left' || this.pickerPosition === 'top-left') { + left += this.element.outerWidth() - this.picker.outerWidth(); + } + } + + var bodyWidth = document.body.clientWidth || window.innerWidth; + if (left + 220 > bodyWidth) { + left = bodyWidth - 220; + } + + if (this.pickerPosition === 'top-left' || this.pickerPosition === 'top-right') { + top = offset.top - this.picker.outerHeight(); + } else { + top = offset.top + this.height; + } + + top = top - containerOffset.top; + left = left - containerOffset.left; + + this.picker.css({ + top: top, + left: left, + zIndex: this.zIndex + }); + }, + + hour_minute: "^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]", + + update: function () { + var date, fromArgs = false; + if (arguments && arguments.length && (typeof arguments[0] === 'string' || arguments[0] instanceof Date)) { + date = arguments[0]; + fromArgs = true; + } else { + date = (this.isInput ? this.element.val() : this.element.find('input').val()) || this.element.data('date') || this.initialDate; + if (typeof date === 'string') { + date = date.replace(/^\s+|\s+$/g,''); + } + } + + if (!date) { + date = new Date(); + fromArgs = false; + } + + if (typeof date === "string") { + if (new RegExp(this.hour_minute).test(date) || new RegExp(this.hour_minute + ":[0-5][0-9]").test(date)) { + date = this.getDate() + } + } + + this.date = DPGlobal.parseDate(date, this.format, this.language, this.formatType, this.timezone); + + if (fromArgs) this.setValue(); + + if (this.date < this.startDate) { + this.viewDate = new Date(this.startDate); + } else if (this.date > this.endDate) { + this.viewDate = new Date(this.endDate); + } else { + this.viewDate = new Date(this.date); + } + this.fill(); + }, + + fillDow: function () { + var dowCnt = this.weekStart, + html = '<tr>'; + while (dowCnt < this.weekStart + 7) { + html += '<th class="dow">' + dates[this.language].daysMin[(dowCnt++) % 7] + '</th>'; + } + html += '</tr>'; + this.picker.find('.datetimepicker-days thead').append(html); + }, + + fillMonths: function () { + var html = ''; + var d = new Date(this.viewDate); + for (var i = 0; i < 12; i++) { + d.setUTCMonth(i); + var classes = this.onRenderMonth(d); + html += '<span class="' + classes.join(' ') + '">' + dates[this.language].monthsShort[i] + '</span>'; + } + this.picker.find('.datetimepicker-months td').html(html); + }, + + fill: function () { + if (!this.date || !this.viewDate) { + return; + } + var d = new Date(this.viewDate), + year = d.getUTCFullYear(), + month = d.getUTCMonth(), + dayMonth = d.getUTCDate(), + hours = d.getUTCHours(), + startYear = this.startDate.getUTCFullYear(), + startMonth = this.startDate.getUTCMonth(), + endYear = this.endDate.getUTCFullYear(), + endMonth = this.endDate.getUTCMonth() + 1, + currentDate = (new UTCDate(this.date.getUTCFullYear(), this.date.getUTCMonth(), this.date.getUTCDate())).valueOf(), + today = new Date(); + this.setTitle('.datetimepicker-days', dates[this.language].months[month] + ' ' + year) + if (this.formatViewType === 'time') { + var formatted = this.getFormattedDate(); + this.setTitle('.datetimepicker-hours', formatted); + this.setTitle('.datetimepicker-minutes', formatted); + } else { + this.setTitle('.datetimepicker-hours', dayMonth + ' ' + dates[this.language].months[month] + ' ' + year); + this.setTitle('.datetimepicker-minutes', dayMonth + ' ' + dates[this.language].months[month] + ' ' + year); + } + this.picker.find('tfoot th.today') + .text(dates[this.language].today || dates['en'].today) + .toggle(this.todayBtn !== false); + this.picker.find('tfoot th.clear') + .text(dates[this.language].clear || dates['en'].clear) + .toggle(this.clearBtn !== false); + this.updateNavArrows(); + this.fillMonths(); + var prevMonth = UTCDate(year, month - 1, 28, 0, 0, 0, 0), + day = DPGlobal.getDaysInMonth(prevMonth.getUTCFullYear(), prevMonth.getUTCMonth()); + prevMonth.setUTCDate(day); + prevMonth.setUTCDate(day - (prevMonth.getUTCDay() - this.weekStart + 7) % 7); + var nextMonth = new Date(prevMonth); + nextMonth.setUTCDate(nextMonth.getUTCDate() + 42); + nextMonth = nextMonth.valueOf(); + var html = []; + var classes; + while (prevMonth.valueOf() < nextMonth) { + if (prevMonth.getUTCDay() === this.weekStart) { + html.push('<tr>'); + } + classes = this.onRenderDay(prevMonth); + if (prevMonth.getUTCFullYear() < year || (prevMonth.getUTCFullYear() === year && prevMonth.getUTCMonth() < month)) { + classes.push('old'); + } else if (prevMonth.getUTCFullYear() > year || (prevMonth.getUTCFullYear() === year && prevMonth.getUTCMonth() > month)) { + classes.push('new'); + } + // Compare internal UTC date with local today, not UTC today + if (this.todayHighlight && + prevMonth.getUTCFullYear() === today.getFullYear() && + prevMonth.getUTCMonth() === today.getMonth() && + prevMonth.getUTCDate() === today.getDate()) { + classes.push('today'); + } + if (prevMonth.valueOf() === currentDate) { + classes.push('active'); + } + if ((prevMonth.valueOf() + 86400000) <= this.startDate || prevMonth.valueOf() > this.endDate || + $.inArray(prevMonth.getUTCDay(), this.daysOfWeekDisabled) !== -1 || + $.inArray(prevMonth.toDateString(), this.datesDisabled) !== -1) { + classes.push('disabled'); + } + html.push('<td class="' + classes.join(' ') + '">' + prevMonth.getUTCDate() + '</td>'); + if (prevMonth.getUTCDay() === this.weekEnd) { + html.push('</tr>'); + } + prevMonth.setUTCDate(prevMonth.getUTCDate() + 1); + } + this.picker.find('.datetimepicker-days tbody').empty().append(html.join('')); + + html = []; + var txt = '', meridian = '', meridianOld = ''; + var hoursDisabled = this.hoursDisabled || []; + d = new Date(this.viewDate) + for (var i = 0; i < 24; i++) { + d.setUTCHours(i); + classes = this.onRenderHour(d); + if (hoursDisabled.indexOf(i) !== -1) { + classes.push('disabled'); + } + var actual = UTCDate(year, month, dayMonth, i); + // We want the previous hour for the startDate + if ((actual.valueOf() + 3600000) <= this.startDate || actual.valueOf() > this.endDate) { + classes.push('disabled'); + } else if (hours === i) { + classes.push('active'); + } + if (this.showMeridian && dates[this.language].meridiem.length === 2) { + meridian = (i < 12 ? dates[this.language].meridiem[0] : dates[this.language].meridiem[1]); + if (meridian !== meridianOld) { + if (meridianOld !== '') { + html.push('</fieldset>'); + } + html.push('<fieldset class="hour"><legend>' + meridian.toUpperCase() + '</legend>'); + } + meridianOld = meridian; + txt = (i % 12 ? i % 12 : 12); + if (i < 12) { + classes.push('hour_am'); + } else { + classes.push('hour_pm'); + } + html.push('<span class="' + classes.join(' ') + '">' + txt + '</span>'); + if (i === 23) { + html.push('</fieldset>'); + } + } else { + txt = i + ':00'; + html.push('<span class="' + classes.join(' ') + '">' + txt + '</span>'); + } + } + this.picker.find('.datetimepicker-hours td').html(html.join('')); + + html = []; + txt = ''; + meridian = ''; + meridianOld = ''; + var minutesDisabled = this.minutesDisabled || []; + d = new Date(this.viewDate); + for (var i = 0; i < 60; i += this.minuteStep) { + if (minutesDisabled.indexOf(i) !== -1) continue; + d.setUTCMinutes(i); + d.setUTCSeconds(0); + classes = this.onRenderMinute(d); + if (this.showMeridian && dates[this.language].meridiem.length === 2) { + meridian = (hours < 12 ? dates[this.language].meridiem[0] : dates[this.language].meridiem[1]); + if (meridian !== meridianOld) { + if (meridianOld !== '') { + html.push('</fieldset>'); + } + html.push('<fieldset class="minute"><legend>' + meridian.toUpperCase() + '</legend>'); + } + meridianOld = meridian; + txt = (hours % 12 ? hours % 12 : 12); + html.push('<span class="' + classes.join(' ') + '">' + txt + ':' + (i < 10 ? '0' + i : i) + '</span>'); + if (i === 59) { + html.push('</fieldset>'); + } + } else { + txt = i + ':00'; + html.push('<span class="' + classes.join(' ') + '">' + hours + ':' + (i < 10 ? '0' + i : i) + '</span>'); + } + } + this.picker.find('.datetimepicker-minutes td').html(html.join('')); + + var currentYear = this.date.getUTCFullYear(); + var months = this.setTitle('.datetimepicker-months', year) + .end() + .find('.month').removeClass('active'); + if (currentYear === year) { + // getUTCMonths() returns 0 based, and we need to select the next one + // To cater bootstrap 2 we don't need to select the next one + months.eq(this.date.getUTCMonth()).addClass('active'); + } + if (year < startYear || year > endYear) { + months.addClass('disabled'); + } + if (year === startYear) { + months.slice(0, startMonth).addClass('disabled'); + } + if (year === endYear) { + months.slice(endMonth).addClass('disabled'); + } + + html = ''; + year = parseInt(year / 10, 10) * 10; + var yearCont = this.setTitle('.datetimepicker-years', year + '-' + (year + 9)) + .end() + .find('td'); + year -= 1; + d = new Date(this.viewDate); + for (var i = -1; i < 11; i++) { + d.setUTCFullYear(year); + classes = this.onRenderYear(d); + if (i === -1 || i === 10) { + classes.push(old); + } + html += '<span class="' + classes.join(' ') + '">' + year + '</span>'; + year += 1; + } + yearCont.html(html); + this.place(); + }, + + updateNavArrows: function () { + var d = new Date(this.viewDate), + year = d.getUTCFullYear(), + month = d.getUTCMonth(), + day = d.getUTCDate(), + hour = d.getUTCHours(); + switch (this.viewMode) { + case 0: + if (year <= this.startDate.getUTCFullYear() + && month <= this.startDate.getUTCMonth() + && day <= this.startDate.getUTCDate() + && hour <= this.startDate.getUTCHours()) { + this.picker.find('.prev').css({visibility: 'hidden'}); + } else { + this.picker.find('.prev').css({visibility: 'visible'}); + } + if (year >= this.endDate.getUTCFullYear() + && month >= this.endDate.getUTCMonth() + && day >= this.endDate.getUTCDate() + && hour >= this.endDate.getUTCHours()) { + this.picker.find('.next').css({visibility: 'hidden'}); + } else { + this.picker.find('.next').css({visibility: 'visible'}); + } + break; + case 1: + if (year <= this.startDate.getUTCFullYear() + && month <= this.startDate.getUTCMonth() + && day <= this.startDate.getUTCDate()) { + this.picker.find('.prev').css({visibility: 'hidden'}); + } else { + this.picker.find('.prev').css({visibility: 'visible'}); + } + if (year >= this.endDate.getUTCFullYear() + && month >= this.endDate.getUTCMonth() + && day >= this.endDate.getUTCDate()) { + this.picker.find('.next').css({visibility: 'hidden'}); + } else { + this.picker.find('.next').css({visibility: 'visible'}); + } + break; + case 2: + if (year <= this.startDate.getUTCFullYear() + && month <= this.startDate.getUTCMonth()) { + this.picker.find('.prev').css({visibility: 'hidden'}); + } else { + this.picker.find('.prev').css({visibility: 'visible'}); + } + if (year >= this.endDate.getUTCFullYear() + && month >= this.endDate.getUTCMonth()) { + this.picker.find('.next').css({visibility: 'hidden'}); + } else { + this.picker.find('.next').css({visibility: 'visible'}); + } + break; + case 3: + case 4: + if (year <= this.startDate.getUTCFullYear()) { + this.picker.find('.prev').css({visibility: 'hidden'}); + } else { + this.picker.find('.prev').css({visibility: 'visible'}); + } + if (year >= this.endDate.getUTCFullYear()) { + this.picker.find('.next').css({visibility: 'hidden'}); + } else { + this.picker.find('.next').css({visibility: 'visible'}); + } + break; + } + }, + + mousewheel: function (e) { + + e.preventDefault(); + e.stopPropagation(); + + if (this.wheelPause) { + return; + } + + this.wheelPause = true; + + var originalEvent = e.originalEvent; + + var delta = originalEvent.wheelDelta; + + var mode = delta > 0 ? 1 : (delta === 0) ? 0 : -1; + + if (this.wheelViewModeNavigationInverseDirection) { + mode = -mode; + } + + this.showMode(mode); + + setTimeout($.proxy(function () { + + this.wheelPause = false + + }, this), this.wheelViewModeNavigationDelay); + + }, + + click: function (e) { + e.stopPropagation(); + e.preventDefault(); + var target = $(e.target).closest('span, td, th, legend'); + if (target.is('.' + this.icontype)) { + target = $(target).parent().closest('span, td, th, legend'); + } + if (target.length === 1) { + if (target.is('.disabled')) { + this.element.trigger({ + type: 'outOfRange', + date: this.viewDate, + startDate: this.startDate, + endDate: this.endDate + }); + return; + } + switch (target[0].nodeName.toLowerCase()) { + case 'th': + switch (target[0].className) { + case 'switch': + this.showMode(1); + break; + case 'prev': + case 'next': + var dir = DPGlobal.modes[this.viewMode].navStep * (target[0].className === 'prev' ? -1 : 1); + switch (this.viewMode) { + case 0: + this.viewDate = this.moveHour(this.viewDate, dir); + break; + case 1: + this.viewDate = this.moveDate(this.viewDate, dir); + break; + case 2: + this.viewDate = this.moveMonth(this.viewDate, dir); + break; + case 3: + case 4: + this.viewDate = this.moveYear(this.viewDate, dir); + break; + } + this.fill(); + this.element.trigger({ + type: target[0].className + ':' + this.convertViewModeText(this.viewMode), + date: this.viewDate, + startDate: this.startDate, + endDate: this.endDate + }); + break; + case 'clear': + this.reset(); + if (this.autoclose) { + this.hide(); + } + break; + case 'today': + var date = new Date(); + date = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), 0); + + // Respect startDate and endDate. + if (date < this.startDate) date = this.startDate; + else if (date > this.endDate) date = this.endDate; + + this.viewMode = this.startViewMode; + this.showMode(0); + this._setDate(date); + this.fill(); + if (this.autoclose) { + this.hide(); + } + break; + } + break; + case 'span': + if (!target.is('.disabled')) { + var year = this.viewDate.getUTCFullYear(), + month = this.viewDate.getUTCMonth(), + day = this.viewDate.getUTCDate(), + hours = this.viewDate.getUTCHours(), + minutes = this.viewDate.getUTCMinutes(), + seconds = this.viewDate.getUTCSeconds(); + + if (target.is('.month')) { + this.viewDate.setUTCDate(1); + month = target.parent().find('span').index(target); + day = this.viewDate.getUTCDate(); + this.viewDate.setUTCMonth(month); + this.element.trigger({ + type: 'changeMonth', + date: this.viewDate + }); + if (this.viewSelect >= 3) { + this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0)); + } + } else if (target.is('.year')) { + this.viewDate.setUTCDate(1); + year = parseInt(target.text(), 10) || 0; + this.viewDate.setUTCFullYear(year); + this.element.trigger({ + type: 'changeYear', + date: this.viewDate + }); + if (this.viewSelect >= 4) { + this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0)); + } + } else if (target.is('.hour')) { + hours = parseInt(target.text(), 10) || 0; + if (target.hasClass('hour_am') || target.hasClass('hour_pm')) { + if (hours === 12 && target.hasClass('hour_am')) { + hours = 0; + } else if (hours !== 12 && target.hasClass('hour_pm')) { + hours += 12; + } + } + this.viewDate.setUTCHours(hours); + this.element.trigger({ + type: 'changeHour', + date: this.viewDate + }); + if (this.viewSelect >= 1) { + this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0)); + } + } else if (target.is('.minute')) { + minutes = parseInt(target.text().substr(target.text().indexOf(':') + 1), 10) || 0; + this.viewDate.setUTCMinutes(minutes); + this.element.trigger({ + type: 'changeMinute', + date: this.viewDate + }); + if (this.viewSelect >= 0) { + this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0)); + } + } + if (this.viewMode !== 0) { + var oldViewMode = this.viewMode; + this.showMode(-1); + this.fill(); + if (oldViewMode === this.viewMode && this.autoclose) { + this.hide(); + } + } else { + this.fill(); + if (this.autoclose) { + this.hide(); + } + } + } + break; + case 'td': + if (target.is('.day') && !target.is('.disabled')) { + var day = parseInt(target.text(), 10) || 1; + var year = this.viewDate.getUTCFullYear(), + month = this.viewDate.getUTCMonth(), + hours = this.viewDate.getUTCHours(), + minutes = this.viewDate.getUTCMinutes(), + seconds = this.viewDate.getUTCSeconds(); + if (target.is('.old')) { + if (month === 0) { + month = 11; + year -= 1; + } else { + month -= 1; + } + } else if (target.is('.new')) { + if (month === 11) { + month = 0; + year += 1; + } else { + month += 1; + } + } + this.viewDate.setUTCFullYear(year); + this.viewDate.setUTCMonth(month, day); + this.element.trigger({ + type: 'changeDay', + date: this.viewDate + }); + if (this.viewSelect >= 2) { + this._setDate(UTCDate(year, month, day, hours, minutes, seconds, 0)); + } + } + var oldViewMode = this.viewMode; + this.showMode(-1); + this.fill(); + if (oldViewMode === this.viewMode && this.autoclose) { + this.hide(); + } + break; + } + } + }, + + _setDate: function (date, which) { + if (!which || which === 'date') + this.date = date; + if (!which || which === 'view') + this.viewDate = date; + this.fill(); + this.setValue(); + var element; + if (this.isInput) { + element = this.element; + } else if (this.component) { + element = this.element.find('input'); + } + if (element) { + element.change(); + } + this.element.trigger({ + type: 'changeDate', + date: this.getDate() + }); + if(date === null) + this.date = this.viewDate; + }, + + moveMinute: function (date, dir) { + if (!dir) return date; + var new_date = new Date(date.valueOf()); + //dir = dir > 0 ? 1 : -1; + new_date.setUTCMinutes(new_date.getUTCMinutes() + (dir * this.minuteStep)); + return new_date; + }, + + moveHour: function (date, dir) { + if (!dir) return date; + var new_date = new Date(date.valueOf()); + //dir = dir > 0 ? 1 : -1; + new_date.setUTCHours(new_date.getUTCHours() + dir); + return new_date; + }, + + moveDate: function (date, dir) { + if (!dir) return date; + var new_date = new Date(date.valueOf()); + //dir = dir > 0 ? 1 : -1; + new_date.setUTCDate(new_date.getUTCDate() + dir); + return new_date; + }, + + moveMonth: function (date, dir) { + if (!dir) return date; + var new_date = new Date(date.valueOf()), + day = new_date.getUTCDate(), + month = new_date.getUTCMonth(), + mag = Math.abs(dir), + new_month, test; + dir = dir > 0 ? 1 : -1; + if (mag === 1) { + test = dir === -1 + // If going back one month, make sure month is not current month + // (eg, Mar 31 -> Feb 31 === Feb 28, not Mar 02) + ? function () { + return new_date.getUTCMonth() === month; + } + // If going forward one month, make sure month is as expected + // (eg, Jan 31 -> Feb 31 === Feb 28, not Mar 02) + : function () { + return new_date.getUTCMonth() !== new_month; + }; + new_month = month + dir; + new_date.setUTCMonth(new_month); + // Dec -> Jan (12) or Jan -> Dec (-1) -- limit expected date to 0-11 + if (new_month < 0 || new_month > 11) + new_month = (new_month + 12) % 12; + } else { + // For magnitudes >1, move one month at a time... + for (var i = 0; i < mag; i++) + // ...which might decrease the day (eg, Jan 31 to Feb 28, etc)... + new_date = this.moveMonth(new_date, dir); + // ...then reset the day, keeping it in the new month + new_month = new_date.getUTCMonth(); + new_date.setUTCDate(day); + test = function () { + return new_month !== new_date.getUTCMonth(); + }; + } + // Common date-resetting loop -- if date is beyond end of month, make it + // end of month + while (test()) { + new_date.setUTCDate(--day); + new_date.setUTCMonth(new_month); + } + return new_date; + }, + + moveYear: function (date, dir) { + return this.moveMonth(date, dir * 12); + }, + + dateWithinRange: function (date) { + return date >= this.startDate && date <= this.endDate; + }, + + keydown: function (e) { + if (this.picker.is(':not(:visible)')) { + if (e.keyCode === 27) // allow escape to hide and re-show picker + this.show(); + return; + } + var dateChanged = false, + dir, newDate, newViewDate; + switch (e.keyCode) { + case 27: // escape + this.hide(); + e.preventDefault(); + break; + case 37: // left + case 39: // right + if (!this.keyboardNavigation) break; + dir = e.keyCode === 37 ? -1 : 1; + var viewMode = this.viewMode; + if (e.ctrlKey) { + viewMode += 2; + } else if (e.shiftKey) { + viewMode += 1; + } + if (viewMode === 4) { + newDate = this.moveYear(this.date, dir); + newViewDate = this.moveYear(this.viewDate, dir); + } else if (viewMode === 3) { + newDate = this.moveMonth(this.date, dir); + newViewDate = this.moveMonth(this.viewDate, dir); + } else if (viewMode === 2) { + newDate = this.moveDate(this.date, dir); + newViewDate = this.moveDate(this.viewDate, dir); + } else if (viewMode === 1) { + newDate = this.moveHour(this.date, dir); + newViewDate = this.moveHour(this.viewDate, dir); + } else if (viewMode === 0) { + newDate = this.moveMinute(this.date, dir); + newViewDate = this.moveMinute(this.viewDate, dir); + } + if (this.dateWithinRange(newDate)) { + this.date = newDate; + this.viewDate = newViewDate; + this.setValue(); + this.update(); + e.preventDefault(); + dateChanged = true; + } + break; + case 38: // up + case 40: // down + if (!this.keyboardNavigation) break; + dir = e.keyCode === 38 ? -1 : 1; + viewMode = this.viewMode; + if (e.ctrlKey) { + viewMode += 2; + } else if (e.shiftKey) { + viewMode += 1; + } + if (viewMode === 4) { + newDate = this.moveYear(this.date, dir); + newViewDate = this.moveYear(this.viewDate, dir); + } else if (viewMode === 3) { + newDate = this.moveMonth(this.date, dir); + newViewDate = this.moveMonth(this.viewDate, dir); + } else if (viewMode === 2) { + newDate = this.moveDate(this.date, dir * 7); + newViewDate = this.moveDate(this.viewDate, dir * 7); + } else if (viewMode === 1) { + if (this.showMeridian) { + newDate = this.moveHour(this.date, dir * 6); + newViewDate = this.moveHour(this.viewDate, dir * 6); + } else { + newDate = this.moveHour(this.date, dir * 4); + newViewDate = this.moveHour(this.viewDate, dir * 4); + } + } else if (viewMode === 0) { + newDate = this.moveMinute(this.date, dir * 4); + newViewDate = this.moveMinute(this.viewDate, dir * 4); + } + if (this.dateWithinRange(newDate)) { + this.date = newDate; + this.viewDate = newViewDate; + this.setValue(); + this.update(); + e.preventDefault(); + dateChanged = true; + } + break; + case 13: // enter + if (this.viewMode !== 0) { + var oldViewMode = this.viewMode; + this.showMode(-1); + this.fill(); + if (oldViewMode === this.viewMode && this.autoclose) { + this.hide(); + } + } else { + this.fill(); + if (this.autoclose) { + this.hide(); + } + } + e.preventDefault(); + break; + case 9: // tab + this.hide(); + break; + } + if (dateChanged) { + var element; + if (this.isInput) { + element = this.element; + } else if (this.component) { + element = this.element.find('input'); + } + if (element) { + element.change(); + } + this.element.trigger({ + type: 'changeDate', + date: this.getDate() + }); + } + }, + + showMode: function (dir) { + if (dir) { + var newViewMode = Math.max(0, Math.min(DPGlobal.modes.length - 1, this.viewMode + dir)); + if (newViewMode >= this.minView && newViewMode <= this.maxView) { + this.element.trigger({ + type: 'changeMode', + date: this.viewDate, + oldViewMode: this.viewMode, + newViewMode: newViewMode + }); + + this.viewMode = newViewMode; + } + } + /* + vitalets: fixing bug of very special conditions: + jquery 1.7.1 + webkit + show inline datetimepicker in bootstrap popover. + Method show() does not set display css correctly and datetimepicker is not shown. + Changed to .css('display', 'block') solve the problem. + See https://github.com/vitalets/x-editable/issues/37 + + In jquery 1.7.2+ everything works fine. + */ + //this.picker.find('>div').hide().filter('.datetimepicker-'+DPGlobal.modes[this.viewMode].clsName).show(); + this.picker.find('>div').hide().filter('.datetimepicker-' + DPGlobal.modes[this.viewMode].clsName).css('display', 'block'); + this.updateNavArrows(); + }, + + reset: function () { + this._setDate(null, 'date'); + }, + + convertViewModeText: function (viewMode) { + switch (viewMode) { + case 4: + return 'decade'; + case 3: + return 'year'; + case 2: + return 'month'; + case 1: + return 'day'; + case 0: + return 'hour'; + } + } + }; + + var old = $.fn.datetimepicker; + $.fn.datetimepicker = function (option) { + var args = Array.apply(null, arguments); + args.shift(); + var internal_return; + this.each(function () { + var $this = $(this), + data = $this.data('datetimepicker'), + options = typeof option === 'object' && option; + if (!data) { + $this.data('datetimepicker', (data = new Datetimepicker(this, $.extend({}, $.fn.datetimepicker.defaults, options)))); + } + if (typeof option === 'string' && typeof data[option] === 'function') { + internal_return = data[option].apply(data, args); + if (internal_return !== undefined) { + return false; + } + } + }); + if (internal_return !== undefined) + return internal_return; + else + return this; + }; + + $.fn.datetimepicker.defaults = { + }; + $.fn.datetimepicker.Constructor = Datetimepicker; + var dates = $.fn.datetimepicker.dates = { + en: { + days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'], + daysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], + daysMin: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'], + months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], + monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], + meridiem: ['am', 'pm'], + suffix: ['st', 'nd', 'rd', 'th'], + today: 'Today', + clear: 'Clear' + } + }; + + var DPGlobal = { + modes: [ + { + clsName: 'minutes', + navFnc: 'Hours', + navStep: 1 + }, + { + clsName: 'hours', + navFnc: 'Date', + navStep: 1 + }, + { + clsName: 'days', + navFnc: 'Month', + navStep: 1 + }, + { + clsName: 'months', + navFnc: 'FullYear', + navStep: 1 + }, + { + clsName: 'years', + navFnc: 'FullYear', + navStep: 10 + } + ], + isLeapYear: function (year) { + return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0)) + }, + getDaysInMonth: function (year, month) { + return [31, (DPGlobal.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month] + }, + getDefaultFormat: function (type, field) { + if (type === 'standard') { + if (field === 'input') + return 'yyyy-mm-dd hh:ii'; + else + return 'yyyy-mm-dd hh:ii:ss'; + } else if (type === 'php') { + if (field === 'input') + return 'Y-m-d H:i'; + else + return 'Y-m-d H:i:s'; + } else { + throw new Error('Invalid format type.'); + } + }, + validParts: function (type) { + if (type === 'standard') { + return /t|hh?|HH?|p|P|z|Z|ii?|ss?|dd?|DD?|mm?|MM?|yy(?:yy)?/g; + } else if (type === 'php') { + return /[dDjlNwzFmMnStyYaABgGhHis]/g; + } else { + throw new Error('Invalid format type.'); + } + }, + nonpunctuation: /[^ -\/:-@\[-`{-~\t\n\rTZ]+/g, + parseFormat: function (format, type) { + // IE treats \0 as a string end in inputs (truncating the value), + // so it's a bad format delimiter, anyway + var separators = format.replace(this.validParts(type), '\0').split('\0'), + parts = format.match(this.validParts(type)); + if (!separators || !separators.length || !parts || parts.length === 0) { + throw new Error('Invalid date format.'); + } + return {separators: separators, parts: parts}; + }, + parseDate: function (date, format, language, type, timezone) { + if (date instanceof Date) { + var dateUTC = new Date(date.valueOf() - date.getTimezoneOffset() * 60000); + dateUTC.setMilliseconds(0); + return dateUTC; + } + if (/^\d{4}\-\d{1,2}\-\d{1,2}$/.test(date)) { + format = this.parseFormat('yyyy-mm-dd', type); + } + if (/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}$/.test(date)) { + format = this.parseFormat('yyyy-mm-dd hh:ii', type); + } + if (/^\d{4}\-\d{1,2}\-\d{1,2}[T ]\d{1,2}\:\d{1,2}\:\d{1,2}[Z]{0,1}$/.test(date)) { + format = this.parseFormat('yyyy-mm-dd hh:ii:ss', type); + } + if (/^[-+]\d+[dmwy]([\s,]+[-+]\d+[dmwy])*$/.test(date)) { + var part_re = /([-+]\d+)([dmwy])/, + parts = date.match(/([-+]\d+)([dmwy])/g), + part, dir; + date = new Date(); + for (var i = 0; i < parts.length; i++) { + part = part_re.exec(parts[i]); + dir = parseInt(part[1]); + switch (part[2]) { + case 'd': + date.setUTCDate(date.getUTCDate() + dir); + break; + case 'm': + date = Datetimepicker.prototype.moveMonth.call(Datetimepicker.prototype, date, dir); + break; + case 'w': + date.setUTCDate(date.getUTCDate() + dir * 7); + break; + case 'y': + date = Datetimepicker.prototype.moveYear.call(Datetimepicker.prototype, date, dir); + break; + } + } + return UTCDate(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds(), 0); + } + var parts = date && date.toString().match(this.nonpunctuation) || [], + date = new Date(0, 0, 0, 0, 0, 0, 0), + parsed = {}, + setters_order = ['hh', 'h', 'ii', 'i', 'ss', 's', 'yyyy', 'yy', 'M', 'MM', 'm', 'mm', 'D', 'DD', 'd', 'dd', 'H', 'HH', 'p', 'P', 'z', 'Z'], + setters_map = { + hh: function (d, v) { + return d.setUTCHours(v); + }, + h: function (d, v) { + return d.setUTCHours(v); + }, + HH: function (d, v) { + return d.setUTCHours(v === 12 ? 0 : v); + }, + H: function (d, v) { + return d.setUTCHours(v === 12 ? 0 : v); + }, + ii: function (d, v) { + return d.setUTCMinutes(v); + }, + i: function (d, v) { + return d.setUTCMinutes(v); + }, + ss: function (d, v) { + return d.setUTCSeconds(v); + }, + s: function (d, v) { + return d.setUTCSeconds(v); + }, + yyyy: function (d, v) { + return d.setUTCFullYear(v); + }, + yy: function (d, v) { + return d.setUTCFullYear(2000 + v); + }, + m: function (d, v) { + v -= 1; + while (v < 0) v += 12; + v %= 12; + d.setUTCMonth(v); + while (d.getUTCMonth() !== v) + if (isNaN(d.getUTCMonth())) + return d; + else + d.setUTCDate(d.getUTCDate() - 1); + return d; + }, + d: function (d, v) { + return d.setUTCDate(v); + }, + p: function (d, v) { + return d.setUTCHours(v === 1 ? d.getUTCHours() + 12 : d.getUTCHours()); + }, + z: function () { + return timezone + } + }, + val, filtered, part; + setters_map['M'] = setters_map['MM'] = setters_map['mm'] = setters_map['m']; + setters_map['dd'] = setters_map['d']; + setters_map['P'] = setters_map['p']; + setters_map['Z'] = setters_map['z']; + date = UTCDate(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()); + if (parts.length === format.parts.length) { + for (var i = 0, cnt = format.parts.length; i < cnt; i++) { + val = parseInt(parts[i], 10); + part = format.parts[i]; + if (isNaN(val)) { + switch (part) { + case 'MM': + filtered = $(dates[language].months).filter(function () { + var m = this.slice(0, parts[i].length), + p = parts[i].slice(0, m.length); + return m === p; + }); + val = $.inArray(filtered[0], dates[language].months) + 1; + break; + case 'M': + filtered = $(dates[language].monthsShort).filter(function () { + var m = this.slice(0, parts[i].length), + p = parts[i].slice(0, m.length); + return m.toLowerCase() === p.toLowerCase(); + }); + val = $.inArray(filtered[0], dates[language].monthsShort) + 1; + break; + case 'p': + case 'P': + val = $.inArray(parts[i].toLowerCase(), dates[language].meridiem); + break; + case 'z': + case 'Z': + timezone; + break; + + } + } + parsed[part] = val; + } + for (var i = 0, s; i < setters_order.length; i++) { + s = setters_order[i]; + if (s in parsed && !isNaN(parsed[s])) + setters_map[s](date, parsed[s]) + } + } + return date; + }, + formatDate: function (date, format, language, type, timezone) { + if (date === null) { + return ''; + } + var val; + if (type === 'standard') { + val = { + t: date.getTime(), + // year + yy: date.getUTCFullYear().toString().substring(2), + yyyy: date.getUTCFullYear(), + // month + m: date.getUTCMonth() + 1, + M: dates[language].monthsShort[date.getUTCMonth()], + MM: dates[language].months[date.getUTCMonth()], + // day + d: date.getUTCDate(), + D: dates[language].daysShort[date.getUTCDay()], + DD: dates[language].days[date.getUTCDay()], + p: (dates[language].meridiem.length === 2 ? dates[language].meridiem[date.getUTCHours() < 12 ? 0 : 1] : ''), + // hour + h: date.getUTCHours(), + // minute + i: date.getUTCMinutes(), + // second + s: date.getUTCSeconds(), + // timezone + z: timezone + }; + + if (dates[language].meridiem.length === 2) { + val.H = (val.h % 12 === 0 ? 12 : val.h % 12); + } + else { + val.H = val.h; + } + val.HH = (val.H < 10 ? '0' : '') + val.H; + val.P = val.p.toUpperCase(); + val.Z = val.z; + val.hh = (val.h < 10 ? '0' : '') + val.h; + val.ii = (val.i < 10 ? '0' : '') + val.i; + val.ss = (val.s < 10 ? '0' : '') + val.s; + val.dd = (val.d < 10 ? '0' : '') + val.d; + val.mm = (val.m < 10 ? '0' : '') + val.m; + } else if (type === 'php') { + // php format + val = { + // year + y: date.getUTCFullYear().toString().substring(2), + Y: date.getUTCFullYear(), + // month + F: dates[language].months[date.getUTCMonth()], + M: dates[language].monthsShort[date.getUTCMonth()], + n: date.getUTCMonth() + 1, + t: DPGlobal.getDaysInMonth(date.getUTCFullYear(), date.getUTCMonth()), + // day + j: date.getUTCDate(), + l: dates[language].days[date.getUTCDay()], + D: dates[language].daysShort[date.getUTCDay()], + w: date.getUTCDay(), // 0 -> 6 + N: (date.getUTCDay() === 0 ? 7 : date.getUTCDay()), // 1 -> 7 + S: (date.getUTCDate() % 10 <= dates[language].suffix.length ? dates[language].suffix[date.getUTCDate() % 10 - 1] : ''), + // hour + a: (dates[language].meridiem.length === 2 ? dates[language].meridiem[date.getUTCHours() < 12 ? 0 : 1] : ''), + g: (date.getUTCHours() % 12 === 0 ? 12 : date.getUTCHours() % 12), + G: date.getUTCHours(), + // minute + i: date.getUTCMinutes(), + // second + s: date.getUTCSeconds() + }; + val.m = (val.n < 10 ? '0' : '') + val.n; + val.d = (val.j < 10 ? '0' : '') + val.j; + val.A = val.a.toString().toUpperCase(); + val.h = (val.g < 10 ? '0' : '') + val.g; + val.H = (val.G < 10 ? '0' : '') + val.G; + val.i = (val.i < 10 ? '0' : '') + val.i; + val.s = (val.s < 10 ? '0' : '') + val.s; + } else { + throw new Error('Invalid format type.'); + } + var date = [], + seps = $.extend([], format.separators); + for (var i = 0, cnt = format.parts.length; i < cnt; i++) { + if (seps.length) { + date.push(seps.shift()); + } + date.push(val[format.parts[i]]); + } + if (seps.length) { + date.push(seps.shift()); + } + return date.join(''); + }, + convertViewMode: function (viewMode) { + switch (viewMode) { + case 4: + case 'decade': + viewMode = 4; + break; + case 3: + case 'year': + viewMode = 3; + break; + case 2: + case 'month': + viewMode = 2; + break; + case 1: + case 'day': + viewMode = 1; + break; + case 0: + case 'hour': + viewMode = 0; + break; + } + + return viewMode; + }, + headTemplate: '<thead>' + + '<tr>' + + '<th class="prev"><i class="{iconType} {leftArrow}"/></th>' + + '<th colspan="5" class="switch"></th>' + + '<th class="next"><i class="{iconType} {rightArrow}"/></th>' + + '</tr>' + + '</thead>', + headTemplateV3: '<thead>' + + '<tr>' + + '<th class="prev"><span class="{iconType} {leftArrow}"></span> </th>' + + '<th colspan="5" class="switch"></th>' + + '<th class="next"><span class="{iconType} {rightArrow}"></span> </th>' + + '</tr>' + + '</thead>', + contTemplate: '<tbody><tr><td colspan="7"></td></tr></tbody>', + footTemplate: '<tfoot>' + + '<tr><th colspan="7" class="today"></th></tr>' + + '<tr><th colspan="7" class="clear"></th></tr>' + + '</tfoot>' + }; + DPGlobal.template = '<div class="datetimepicker">' + + '<div class="datetimepicker-minutes">' + + '<table class=" table-condensed">' + + DPGlobal.headTemplate + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '</table>' + + '</div>' + + '<div class="datetimepicker-hours">' + + '<table class=" table-condensed">' + + DPGlobal.headTemplate + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '</table>' + + '</div>' + + '<div class="datetimepicker-days">' + + '<table class=" table-condensed">' + + DPGlobal.headTemplate + + '<tbody></tbody>' + + DPGlobal.footTemplate + + '</table>' + + '</div>' + + '<div class="datetimepicker-months">' + + '<table class="table-condensed">' + + DPGlobal.headTemplate + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '</table>' + + '</div>' + + '<div class="datetimepicker-years">' + + '<table class="table-condensed">' + + DPGlobal.headTemplate + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '</table>' + + '</div>' + + '</div>'; + DPGlobal.templateV3 = '<div class="datetimepicker">' + + '<div class="datetimepicker-minutes">' + + '<table class=" table-condensed">' + + DPGlobal.headTemplateV3 + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '</table>' + + '</div>' + + '<div class="datetimepicker-hours">' + + '<table class=" table-condensed">' + + DPGlobal.headTemplateV3 + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '</table>' + + '</div>' + + '<div class="datetimepicker-days">' + + '<table class=" table-condensed">' + + DPGlobal.headTemplateV3 + + '<tbody></tbody>' + + DPGlobal.footTemplate + + '</table>' + + '</div>' + + '<div class="datetimepicker-months">' + + '<table class="table-condensed">' + + DPGlobal.headTemplateV3 + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '</table>' + + '</div>' + + '<div class="datetimepicker-years">' + + '<table class="table-condensed">' + + DPGlobal.headTemplateV3 + + DPGlobal.contTemplate + + DPGlobal.footTemplate + + '</table>' + + '</div>' + + '</div>'; + $.fn.datetimepicker.DPGlobal = DPGlobal; + + /* DATETIMEPICKER NO CONFLICT + * =================== */ + + $.fn.datetimepicker.noConflict = function () { + $.fn.datetimepicker = old; + return this; + }; + + /* DATETIMEPICKER DATA-API + * ================== */ + + $(document).on( + 'focus.datetimepicker.data-api click.datetimepicker.data-api', + '[data-provide="datetimepicker"]', + function (e) { + var $this = $(this); + if ($this.data('datetimepicker')) return; + e.preventDefault(); + // component click requires us to explicitly show it + $this.datetimepicker('show'); + } + ); + $(function () { + $('[data-provide="datetimepicker-inline"]').datetimepicker(); + }); + +})); +/* + * Copyright 2018-2018 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * WebSite: http://bootstrap-viewer.leftso.com + */ + +$.fn.bootstrapViewer = function (options) { + $(this).on('click', function () { + var opts = $.extend({}, $.fn.bootstrapViewer.defaults, options); + var viewer = $('<div class="modal fade bs-example-modal-lg text-center" id="bootstrapViewer" tabindex="-1" role="dialog" aria-labelledby="myLargeModalLabel" >\n' + + ' <div class="modal-dialog modal-lg" style="display: inline-block; width: auto;">\n' + + ' <div class="modal-content">\n' + + ' <img' + + '\t\t\t class="carousel-inner img-responsive img-rounded img-viewer" draggable="false"\n' + + '\t\t\t onclick="/*$(\'#bootstrapViewer\').modal(\'hide\');setTimeout(function(){$(\'#bootstrapViewer\').remove();},200);*/"\n' + + '\t\t\t onmouseover="this.style.cursor=\'move\';" \n' + + '\t\t\t onmouseout="this.style.cursor=\'default\'" \n' + + '\t\t\t />\n' + + ' </div>\n' + + ' </div>\n' + + ' </div>'); + $('body').append(viewer); + if ($(this).attr(opts.src)) { + $("#bootstrapViewer").find(".img-viewer").attr("src", $(this).attr(opts.src)); + $("#bootstrapViewer").modal(); + } else { + throw "图片不存在" + } + $('#bootstrapViewer').on('hidden.bs.modal', function(){ + $('#bootstrapViewer').remove(); + }); + + var $moveDiv = $('#bootstrapViewer .modal-dialog'); + var isMove = false; + var div_x = $moveDiv.offset().left; + var div_y = $moveDiv.offset().top; + + var mousedownFunc = function (e) { + if (isMove) { + var left = e.pageX - div_x; + var top = e.pageY - div_y; + if(left < 0){ left = 0} + if(top < 0){ top = 0} + $moveDiv.css({"left": left, "top":top}); + } + } + + $moveDiv.mousedown(function (e) { + $moveDiv.css({ left: $moveDiv[0].offsetLeft, top: $moveDiv[0].offsetTop, marginTop: 0, position: 'absolute' }); + + isMove = true; + div_x = e.pageX - $moveDiv.offset().left; + div_y = e.pageY - $moveDiv.offset().top; + $(document).mousemove(mousedownFunc); + }).mouseup(function () { + isMove = false; + $(document).unbind('mousemove', mousedownFunc); + }); + }) + + $(this).on('mouseover', function () { + $(this).css('cursor', 'zoom-in'); + }) +} +$.fn.bootstrapViewer.defaults = { + src: 'src' +} +; +/* Author:mingyuhisoft@163.com + * Github:https://github.com/imingyu/jquery.mloading + * Npm:npm install jquery.mloading.js + * Date:2016-7-4 + */ + + +;(function (root, factory) { + 'use strict'; + + if (typeof module === 'object' && typeof module.exports === 'object') { + factory(require('jquery'),root); + } if(typeof define ==="function"){ + if(define.cmd){ + define(function(require, exports, module){ + var $ = require("jquery"); + factory($,root); + }); + }else{ + define(["jquery"],function($){ + factory($,root); + }); + } + }else { + factory(root.jQuery,root); + } +} (typeof window !=="undefined" ? window : this, function ($, root, undefined) { + 'use strict'; + if(!$){ + $ = root.jQuery || null; + } + if(!$){ + throw new TypeError("必须引入jquery库方可正常使用!"); + } + + var arraySlice = Array.prototype.slice, + comparison=function (obj1,obj2) { + var result=true; + for(var pro in obj1){ + if(obj1[pro] !== obj2[obj1]){ + result=true; + break; + } + } + return result; + } + + function MLoading(dom,options) { + options=options||{}; + this.dom=dom; + this.options=$.extend(true,{},MLoading.defaultOptions,options); + this.curtain=null; + this.render().show(); + } + MLoading.prototype={ + constructor:MLoading, + initElement:function () { + var dom=this.dom, + ops=this.options; + var curtainElement=dom.children(".mloading"), + bodyElement = curtainElement.children('.mloading-body'), + barElement = bodyElement.children('.mloading-bar'), + iconElement = barElement.children('.mloading-icon'), + textElement = barElement.find(".mloading-text"); + if (curtainElement.length == 0) { + curtainElement = $('<div class="mloading"></div>'); + dom.append(curtainElement); + } + if (bodyElement.length == 0) { + bodyElement = $('<div class="mloading-body"></div>'); + curtainElement.append(bodyElement); + } + if (barElement.length == 0) { + barElement = $('<div class="mloading-bar"></div>'); + bodyElement.append(barElement); + } + if (iconElement.length == 0) { + var _iconElement=document.createElement(ops.iconTag); + iconElement = $(_iconElement); + iconElement.addClass("mloading-icon"); + barElement.append(iconElement); + } + if (textElement.length == 0) { + textElement = $('<span class="mloading-text"></span>'); + barElement.append(textElement); + } + + this.curtainElement=curtainElement; + this.bodyElement = bodyElement; + this.barElement = barElement; + this.iconElement = iconElement; + this.textElement = textElement; + return this; + }, + render:function () { + var dom=this.dom, + ops=this.options; + this.initElement(); + if(dom.is("html") || dom.is("body")){ + this.curtainElement.addClass("mloading-full"); + }else{ + this.curtainElement.removeClass("mloading-full"); + + if(!dom.hasClass("mloading-container")){ + dom.addClass("mloading-container"); + } + } + if(ops.mask){ + this.curtainElement.addClass("mloading-mask"); + }else{ + this.curtainElement.removeClass("mloading-mask"); + } + if(ops.content!="" && typeof ops.content!="undefined"){ + if(ops.html){ + this.bodyElement.html(ops.content); + }else{ + this.bodyElement.text(ops.content); + } + }else{ + this.iconElement.attr("src",ops.icon); + if(ops.html){ + this.textElement.html(ops.text); + }else{ + this.textElement.text(ops.text); + } + } + + return this; + }, + setOptions:function (options) { + options=options||{}; + var oldOptions = this.options; + this.options = $.extend(true,{},this.options,options); + if(!comparison(oldOptions,this.options)) this.render(); + }, + show:function () { + var dom=this.dom, + ops=this.options, + barElement=this.barElement; + this.curtainElement.addClass("active"); + barElement.css({ + "marginTop":"-"+barElement.outerHeight()/2+"px", + "marginLeft":"-"+barElement.outerWidth()/2+"px" + }); + + return this; + }, + hide:function () { + var dom=this.dom, + ops=this.options; + this.curtainElement.removeClass("active"); + if(!dom.is("html") && !dom.is("body")){ + dom.removeClass("mloading-container"); + } + return this; + }, + destroy:function () { + var dom=this.dom, + ops=this.options; + this.curtainElement.remove(); + if(!dom.is("html") && !dom.is("body")){ + dom.removeClass("mloading-container"); + } + dom.removeData(MLoading.dataKey); + return this; + } + }; + MLoading.dataKey="MLoading"; + MLoading.defaultOptions = { + text:"加载中...", + iconTag:"img", + icon:"data:image/gif;base64,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", + html:false, + content:"",//设置content后,text和icon设置将无效 + mask:true//是否显示遮罩(半透明背景) + }; + + $.fn.mLoading=function (options) { + var ops={}, + funName="", + funArgs=[]; + if(typeof options==="object"){ + ops = options; + }else if(typeof options ==="string"){ + funName=options; + funArgs = arraySlice.call(arguments).splice(0,1); + } + return this.each(function (i,element) { + var dom = $(element), + plsInc=dom.data(MLoading.dataKey); + if(!plsInc){ + plsInc=new MLoading(dom,ops); + } + + if(funName){ + var fun = plsInc[funName]; + if(typeof fun==="function"){ + fun.apply(plsInc,funArgs); + } + } + }); + } +})); +/*! + * jquery-confirm v3.3.4 (http://craftpip.github.io/jquery-confirm/) + * Author: Boniface Pereira + * Website: www.craftpip.com + * Contact: hey@craftpip.com + * + * Copyright 2013-2019 jquery-confirm + * Licensed under MIT (https://github.com/craftpip/jquery-confirm/blob/master/LICENSE) + */ + +(function(factory){if(typeof define==="function"&&define.amd){define(["jquery"],factory);}else{if(typeof module==="object"&&module.exports){module.exports=function(root,jQuery){if(jQuery===undefined){if(typeof window!=="undefined"){jQuery=require("jquery");}else{jQuery=require("jquery")(root);}}factory(jQuery);return jQuery;};}else{factory(jQuery);}}}(function($){var w=window;$.fn.confirm=function(options,option2){if(typeof options==="undefined"){options={};}if(typeof options==="string"){options={content:options,title:(option2)?option2:false};}$(this).each(function(){var $this=$(this);if($this.attr("jc-attached")){console.warn("jConfirm has already been attached to this element ",$this[0]);return;}$this.on("click",function(e){e.preventDefault();var jcOption=$.extend({},options);if($this.attr("data-title")){jcOption.title=$this.attr("data-title");}if($this.attr("data-content")){jcOption.content=$this.attr("data-content");}if(typeof jcOption.buttons==="undefined"){jcOption.buttons={};}jcOption["$target"]=$this;if($this.attr("href")&&Object.keys(jcOption.buttons).length===0){var buttons=$.extend(true,{},w.jconfirm.pluginDefaults.defaultButtons,(w.jconfirm.defaults||{}).defaultButtons||{});var firstBtn=Object.keys(buttons)[0];jcOption.buttons=buttons;jcOption.buttons[firstBtn].action=function(){location.href=$this.attr("href");};}jcOption.closeIcon=false;var instance=$.confirm(jcOption);});$this.attr("jc-attached",true);});return $(this);};$.confirm=function(options,option2){if(typeof options==="undefined"){options={};}if(typeof options==="string"){options={content:options,title:(option2)?option2:false};}var putDefaultButtons=!(options.buttons===false);if(typeof options.buttons!=="object"){options.buttons={};}if(Object.keys(options.buttons).length===0&&putDefaultButtons){var buttons=$.extend(true,{},w.jconfirm.pluginDefaults.defaultButtons,(w.jconfirm.defaults||{}).defaultButtons||{});options.buttons=buttons;}return w.jconfirm(options);};$.alert=function(options,option2){if(typeof options==="undefined"){options={};}if(typeof options==="string"){options={content:options,title:(option2)?option2:false};}var putDefaultButtons=!(options.buttons===false);if(typeof options.buttons!=="object"){options.buttons={};}if(Object.keys(options.buttons).length===0&&putDefaultButtons){var buttons=$.extend(true,{},w.jconfirm.pluginDefaults.defaultButtons,(w.jconfirm.defaults||{}).defaultButtons||{});var firstBtn=Object.keys(buttons)[0];options.buttons[firstBtn]=buttons[firstBtn];}return w.jconfirm(options);};$.dialog=function(options,option2){if(typeof options==="undefined"){options={};}if(typeof options==="string"){options={content:options,title:(option2)?option2:false,closeIcon:function(){}};}options.buttons={};if(typeof options.closeIcon==="undefined"){options.closeIcon=function(){};}options.confirmKeys=[13];return w.jconfirm(options);};w.jconfirm=function(options){if(typeof options==="undefined"){options={};}var pluginOptions=$.extend(true,{},w.jconfirm.pluginDefaults);if(w.jconfirm.defaults){pluginOptions=$.extend(true,pluginOptions,w.jconfirm.defaults);}pluginOptions=$.extend(true,{},pluginOptions,options);var instance=new w.Jconfirm(pluginOptions);w.jconfirm.instances.push(instance);return instance;};w.Jconfirm=function(options){$.extend(this,options);this._init();};w.Jconfirm.prototype={_init:function(){var that=this;if(!w.jconfirm.instances.length){w.jconfirm.lastFocused=$("body").find(":focus");}this._id=Math.round(Math.random()*99999);this.contentParsed=$(document.createElement("div"));if(!this.lazyOpen){setTimeout(function(){that.open();},0);}},_buildHTML:function(){var that=this;this._parseAnimation(this.animation,"o");this._parseAnimation(this.closeAnimation,"c");this._parseBgDismissAnimation(this.backgroundDismissAnimation);this._parseColumnClass(this.columnClass);this._parseTheme(this.theme);this._parseType(this.type);var template=$(this.template);template.find(".jconfirm-box").addClass(this.animationParsed).addClass(this.backgroundDismissAnimationParsed).addClass(this.typeParsed);if(this.typeAnimated){template.find(".jconfirm-box").addClass("jconfirm-type-animated");}if(this.useBootstrap){template.find(".jc-bs3-row").addClass(this.bootstrapClasses.row);template.find(".jc-bs3-row").addClass("justify-content-md-center justify-content-sm-center justify-content-xs-center justify-content-lg-center");template.find(".jconfirm-box-container").addClass(this.columnClassParsed);if(this.containerFluid){template.find(".jc-bs3-container").addClass(this.bootstrapClasses.containerFluid);}else{template.find(".jc-bs3-container").addClass(this.bootstrapClasses.container);}}else{template.find(".jconfirm-box").css("width",this.boxWidth);}if(this.titleClass){template.find(".jconfirm-title-c").addClass(this.titleClass);}template.addClass(this.themeParsed);var ariaLabel="jconfirm-box"+this._id;template.find(".jconfirm-box").attr("aria-labelledby",ariaLabel).attr("tabindex",-1);template.find(".jconfirm-content").attr("id",ariaLabel);if(this.bgOpacity!==null){template.find(".jconfirm-bg").css("opacity",this.bgOpacity);}if(this.rtl){template.addClass("jconfirm-rtl");}this.$el=template.appendTo(this.container);this.$jconfirmBoxContainer=this.$el.find(".jconfirm-box-container");this.$jconfirmBox=this.$body=this.$el.find(".jconfirm-box");this.$jconfirmBg=this.$el.find(".jconfirm-bg");this.$title=this.$el.find(".jconfirm-title");this.$titleContainer=this.$el.find(".jconfirm-title-c");this.$content=this.$el.find("div.jconfirm-content");this.$contentPane=this.$el.find(".jconfirm-content-pane");this.$icon=this.$el.find(".jconfirm-icon-c");this.$closeIcon=this.$el.find(".jconfirm-closeIcon");this.$holder=this.$el.find(".jconfirm-holder");this.$btnc=this.$el.find(".jconfirm-buttons");this.$scrollPane=this.$el.find(".jconfirm-scrollpane");that.setStartingPoint();this._contentReady=$.Deferred();this._modalReady=$.Deferred();this.$holder.css({"padding-top":this.offsetTop,"padding-bottom":this.offsetBottom,});this.setTitle();this.setIcon();this._setButtons();this._parseContent();this.initDraggable();if(this.isAjax){this.showLoading(false);}$.when(this._contentReady,this._modalReady).then(function(){if(that.isAjaxLoading){setTimeout(function(){that.isAjaxLoading=false;that.setContent();that.setTitle();that.setIcon();setTimeout(function(){that.hideLoading(false);that._updateContentMaxHeight();},100);if(typeof that.onContentReady==="function"){that.onContentReady();}},50);}else{that._updateContentMaxHeight();that.setTitle();that.setIcon();if(typeof that.onContentReady==="function"){that.onContentReady();}}if(that.autoClose){that._startCountDown();}}).then(function(){that._watchContent();});if(this.animation==="none"){this.animationSpeed=1;this.animationBounce=1;}this.$body.css(this._getCSS(this.animationSpeed,this.animationBounce));this.$contentPane.css(this._getCSS(this.animationSpeed,1));this.$jconfirmBg.css(this._getCSS(this.animationSpeed,1));this.$jconfirmBoxContainer.css(this._getCSS(this.animationSpeed,1));},_typePrefix:"jconfirm-type-",typeParsed:"",_parseType:function(type){this.typeParsed=this._typePrefix+type;},setType:function(type){var oldClass=this.typeParsed;this._parseType(type);this.$jconfirmBox.removeClass(oldClass).addClass(this.typeParsed);},themeParsed:"",_themePrefix:"jconfirm-",setTheme:function(theme){var previous=this.theme;this.theme=theme||this.theme;this._parseTheme(this.theme);if(previous){this.$el.removeClass(previous);}this.$el.addClass(this.themeParsed);this.theme=theme;},_parseTheme:function(theme){var that=this;theme=theme.split(",");$.each(theme,function(k,a){if(a.indexOf(that._themePrefix)===-1){theme[k]=that._themePrefix+$.trim(a);}});this.themeParsed=theme.join(" ").toLowerCase();},backgroundDismissAnimationParsed:"",_bgDismissPrefix:"jconfirm-hilight-",_parseBgDismissAnimation:function(bgDismissAnimation){var animation=bgDismissAnimation.split(",");var that=this;$.each(animation,function(k,a){if(a.indexOf(that._bgDismissPrefix)===-1){animation[k]=that._bgDismissPrefix+$.trim(a);}});this.backgroundDismissAnimationParsed=animation.join(" ").toLowerCase();},animationParsed:"",closeAnimationParsed:"",_animationPrefix:"jconfirm-animation-",setAnimation:function(animation){this.animation=animation||this.animation;this._parseAnimation(this.animation,"o");},_parseAnimation:function(animation,which){which=which||"o";var animations=animation.split(",");var that=this;$.each(animations,function(k,a){if(a.indexOf(that._animationPrefix)===-1){animations[k]=that._animationPrefix+$.trim(a);}});var a_string=animations.join(" ").toLowerCase();if(which==="o"){this.animationParsed=a_string;}else{this.closeAnimationParsed=a_string;}return a_string;},setCloseAnimation:function(closeAnimation){this.closeAnimation=closeAnimation||this.closeAnimation;this._parseAnimation(this.closeAnimation,"c");},setAnimationSpeed:function(speed){this.animationSpeed=speed||this.animationSpeed;},columnClassParsed:"",setColumnClass:function(colClass){if(!this.useBootstrap){console.warn("cannot set columnClass, useBootstrap is set to false");return;}this.columnClass=colClass||this.columnClass;this._parseColumnClass(this.columnClass);this.$jconfirmBoxContainer.addClass(this.columnClassParsed);},_updateContentMaxHeight:function(){var height=$(window).height()-(this.$jconfirmBox.outerHeight()-this.$contentPane.outerHeight())-(this.offsetTop+this.offsetBottom);this.$contentPane.css({"max-height":height+"px"});},setBoxWidth:function(width){if(this.useBootstrap){console.warn("cannot set boxWidth, useBootstrap is set to true");return;}this.boxWidth=width;this.$jconfirmBox.css("width",width);},_parseColumnClass:function(colClass){colClass=colClass.toLowerCase();var p;switch(colClass){case"xl":case"xlarge":p="col-md-12";break;case"l":case"large":p="col-md-8 col-md-offset-2";break;case"m":case"medium":p="col-md-6 col-md-offset-3";break;case"s":case"small":p="col-md-4 col-md-offset-4";break;case"xs":case"xsmall":p="col-md-2 col-md-offset-5";break;default:p=colClass;}this.columnClassParsed=p;},initDraggable:function(){var that=this;var $t=this.$titleContainer;this.resetDrag();if(this.draggable){$t.on("mousedown",function(e){$t.addClass("jconfirm-hand");that.mouseX=e.clientX;that.mouseY=e.clientY;that.isDrag=true;});$(window).on("mousemove."+this._id,function(e){if(that.isDrag){that.movingX=e.clientX-that.mouseX+that.initialX;that.movingY=e.clientY-that.mouseY+that.initialY;that.setDrag();}});$(window).on("mouseup."+this._id,function(){$t.removeClass("jconfirm-hand");if(that.isDrag){that.isDrag=false;that.initialX=that.movingX;that.initialY=that.movingY;}});}},resetDrag:function(){this.isDrag=false;this.initialX=0;this.initialY=0;this.movingX=0;this.movingY=0;this.mouseX=0;this.mouseY=0;this.$jconfirmBoxContainer.css("transform","translate("+0+"px, "+0+"px)");},setDrag:function(){if(!this.draggable){return;}this.alignMiddle=false;var boxWidth=this.$jconfirmBox.outerWidth();var boxHeight=this.$jconfirmBox.outerHeight();var windowWidth=$(window).width();var windowHeight=$(window).height();var that=this;var dragUpdate=1;if(that.movingX%dragUpdate===0||that.movingY%dragUpdate===0){if(that.dragWindowBorder){var leftDistance=(windowWidth/2)-boxWidth/2;var topDistance=(windowHeight/2)-boxHeight/2;topDistance-=that.dragWindowGap;leftDistance-=that.dragWindowGap;if(leftDistance+that.movingX<0){that.movingX=-leftDistance;}else{if(leftDistance-that.movingX<0){that.movingX=leftDistance;}}if(topDistance+that.movingY<0){that.movingY=-topDistance;}else{if(topDistance-that.movingY<0){that.movingY=topDistance;}}}that.$jconfirmBoxContainer.css("transform","translate("+that.movingX+"px, "+that.movingY+"px)");}},_scrollTop:function(){if(typeof pageYOffset!=="undefined"){return pageYOffset;}else{var B=document.body;var D=document.documentElement;D=(D.clientHeight)?D:B;return D.scrollTop;}},_watchContent:function(){var that=this;if(this._timer){clearInterval(this._timer);}var prevContentHeight=0;this._timer=setInterval(function(){if(that.smoothContent){var contentHeight=that.$content.outerHeight()||0;if(contentHeight!==prevContentHeight){prevContentHeight=contentHeight;}var wh=$(window).height();var total=that.offsetTop+that.offsetBottom+that.$jconfirmBox.height()-that.$contentPane.height()+that.$content.height();if(total<wh){that.$contentPane.addClass("no-scroll");}else{that.$contentPane.removeClass("no-scroll");}}},this.watchInterval);},_overflowClass:"jconfirm-overflow",_hilightAnimating:false,highlight:function(){this.hiLightModal();},hiLightModal:function(){var that=this;if(this._hilightAnimating){return;}that.$body.addClass("hilight");var duration=parseFloat(that.$body.css("animation-duration"))||2;this._hilightAnimating=true;setTimeout(function(){that._hilightAnimating=false;that.$body.removeClass("hilight");},duration*1000);},_bindEvents:function(){var that=this;this.boxClicked=false;this.$scrollPane.click(function(e){if(!that.boxClicked){var buttonName=false;var shouldClose=false;var str;if(typeof that.backgroundDismiss==="function"){str=that.backgroundDismiss();}else{str=that.backgroundDismiss;}if(typeof str==="string"&&typeof that.buttons[str]!=="undefined"){buttonName=str;shouldClose=false;}else{if(typeof str==="undefined"||!!(str)===true){shouldClose=true;}else{shouldClose=false;}}if(buttonName){var btnResponse=that.buttons[buttonName].action.apply(that);shouldClose=(typeof btnResponse==="undefined")||!!(btnResponse);}if(shouldClose){that.close();}else{that.hiLightModal();}}that.boxClicked=false;});this.$jconfirmBox.click(function(e){that.boxClicked=true;});var isKeyDown=false;$(window).on("jcKeyDown."+that._id,function(e){if(!isKeyDown){isKeyDown=true;}});$(window).on("keyup."+that._id,function(e){if(isKeyDown){that.reactOnKey(e);isKeyDown=false;}});$(window).on("resize."+this._id,function(){that._updateContentMaxHeight();setTimeout(function(){that.resetDrag();},100);});},_cubic_bezier:"0.36, 0.55, 0.19",_getCSS:function(speed,bounce){return{"-webkit-transition-duration":speed/1000+"s","transition-duration":speed/1000+"s","-webkit-transition-timing-function":"cubic-bezier("+this._cubic_bezier+", "+bounce+")","transition-timing-function":"cubic-bezier("+this._cubic_bezier+", "+bounce+")"};},_setButtons:function(){var that=this;var total_buttons=0;if(typeof this.buttons!=="object"){this.buttons={};}$.each(this.buttons,function(key,button){total_buttons+=1;if(typeof button==="function"){that.buttons[key]=button={action:button};}that.buttons[key].text=button.text||key;that.buttons[key].btnClass=button.btnClass||"btn-default";that.buttons[key].action=button.action||function(){};that.buttons[key].keys=button.keys||[];that.buttons[key].isHidden=button.isHidden||false;that.buttons[key].isDisabled=button.isDisabled||false;$.each(that.buttons[key].keys,function(i,a){that.buttons[key].keys[i]=a.toLowerCase();});var button_element=$('<button type="button" class="btn"></button>').html(that.buttons[key].text).addClass(that.buttons[key].btnClass).prop("disabled",that.buttons[key].isDisabled).css("display",that.buttons[key].isHidden?"none":"").click(function(e){e.preventDefault();var res=that.buttons[key].action.apply(that,[that.buttons[key]]);that.onAction.apply(that,[key,that.buttons[key]]);that._stopCountDown();if(typeof res==="undefined"||res){that.close();}});that.buttons[key].el=button_element;that.buttons[key].setText=function(text){button_element.html(text);};that.buttons[key].addClass=function(className){button_element.addClass(className);};that.buttons[key].removeClass=function(className){button_element.removeClass(className);};that.buttons[key].disable=function(){that.buttons[key].isDisabled=true;button_element.prop("disabled",true);};that.buttons[key].enable=function(){that.buttons[key].isDisabled=false;button_element.prop("disabled",false);};that.buttons[key].show=function(){that.buttons[key].isHidden=false;button_element.css("display","");};that.buttons[key].hide=function(){that.buttons[key].isHidden=true;button_element.css("display","none");};that["$_"+key]=that["$$"+key]=button_element;that.$btnc.append(button_element);});if(total_buttons===0){this.$btnc.hide();}if(this.closeIcon===null&&total_buttons===0){this.closeIcon=true;}if(this.closeIcon){if(this.closeIconClass){var closeHtml='<i class="'+this.closeIconClass+'"></i>';this.$closeIcon.html(closeHtml);}this.$closeIcon.click(function(e){e.preventDefault();var buttonName=false;var shouldClose=false;var str;if(typeof that.closeIcon==="function"){str=that.closeIcon();}else{str=that.closeIcon;}if(typeof str==="string"&&typeof that.buttons[str]!=="undefined"){buttonName=str;shouldClose=false;}else{if(typeof str==="undefined"||!!(str)===true){shouldClose=true;}else{shouldClose=false;}}if(buttonName){var btnResponse=that.buttons[buttonName].action.apply(that);shouldClose=(typeof btnResponse==="undefined")||!!(btnResponse);}if(shouldClose){that.close();}});this.$closeIcon.show();}else{this.$closeIcon.hide();}},setTitle:function(string,force){force=force||false;if(typeof string!=="undefined"){if(typeof string==="string"){this.title=string;}else{if(typeof string==="function"){if(typeof string.promise==="function"){console.error("Promise was returned from title function, this is not supported.");}var response=string();if(typeof response==="string"){this.title=response;}else{this.title=false;}}else{this.title=false;}}}if(this.isAjaxLoading&&!force){return;}this.$title.html(this.title||"");this.updateTitleContainer();},setIcon:function(iconClass,force){force=force||false;if(typeof iconClass!=="undefined"){if(typeof iconClass==="string"){this.icon=iconClass;}else{if(typeof iconClass==="function"){var response=iconClass();if(typeof response==="string"){this.icon=response;}else{this.icon=false;}}else{this.icon=false;}}}if(this.isAjaxLoading&&!force){return;}this.$icon.html(this.icon?'<i class="'+this.icon+'"></i>':"");this.updateTitleContainer();},updateTitleContainer:function(){if(!this.title&&!this.icon){this.$titleContainer.hide();}else{this.$titleContainer.show();}},setContentPrepend:function(content,force){if(!content){return;}this.contentParsed.prepend(content);},setContentAppend:function(content){if(!content){return;}this.contentParsed.append(content);},setContent:function(content,force){force=!!force;var that=this;if(content){this.contentParsed.html("").append(content);}if(this.isAjaxLoading&&!force){return;}this.$content.html("");this.$content.append(this.contentParsed);setTimeout(function(){that.$body.find("input[autofocus]:visible:first").focus();},100);},loadingSpinner:false,showLoading:function(disableButtons){this.loadingSpinner=true;this.$jconfirmBox.addClass("loading");if(disableButtons){this.$btnc.find("button").prop("disabled",true);}},hideLoading:function(enableButtons){this.loadingSpinner=false;this.$jconfirmBox.removeClass("loading");if(enableButtons){this.$btnc.find("button").prop("disabled",false);}},ajaxResponse:false,contentParsed:"",isAjax:false,isAjaxLoading:false,_parseContent:function(){var that=this;var e=" ";if(typeof this.content==="function"){var res=this.content.apply(this);if(typeof res==="string"){this.content=res;}else{if(typeof res==="object"&&typeof res.always==="function"){this.isAjax=true;this.isAjaxLoading=true;res.always(function(data,status,xhr){that.ajaxResponse={data:data,status:status,xhr:xhr};that._contentReady.resolve(data,status,xhr);if(typeof that.contentLoaded==="function"){that.contentLoaded(data,status,xhr);}});this.content=e;}else{this.content=e;}}}if(typeof this.content==="string"&&this.content.substr(0,4).toLowerCase()==="url:"){this.isAjax=true;this.isAjaxLoading=true;var u=this.content.substring(4,this.content.length);$.get(u).done(function(html){that.contentParsed.html(html);}).always(function(data,status,xhr){that.ajaxResponse={data:data,status:status,xhr:xhr};that._contentReady.resolve(data,status,xhr);if(typeof that.contentLoaded==="function"){that.contentLoaded(data,status,xhr);}});}if(!this.content){this.content=e;}if(!this.isAjax){this.contentParsed.html(this.content);this.setContent();that._contentReady.resolve();}},_stopCountDown:function(){clearInterval(this.autoCloseInterval);if(this.$cd){this.$cd.remove();}},_startCountDown:function(){var that=this;var opt=this.autoClose.split("|");if(opt.length!==2){console.error("Invalid option for autoClose. example 'close|10000'");return false;}var button_key=opt[0];var time=parseInt(opt[1]);if(typeof this.buttons[button_key]==="undefined"){console.error("Invalid button key '"+button_key+"' for autoClose");return false;}var seconds=Math.ceil(time/1000);this.$cd=$('<span class="countdown"> ('+seconds+")</span>").appendTo(this["$_"+button_key]);this.autoCloseInterval=setInterval(function(){that.$cd.html(" ("+(seconds-=1)+") ");if(seconds<=0){that["$$"+button_key].trigger("click");that._stopCountDown();}},1000);},_getKey:function(key){switch(key){case 192:return"tilde";case 13:return"enter";case 16:return"shift";case 9:return"tab";case 20:return"capslock";case 17:return"ctrl";case 91:return"win";case 18:return"alt";case 27:return"esc";case 32:return"space";}var initial=String.fromCharCode(key);if(/^[A-z0-9]+$/.test(initial)){return initial.toLowerCase();}else{return false;}},reactOnKey:function(e){var that=this;var a=$(".jconfirm");if(a.eq(a.length-1)[0]!==this.$el[0]){return false;}var key=e.which;if(this.$content.find(":input").is(":focus")&&/13|32/.test(key)){return false;}var keyChar=this._getKey(key);if(keyChar==="esc"&&this.escapeKey){if(this.escapeKey===true){this.$scrollPane.trigger("click");}else{if(typeof this.escapeKey==="string"||typeof this.escapeKey==="function"){var buttonKey;if(typeof this.escapeKey==="function"){buttonKey=this.escapeKey();}else{buttonKey=this.escapeKey;}if(buttonKey){if(typeof this.buttons[buttonKey]==="undefined"){console.warn("Invalid escapeKey, no buttons found with key "+buttonKey);}else{this["$_"+buttonKey].trigger("click");}}}}}$.each(this.buttons,function(key,button){if(button.keys.indexOf(keyChar)!==-1){that["$_"+key].trigger("click");}});},setDialogCenter:function(){console.info("setDialogCenter is deprecated, dialogs are centered with CSS3 tables");},_unwatchContent:function(){clearInterval(this._timer);},close:function(onClosePayload){var that=this;if(typeof this.onClose==="function"){this.onClose(onClosePayload);}this._unwatchContent();$(window).unbind("resize."+this._id);$(window).unbind("keyup."+this._id);$(window).unbind("jcKeyDown."+this._id);if(this.draggable){$(window).unbind("mousemove."+this._id);$(window).unbind("mouseup."+this._id);this.$titleContainer.unbind("mousedown");}that.$el.removeClass(that.loadedClass);$("body").removeClass("jconfirm-no-scroll-"+that._id);that.$jconfirmBoxContainer.removeClass("jconfirm-no-transition");setTimeout(function(){that.$body.addClass(that.closeAnimationParsed);that.$jconfirmBg.addClass("jconfirm-bg-h");var closeTimer=(that.closeAnimation==="none")?1:that.animationSpeed;setTimeout(function(){that.$el.remove();var l=w.jconfirm.instances;var i=w.jconfirm.instances.length-1;for(i;i>=0;i--){if(w.jconfirm.instances[i]._id===that._id){w.jconfirm.instances.splice(i,1);}}if(!w.jconfirm.instances.length){if(that.scrollToPreviousElement&&w.jconfirm.lastFocused&&w.jconfirm.lastFocused.length&&$.contains(document,w.jconfirm.lastFocused[0])){var $lf=w.jconfirm.lastFocused;if(that.scrollToPreviousElementAnimate){var st=$(window).scrollTop();var ot=w.jconfirm.lastFocused.offset().top;var wh=$(window).height();if(!(ot>st&&ot<(st+wh))){var scrollTo=(ot-Math.round((wh/3)));$("html, body").animate({scrollTop:scrollTo},that.animationSpeed,"swing",function(){$lf.focus();});}else{$lf.focus();}}else{$lf.focus();}w.jconfirm.lastFocused=false;}}if(typeof that.onDestroy==="function"){that.onDestroy();}},closeTimer*0.4);},50);return true;},open:function(){if(this.isOpen()){return false;}this._buildHTML();this._bindEvents();this._open();return true;},setStartingPoint:function(){var el=false;if(this.animateFromElement!==true&&this.animateFromElement){el=this.animateFromElement;w.jconfirm.lastClicked=false;}else{if(w.jconfirm.lastClicked&&this.animateFromElement===true){el=w.jconfirm.lastClicked;w.jconfirm.lastClicked=false;}else{return false;}}if(!el){return false;}var offset=el.offset();var iTop=el.outerHeight()/2;var iLeft=el.outerWidth()/2;iTop-=this.$jconfirmBox.outerHeight()/2;iLeft-=this.$jconfirmBox.outerWidth()/2;var sourceTop=offset.top+iTop;sourceTop=sourceTop-this._scrollTop();var sourceLeft=offset.left+iLeft;var wh=$(window).height()/2;var ww=$(window).width()/2;var targetH=wh-this.$jconfirmBox.outerHeight()/2;var targetW=ww-this.$jconfirmBox.outerWidth()/2;sourceTop-=targetH;sourceLeft-=targetW;if(Math.abs(sourceTop)>wh||Math.abs(sourceLeft)>ww){return false;}this.$jconfirmBoxContainer.css("transform","translate("+sourceLeft+"px, "+sourceTop+"px)");},_open:function(){var that=this;if(typeof that.onOpenBefore==="function"){that.onOpenBefore();}this.$body.removeClass(this.animationParsed);this.$jconfirmBg.removeClass("jconfirm-bg-h");this.$body.focus();that.$jconfirmBoxContainer.css("transform","translate("+0+"px, "+0+"px)");setTimeout(function(){that.$body.css(that._getCSS(that.animationSpeed,1));that.$body.css({"transition-property":that.$body.css("transition-property")+", margin"});that.$jconfirmBoxContainer.addClass("jconfirm-no-transition");that._modalReady.resolve();if(typeof that.onOpen==="function"){that.onOpen();}that.$el.addClass(that.loadedClass);},this.animationSpeed);},loadedClass:"jconfirm-open",isClosed:function(){return !this.$el||this.$el.parent().length===0;},isOpen:function(){return !this.isClosed();},toggle:function(){if(!this.isOpen()){this.open();}else{this.close();}}};w.jconfirm.instances=[];w.jconfirm.lastFocused=false;w.jconfirm.pluginDefaults={template:'<div class="jconfirm"><div class="jconfirm-bg jconfirm-bg-h"></div><div class="jconfirm-scrollpane"><div class="jconfirm-row"><div class="jconfirm-cell"><div class="jconfirm-holder"><div class="jc-bs3-container"><div class="jc-bs3-row"><div class="jconfirm-box-container jconfirm-animated"><div class="jconfirm-box" role="dialog" aria-labelledby="labelled" tabindex="-1"><div class="jconfirm-closeIcon">×</div><div class="jconfirm-title-c"><span class="jconfirm-icon-c"></span><span class="jconfirm-title"></span></div><div class="jconfirm-content-pane"><div class="jconfirm-content"></div></div><div class="jconfirm-buttons"></div><div class="jconfirm-clear"></div></div></div></div></div></div></div></div></div></div>',title:"Hello",titleClass:"",type:"default",typeAnimated:true,draggable:true,dragWindowGap:15,dragWindowBorder:true,animateFromElement:true,alignMiddle:true,smoothContent:true,content:"Are you sure to continue?",buttons:{},defaultButtons:{ok:{action:function(){}},close:{action:function(){}}},contentLoaded:function(){},icon:"",lazyOpen:false,bgOpacity:null,theme:"light",animation:"scale",closeAnimation:"scale",animationSpeed:400,animationBounce:1,escapeKey:true,rtl:false,container:"body",containerFluid:false,backgroundDismiss:false,backgroundDismissAnimation:"shake",autoClose:false,closeIcon:null,closeIconClass:false,watchInterval:100,columnClass:"col-md-4 col-md-offset-4 col-sm-6 col-sm-offset-3 col-xs-10 col-xs-offset-1",boxWidth:"50%",scrollToPreviousElement:true,scrollToPreviousElementAnimate:true,useBootstrap:true,offsetTop:40,offsetBottom:40,bootstrapClasses:{container:"container",containerFluid:"container-fluid",row:"row"},onContentReady:function(){},onOpenBefore:function(){},onOpen:function(){},onClose:function(){},onDestroy:function(){},onAction:function(){}};var keyDown=false;$(window).on("keydown",function(e){if(!keyDown){var $target=$(e.target);var pass=false;if($target.closest(".jconfirm-box").length){pass=true;}if(pass){$(window).trigger("jcKeyDown");}keyDown=true;}});$(window).on("keyup",function(){keyDown=false;});w.jconfirm.lastClicked=false;$(document).on("mousedown","button, a, [jc-source]",function(){w.jconfirm.lastClicked=$(this);});})); +function createMDEditor(element, opts){ + var defaults = { + height: 600, + path: '/editormd/lib/', + syncScrolling: "single", + tex: true, + tocm: true, + emoji: true, + taskList: true, + codeFold: true, + searchReplace: true, + htmlDecode: "style,script,iframe", + sequenceDiagram: true, + autoFocus: false, + toolbarIcons: function () { + // Or return editormd.toolbarModes[name]; // full, simple, mini + // Using "||" set icons align right. + return ["bold", "italic", "|", "list-ul", "list-ol", "|", "code", "code-block", "|", "image", "table", '|', "watch", "clear"] + }, + //这个配置在simple.html中并没有,但是为了能够提交表单,使用这个配置可以让构造出来的HTML代码直接在第二个隐藏的textarea域中,方便post提交表单。 + saveHTMLToTextarea: true, + dialogMaskOpacity: 0.6, + imageUpload: true, + imageFormats: ["jpg", "jpeg", "gif", "png", "bmp", "webp", "JPG", "JPEG", "GIF", "PNG", "BMP", "WEBP"], + imageUploadURL: '/api/attachments.json' + } + var options = $.extend({}, defaults, opts); + + return editormd(element, options); +} + +function ajaxErrorNotifyHandler(res) { + var message = ''; + if(res.status !== 500){ + message = res.responseJSON.message; + } else { + message = '系统错误'; + } + return $.notify({message: message}, {type: 'danger'}); +} + +function resetFileInputFunc(file){ + file.after(file.clone().val("")); + file.remove(); +} + +function customConfirm(opts){ + var okCallback = opts.ok; + var cancelCallback = opts.cancel; + + var defaultOpts = { + title: '提示', + buttons: { + ok: { + text: '确认', + btnClass: 'btn btn-primary', + action: okCallback + }, + cancel: { + text: '取消', + btnClass: 'btn btn-secondary', + action: cancelCallback + }, + } + } + return $.confirm($.extend({}, defaultOpts, opts)) +} + +function show_success_flash(message){ + $.notify({ + message: message || '操作成功' + },{ + type: 'success' + }); +} +; +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.echarts = {}))); +}(this, (function (exports) { 'use strict'; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// (1) The code `if (__DEV__) ...` can be removed by build tool. +// (2) If intend to use `__DEV__`, this module should be imported. Use a global +// variable `__DEV__` may cause that miss the declaration (see #6535), or the +// declaration is behind of the using position (for example in `Model.extent`, +// And tools like rollup can not analysis the dependency if not import). + +var dev; + +// In browser +if (typeof window !== 'undefined') { + dev = window.__DEV__; +} +// In node +else if (typeof global !== 'undefined') { + dev = global.__DEV__; +} + +if (typeof dev === 'undefined') { + dev = true; +} + +var __DEV__ = dev; + +/** + * zrender: 生成唯一id + * + * @author errorrik (errorrik@gmail.com) + */ + +var idStart = 0x0907; + +var guid = function () { + return idStart++; +}; + +/** + * echarts设备环境识别 + * + * @desc echarts基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据统计图表。 + * @author firede[firede@firede.us] + * @desc thanks zepto. + */ + +var env = {}; + +if (typeof wx === 'object' && typeof wx.getSystemInfoSync === 'function') { + // In Weixin Application + env = { + browser: {}, + os: {}, + node: false, + wxa: true, // Weixin Application + canvasSupported: true, + svgSupported: false, + touchEventsSupported: true + }; +} +else if (typeof document === 'undefined' && typeof self !== 'undefined') { + // In worker + env = { + browser: {}, + os: {}, + node: false, + worker: true, + canvasSupported: true + }; +} +else if (typeof navigator === 'undefined') { + // In node + env = { + browser: {}, + os: {}, + node: true, + worker: false, + // Assume canvas is supported + canvasSupported: true, + svgSupported: true + }; +} +else { + env = detect(navigator.userAgent); +} + +var env$1 = env; + +// Zepto.js +// (c) 2010-2013 Thomas Fuchs +// Zepto.js may be freely distributed under the MIT license. + +function detect(ua) { + var os = {}; + var browser = {}; + // var webkit = ua.match(/Web[kK]it[\/]{0,1}([\d.]+)/); + // var android = ua.match(/(Android);?[\s\/]+([\d.]+)?/); + // var ipad = ua.match(/(iPad).*OS\s([\d_]+)/); + // var ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/); + // var iphone = !ipad && ua.match(/(iPhone\sOS)\s([\d_]+)/); + // var webos = ua.match(/(webOS|hpwOS)[\s\/]([\d.]+)/); + // var touchpad = webos && ua.match(/TouchPad/); + // var kindle = ua.match(/Kindle\/([\d.]+)/); + // var silk = ua.match(/Silk\/([\d._]+)/); + // var blackberry = ua.match(/(BlackBerry).*Version\/([\d.]+)/); + // var bb10 = ua.match(/(BB10).*Version\/([\d.]+)/); + // var rimtabletos = ua.match(/(RIM\sTablet\sOS)\s([\d.]+)/); + // var playbook = ua.match(/PlayBook/); + // var chrome = ua.match(/Chrome\/([\d.]+)/) || ua.match(/CriOS\/([\d.]+)/); + var firefox = ua.match(/Firefox\/([\d.]+)/); + // var safari = webkit && ua.match(/Mobile\//) && !chrome; + // var webview = ua.match(/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/) && !chrome; + var ie = ua.match(/MSIE\s([\d.]+)/) + // IE 11 Trident/7.0; rv:11.0 + || ua.match(/Trident\/.+?rv:(([\d.]+))/); + var edge = ua.match(/Edge\/([\d.]+)/); // IE 12 and 12+ + + var weChat = (/micromessenger/i).test(ua); + + // Todo: clean this up with a better OS/browser seperation: + // - discern (more) between multiple browsers on android + // - decide if kindle fire in silk mode is android or not + // - Firefox on Android doesn't specify the Android version + // - possibly devide in os, device and browser hashes + + // if (browser.webkit = !!webkit) browser.version = webkit[1]; + + // if (android) os.android = true, os.version = android[2]; + // if (iphone && !ipod) os.ios = os.iphone = true, os.version = iphone[2].replace(/_/g, '.'); + // if (ipad) os.ios = os.ipad = true, os.version = ipad[2].replace(/_/g, '.'); + // if (ipod) os.ios = os.ipod = true, os.version = ipod[3] ? ipod[3].replace(/_/g, '.') : null; + // if (webos) os.webos = true, os.version = webos[2]; + // if (touchpad) os.touchpad = true; + // if (blackberry) os.blackberry = true, os.version = blackberry[2]; + // if (bb10) os.bb10 = true, os.version = bb10[2]; + // if (rimtabletos) os.rimtabletos = true, os.version = rimtabletos[2]; + // if (playbook) browser.playbook = true; + // if (kindle) os.kindle = true, os.version = kindle[1]; + // if (silk) browser.silk = true, browser.version = silk[1]; + // if (!silk && os.android && ua.match(/Kindle Fire/)) browser.silk = true; + // if (chrome) browser.chrome = true, browser.version = chrome[1]; + if (firefox) { + browser.firefox = true; + browser.version = firefox[1]; + } + // if (safari && (ua.match(/Safari/) || !!os.ios)) browser.safari = true; + // if (webview) browser.webview = true; + + if (ie) { + browser.ie = true; + browser.version = ie[1]; + } + + if (edge) { + browser.edge = true; + browser.version = edge[1]; + } + + // It is difficult to detect WeChat in Win Phone precisely, because ua can + // not be set on win phone. So we do not consider Win Phone. + if (weChat) { + browser.weChat = true; + } + + // os.tablet = !!(ipad || playbook || (android && !ua.match(/Mobile/)) || + // (firefox && ua.match(/Tablet/)) || (ie && !ua.match(/Phone/) && ua.match(/Touch/))); + // os.phone = !!(!os.tablet && !os.ipod && (android || iphone || webos || + // (chrome && ua.match(/Android/)) || (chrome && ua.match(/CriOS\/([\d.]+)/)) || + // (firefox && ua.match(/Mobile/)) || (ie && ua.match(/Touch/)))); + + return { + browser: browser, + os: os, + node: false, + // 原生canvas支持,改极端点了 + // canvasSupported : !(browser.ie && parseFloat(browser.version) < 9) + canvasSupported: !!document.createElement('canvas').getContext, + svgSupported: typeof SVGRect !== 'undefined', + // works on most browsers + // IE10/11 does not support touch event, and MS Edge supports them but not by + // default, so we dont check navigator.maxTouchPoints for them here. + touchEventsSupported: 'ontouchstart' in window && !browser.ie && !browser.edge, + // <http://caniuse.com/#search=pointer%20event>. + pointerEventsSupported: 'onpointerdown' in window + // Firefox supports pointer but not by default, only MS browsers are reliable on pointer + // events currently. So we dont use that on other browsers unless tested sufficiently. + // Although IE 10 supports pointer event, it use old style and is different from the + // standard. So we exclude that. (IE 10 is hardly used on touch device) + && (browser.edge || (browser.ie && browser.version >= 11)) + // passiveSupported: detectPassiveSupport() + }; +} + +// See https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md#feature-detection +// function detectPassiveSupport() { +// // Test via a getter in the options object to see if the passive property is accessed +// var supportsPassive = false; +// try { +// var opts = Object.defineProperty({}, 'passive', { +// get: function() { +// supportsPassive = true; +// } +// }); +// window.addEventListener('testPassive', function() {}, opts); +// } catch (e) { +// } +// return supportsPassive; +// } + +/** + * @module zrender/core/util + */ + +// 用于处理merge时无法遍历Date等对象的问题 +var BUILTIN_OBJECT = { + '[object Function]': 1, + '[object RegExp]': 1, + '[object Date]': 1, + '[object Error]': 1, + '[object CanvasGradient]': 1, + '[object CanvasPattern]': 1, + // For node-canvas + '[object Image]': 1, + '[object Canvas]': 1 +}; + +var TYPED_ARRAY = { + '[object Int8Array]': 1, + '[object Uint8Array]': 1, + '[object Uint8ClampedArray]': 1, + '[object Int16Array]': 1, + '[object Uint16Array]': 1, + '[object Int32Array]': 1, + '[object Uint32Array]': 1, + '[object Float32Array]': 1, + '[object Float64Array]': 1 +}; + +var objToString = Object.prototype.toString; + +var arrayProto = Array.prototype; +var nativeForEach = arrayProto.forEach; +var nativeFilter = arrayProto.filter; +var nativeSlice = arrayProto.slice; +var nativeMap = arrayProto.map; +var nativeReduce = arrayProto.reduce; + +// Avoid assign to an exported variable, for transforming to cjs. +var methods = {}; + +function $override(name, fn) { + // Clear ctx instance for different environment + if (name === 'createCanvas') { + _ctx = null; + } + + methods[name] = fn; +} + +/** + * Those data types can be cloned: + * Plain object, Array, TypedArray, number, string, null, undefined. + * Those data types will be assgined using the orginal data: + * BUILTIN_OBJECT + * Instance of user defined class will be cloned to a plain object, without + * properties in prototype. + * Other data types is not supported (not sure what will happen). + * + * Caution: do not support clone Date, for performance consideration. + * (There might be a large number of date in `series.data`). + * So date should not be modified in and out of echarts. + * + * @param {*} source + * @return {*} new + */ +function clone(source) { + if (source == null || typeof source != 'object') { + return source; + } + + var result = source; + var typeStr = objToString.call(source); + + if (typeStr === '[object Array]') { + if (!isPrimitive(source)) { + result = []; + for (var i = 0, len = source.length; i < len; i++) { + result[i] = clone(source[i]); + } + } + } + else if (TYPED_ARRAY[typeStr]) { + if (!isPrimitive(source)) { + var Ctor = source.constructor; + if (source.constructor.from) { + result = Ctor.from(source); + } + else { + result = new Ctor(source.length); + for (var i = 0, len = source.length; i < len; i++) { + result[i] = clone(source[i]); + } + } + } + } + else if (!BUILTIN_OBJECT[typeStr] && !isPrimitive(source) && !isDom(source)) { + result = {}; + for (var key in source) { + if (source.hasOwnProperty(key)) { + result[key] = clone(source[key]); + } + } + } + + return result; +} + +/** + * @memberOf module:zrender/core/util + * @param {*} target + * @param {*} source + * @param {boolean} [overwrite=false] + */ +function merge(target, source, overwrite) { + // We should escapse that source is string + // and enter for ... in ... + if (!isObject$1(source) || !isObject$1(target)) { + return overwrite ? clone(source) : target; + } + + for (var key in source) { + if (source.hasOwnProperty(key)) { + var targetProp = target[key]; + var sourceProp = source[key]; + + if (isObject$1(sourceProp) + && isObject$1(targetProp) + && !isArray(sourceProp) + && !isArray(targetProp) + && !isDom(sourceProp) + && !isDom(targetProp) + && !isBuiltInObject(sourceProp) + && !isBuiltInObject(targetProp) + && !isPrimitive(sourceProp) + && !isPrimitive(targetProp) + ) { + // 如果需要递归覆盖,就递归调用merge + merge(targetProp, sourceProp, overwrite); + } + else if (overwrite || !(key in target)) { + // 否则只处理overwrite为true,或者在目标对象中没有此属性的情况 + // NOTE,在 target[key] 不存在的时候也是直接覆盖 + target[key] = clone(source[key], true); + } + } + } + + return target; +} + +/** + * @param {Array} targetAndSources The first item is target, and the rests are source. + * @param {boolean} [overwrite=false] + * @return {*} target + */ +function mergeAll(targetAndSources, overwrite) { + var result = targetAndSources[0]; + for (var i = 1, len = targetAndSources.length; i < len; i++) { + result = merge(result, targetAndSources[i], overwrite); + } + return result; +} + +/** + * @param {*} target + * @param {*} source + * @memberOf module:zrender/core/util + */ +function extend(target, source) { + for (var key in source) { + if (source.hasOwnProperty(key)) { + target[key] = source[key]; + } + } + return target; +} + +/** + * @param {*} target + * @param {*} source + * @param {boolean} [overlay=false] + * @memberOf module:zrender/core/util + */ +function defaults(target, source, overlay) { + for (var key in source) { + if (source.hasOwnProperty(key) + && (overlay ? source[key] != null : target[key] == null) + ) { + target[key] = source[key]; + } + } + return target; +} + +var createCanvas = function () { + return methods.createCanvas(); +}; + +methods.createCanvas = function () { + return document.createElement('canvas'); +}; + +// FIXME +var _ctx; + +function getContext() { + if (!_ctx) { + // Use util.createCanvas instead of createCanvas + // because createCanvas may be overwritten in different environment + _ctx = createCanvas().getContext('2d'); + } + return _ctx; +} + +/** + * 查询数组中元素的index + * @memberOf module:zrender/core/util + */ +function indexOf(array, value) { + if (array) { + if (array.indexOf) { + return array.indexOf(value); + } + for (var i = 0, len = array.length; i < len; i++) { + if (array[i] === value) { + return i; + } + } + } + return -1; +} + +/** + * 构造类继承关系 + * + * @memberOf module:zrender/core/util + * @param {Function} clazz 源类 + * @param {Function} baseClazz 基类 + */ +function inherits(clazz, baseClazz) { + var clazzPrototype = clazz.prototype; + function F() {} + F.prototype = baseClazz.prototype; + clazz.prototype = new F(); + + for (var prop in clazzPrototype) { + clazz.prototype[prop] = clazzPrototype[prop]; + } + clazz.prototype.constructor = clazz; + clazz.superClass = baseClazz; +} + +/** + * @memberOf module:zrender/core/util + * @param {Object|Function} target + * @param {Object|Function} sorce + * @param {boolean} overlay + */ +function mixin(target, source, overlay) { + target = 'prototype' in target ? target.prototype : target; + source = 'prototype' in source ? source.prototype : source; + + defaults(target, source, overlay); +} + +/** + * Consider typed array. + * @param {Array|TypedArray} data + */ +function isArrayLike(data) { + if (! data) { + return; + } + if (typeof data == 'string') { + return false; + } + return typeof data.length == 'number'; +} + +/** + * 数组或对象遍历 + * @memberOf module:zrender/core/util + * @param {Object|Array} obj + * @param {Function} cb + * @param {*} [context] + */ +function each$1(obj, cb, context) { + if (!(obj && cb)) { + return; + } + if (obj.forEach && obj.forEach === nativeForEach) { + obj.forEach(cb, context); + } + else if (obj.length === +obj.length) { + for (var i = 0, len = obj.length; i < len; i++) { + cb.call(context, obj[i], i, obj); + } + } + else { + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + cb.call(context, obj[key], key, obj); + } + } + } +} + +/** + * 数组映射 + * @memberOf module:zrender/core/util + * @param {Array} obj + * @param {Function} cb + * @param {*} [context] + * @return {Array} + */ +function map(obj, cb, context) { + if (!(obj && cb)) { + return; + } + if (obj.map && obj.map === nativeMap) { + return obj.map(cb, context); + } + else { + var result = []; + for (var i = 0, len = obj.length; i < len; i++) { + result.push(cb.call(context, obj[i], i, obj)); + } + return result; + } +} + +/** + * @memberOf module:zrender/core/util + * @param {Array} obj + * @param {Function} cb + * @param {Object} [memo] + * @param {*} [context] + * @return {Array} + */ +function reduce(obj, cb, memo, context) { + if (!(obj && cb)) { + return; + } + if (obj.reduce && obj.reduce === nativeReduce) { + return obj.reduce(cb, memo, context); + } + else { + for (var i = 0, len = obj.length; i < len; i++) { + memo = cb.call(context, memo, obj[i], i, obj); + } + return memo; + } +} + +/** + * 数组过滤 + * @memberOf module:zrender/core/util + * @param {Array} obj + * @param {Function} cb + * @param {*} [context] + * @return {Array} + */ +function filter(obj, cb, context) { + if (!(obj && cb)) { + return; + } + if (obj.filter && obj.filter === nativeFilter) { + return obj.filter(cb, context); + } + else { + var result = []; + for (var i = 0, len = obj.length; i < len; i++) { + if (cb.call(context, obj[i], i, obj)) { + result.push(obj[i]); + } + } + return result; + } +} + +/** + * 数组项查找 + * @memberOf module:zrender/core/util + * @param {Array} obj + * @param {Function} cb + * @param {*} [context] + * @return {*} + */ +function find(obj, cb, context) { + if (!(obj && cb)) { + return; + } + for (var i = 0, len = obj.length; i < len; i++) { + if (cb.call(context, obj[i], i, obj)) { + return obj[i]; + } + } +} + +/** + * @memberOf module:zrender/core/util + * @param {Function} func + * @param {*} context + * @return {Function} + */ +function bind(func, context) { + var args = nativeSlice.call(arguments, 2); + return function () { + return func.apply(context, args.concat(nativeSlice.call(arguments))); + }; +} + +/** + * @memberOf module:zrender/core/util + * @param {Function} func + * @return {Function} + */ +function curry(func) { + var args = nativeSlice.call(arguments, 1); + return function () { + return func.apply(this, args.concat(nativeSlice.call(arguments))); + }; +} + +/** + * @memberOf module:zrender/core/util + * @param {*} value + * @return {boolean} + */ +function isArray(value) { + return objToString.call(value) === '[object Array]'; +} + +/** + * @memberOf module:zrender/core/util + * @param {*} value + * @return {boolean} + */ +function isFunction$1(value) { + return typeof value === 'function'; +} + +/** + * @memberOf module:zrender/core/util + * @param {*} value + * @return {boolean} + */ +function isString(value) { + return objToString.call(value) === '[object String]'; +} + +/** + * @memberOf module:zrender/core/util + * @param {*} value + * @return {boolean} + */ +function isObject$1(value) { + // Avoid a V8 JIT bug in Chrome 19-20. + // See https://code.google.com/p/v8/issues/detail?id=2291 for more details. + var type = typeof value; + return type === 'function' || (!!value && type == 'object'); +} + +/** + * @memberOf module:zrender/core/util + * @param {*} value + * @return {boolean} + */ +function isBuiltInObject(value) { + return !!BUILTIN_OBJECT[objToString.call(value)]; +} + +/** + * @memberOf module:zrender/core/util + * @param {*} value + * @return {boolean} + */ +function isTypedArray(value) { + return !!TYPED_ARRAY[objToString.call(value)]; +} + +/** + * @memberOf module:zrender/core/util + * @param {*} value + * @return {boolean} + */ +function isDom(value) { + return typeof value === 'object' + && typeof value.nodeType === 'number' + && typeof value.ownerDocument === 'object'; +} + +/** + * Whether is exactly NaN. Notice isNaN('a') returns true. + * @param {*} value + * @return {boolean} + */ +function eqNaN(value) { + return value !== value; +} + +/** + * If value1 is not null, then return value1, otherwise judget rest of values. + * Low performance. + * @memberOf module:zrender/core/util + * @return {*} Final value + */ +function retrieve(values) { + for (var i = 0, len = arguments.length; i < len; i++) { + if (arguments[i] != null) { + return arguments[i]; + } + } +} + +function retrieve2(value0, value1) { + return value0 != null + ? value0 + : value1; +} + +function retrieve3(value0, value1, value2) { + return value0 != null + ? value0 + : value1 != null + ? value1 + : value2; +} + +/** + * @memberOf module:zrender/core/util + * @param {Array} arr + * @param {number} startIndex + * @param {number} endIndex + * @return {Array} + */ +function slice() { + return Function.call.apply(nativeSlice, arguments); +} + +/** + * Normalize css liked array configuration + * e.g. + * 3 => [3, 3, 3, 3] + * [4, 2] => [4, 2, 4, 2] + * [4, 3, 2] => [4, 3, 2, 3] + * @param {number|Array.<number>} val + * @return {Array.<number>} + */ +function normalizeCssArray(val) { + if (typeof (val) === 'number') { + return [val, val, val, val]; + } + var len = val.length; + if (len === 2) { + // vertical | horizontal + return [val[0], val[1], val[0], val[1]]; + } + else if (len === 3) { + // top | horizontal | bottom + return [val[0], val[1], val[2], val[1]]; + } + return val; +} + +/** + * @memberOf module:zrender/core/util + * @param {boolean} condition + * @param {string} message + */ +function assert$1(condition, message) { + if (!condition) { + throw new Error(message); + } +} + +/** + * @memberOf module:zrender/core/util + * @param {string} str string to be trimed + * @return {string} trimed string + */ +function trim(str) { + if (str == null) { + return null; + } + else if (typeof str.trim === 'function') { + return str.trim(); + } + else { + return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, ''); + } +} + +var primitiveKey = '__ec_primitive__'; +/** + * Set an object as primitive to be ignored traversing children in clone or merge + */ +function setAsPrimitive(obj) { + obj[primitiveKey] = true; +} + +function isPrimitive(obj) { + return obj[primitiveKey]; +} + +/** + * @constructor + * @param {Object} obj Only apply `ownProperty`. + */ +function HashMap(obj) { + var isArr = isArray(obj); + var thisMap = this; + + (obj instanceof HashMap) + ? obj.each(visit) + : (obj && each$1(obj, visit)); + + function visit(value, key) { + isArr ? thisMap.set(value, key) : thisMap.set(key, value); + } +} + +// Add prefix to avoid conflict with Object.prototype. + +HashMap.prototype = { + constructor: HashMap, + // Do not provide `has` method to avoid defining what is `has`. + // (We usually treat `null` and `undefined` as the same, different + // from ES6 Map). + get: function (key) { + return this.hasOwnProperty(key) ? this[key] : null; + }, + set: function (key, value) { + // Comparing with invocation chaining, `return value` is more commonly + // used in this case: `var someVal = map.set('a', genVal());` + return (this[key] = value); + }, + // Although util.each can be performed on this hashMap directly, user + // should not use the exposed keys, who are prefixed. + each: function (cb, context) { + context !== void 0 && (cb = bind(cb, context)); + for (var key in this) { + this.hasOwnProperty(key) && cb(this[key], key); + } + }, + // Do not use this method if performance sensitive. + removeKey: function (key) { + delete this[key]; + } +}; + +function createHashMap(obj) { + return new HashMap(obj); +} + +function concatArray(a, b) { + var newArray = new a.constructor(a.length + b.length); + for (var i = 0; i < a.length; i++) { + newArray[i] = a[i]; + } + var offset = a.length; + for (i = 0; i < b.length; i++) { + newArray[i + offset] = b[i]; + } + return newArray; +} + + +function noop() {} + + +var zrUtil = (Object.freeze || Object)({ + $override: $override, + clone: clone, + merge: merge, + mergeAll: mergeAll, + extend: extend, + defaults: defaults, + createCanvas: createCanvas, + getContext: getContext, + indexOf: indexOf, + inherits: inherits, + mixin: mixin, + isArrayLike: isArrayLike, + each: each$1, + map: map, + reduce: reduce, + filter: filter, + find: find, + bind: bind, + curry: curry, + isArray: isArray, + isFunction: isFunction$1, + isString: isString, + isObject: isObject$1, + isBuiltInObject: isBuiltInObject, + isTypedArray: isTypedArray, + isDom: isDom, + eqNaN: eqNaN, + retrieve: retrieve, + retrieve2: retrieve2, + retrieve3: retrieve3, + slice: slice, + normalizeCssArray: normalizeCssArray, + assert: assert$1, + trim: trim, + setAsPrimitive: setAsPrimitive, + isPrimitive: isPrimitive, + createHashMap: createHashMap, + concatArray: concatArray, + noop: noop +}); + +var ArrayCtor = typeof Float32Array === 'undefined' + ? Array + : Float32Array; + +/** + * 创建一个向量 + * @param {number} [x=0] + * @param {number} [y=0] + * @return {Vector2} + */ +function create(x, y) { + var out = new ArrayCtor(2); + if (x == null) { + x = 0; + } + if (y == null) { + y = 0; + } + out[0] = x; + out[1] = y; + return out; +} + +/** + * 复制向量数据 + * @param {Vector2} out + * @param {Vector2} v + * @return {Vector2} + */ +function copy(out, v) { + out[0] = v[0]; + out[1] = v[1]; + return out; +} + +/** + * 克隆一个向量 + * @param {Vector2} v + * @return {Vector2} + */ +function clone$1(v) { + var out = new ArrayCtor(2); + out[0] = v[0]; + out[1] = v[1]; + return out; +} + +/** + * 设置向量的两个项 + * @param {Vector2} out + * @param {number} a + * @param {number} b + * @return {Vector2} 结果 + */ +function set(out, a, b) { + out[0] = a; + out[1] = b; + return out; +} + +/** + * 向量相加 + * @param {Vector2} out + * @param {Vector2} v1 + * @param {Vector2} v2 + */ +function add(out, v1, v2) { + out[0] = v1[0] + v2[0]; + out[1] = v1[1] + v2[1]; + return out; +} + +/** + * 向量缩放后相加 + * @param {Vector2} out + * @param {Vector2} v1 + * @param {Vector2} v2 + * @param {number} a + */ +function scaleAndAdd(out, v1, v2, a) { + out[0] = v1[0] + v2[0] * a; + out[1] = v1[1] + v2[1] * a; + return out; +} + +/** + * 向量相减 + * @param {Vector2} out + * @param {Vector2} v1 + * @param {Vector2} v2 + */ +function sub(out, v1, v2) { + out[0] = v1[0] - v2[0]; + out[1] = v1[1] - v2[1]; + return out; +} + +/** + * 向量长度 + * @param {Vector2} v + * @return {number} + */ +function len(v) { + return Math.sqrt(lenSquare(v)); +} +var length = len; // jshint ignore:line + +/** + * 向量长度平方 + * @param {Vector2} v + * @return {number} + */ +function lenSquare(v) { + return v[0] * v[0] + v[1] * v[1]; +} +var lengthSquare = lenSquare; + +/** + * 向量乘法 + * @param {Vector2} out + * @param {Vector2} v1 + * @param {Vector2} v2 + */ +function mul(out, v1, v2) { + out[0] = v1[0] * v2[0]; + out[1] = v1[1] * v2[1]; + return out; +} + +/** + * 向量除法 + * @param {Vector2} out + * @param {Vector2} v1 + * @param {Vector2} v2 + */ +function div(out, v1, v2) { + out[0] = v1[0] / v2[0]; + out[1] = v1[1] / v2[1]; + return out; +} + +/** + * 向量点乘 + * @param {Vector2} v1 + * @param {Vector2} v2 + * @return {number} + */ +function dot(v1, v2) { + return v1[0] * v2[0] + v1[1] * v2[1]; +} + +/** + * 向量缩放 + * @param {Vector2} out + * @param {Vector2} v + * @param {number} s + */ +function scale(out, v, s) { + out[0] = v[0] * s; + out[1] = v[1] * s; + return out; +} + +/** + * 向量归一化 + * @param {Vector2} out + * @param {Vector2} v + */ +function normalize(out, v) { + var d = len(v); + if (d === 0) { + out[0] = 0; + out[1] = 0; + } + else { + out[0] = v[0] / d; + out[1] = v[1] / d; + } + return out; +} + +/** + * 计算向量间距离 + * @param {Vector2} v1 + * @param {Vector2} v2 + * @return {number} + */ +function distance(v1, v2) { + return Math.sqrt( + (v1[0] - v2[0]) * (v1[0] - v2[0]) + + (v1[1] - v2[1]) * (v1[1] - v2[1]) + ); +} +var dist = distance; + +/** + * 向量距离平方 + * @param {Vector2} v1 + * @param {Vector2} v2 + * @return {number} + */ +function distanceSquare(v1, v2) { + return (v1[0] - v2[0]) * (v1[0] - v2[0]) + + (v1[1] - v2[1]) * (v1[1] - v2[1]); +} +var distSquare = distanceSquare; + +/** + * 求负向量 + * @param {Vector2} out + * @param {Vector2} v + */ +function negate(out, v) { + out[0] = -v[0]; + out[1] = -v[1]; + return out; +} + +/** + * 插值两个点 + * @param {Vector2} out + * @param {Vector2} v1 + * @param {Vector2} v2 + * @param {number} t + */ +function lerp(out, v1, v2, t) { + out[0] = v1[0] + t * (v2[0] - v1[0]); + out[1] = v1[1] + t * (v2[1] - v1[1]); + return out; +} + +/** + * 矩阵左乘向量 + * @param {Vector2} out + * @param {Vector2} v + * @param {Vector2} m + */ +function applyTransform(out, v, m) { + var x = v[0]; + var y = v[1]; + out[0] = m[0] * x + m[2] * y + m[4]; + out[1] = m[1] * x + m[3] * y + m[5]; + return out; +} + +/** + * 求两个向量最小值 + * @param {Vector2} out + * @param {Vector2} v1 + * @param {Vector2} v2 + */ +function min(out, v1, v2) { + out[0] = Math.min(v1[0], v2[0]); + out[1] = Math.min(v1[1], v2[1]); + return out; +} + +/** + * 求两个向量最大值 + * @param {Vector2} out + * @param {Vector2} v1 + * @param {Vector2} v2 + */ +function max(out, v1, v2) { + out[0] = Math.max(v1[0], v2[0]); + out[1] = Math.max(v1[1], v2[1]); + return out; +} + + +var vector = (Object.freeze || Object)({ + create: create, + copy: copy, + clone: clone$1, + set: set, + add: add, + scaleAndAdd: scaleAndAdd, + sub: sub, + len: len, + length: length, + lenSquare: lenSquare, + lengthSquare: lengthSquare, + mul: mul, + div: div, + dot: dot, + scale: scale, + normalize: normalize, + distance: distance, + dist: dist, + distanceSquare: distanceSquare, + distSquare: distSquare, + negate: negate, + lerp: lerp, + applyTransform: applyTransform, + min: min, + max: max +}); + +// TODO Draggable for group +// FIXME Draggable on element which has parent rotation or scale +function Draggable() { + + this.on('mousedown', this._dragStart, this); + this.on('mousemove', this._drag, this); + this.on('mouseup', this._dragEnd, this); + this.on('globalout', this._dragEnd, this); + // this._dropTarget = null; + // this._draggingTarget = null; + + // this._x = 0; + // this._y = 0; +} + +Draggable.prototype = { + + constructor: Draggable, + + _dragStart: function (e) { + var draggingTarget = e.target; + if (draggingTarget && draggingTarget.draggable) { + this._draggingTarget = draggingTarget; + draggingTarget.dragging = true; + this._x = e.offsetX; + this._y = e.offsetY; + + this.dispatchToElement(param(draggingTarget, e), 'dragstart', e.event); + } + }, + + _drag: function (e) { + var draggingTarget = this._draggingTarget; + if (draggingTarget) { + + var x = e.offsetX; + var y = e.offsetY; + + var dx = x - this._x; + var dy = y - this._y; + this._x = x; + this._y = y; + + draggingTarget.drift(dx, dy, e); + this.dispatchToElement(param(draggingTarget, e), 'drag', e.event); + + var dropTarget = this.findHover(x, y, draggingTarget).target; + var lastDropTarget = this._dropTarget; + this._dropTarget = dropTarget; + + if (draggingTarget !== dropTarget) { + if (lastDropTarget && dropTarget !== lastDropTarget) { + this.dispatchToElement(param(lastDropTarget, e), 'dragleave', e.event); + } + if (dropTarget && dropTarget !== lastDropTarget) { + this.dispatchToElement(param(dropTarget, e), 'dragenter', e.event); + } + } + } + }, + + _dragEnd: function (e) { + var draggingTarget = this._draggingTarget; + + if (draggingTarget) { + draggingTarget.dragging = false; + } + + this.dispatchToElement(param(draggingTarget, e), 'dragend', e.event); + + if (this._dropTarget) { + this.dispatchToElement(param(this._dropTarget, e), 'drop', e.event); + } + + this._draggingTarget = null; + this._dropTarget = null; + } + +}; + +function param(target, e) { + return {target: target, topTarget: e && e.topTarget}; +} + +/** + * 事件扩展 + * @module zrender/mixin/Eventful + * @author Kener (@Kener-林峰, kener.linfeng@gmail.com) + * pissang (https://www.github.com/pissang) + */ + +var arrySlice = Array.prototype.slice; + +/** + * 事件分发器 + * @alias module:zrender/mixin/Eventful + * @constructor + */ +var Eventful = function () { + this._$handlers = {}; +}; + +Eventful.prototype = { + + constructor: Eventful, + + /** + * 单次触发绑定,trigger后销毁 + * + * @param {string} event 事件名 + * @param {Function} handler 响应函数 + * @param {Object} context + */ + one: function (event, handler, context) { + var _h = this._$handlers; + + if (!handler || !event) { + return this; + } + + if (!_h[event]) { + _h[event] = []; + } + + for (var i = 0; i < _h[event].length; i++) { + if (_h[event][i].h === handler) { + return this; + } + } + + _h[event].push({ + h: handler, + one: true, + ctx: context || this + }); + + return this; + }, + + /** + * 绑定事件 + * @param {string} event 事件名 + * @param {Function} handler 事件处理函数 + * @param {Object} [context] + */ + on: function (event, handler, context) { + var _h = this._$handlers; + + if (!handler || !event) { + return this; + } + + if (!_h[event]) { + _h[event] = []; + } + + for (var i = 0; i < _h[event].length; i++) { + if (_h[event][i].h === handler) { + return this; + } + } + + _h[event].push({ + h: handler, + one: false, + ctx: context || this + }); + + return this; + }, + + /** + * 是否绑定了事件 + * @param {string} event + * @return {boolean} + */ + isSilent: function (event) { + var _h = this._$handlers; + return _h[event] && _h[event].length; + }, + + /** + * 解绑事件 + * @param {string} event 事件名 + * @param {Function} [handler] 事件处理函数 + */ + off: function (event, handler) { + var _h = this._$handlers; + + if (!event) { + this._$handlers = {}; + return this; + } + + if (handler) { + if (_h[event]) { + var newList = []; + for (var i = 0, l = _h[event].length; i < l; i++) { + if (_h[event][i]['h'] != handler) { + newList.push(_h[event][i]); + } + } + _h[event] = newList; + } + + if (_h[event] && _h[event].length === 0) { + delete _h[event]; + } + } + else { + delete _h[event]; + } + + return this; + }, + + /** + * 事件分发 + * + * @param {string} type 事件类型 + */ + trigger: function (type) { + if (this._$handlers[type]) { + var args = arguments; + var argLen = args.length; + + if (argLen > 3) { + args = arrySlice.call(args, 1); + } + + var _h = this._$handlers[type]; + var len = _h.length; + for (var i = 0; i < len;) { + // Optimize advise from backbone + switch (argLen) { + case 1: + _h[i]['h'].call(_h[i]['ctx']); + break; + case 2: + _h[i]['h'].call(_h[i]['ctx'], args[1]); + break; + case 3: + _h[i]['h'].call(_h[i]['ctx'], args[1], args[2]); + break; + default: + // have more than 2 given arguments + _h[i]['h'].apply(_h[i]['ctx'], args); + break; + } + + if (_h[i]['one']) { + _h.splice(i, 1); + len--; + } + else { + i++; + } + } + } + + return this; + }, + + /** + * 带有context的事件分发, 最后一个参数是事件回调的context + * @param {string} type 事件类型 + */ + triggerWithContext: function (type) { + if (this._$handlers[type]) { + var args = arguments; + var argLen = args.length; + + if (argLen > 4) { + args = arrySlice.call(args, 1, args.length - 1); + } + var ctx = args[args.length - 1]; + + var _h = this._$handlers[type]; + var len = _h.length; + for (var i = 0; i < len;) { + // Optimize advise from backbone + switch (argLen) { + case 1: + _h[i]['h'].call(ctx); + break; + case 2: + _h[i]['h'].call(ctx, args[1]); + break; + case 3: + _h[i]['h'].call(ctx, args[1], args[2]); + break; + default: + // have more than 2 given arguments + _h[i]['h'].apply(ctx, args); + break; + } + + if (_h[i]['one']) { + _h.splice(i, 1); + len--; + } + else { + i++; + } + } + } + + return this; + } +}; + +var SILENT = 'silent'; + +function makeEventPacket(eveType, targetInfo, event) { + return { + type: eveType, + event: event, + // target can only be an element that is not silent. + target: targetInfo.target, + // topTarget can be a silent element. + topTarget: targetInfo.topTarget, + cancelBubble: false, + offsetX: event.zrX, + offsetY: event.zrY, + gestureEvent: event.gestureEvent, + pinchX: event.pinchX, + pinchY: event.pinchY, + pinchScale: event.pinchScale, + wheelDelta: event.zrDelta, + zrByTouch: event.zrByTouch, + which: event.which + }; +} + +function EmptyProxy () {} +EmptyProxy.prototype.dispose = function () {}; + +var handlerNames = [ + 'click', 'dblclick', 'mousewheel', 'mouseout', + 'mouseup', 'mousedown', 'mousemove', 'contextmenu' +]; +/** + * @alias module:zrender/Handler + * @constructor + * @extends module:zrender/mixin/Eventful + * @param {module:zrender/Storage} storage Storage instance. + * @param {module:zrender/Painter} painter Painter instance. + * @param {module:zrender/dom/HandlerProxy} proxy HandlerProxy instance. + * @param {HTMLElement} painterRoot painter.root (not painter.getViewportRoot()). + */ +var Handler = function(storage, painter, proxy, painterRoot) { + Eventful.call(this); + + this.storage = storage; + + this.painter = painter; + + this.painterRoot = painterRoot; + + proxy = proxy || new EmptyProxy(); + + /** + * Proxy of event. can be Dom, WebGLSurface, etc. + */ + this.proxy = null; + + /** + * {target, topTarget, x, y} + * @private + * @type {Object} + */ + this._hovered = {}; + + /** + * @private + * @type {Date} + */ + this._lastTouchMoment; + + /** + * @private + * @type {number} + */ + this._lastX; + + /** + * @private + * @type {number} + */ + this._lastY; + + + Draggable.call(this); + + this.setHandlerProxy(proxy); +}; + +Handler.prototype = { + + constructor: Handler, + + setHandlerProxy: function (proxy) { + if (this.proxy) { + this.proxy.dispose(); + } + + if (proxy) { + each$1(handlerNames, function (name) { + proxy.on && proxy.on(name, this[name], this); + }, this); + // Attach handler + proxy.handler = this; + } + this.proxy = proxy; + }, + + mousemove: function (event) { + var x = event.zrX; + var y = event.zrY; + + var lastHovered = this._hovered; + var lastHoveredTarget = lastHovered.target; + + // If lastHoveredTarget is removed from zr (detected by '__zr') by some API call + // (like 'setOption' or 'dispatchAction') in event handlers, we should find + // lastHovered again here. Otherwise 'mouseout' can not be triggered normally. + // See #6198. + if (lastHoveredTarget && !lastHoveredTarget.__zr) { + lastHovered = this.findHover(lastHovered.x, lastHovered.y); + lastHoveredTarget = lastHovered.target; + } + + var hovered = this._hovered = this.findHover(x, y); + var hoveredTarget = hovered.target; + + var proxy = this.proxy; + proxy.setCursor && proxy.setCursor(hoveredTarget ? hoveredTarget.cursor : 'default'); + + // Mouse out on previous hovered element + if (lastHoveredTarget && hoveredTarget !== lastHoveredTarget) { + this.dispatchToElement(lastHovered, 'mouseout', event); + } + + // Mouse moving on one element + this.dispatchToElement(hovered, 'mousemove', event); + + // Mouse over on a new element + if (hoveredTarget && hoveredTarget !== lastHoveredTarget) { + this.dispatchToElement(hovered, 'mouseover', event); + } + }, + + mouseout: function (event) { + this.dispatchToElement(this._hovered, 'mouseout', event); + + // There might be some doms created by upper layer application + // at the same level of painter.getViewportRoot() (e.g., tooltip + // dom created by echarts), where 'globalout' event should not + // be triggered when mouse enters these doms. (But 'mouseout' + // should be triggered at the original hovered element as usual). + var element = event.toElement || event.relatedTarget; + var innerDom; + do { + element = element && element.parentNode; + } + while (element && element.nodeType != 9 && !( + innerDom = element === this.painterRoot + )); + + !innerDom && this.trigger('globalout', {event: event}); + }, + + /** + * Resize + */ + resize: function (event) { + this._hovered = {}; + }, + + /** + * Dispatch event + * @param {string} eventName + * @param {event=} eventArgs + */ + dispatch: function (eventName, eventArgs) { + var handler = this[eventName]; + handler && handler.call(this, eventArgs); + }, + + /** + * Dispose + */ + dispose: function () { + + this.proxy.dispose(); + + this.storage = + this.proxy = + this.painter = null; + }, + + /** + * 设置默认的cursor style + * @param {string} [cursorStyle='default'] 例如 crosshair + */ + setCursorStyle: function (cursorStyle) { + var proxy = this.proxy; + proxy.setCursor && proxy.setCursor(cursorStyle); + }, + + /** + * 事件分发代理 + * + * @private + * @param {Object} targetInfo {target, topTarget} 目标图形元素 + * @param {string} eventName 事件名称 + * @param {Object} event 事件对象 + */ + dispatchToElement: function (targetInfo, eventName, event) { + targetInfo = targetInfo || {}; + var el = targetInfo.target; + if (el && el.silent) { + return; + } + var eventHandler = 'on' + eventName; + var eventPacket = makeEventPacket(eventName, targetInfo, event); + + while (el) { + el[eventHandler] + && (eventPacket.cancelBubble = el[eventHandler].call(el, eventPacket)); + + el.trigger(eventName, eventPacket); + + el = el.parent; + + if (eventPacket.cancelBubble) { + break; + } + } + + if (!eventPacket.cancelBubble) { + // 冒泡到顶级 zrender 对象 + this.trigger(eventName, eventPacket); + // 分发事件到用户自定义层 + // 用户有可能在全局 click 事件中 dispose,所以需要判断下 painter 是否存在 + this.painter && this.painter.eachOtherLayer(function (layer) { + if (typeof(layer[eventHandler]) == 'function') { + layer[eventHandler].call(layer, eventPacket); + } + if (layer.trigger) { + layer.trigger(eventName, eventPacket); + } + }); + } + }, + + /** + * @private + * @param {number} x + * @param {number} y + * @param {module:zrender/graphic/Displayable} exclude + * @return {model:zrender/Element} + * @method + */ + findHover: function(x, y, exclude) { + var list = this.storage.getDisplayList(); + var out = {x: x, y: y}; + + for (var i = list.length - 1; i >= 0 ; i--) { + var hoverCheckResult; + if (list[i] !== exclude + // getDisplayList may include ignored item in VML mode + && !list[i].ignore + && (hoverCheckResult = isHover(list[i], x, y)) + ) { + !out.topTarget && (out.topTarget = list[i]); + if (hoverCheckResult !== SILENT) { + out.target = list[i]; + break; + } + } + } + + return out; + } +}; + +// Common handlers +each$1(['click', 'mousedown', 'mouseup', 'mousewheel', 'dblclick', 'contextmenu'], function (name) { + Handler.prototype[name] = function (event) { + // Find hover again to avoid click event is dispatched manually. Or click is triggered without mouseover + var hovered = this.findHover(event.zrX, event.zrY); + var hoveredTarget = hovered.target; + + if (name === 'mousedown') { + this._downEl = hoveredTarget; + this._downPoint = [event.zrX, event.zrY]; + // In case click triggered before mouseup + this._upEl = hoveredTarget; + } + else if (name === 'mouseup') { + this._upEl = hoveredTarget; + } + else if (name === 'click') { + if (this._downEl !== this._upEl + // Original click event is triggered on the whole canvas element, + // including the case that `mousedown` - `mousemove` - `mouseup`, + // which should be filtered, otherwise it will bring trouble to + // pan and zoom. + || !this._downPoint + // Arbitrary value + || dist(this._downPoint, [event.zrX, event.zrY]) > 4 + ) { + return; + } + this._downPoint = null; + } + + this.dispatchToElement(hovered, name, event); + }; +}); + +function isHover(displayable, x, y) { + if (displayable[displayable.rectHover ? 'rectContain' : 'contain'](x, y)) { + var el = displayable; + var isSilent; + while (el) { + // If clipped by ancestor. + // FIXME: If clipPath has neither stroke nor fill, + // el.clipPath.contain(x, y) will always return false. + if (el.clipPath && !el.clipPath.contain(x, y)) { + return false; + } + if (el.silent) { + isSilent = true; + } + el = el.parent; + } + return isSilent ? SILENT : true; + } + + return false; +} + +mixin(Handler, Eventful); +mixin(Handler, Draggable); + +/** + * 3x2矩阵操作类 + * @exports zrender/tool/matrix + */ + +var ArrayCtor$1 = typeof Float32Array === 'undefined' + ? Array + : Float32Array; + +/** + * Create a identity matrix. + * @return {Float32Array|Array.<number>} + */ +function create$1() { + var out = new ArrayCtor$1(6); + identity(out); + + return out; +} + +/** + * 设置矩阵为单位矩阵 + * @param {Float32Array|Array.<number>} out + */ +function identity(out) { + out[0] = 1; + out[1] = 0; + out[2] = 0; + out[3] = 1; + out[4] = 0; + out[5] = 0; + return out; +} + +/** + * 复制矩阵 + * @param {Float32Array|Array.<number>} out + * @param {Float32Array|Array.<number>} m + */ +function copy$1(out, m) { + out[0] = m[0]; + out[1] = m[1]; + out[2] = m[2]; + out[3] = m[3]; + out[4] = m[4]; + out[5] = m[5]; + return out; +} + +/** + * 矩阵相乘 + * @param {Float32Array|Array.<number>} out + * @param {Float32Array|Array.<number>} m1 + * @param {Float32Array|Array.<number>} m2 + */ +function mul$1(out, m1, m2) { + // Consider matrix.mul(m, m2, m); + // where out is the same as m2. + // So use temp variable to escape error. + var out0 = m1[0] * m2[0] + m1[2] * m2[1]; + var out1 = m1[1] * m2[0] + m1[3] * m2[1]; + var out2 = m1[0] * m2[2] + m1[2] * m2[3]; + var out3 = m1[1] * m2[2] + m1[3] * m2[3]; + var out4 = m1[0] * m2[4] + m1[2] * m2[5] + m1[4]; + var out5 = m1[1] * m2[4] + m1[3] * m2[5] + m1[5]; + out[0] = out0; + out[1] = out1; + out[2] = out2; + out[3] = out3; + out[4] = out4; + out[5] = out5; + return out; +} + +/** + * 平移变换 + * @param {Float32Array|Array.<number>} out + * @param {Float32Array|Array.<number>} a + * @param {Float32Array|Array.<number>} v + */ +function translate(out, a, v) { + out[0] = a[0]; + out[1] = a[1]; + out[2] = a[2]; + out[3] = a[3]; + out[4] = a[4] + v[0]; + out[5] = a[5] + v[1]; + return out; +} + +/** + * 旋转变换 + * @param {Float32Array|Array.<number>} out + * @param {Float32Array|Array.<number>} a + * @param {number} rad + */ +function rotate(out, a, rad) { + var aa = a[0]; + var ac = a[2]; + var atx = a[4]; + var ab = a[1]; + var ad = a[3]; + var aty = a[5]; + var st = Math.sin(rad); + var ct = Math.cos(rad); + + out[0] = aa * ct + ab * st; + out[1] = -aa * st + ab * ct; + out[2] = ac * ct + ad * st; + out[3] = -ac * st + ct * ad; + out[4] = ct * atx + st * aty; + out[5] = ct * aty - st * atx; + return out; +} + +/** + * 缩放变换 + * @param {Float32Array|Array.<number>} out + * @param {Float32Array|Array.<number>} a + * @param {Float32Array|Array.<number>} v + */ +function scale$1(out, a, v) { + var vx = v[0]; + var vy = v[1]; + out[0] = a[0] * vx; + out[1] = a[1] * vy; + out[2] = a[2] * vx; + out[3] = a[3] * vy; + out[4] = a[4] * vx; + out[5] = a[5] * vy; + return out; +} + +/** + * 求逆矩阵 + * @param {Float32Array|Array.<number>} out + * @param {Float32Array|Array.<number>} a + */ +function invert(out, a) { + + var aa = a[0]; + var ac = a[2]; + var atx = a[4]; + var ab = a[1]; + var ad = a[3]; + var aty = a[5]; + + var det = aa * ad - ab * ac; + if (!det) { + return null; + } + det = 1.0 / det; + + out[0] = ad * det; + out[1] = -ab * det; + out[2] = -ac * det; + out[3] = aa * det; + out[4] = (ac * aty - ad * atx) * det; + out[5] = (ab * atx - aa * aty) * det; + return out; +} + +/** + * Clone a new matrix. + * @param {Float32Array|Array.<number>} a + */ +function clone$2(a) { + var b = create$1(); + copy$1(b, a); + return b; +} + +var matrix = (Object.freeze || Object)({ + create: create$1, + identity: identity, + copy: copy$1, + mul: mul$1, + translate: translate, + rotate: rotate, + scale: scale$1, + invert: invert, + clone: clone$2 +}); + +/** + * 提供变换扩展 + * @module zrender/mixin/Transformable + * @author pissang (https://www.github.com/pissang) + */ + +var mIdentity = identity; + +var EPSILON = 5e-5; + +function isNotAroundZero(val) { + return val > EPSILON || val < -EPSILON; +} + +/** + * @alias module:zrender/mixin/Transformable + * @constructor + */ +var Transformable = function (opts) { + opts = opts || {}; + // If there are no given position, rotation, scale + if (!opts.position) { + /** + * 平移 + * @type {Array.<number>} + * @default [0, 0] + */ + this.position = [0, 0]; + } + if (opts.rotation == null) { + /** + * 旋转 + * @type {Array.<number>} + * @default 0 + */ + this.rotation = 0; + } + if (!opts.scale) { + /** + * 缩放 + * @type {Array.<number>} + * @default [1, 1] + */ + this.scale = [1, 1]; + } + /** + * 旋转和缩放的原点 + * @type {Array.<number>} + * @default null + */ + this.origin = this.origin || null; +}; + +var transformableProto = Transformable.prototype; +transformableProto.transform = null; + +/** + * 判断是否需要有坐标变换 + * 如果有坐标变换, 则从position, rotation, scale以及父节点的transform计算出自身的transform矩阵 + */ +transformableProto.needLocalTransform = function () { + return isNotAroundZero(this.rotation) + || isNotAroundZero(this.position[0]) + || isNotAroundZero(this.position[1]) + || isNotAroundZero(this.scale[0] - 1) + || isNotAroundZero(this.scale[1] - 1); +}; + +transformableProto.updateTransform = function () { + var parent = this.parent; + var parentHasTransform = parent && parent.transform; + var needLocalTransform = this.needLocalTransform(); + + var m = this.transform; + if (!(needLocalTransform || parentHasTransform)) { + m && mIdentity(m); + return; + } + + m = m || create$1(); + + if (needLocalTransform) { + this.getLocalTransform(m); + } + else { + mIdentity(m); + } + + // 应用父节点变换 + if (parentHasTransform) { + if (needLocalTransform) { + mul$1(m, parent.transform, m); + } + else { + copy$1(m, parent.transform); + } + } + // 保存这个变换矩阵 + this.transform = m; + + this.invTransform = this.invTransform || create$1(); + invert(this.invTransform, m); +}; + +transformableProto.getLocalTransform = function (m) { + return Transformable.getLocalTransform(this, m); +}; + +/** + * 将自己的transform应用到context上 + * @param {CanvasRenderingContext2D} ctx + */ +transformableProto.setTransform = function (ctx) { + var m = this.transform; + var dpr = ctx.dpr || 1; + if (m) { + ctx.setTransform(dpr * m[0], dpr * m[1], dpr * m[2], dpr * m[3], dpr * m[4], dpr * m[5]); + } + else { + ctx.setTransform(dpr, 0, 0, dpr, 0, 0); + } +}; + +transformableProto.restoreTransform = function (ctx) { + var dpr = ctx.dpr || 1; + ctx.setTransform(dpr, 0, 0, dpr, 0, 0); +}; + +var tmpTransform = []; + +/** + * 分解`transform`矩阵到`position`, `rotation`, `scale` + */ +transformableProto.decomposeTransform = function () { + if (!this.transform) { + return; + } + var parent = this.parent; + var m = this.transform; + if (parent && parent.transform) { + // Get local transform and decompose them to position, scale, rotation + mul$1(tmpTransform, parent.invTransform, m); + m = tmpTransform; + } + var sx = m[0] * m[0] + m[1] * m[1]; + var sy = m[2] * m[2] + m[3] * m[3]; + var position = this.position; + var scale$$1 = this.scale; + if (isNotAroundZero(sx - 1)) { + sx = Math.sqrt(sx); + } + if (isNotAroundZero(sy - 1)) { + sy = Math.sqrt(sy); + } + if (m[0] < 0) { + sx = -sx; + } + if (m[3] < 0) { + sy = -sy; + } + position[0] = m[4]; + position[1] = m[5]; + scale$$1[0] = sx; + scale$$1[1] = sy; + this.rotation = Math.atan2(-m[1] / sy, m[0] / sx); +}; + +/** + * Get global scale + * @return {Array.<number>} + */ +transformableProto.getGlobalScale = function () { + var m = this.transform; + if (!m) { + return [1, 1]; + } + var sx = Math.sqrt(m[0] * m[0] + m[1] * m[1]); + var sy = Math.sqrt(m[2] * m[2] + m[3] * m[3]); + if (m[0] < 0) { + sx = -sx; + } + if (m[3] < 0) { + sy = -sy; + } + return [sx, sy]; +}; +/** + * 变换坐标位置到 shape 的局部坐标空间 + * @method + * @param {number} x + * @param {number} y + * @return {Array.<number>} + */ +transformableProto.transformCoordToLocal = function (x, y) { + var v2 = [x, y]; + var invTransform = this.invTransform; + if (invTransform) { + applyTransform(v2, v2, invTransform); + } + return v2; +}; + +/** + * 变换局部坐标位置到全局坐标空间 + * @method + * @param {number} x + * @param {number} y + * @return {Array.<number>} + */ +transformableProto.transformCoordToGlobal = function (x, y) { + var v2 = [x, y]; + var transform = this.transform; + if (transform) { + applyTransform(v2, v2, transform); + } + return v2; +}; + +/** + * @static + * @param {Object} target + * @param {Array.<number>} target.origin + * @param {number} target.rotation + * @param {Array.<number>} target.position + * @param {Array.<number>} [m] + */ +Transformable.getLocalTransform = function (target, m) { + m = m || []; + mIdentity(m); + + var origin = target.origin; + var scale$$1 = target.scale || [1, 1]; + var rotation = target.rotation || 0; + var position = target.position || [0, 0]; + + if (origin) { + // Translate to origin + m[4] -= origin[0]; + m[5] -= origin[1]; + } + scale$1(m, m, scale$$1); + if (rotation) { + rotate(m, m, rotation); + } + if (origin) { + // Translate back from origin + m[4] += origin[0]; + m[5] += origin[1]; + } + + m[4] += position[0]; + m[5] += position[1]; + + return m; +}; + +/** + * 缓动代码来自 https://github.com/sole/tween.js/blob/master/src/Tween.js + * @see http://sole.github.io/tween.js/examples/03_graphs.html + * @exports zrender/animation/easing + */ +var easing = { + /** + * @param {number} k + * @return {number} + */ + linear: function (k) { + return k; + }, + + /** + * @param {number} k + * @return {number} + */ + quadraticIn: function (k) { + return k * k; + }, + /** + * @param {number} k + * @return {number} + */ + quadraticOut: function (k) { + return k * (2 - k); + }, + /** + * @param {number} k + * @return {number} + */ + quadraticInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k; + } + return -0.5 * (--k * (k - 2) - 1); + }, + + // 三次方的缓动(t^3) + /** + * @param {number} k + * @return {number} + */ + cubicIn: function (k) { + return k * k * k; + }, + /** + * @param {number} k + * @return {number} + */ + cubicOut: function (k) { + return --k * k * k + 1; + }, + /** + * @param {number} k + * @return {number} + */ + cubicInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k * k; + } + return 0.5 * ((k -= 2) * k * k + 2); + }, + + // 四次方的缓动(t^4) + /** + * @param {number} k + * @return {number} + */ + quarticIn: function (k) { + return k * k * k * k; + }, + /** + * @param {number} k + * @return {number} + */ + quarticOut: function (k) { + return 1 - (--k * k * k * k); + }, + /** + * @param {number} k + * @return {number} + */ + quarticInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k * k * k; + } + return -0.5 * ((k -= 2) * k * k * k - 2); + }, + + // 五次方的缓动(t^5) + /** + * @param {number} k + * @return {number} + */ + quinticIn: function (k) { + return k * k * k * k * k; + }, + /** + * @param {number} k + * @return {number} + */ + quinticOut: function (k) { + return --k * k * k * k * k + 1; + }, + /** + * @param {number} k + * @return {number} + */ + quinticInOut: function (k) { + if ((k *= 2) < 1) { + return 0.5 * k * k * k * k * k; + } + return 0.5 * ((k -= 2) * k * k * k * k + 2); + }, + + // 正弦曲线的缓动(sin(t)) + /** + * @param {number} k + * @return {number} + */ + sinusoidalIn: function (k) { + return 1 - Math.cos(k * Math.PI / 2); + }, + /** + * @param {number} k + * @return {number} + */ + sinusoidalOut: function (k) { + return Math.sin(k * Math.PI / 2); + }, + /** + * @param {number} k + * @return {number} + */ + sinusoidalInOut: function (k) { + return 0.5 * (1 - Math.cos(Math.PI * k)); + }, + + // 指数曲线的缓动(2^t) + /** + * @param {number} k + * @return {number} + */ + exponentialIn: function (k) { + return k === 0 ? 0 : Math.pow(1024, k - 1); + }, + /** + * @param {number} k + * @return {number} + */ + exponentialOut: function (k) { + return k === 1 ? 1 : 1 - Math.pow(2, -10 * k); + }, + /** + * @param {number} k + * @return {number} + */ + exponentialInOut: function (k) { + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if ((k *= 2) < 1) { + return 0.5 * Math.pow(1024, k - 1); + } + return 0.5 * (-Math.pow(2, -10 * (k - 1)) + 2); + }, + + // 圆形曲线的缓动(sqrt(1-t^2)) + /** + * @param {number} k + * @return {number} + */ + circularIn: function (k) { + return 1 - Math.sqrt(1 - k * k); + }, + /** + * @param {number} k + * @return {number} + */ + circularOut: function (k) { + return Math.sqrt(1 - (--k * k)); + }, + /** + * @param {number} k + * @return {number} + */ + circularInOut: function (k) { + if ((k *= 2) < 1) { + return -0.5 * (Math.sqrt(1 - k * k) - 1); + } + return 0.5 * (Math.sqrt(1 - (k -= 2) * k) + 1); + }, + + // 创建类似于弹簧在停止前来回振荡的动画 + /** + * @param {number} k + * @return {number} + */ + elasticIn: function (k) { + var s; + var a = 0.1; + var p = 0.4; + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if (!a || a < 1) { + a = 1; s = p / 4; + } + else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + return -(a * Math.pow(2, 10 * (k -= 1)) * + Math.sin((k - s) * (2 * Math.PI) / p)); + }, + /** + * @param {number} k + * @return {number} + */ + elasticOut: function (k) { + var s; + var a = 0.1; + var p = 0.4; + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if (!a || a < 1) { + a = 1; s = p / 4; + } + else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + return (a * Math.pow(2, -10 * k) * + Math.sin((k - s) * (2 * Math.PI) / p) + 1); + }, + /** + * @param {number} k + * @return {number} + */ + elasticInOut: function (k) { + var s; + var a = 0.1; + var p = 0.4; + if (k === 0) { + return 0; + } + if (k === 1) { + return 1; + } + if (!a || a < 1) { + a = 1; s = p / 4; + } + else { + s = p * Math.asin(1 / a) / (2 * Math.PI); + } + if ((k *= 2) < 1) { + return -0.5 * (a * Math.pow(2, 10 * (k -= 1)) + * Math.sin((k - s) * (2 * Math.PI) / p)); + } + return a * Math.pow(2, -10 * (k -= 1)) + * Math.sin((k - s) * (2 * Math.PI) / p) * 0.5 + 1; + + }, + + // 在某一动画开始沿指示的路径进行动画处理前稍稍收回该动画的移动 + /** + * @param {number} k + * @return {number} + */ + backIn: function (k) { + var s = 1.70158; + return k * k * ((s + 1) * k - s); + }, + /** + * @param {number} k + * @return {number} + */ + backOut: function (k) { + var s = 1.70158; + return --k * k * ((s + 1) * k + s) + 1; + }, + /** + * @param {number} k + * @return {number} + */ + backInOut: function (k) { + var s = 1.70158 * 1.525; + if ((k *= 2) < 1) { + return 0.5 * (k * k * ((s + 1) * k - s)); + } + return 0.5 * ((k -= 2) * k * ((s + 1) * k + s) + 2); + }, + + // 创建弹跳效果 + /** + * @param {number} k + * @return {number} + */ + bounceIn: function (k) { + return 1 - easing.bounceOut(1 - k); + }, + /** + * @param {number} k + * @return {number} + */ + bounceOut: function (k) { + if (k < (1 / 2.75)) { + return 7.5625 * k * k; + } + else if (k < (2 / 2.75)) { + return 7.5625 * (k -= (1.5 / 2.75)) * k + 0.75; + } + else if (k < (2.5 / 2.75)) { + return 7.5625 * (k -= (2.25 / 2.75)) * k + 0.9375; + } + else { + return 7.5625 * (k -= (2.625 / 2.75)) * k + 0.984375; + } + }, + /** + * @param {number} k + * @return {number} + */ + bounceInOut: function (k) { + if (k < 0.5) { + return easing.bounceIn(k * 2) * 0.5; + } + return easing.bounceOut(k * 2 - 1) * 0.5 + 0.5; + } +}; + +/** + * 动画主控制器 + * @config target 动画对象,可以是数组,如果是数组的话会批量分发onframe等事件 + * @config life(1000) 动画时长 + * @config delay(0) 动画延迟时间 + * @config loop(true) + * @config gap(0) 循环的间隔时间 + * @config onframe + * @config easing(optional) + * @config ondestroy(optional) + * @config onrestart(optional) + * + * TODO pause + */ + +function Clip(options) { + + this._target = options.target; + + // 生命周期 + this._life = options.life || 1000; + // 延时 + this._delay = options.delay || 0; + // 开始时间 + // this._startTime = new Date().getTime() + this._delay;// 单位毫秒 + this._initialized = false; + + // 是否循环 + this.loop = options.loop == null ? false : options.loop; + + this.gap = options.gap || 0; + + this.easing = options.easing || 'Linear'; + + this.onframe = options.onframe; + this.ondestroy = options.ondestroy; + this.onrestart = options.onrestart; + + this._pausedTime = 0; + this._paused = false; +} + +Clip.prototype = { + + constructor: Clip, + + step: function (globalTime, deltaTime) { + // Set startTime on first step, or _startTime may has milleseconds different between clips + // PENDING + if (!this._initialized) { + this._startTime = globalTime + this._delay; + this._initialized = true; + } + + if (this._paused) { + this._pausedTime += deltaTime; + return; + } + + var percent = (globalTime - this._startTime - this._pausedTime) / this._life; + + // 还没开始 + if (percent < 0) { + return; + } + + percent = Math.min(percent, 1); + + var easing$$1 = this.easing; + var easingFunc = typeof easing$$1 == 'string' ? easing[easing$$1] : easing$$1; + var schedule = typeof easingFunc === 'function' + ? easingFunc(percent) + : percent; + + this.fire('frame', schedule); + + // 结束 + if (percent == 1) { + if (this.loop) { + this.restart (globalTime); + // 重新开始周期 + // 抛出而不是直接调用事件直到 stage.update 后再统一调用这些事件 + return 'restart'; + } + + // 动画完成将这个控制器标识为待删除 + // 在Animation.update中进行批量删除 + this._needsRemove = true; + return 'destroy'; + } + + return null; + }, + + restart: function (globalTime) { + var remainder = (globalTime - this._startTime - this._pausedTime) % this._life; + this._startTime = globalTime - remainder + this.gap; + this._pausedTime = 0; + + this._needsRemove = false; + }, + + fire: function (eventType, arg) { + eventType = 'on' + eventType; + if (this[eventType]) { + this[eventType](this._target, arg); + } + }, + + pause: function () { + this._paused = true; + }, + + resume: function () { + this._paused = false; + } +}; + +// Simple LRU cache use doubly linked list +// @module zrender/core/LRU + +/** + * Simple double linked list. Compared with array, it has O(1) remove operation. + * @constructor + */ +var LinkedList = function () { + + /** + * @type {module:zrender/core/LRU~Entry} + */ + this.head = null; + + /** + * @type {module:zrender/core/LRU~Entry} + */ + this.tail = null; + + this._len = 0; +}; + +var linkedListProto = LinkedList.prototype; +/** + * Insert a new value at the tail + * @param {} val + * @return {module:zrender/core/LRU~Entry} + */ +linkedListProto.insert = function (val) { + var entry = new Entry(val); + this.insertEntry(entry); + return entry; +}; + +/** + * Insert an entry at the tail + * @param {module:zrender/core/LRU~Entry} entry + */ +linkedListProto.insertEntry = function (entry) { + if (!this.head) { + this.head = this.tail = entry; + } + else { + this.tail.next = entry; + entry.prev = this.tail; + entry.next = null; + this.tail = entry; + } + this._len++; +}; + +/** + * Remove entry. + * @param {module:zrender/core/LRU~Entry} entry + */ +linkedListProto.remove = function (entry) { + var prev = entry.prev; + var next = entry.next; + if (prev) { + prev.next = next; + } + else { + // Is head + this.head = next; + } + if (next) { + next.prev = prev; + } + else { + // Is tail + this.tail = prev; + } + entry.next = entry.prev = null; + this._len--; +}; + +/** + * @return {number} + */ +linkedListProto.len = function () { + return this._len; +}; + +/** + * Clear list + */ +linkedListProto.clear = function () { + this.head = this.tail = null; + this._len = 0; +}; + +/** + * @constructor + * @param {} val + */ +var Entry = function (val) { + /** + * @type {} + */ + this.value = val; + + /** + * @type {module:zrender/core/LRU~Entry} + */ + this.next; + + /** + * @type {module:zrender/core/LRU~Entry} + */ + this.prev; +}; + +/** + * LRU Cache + * @constructor + * @alias module:zrender/core/LRU + */ +var LRU = function (maxSize) { + + this._list = new LinkedList(); + + this._map = {}; + + this._maxSize = maxSize || 10; + + this._lastRemovedEntry = null; +}; + +var LRUProto = LRU.prototype; + +/** + * @param {string} key + * @param {} value + * @return {} Removed value + */ +LRUProto.put = function (key, value) { + var list = this._list; + var map = this._map; + var removed = null; + if (map[key] == null) { + var len = list.len(); + // Reuse last removed entry + var entry = this._lastRemovedEntry; + + if (len >= this._maxSize && len > 0) { + // Remove the least recently used + var leastUsedEntry = list.head; + list.remove(leastUsedEntry); + delete map[leastUsedEntry.key]; + + removed = leastUsedEntry.value; + this._lastRemovedEntry = leastUsedEntry; + } + + if (entry) { + entry.value = value; + } + else { + entry = new Entry(value); + } + entry.key = key; + list.insertEntry(entry); + map[key] = entry; + } + + return removed; +}; + +/** + * @param {string} key + * @return {} + */ +LRUProto.get = function (key) { + var entry = this._map[key]; + var list = this._list; + if (entry != null) { + // Put the latest used entry in the tail + if (entry !== list.tail) { + list.remove(entry); + list.insertEntry(entry); + } + + return entry.value; + } +}; + +/** + * Clear the cache + */ +LRUProto.clear = function () { + this._list.clear(); + this._map = {}; +}; + +var kCSSColorTable = { + 'transparent': [0,0,0,0], 'aliceblue': [240,248,255,1], + 'antiquewhite': [250,235,215,1], 'aqua': [0,255,255,1], + 'aquamarine': [127,255,212,1], 'azure': [240,255,255,1], + 'beige': [245,245,220,1], 'bisque': [255,228,196,1], + 'black': [0,0,0,1], 'blanchedalmond': [255,235,205,1], + 'blue': [0,0,255,1], 'blueviolet': [138,43,226,1], + 'brown': [165,42,42,1], 'burlywood': [222,184,135,1], + 'cadetblue': [95,158,160,1], 'chartreuse': [127,255,0,1], + 'chocolate': [210,105,30,1], 'coral': [255,127,80,1], + 'cornflowerblue': [100,149,237,1], 'cornsilk': [255,248,220,1], + 'crimson': [220,20,60,1], 'cyan': [0,255,255,1], + 'darkblue': [0,0,139,1], 'darkcyan': [0,139,139,1], + 'darkgoldenrod': [184,134,11,1], 'darkgray': [169,169,169,1], + 'darkgreen': [0,100,0,1], 'darkgrey': [169,169,169,1], + 'darkkhaki': [189,183,107,1], 'darkmagenta': [139,0,139,1], + 'darkolivegreen': [85,107,47,1], 'darkorange': [255,140,0,1], + 'darkorchid': [153,50,204,1], 'darkred': [139,0,0,1], + 'darksalmon': [233,150,122,1], 'darkseagreen': [143,188,143,1], + 'darkslateblue': [72,61,139,1], 'darkslategray': [47,79,79,1], + 'darkslategrey': [47,79,79,1], 'darkturquoise': [0,206,209,1], + 'darkviolet': [148,0,211,1], 'deeppink': [255,20,147,1], + 'deepskyblue': [0,191,255,1], 'dimgray': [105,105,105,1], + 'dimgrey': [105,105,105,1], 'dodgerblue': [30,144,255,1], + 'firebrick': [178,34,34,1], 'floralwhite': [255,250,240,1], + 'forestgreen': [34,139,34,1], 'fuchsia': [255,0,255,1], + 'gainsboro': [220,220,220,1], 'ghostwhite': [248,248,255,1], + 'gold': [255,215,0,1], 'goldenrod': [218,165,32,1], + 'gray': [128,128,128,1], 'green': [0,128,0,1], + 'greenyellow': [173,255,47,1], 'grey': [128,128,128,1], + 'honeydew': [240,255,240,1], 'hotpink': [255,105,180,1], + 'indianred': [205,92,92,1], 'indigo': [75,0,130,1], + 'ivory': [255,255,240,1], 'khaki': [240,230,140,1], + 'lavender': [230,230,250,1], 'lavenderblush': [255,240,245,1], + 'lawngreen': [124,252,0,1], 'lemonchiffon': [255,250,205,1], + 'lightblue': [173,216,230,1], 'lightcoral': [240,128,128,1], + 'lightcyan': [224,255,255,1], 'lightgoldenrodyellow': [250,250,210,1], + 'lightgray': [211,211,211,1], 'lightgreen': [144,238,144,1], + 'lightgrey': [211,211,211,1], 'lightpink': [255,182,193,1], + 'lightsalmon': [255,160,122,1], 'lightseagreen': [32,178,170,1], + 'lightskyblue': [135,206,250,1], 'lightslategray': [119,136,153,1], + 'lightslategrey': [119,136,153,1], 'lightsteelblue': [176,196,222,1], + 'lightyellow': [255,255,224,1], 'lime': [0,255,0,1], + 'limegreen': [50,205,50,1], 'linen': [250,240,230,1], + 'magenta': [255,0,255,1], 'maroon': [128,0,0,1], + 'mediumaquamarine': [102,205,170,1], 'mediumblue': [0,0,205,1], + 'mediumorchid': [186,85,211,1], 'mediumpurple': [147,112,219,1], + 'mediumseagreen': [60,179,113,1], 'mediumslateblue': [123,104,238,1], + 'mediumspringgreen': [0,250,154,1], 'mediumturquoise': [72,209,204,1], + 'mediumvioletred': [199,21,133,1], 'midnightblue': [25,25,112,1], + 'mintcream': [245,255,250,1], 'mistyrose': [255,228,225,1], + 'moccasin': [255,228,181,1], 'navajowhite': [255,222,173,1], + 'navy': [0,0,128,1], 'oldlace': [253,245,230,1], + 'olive': [128,128,0,1], 'olivedrab': [107,142,35,1], + 'orange': [255,165,0,1], 'orangered': [255,69,0,1], + 'orchid': [218,112,214,1], 'palegoldenrod': [238,232,170,1], + 'palegreen': [152,251,152,1], 'paleturquoise': [175,238,238,1], + 'palevioletred': [219,112,147,1], 'papayawhip': [255,239,213,1], + 'peachpuff': [255,218,185,1], 'peru': [205,133,63,1], + 'pink': [255,192,203,1], 'plum': [221,160,221,1], + 'powderblue': [176,224,230,1], 'purple': [128,0,128,1], + 'red': [255,0,0,1], 'rosybrown': [188,143,143,1], + 'royalblue': [65,105,225,1], 'saddlebrown': [139,69,19,1], + 'salmon': [250,128,114,1], 'sandybrown': [244,164,96,1], + 'seagreen': [46,139,87,1], 'seashell': [255,245,238,1], + 'sienna': [160,82,45,1], 'silver': [192,192,192,1], + 'skyblue': [135,206,235,1], 'slateblue': [106,90,205,1], + 'slategray': [112,128,144,1], 'slategrey': [112,128,144,1], + 'snow': [255,250,250,1], 'springgreen': [0,255,127,1], + 'steelblue': [70,130,180,1], 'tan': [210,180,140,1], + 'teal': [0,128,128,1], 'thistle': [216,191,216,1], + 'tomato': [255,99,71,1], 'turquoise': [64,224,208,1], + 'violet': [238,130,238,1], 'wheat': [245,222,179,1], + 'white': [255,255,255,1], 'whitesmoke': [245,245,245,1], + 'yellow': [255,255,0,1], 'yellowgreen': [154,205,50,1] +}; + +function clampCssByte(i) { // Clamp to integer 0 .. 255. + i = Math.round(i); // Seems to be what Chrome does (vs truncation). + return i < 0 ? 0 : i > 255 ? 255 : i; +} + +function clampCssAngle(i) { // Clamp to integer 0 .. 360. + i = Math.round(i); // Seems to be what Chrome does (vs truncation). + return i < 0 ? 0 : i > 360 ? 360 : i; +} + +function clampCssFloat(f) { // Clamp to float 0.0 .. 1.0. + return f < 0 ? 0 : f > 1 ? 1 : f; +} + +function parseCssInt(str) { // int or percentage. + if (str.length && str.charAt(str.length - 1) === '%') { + return clampCssByte(parseFloat(str) / 100 * 255); + } + return clampCssByte(parseInt(str, 10)); +} + +function parseCssFloat(str) { // float or percentage. + if (str.length && str.charAt(str.length - 1) === '%') { + return clampCssFloat(parseFloat(str) / 100); + } + return clampCssFloat(parseFloat(str)); +} + +function cssHueToRgb(m1, m2, h) { + if (h < 0) { + h += 1; + } + else if (h > 1) { + h -= 1; + } + + if (h * 6 < 1) { + return m1 + (m2 - m1) * h * 6; + } + if (h * 2 < 1) { + return m2; + } + if (h * 3 < 2) { + return m1 + (m2 - m1) * (2/3 - h) * 6; + } + return m1; +} + +function lerpNumber(a, b, p) { + return a + (b - a) * p; +} + +function setRgba(out, r, g, b, a) { + out[0] = r; out[1] = g; out[2] = b; out[3] = a; + return out; +} +function copyRgba(out, a) { + out[0] = a[0]; out[1] = a[1]; out[2] = a[2]; out[3] = a[3]; + return out; +} + +var colorCache = new LRU(20); +var lastRemovedArr = null; + +function putToCache(colorStr, rgbaArr) { + // Reuse removed array + if (lastRemovedArr) { + copyRgba(lastRemovedArr, rgbaArr); + } + lastRemovedArr = colorCache.put(colorStr, lastRemovedArr || (rgbaArr.slice())); +} + +/** + * @param {string} colorStr + * @param {Array.<number>} out + * @return {Array.<number>} + * @memberOf module:zrender/util/color + */ +function parse(colorStr, rgbaArr) { + if (!colorStr) { + return; + } + rgbaArr = rgbaArr || []; + + var cached = colorCache.get(colorStr); + if (cached) { + return copyRgba(rgbaArr, cached); + } + + // colorStr may be not string + colorStr = colorStr + ''; + // Remove all whitespace, not compliant, but should just be more accepting. + var str = colorStr.replace(/ /g, '').toLowerCase(); + + // Color keywords (and transparent) lookup. + if (str in kCSSColorTable) { + copyRgba(rgbaArr, kCSSColorTable[str]); + putToCache(colorStr, rgbaArr); + return rgbaArr; + } + + // #abc and #abc123 syntax. + if (str.charAt(0) === '#') { + if (str.length === 4) { + var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. + if (!(iv >= 0 && iv <= 0xfff)) { + setRgba(rgbaArr, 0, 0, 0, 1); + return; // Covers NaN. + } + setRgba(rgbaArr, + ((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8), + (iv & 0xf0) | ((iv & 0xf0) >> 4), + (iv & 0xf) | ((iv & 0xf) << 4), + 1 + ); + putToCache(colorStr, rgbaArr); + return rgbaArr; + } + else if (str.length === 7) { + var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. + if (!(iv >= 0 && iv <= 0xffffff)) { + setRgba(rgbaArr, 0, 0, 0, 1); + return; // Covers NaN. + } + setRgba(rgbaArr, + (iv & 0xff0000) >> 16, + (iv & 0xff00) >> 8, + iv & 0xff, + 1 + ); + putToCache(colorStr, rgbaArr); + return rgbaArr; + } + + return; + } + var op = str.indexOf('('), ep = str.indexOf(')'); + if (op !== -1 && ep + 1 === str.length) { + var fname = str.substr(0, op); + var params = str.substr(op + 1, ep - (op + 1)).split(','); + var alpha = 1; // To allow case fallthrough. + switch (fname) { + case 'rgba': + if (params.length !== 4) { + setRgba(rgbaArr, 0, 0, 0, 1); + return; + } + alpha = parseCssFloat(params.pop()); // jshint ignore:line + // Fall through. + case 'rgb': + if (params.length !== 3) { + setRgba(rgbaArr, 0, 0, 0, 1); + return; + } + setRgba(rgbaArr, + parseCssInt(params[0]), + parseCssInt(params[1]), + parseCssInt(params[2]), + alpha + ); + putToCache(colorStr, rgbaArr); + return rgbaArr; + case 'hsla': + if (params.length !== 4) { + setRgba(rgbaArr, 0, 0, 0, 1); + return; + } + params[3] = parseCssFloat(params[3]); + hsla2rgba(params, rgbaArr); + putToCache(colorStr, rgbaArr); + return rgbaArr; + case 'hsl': + if (params.length !== 3) { + setRgba(rgbaArr, 0, 0, 0, 1); + return; + } + hsla2rgba(params, rgbaArr); + putToCache(colorStr, rgbaArr); + return rgbaArr; + default: + return; + } + } + + setRgba(rgbaArr, 0, 0, 0, 1); + return; +} + +/** + * @param {Array.<number>} hsla + * @param {Array.<number>} rgba + * @return {Array.<number>} rgba + */ +function hsla2rgba(hsla, rgba) { + var h = (((parseFloat(hsla[0]) % 360) + 360) % 360) / 360; // 0 .. 1 + // NOTE(deanm): According to the CSS spec s/l should only be + // percentages, but we don't bother and let float or percentage. + var s = parseCssFloat(hsla[1]); + var l = parseCssFloat(hsla[2]); + var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; + var m1 = l * 2 - m2; + + rgba = rgba || []; + setRgba(rgba, + clampCssByte(cssHueToRgb(m1, m2, h + 1 / 3) * 255), + clampCssByte(cssHueToRgb(m1, m2, h) * 255), + clampCssByte(cssHueToRgb(m1, m2, h - 1 / 3) * 255), + 1 + ); + + if (hsla.length === 4) { + rgba[3] = hsla[3]; + } + + return rgba; +} + +/** + * @param {Array.<number>} rgba + * @return {Array.<number>} hsla + */ +function rgba2hsla(rgba) { + if (!rgba) { + return; + } + + // RGB from 0 to 255 + var R = rgba[0] / 255; + var G = rgba[1] / 255; + var B = rgba[2] / 255; + + var vMin = Math.min(R, G, B); // Min. value of RGB + var vMax = Math.max(R, G, B); // Max. value of RGB + var delta = vMax - vMin; // Delta RGB value + + var L = (vMax + vMin) / 2; + var H; + var S; + // HSL results from 0 to 1 + if (delta === 0) { + H = 0; + S = 0; + } + else { + if (L < 0.5) { + S = delta / (vMax + vMin); + } + else { + S = delta / (2 - vMax - vMin); + } + + var deltaR = (((vMax - R) / 6) + (delta / 2)) / delta; + var deltaG = (((vMax - G) / 6) + (delta / 2)) / delta; + var deltaB = (((vMax - B) / 6) + (delta / 2)) / delta; + + if (R === vMax) { + H = deltaB - deltaG; + } + else if (G === vMax) { + H = (1 / 3) + deltaR - deltaB; + } + else if (B === vMax) { + H = (2 / 3) + deltaG - deltaR; + } + + if (H < 0) { + H += 1; + } + + if (H > 1) { + H -= 1; + } + } + + var hsla = [H * 360, S, L]; + + if (rgba[3] != null) { + hsla.push(rgba[3]); + } + + return hsla; +} + +/** + * @param {string} color + * @param {number} level + * @return {string} + * @memberOf module:zrender/util/color + */ +function lift(color, level) { + var colorArr = parse(color); + if (colorArr) { + for (var i = 0; i < 3; i++) { + if (level < 0) { + colorArr[i] = colorArr[i] * (1 - level) | 0; + } + else { + colorArr[i] = ((255 - colorArr[i]) * level + colorArr[i]) | 0; + } + if (colorArr[i] > 255) { + colorArr[i] = 255; + } + else if (color[i] < 0) { + colorArr[i] = 0; + } + } + return stringify(colorArr, colorArr.length === 4 ? 'rgba' : 'rgb'); + } +} + +/** + * @param {string} color + * @return {string} + * @memberOf module:zrender/util/color + */ +function toHex(color) { + var colorArr = parse(color); + if (colorArr) { + return ((1 << 24) + (colorArr[0] << 16) + (colorArr[1] << 8) + (+colorArr[2])).toString(16).slice(1); + } +} + +/** + * Map value to color. Faster than lerp methods because color is represented by rgba array. + * @param {number} normalizedValue A float between 0 and 1. + * @param {Array.<Array.<number>>} colors List of rgba color array + * @param {Array.<number>} [out] Mapped gba color array + * @return {Array.<number>} will be null/undefined if input illegal. + */ +function fastLerp(normalizedValue, colors, out) { + if (!(colors && colors.length) + || !(normalizedValue >= 0 && normalizedValue <= 1) + ) { + return; + } + + out = out || []; + + var value = normalizedValue * (colors.length - 1); + var leftIndex = Math.floor(value); + var rightIndex = Math.ceil(value); + var leftColor = colors[leftIndex]; + var rightColor = colors[rightIndex]; + var dv = value - leftIndex; + out[0] = clampCssByte(lerpNumber(leftColor[0], rightColor[0], dv)); + out[1] = clampCssByte(lerpNumber(leftColor[1], rightColor[1], dv)); + out[2] = clampCssByte(lerpNumber(leftColor[2], rightColor[2], dv)); + out[3] = clampCssFloat(lerpNumber(leftColor[3], rightColor[3], dv)); + + return out; +} + +/** + * @deprecated + */ +var fastMapToColor = fastLerp; + +/** + * @param {number} normalizedValue A float between 0 and 1. + * @param {Array.<string>} colors Color list. + * @param {boolean=} fullOutput Default false. + * @return {(string|Object)} Result color. If fullOutput, + * return {color: ..., leftIndex: ..., rightIndex: ..., value: ...}, + * @memberOf module:zrender/util/color + */ +function lerp$1(normalizedValue, colors, fullOutput) { + if (!(colors && colors.length) + || !(normalizedValue >= 0 && normalizedValue <= 1) + ) { + return; + } + + var value = normalizedValue * (colors.length - 1); + var leftIndex = Math.floor(value); + var rightIndex = Math.ceil(value); + var leftColor = parse(colors[leftIndex]); + var rightColor = parse(colors[rightIndex]); + var dv = value - leftIndex; + + var color = stringify( + [ + clampCssByte(lerpNumber(leftColor[0], rightColor[0], dv)), + clampCssByte(lerpNumber(leftColor[1], rightColor[1], dv)), + clampCssByte(lerpNumber(leftColor[2], rightColor[2], dv)), + clampCssFloat(lerpNumber(leftColor[3], rightColor[3], dv)) + ], + 'rgba' + ); + + return fullOutput + ? { + color: color, + leftIndex: leftIndex, + rightIndex: rightIndex, + value: value + } + : color; +} + +/** + * @deprecated + */ +var mapToColor = lerp$1; + +/** + * @param {string} color + * @param {number=} h 0 ~ 360, ignore when null. + * @param {number=} s 0 ~ 1, ignore when null. + * @param {number=} l 0 ~ 1, ignore when null. + * @return {string} Color string in rgba format. + * @memberOf module:zrender/util/color + */ +function modifyHSL(color, h, s, l) { + color = parse(color); + + if (color) { + color = rgba2hsla(color); + h != null && (color[0] = clampCssAngle(h)); + s != null && (color[1] = parseCssFloat(s)); + l != null && (color[2] = parseCssFloat(l)); + + return stringify(hsla2rgba(color), 'rgba'); + } +} + +/** + * @param {string} color + * @param {number=} alpha 0 ~ 1 + * @return {string} Color string in rgba format. + * @memberOf module:zrender/util/color + */ +function modifyAlpha(color, alpha) { + color = parse(color); + + if (color && alpha != null) { + color[3] = clampCssFloat(alpha); + return stringify(color, 'rgba'); + } +} + +/** + * @param {Array.<number>} arrColor like [12,33,44,0.4] + * @param {string} type 'rgba', 'hsva', ... + * @return {string} Result color. (If input illegal, return undefined). + */ +function stringify(arrColor, type) { + if (!arrColor || !arrColor.length) { + return; + } + var colorStr = arrColor[0] + ',' + arrColor[1] + ',' + arrColor[2]; + if (type === 'rgba' || type === 'hsva' || type === 'hsla') { + colorStr += ',' + arrColor[3]; + } + return type + '(' + colorStr + ')'; +} + + +var color = (Object.freeze || Object)({ + parse: parse, + lift: lift, + toHex: toHex, + fastLerp: fastLerp, + fastMapToColor: fastMapToColor, + lerp: lerp$1, + mapToColor: mapToColor, + modifyHSL: modifyHSL, + modifyAlpha: modifyAlpha, + stringify: stringify +}); + +/** + * @module echarts/animation/Animator + */ + +var arraySlice = Array.prototype.slice; + +function defaultGetter(target, key) { + return target[key]; +} + +function defaultSetter(target, key, value) { + target[key] = value; +} + +/** + * @param {number} p0 + * @param {number} p1 + * @param {number} percent + * @return {number} + */ +function interpolateNumber(p0, p1, percent) { + return (p1 - p0) * percent + p0; +} + +/** + * @param {string} p0 + * @param {string} p1 + * @param {number} percent + * @return {string} + */ +function interpolateString(p0, p1, percent) { + return percent > 0.5 ? p1 : p0; +} + +/** + * @param {Array} p0 + * @param {Array} p1 + * @param {number} percent + * @param {Array} out + * @param {number} arrDim + */ +function interpolateArray(p0, p1, percent, out, arrDim) { + var len = p0.length; + if (arrDim == 1) { + for (var i = 0; i < len; i++) { + out[i] = interpolateNumber(p0[i], p1[i], percent); + } + } + else { + var len2 = len && p0[0].length; + for (var i = 0; i < len; i++) { + for (var j = 0; j < len2; j++) { + out[i][j] = interpolateNumber( + p0[i][j], p1[i][j], percent + ); + } + } + } +} + +// arr0 is source array, arr1 is target array. +// Do some preprocess to avoid error happened when interpolating from arr0 to arr1 +function fillArr(arr0, arr1, arrDim) { + var arr0Len = arr0.length; + var arr1Len = arr1.length; + if (arr0Len !== arr1Len) { + // FIXME Not work for TypedArray + var isPreviousLarger = arr0Len > arr1Len; + if (isPreviousLarger) { + // Cut the previous + arr0.length = arr1Len; + } + else { + // Fill the previous + for (var i = arr0Len; i < arr1Len; i++) { + arr0.push( + arrDim === 1 ? arr1[i] : arraySlice.call(arr1[i]) + ); + } + } + } + // Handling NaN value + var len2 = arr0[0] && arr0[0].length; + for (var i = 0; i < arr0.length; i++) { + if (arrDim === 1) { + if (isNaN(arr0[i])) { + arr0[i] = arr1[i]; + } + } + else { + for (var j = 0; j < len2; j++) { + if (isNaN(arr0[i][j])) { + arr0[i][j] = arr1[i][j]; + } + } + } + } +} + +/** + * @param {Array} arr0 + * @param {Array} arr1 + * @param {number} arrDim + * @return {boolean} + */ +function isArraySame(arr0, arr1, arrDim) { + if (arr0 === arr1) { + return true; + } + var len = arr0.length; + if (len !== arr1.length) { + return false; + } + if (arrDim === 1) { + for (var i = 0; i < len; i++) { + if (arr0[i] !== arr1[i]) { + return false; + } + } + } + else { + var len2 = arr0[0].length; + for (var i = 0; i < len; i++) { + for (var j = 0; j < len2; j++) { + if (arr0[i][j] !== arr1[i][j]) { + return false; + } + } + } + } + return true; +} + +/** + * Catmull Rom interpolate array + * @param {Array} p0 + * @param {Array} p1 + * @param {Array} p2 + * @param {Array} p3 + * @param {number} t + * @param {number} t2 + * @param {number} t3 + * @param {Array} out + * @param {number} arrDim + */ +function catmullRomInterpolateArray( + p0, p1, p2, p3, t, t2, t3, out, arrDim +) { + var len = p0.length; + if (arrDim == 1) { + for (var i = 0; i < len; i++) { + out[i] = catmullRomInterpolate( + p0[i], p1[i], p2[i], p3[i], t, t2, t3 + ); + } + } + else { + var len2 = p0[0].length; + for (var i = 0; i < len; i++) { + for (var j = 0; j < len2; j++) { + out[i][j] = catmullRomInterpolate( + p0[i][j], p1[i][j], p2[i][j], p3[i][j], + t, t2, t3 + ); + } + } + } +} + +/** + * Catmull Rom interpolate number + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} p3 + * @param {number} t + * @param {number} t2 + * @param {number} t3 + * @return {number} + */ +function catmullRomInterpolate(p0, p1, p2, p3, t, t2, t3) { + var v0 = (p2 - p0) * 0.5; + var v1 = (p3 - p1) * 0.5; + return (2 * (p1 - p2) + v0 + v1) * t3 + + (-3 * (p1 - p2) - 2 * v0 - v1) * t2 + + v0 * t + p1; +} + +function cloneValue(value) { + if (isArrayLike(value)) { + var len = value.length; + if (isArrayLike(value[0])) { + var ret = []; + for (var i = 0; i < len; i++) { + ret.push(arraySlice.call(value[i])); + } + return ret; + } + + return arraySlice.call(value); + } + + return value; +} + +function rgba2String(rgba) { + rgba[0] = Math.floor(rgba[0]); + rgba[1] = Math.floor(rgba[1]); + rgba[2] = Math.floor(rgba[2]); + + return 'rgba(' + rgba.join(',') + ')'; +} + +function getArrayDim(keyframes) { + var lastValue = keyframes[keyframes.length - 1].value; + return isArrayLike(lastValue && lastValue[0]) ? 2 : 1; +} + +function createTrackClip(animator, easing, oneTrackDone, keyframes, propName, forceAnimate) { + var getter = animator._getter; + var setter = animator._setter; + var useSpline = easing === 'spline'; + + var trackLen = keyframes.length; + if (!trackLen) { + return; + } + // Guess data type + var firstVal = keyframes[0].value; + var isValueArray = isArrayLike(firstVal); + var isValueColor = false; + var isValueString = false; + + // For vertices morphing + var arrDim = isValueArray ? getArrayDim(keyframes) : 0; + + var trackMaxTime; + // Sort keyframe as ascending + keyframes.sort(function(a, b) { + return a.time - b.time; + }); + + trackMaxTime = keyframes[trackLen - 1].time; + // Percents of each keyframe + var kfPercents = []; + // Value of each keyframe + var kfValues = []; + var prevValue = keyframes[0].value; + var isAllValueEqual = true; + for (var i = 0; i < trackLen; i++) { + kfPercents.push(keyframes[i].time / trackMaxTime); + // Assume value is a color when it is a string + var value = keyframes[i].value; + + // Check if value is equal, deep check if value is array + if (!((isValueArray && isArraySame(value, prevValue, arrDim)) + || (!isValueArray && value === prevValue))) { + isAllValueEqual = false; + } + prevValue = value; + + // Try converting a string to a color array + if (typeof value == 'string') { + var colorArray = parse(value); + if (colorArray) { + value = colorArray; + isValueColor = true; + } + else { + isValueString = true; + } + } + kfValues.push(value); + } + if (!forceAnimate && isAllValueEqual) { + return; + } + + var lastValue = kfValues[trackLen - 1]; + // Polyfill array and NaN value + for (var i = 0; i < trackLen - 1; i++) { + if (isValueArray) { + fillArr(kfValues[i], lastValue, arrDim); + } + else { + if (isNaN(kfValues[i]) && !isNaN(lastValue) && !isValueString && !isValueColor) { + kfValues[i] = lastValue; + } + } + } + isValueArray && fillArr(getter(animator._target, propName), lastValue, arrDim); + + // Cache the key of last frame to speed up when + // animation playback is sequency + var lastFrame = 0; + var lastFramePercent = 0; + var start; + var w; + var p0; + var p1; + var p2; + var p3; + + if (isValueColor) { + var rgba = [0, 0, 0, 0]; + } + + var onframe = function (target, percent) { + // Find the range keyframes + // kf1-----kf2---------current--------kf3 + // find kf2 and kf3 and do interpolation + var frame; + // In the easing function like elasticOut, percent may less than 0 + if (percent < 0) { + frame = 0; + } + else if (percent < lastFramePercent) { + // Start from next key + // PENDING start from lastFrame ? + start = Math.min(lastFrame + 1, trackLen - 1); + for (frame = start; frame >= 0; frame--) { + if (kfPercents[frame] <= percent) { + break; + } + } + // PENDING really need to do this ? + frame = Math.min(frame, trackLen - 2); + } + else { + for (frame = lastFrame; frame < trackLen; frame++) { + if (kfPercents[frame] > percent) { + break; + } + } + frame = Math.min(frame - 1, trackLen - 2); + } + lastFrame = frame; + lastFramePercent = percent; + + var range = (kfPercents[frame + 1] - kfPercents[frame]); + if (range === 0) { + return; + } + else { + w = (percent - kfPercents[frame]) / range; + } + if (useSpline) { + p1 = kfValues[frame]; + p0 = kfValues[frame === 0 ? frame : frame - 1]; + p2 = kfValues[frame > trackLen - 2 ? trackLen - 1 : frame + 1]; + p3 = kfValues[frame > trackLen - 3 ? trackLen - 1 : frame + 2]; + if (isValueArray) { + catmullRomInterpolateArray( + p0, p1, p2, p3, w, w * w, w * w * w, + getter(target, propName), + arrDim + ); + } + else { + var value; + if (isValueColor) { + value = catmullRomInterpolateArray( + p0, p1, p2, p3, w, w * w, w * w * w, + rgba, 1 + ); + value = rgba2String(rgba); + } + else if (isValueString) { + // String is step(0.5) + return interpolateString(p1, p2, w); + } + else { + value = catmullRomInterpolate( + p0, p1, p2, p3, w, w * w, w * w * w + ); + } + setter( + target, + propName, + value + ); + } + } + else { + if (isValueArray) { + interpolateArray( + kfValues[frame], kfValues[frame + 1], w, + getter(target, propName), + arrDim + ); + } + else { + var value; + if (isValueColor) { + interpolateArray( + kfValues[frame], kfValues[frame + 1], w, + rgba, 1 + ); + value = rgba2String(rgba); + } + else if (isValueString) { + // String is step(0.5) + return interpolateString(kfValues[frame], kfValues[frame + 1], w); + } + else { + value = interpolateNumber(kfValues[frame], kfValues[frame + 1], w); + } + setter( + target, + propName, + value + ); + } + } + }; + + var clip = new Clip({ + target: animator._target, + life: trackMaxTime, + loop: animator._loop, + delay: animator._delay, + onframe: onframe, + ondestroy: oneTrackDone + }); + + if (easing && easing !== 'spline') { + clip.easing = easing; + } + + return clip; +} + +/** + * @alias module:zrender/animation/Animator + * @constructor + * @param {Object} target + * @param {boolean} loop + * @param {Function} getter + * @param {Function} setter + */ +var Animator = function(target, loop, getter, setter) { + this._tracks = {}; + this._target = target; + + this._loop = loop || false; + + this._getter = getter || defaultGetter; + this._setter = setter || defaultSetter; + + this._clipCount = 0; + + this._delay = 0; + + this._doneList = []; + + this._onframeList = []; + + this._clipList = []; +}; + +Animator.prototype = { + /** + * 设置动画关键帧 + * @param {number} time 关键帧时间,单位是ms + * @param {Object} props 关键帧的属性值,key-value表示 + * @return {module:zrender/animation/Animator} + */ + when: function(time /* ms */, props) { + var tracks = this._tracks; + for (var propName in props) { + if (!props.hasOwnProperty(propName)) { + continue; + } + + if (!tracks[propName]) { + tracks[propName] = []; + // Invalid value + var value = this._getter(this._target, propName); + if (value == null) { + // zrLog('Invalid property ' + propName); + continue; + } + // If time is 0 + // Then props is given initialize value + // Else + // Initialize value from current prop value + if (time !== 0) { + tracks[propName].push({ + time: 0, + value: cloneValue(value) + }); + } + } + tracks[propName].push({ + time: time, + value: props[propName] + }); + } + return this; + }, + /** + * 添加动画每一帧的回调函数 + * @param {Function} callback + * @return {module:zrender/animation/Animator} + */ + during: function (callback) { + this._onframeList.push(callback); + return this; + }, + + pause: function () { + for (var i = 0; i < this._clipList.length; i++) { + this._clipList[i].pause(); + } + this._paused = true; + }, + + resume: function () { + for (var i = 0; i < this._clipList.length; i++) { + this._clipList[i].resume(); + } + this._paused = false; + }, + + isPaused: function () { + return !!this._paused; + }, + + _doneCallback: function () { + // Clear all tracks + this._tracks = {}; + // Clear all clips + this._clipList.length = 0; + + var doneList = this._doneList; + var len = doneList.length; + for (var i = 0; i < len; i++) { + doneList[i].call(this); + } + }, + /** + * 开始执行动画 + * @param {string|Function} [easing] + * 动画缓动函数,详见{@link module:zrender/animation/easing} + * @param {boolean} forceAnimate + * @return {module:zrender/animation/Animator} + */ + start: function (easing, forceAnimate) { + + var self = this; + var clipCount = 0; + + var oneTrackDone = function() { + clipCount--; + if (!clipCount) { + self._doneCallback(); + } + }; + + var lastClip; + for (var propName in this._tracks) { + if (!this._tracks.hasOwnProperty(propName)) { + continue; + } + var clip = createTrackClip( + this, easing, oneTrackDone, + this._tracks[propName], propName, forceAnimate + ); + if (clip) { + this._clipList.push(clip); + clipCount++; + + // If start after added to animation + if (this.animation) { + this.animation.addClip(clip); + } + + lastClip = clip; + } + } + + // Add during callback on the last clip + if (lastClip) { + var oldOnFrame = lastClip.onframe; + lastClip.onframe = function (target, percent) { + oldOnFrame(target, percent); + + for (var i = 0; i < self._onframeList.length; i++) { + self._onframeList[i](target, percent); + } + }; + } + + // This optimization will help the case that in the upper application + // the view may be refreshed frequently, where animation will be + // called repeatly but nothing changed. + if (!clipCount) { + this._doneCallback(); + } + return this; + }, + /** + * 停止动画 + * @param {boolean} forwardToLast If move to last frame before stop + */ + stop: function (forwardToLast) { + var clipList = this._clipList; + var animation = this.animation; + for (var i = 0; i < clipList.length; i++) { + var clip = clipList[i]; + if (forwardToLast) { + // Move to last frame before stop + clip.onframe(this._target, 1); + } + animation && animation.removeClip(clip); + } + clipList.length = 0; + }, + /** + * 设置动画延迟开始的时间 + * @param {number} time 单位ms + * @return {module:zrender/animation/Animator} + */ + delay: function (time) { + this._delay = time; + return this; + }, + /** + * 添加动画结束的回调 + * @param {Function} cb + * @return {module:zrender/animation/Animator} + */ + done: function(cb) { + if (cb) { + this._doneList.push(cb); + } + return this; + }, + + /** + * @return {Array.<module:zrender/animation/Clip>} + */ + getClips: function () { + return this._clipList; + } +}; + +var dpr = 1; + +// If in browser environment +if (typeof window !== 'undefined') { + dpr = Math.max(window.devicePixelRatio || 1, 1); +} + +/** + * config默认配置项 + * @exports zrender/config + * @author Kener (@Kener-林峰, kener.linfeng@gmail.com) + */ + +/** + * debug日志选项:catchBrushException为true下有效 + * 0 : 不生成debug数据,发布用 + * 1 : 异常抛出,调试用 + * 2 : 控制台输出,调试用 + */ +var debugMode = 0; + +// retina 屏幕优化 +var devicePixelRatio = dpr; + +var log = function () { +}; + +if (debugMode === 1) { + log = function () { + for (var k in arguments) { + throw new Error(arguments[k]); + } + }; +} +else if (debugMode > 1) { + log = function () { + for (var k in arguments) { + console.log(arguments[k]); + } + }; +} + +var zrLog = log; + +/** + * @alias modue:zrender/mixin/Animatable + * @constructor + */ +var Animatable = function () { + + /** + * @type {Array.<module:zrender/animation/Animator>} + * @readOnly + */ + this.animators = []; +}; + +Animatable.prototype = { + + constructor: Animatable, + + /** + * 动画 + * + * @param {string} path The path to fetch value from object, like 'a.b.c'. + * @param {boolean} [loop] Whether to loop animation. + * @return {module:zrender/animation/Animator} + * @example: + * el.animate('style', false) + * .when(1000, {x: 10} ) + * .done(function(){ // Animation done }) + * .start() + */ + animate: function (path, loop) { + var target; + var animatingShape = false; + var el = this; + var zr = this.__zr; + if (path) { + var pathSplitted = path.split('.'); + var prop = el; + // If animating shape + animatingShape = pathSplitted[0] === 'shape'; + for (var i = 0, l = pathSplitted.length; i < l; i++) { + if (!prop) { + continue; + } + prop = prop[pathSplitted[i]]; + } + if (prop) { + target = prop; + } + } + else { + target = el; + } + + if (!target) { + zrLog( + 'Property "' + + path + + '" is not existed in element ' + + el.id + ); + return; + } + + var animators = el.animators; + + var animator = new Animator(target, loop); + + animator.during(function (target) { + el.dirty(animatingShape); + }) + .done(function () { + // FIXME Animator will not be removed if use `Animator#stop` to stop animation + animators.splice(indexOf(animators, animator), 1); + }); + + animators.push(animator); + + // If animate after added to the zrender + if (zr) { + zr.animation.addAnimator(animator); + } + + return animator; + }, + + /** + * 停止动画 + * @param {boolean} forwardToLast If move to last frame before stop + */ + stopAnimation: function (forwardToLast) { + var animators = this.animators; + var len = animators.length; + for (var i = 0; i < len; i++) { + animators[i].stop(forwardToLast); + } + animators.length = 0; + + return this; + }, + + /** + * Caution: this method will stop previous animation. + * So do not use this method to one element twice before + * animation starts, unless you know what you are doing. + * @param {Object} target + * @param {number} [time=500] Time in ms + * @param {string} [easing='linear'] + * @param {number} [delay=0] + * @param {Function} [callback] + * @param {Function} [forceAnimate] Prevent stop animation and callback + * immediently when target values are the same as current values. + * + * @example + * // Animate position + * el.animateTo({ + * position: [10, 10] + * }, function () { // done }) + * + * // Animate shape, style and position in 100ms, delayed 100ms, with cubicOut easing + * el.animateTo({ + * shape: { + * width: 500 + * }, + * style: { + * fill: 'red' + * } + * position: [10, 10] + * }, 100, 100, 'cubicOut', function () { // done }) + */ + // TODO Return animation key + animateTo: function (target, time, delay, easing, callback, forceAnimate) { + // animateTo(target, time, easing, callback); + if (isString(delay)) { + callback = easing; + easing = delay; + delay = 0; + } + // animateTo(target, time, delay, callback); + else if (isFunction$1(easing)) { + callback = easing; + easing = 'linear'; + delay = 0; + } + // animateTo(target, time, callback); + else if (isFunction$1(delay)) { + callback = delay; + delay = 0; + } + // animateTo(target, callback) + else if (isFunction$1(time)) { + callback = time; + time = 500; + } + // animateTo(target) + else if (!time) { + time = 500; + } + // Stop all previous animations + this.stopAnimation(); + this._animateToShallow('', this, target, time, delay); + + // Animators may be removed immediately after start + // if there is nothing to animate + var animators = this.animators.slice(); + var count = animators.length; + function done() { + count--; + if (!count) { + callback && callback(); + } + } + + // No animators. This should be checked before animators[i].start(), + // because 'done' may be executed immediately if no need to animate. + if (!count) { + callback && callback(); + } + // Start after all animators created + // Incase any animator is done immediately when all animation properties are not changed + for (var i = 0; i < animators.length; i++) { + animators[i] + .done(done) + .start(easing, forceAnimate); + } + }, + + /** + * @private + * @param {string} path='' + * @param {Object} source=this + * @param {Object} target + * @param {number} [time=500] + * @param {number} [delay=0] + * + * @example + * // Animate position + * el._animateToShallow({ + * position: [10, 10] + * }) + * + * // Animate shape, style and position in 100ms, delayed 100ms + * el._animateToShallow({ + * shape: { + * width: 500 + * }, + * style: { + * fill: 'red' + * } + * position: [10, 10] + * }, 100, 100) + */ + _animateToShallow: function (path, source, target, time, delay) { + var objShallow = {}; + var propertyCount = 0; + for (var name in target) { + if (!target.hasOwnProperty(name)) { + continue; + } + + if (source[name] != null) { + if (isObject$1(target[name]) && !isArrayLike(target[name])) { + this._animateToShallow( + path ? path + '.' + name : name, + source[name], + target[name], + time, + delay + ); + } + else { + objShallow[name] = target[name]; + propertyCount++; + } + } + else if (target[name] != null) { + // Attr directly if not has property + // FIXME, if some property not needed for element ? + if (!path) { + this.attr(name, target[name]); + } + else { // Shape or style + var props = {}; + props[path] = {}; + props[path][name] = target[name]; + this.attr(props); + } + } + } + + if (propertyCount > 0) { + this.animate(path, false) + .when(time == null ? 500 : time, objShallow) + .delay(delay || 0); + } + + return this; + } +}; + +/** + * @alias module:zrender/Element + * @constructor + * @extends {module:zrender/mixin/Animatable} + * @extends {module:zrender/mixin/Transformable} + * @extends {module:zrender/mixin/Eventful} + */ +var Element = function (opts) { // jshint ignore:line + + Transformable.call(this, opts); + Eventful.call(this, opts); + Animatable.call(this, opts); + + /** + * 画布元素ID + * @type {string} + */ + this.id = opts.id || guid(); +}; + +Element.prototype = { + + /** + * 元素类型 + * Element type + * @type {string} + */ + type: 'element', + + /** + * 元素名字 + * Element name + * @type {string} + */ + name: '', + + /** + * ZRender 实例对象,会在 element 添加到 zrender 实例中后自动赋值 + * ZRender instance will be assigned when element is associated with zrender + * @name module:/zrender/Element#__zr + * @type {module:zrender/ZRender} + */ + __zr: null, + + /** + * 图形是否忽略,为true时忽略图形的绘制以及事件触发 + * If ignore drawing and events of the element object + * @name module:/zrender/Element#ignore + * @type {boolean} + * @default false + */ + ignore: false, + + /** + * 用于裁剪的路径(shape),所有 Group 内的路径在绘制时都会被这个路径裁剪 + * 该路径会继承被裁减对象的变换 + * @type {module:zrender/graphic/Path} + * @see http://www.w3.org/TR/2dcontext/#clipping-region + * @readOnly + */ + clipPath: null, + + /** + * 是否是 Group + * @type {boolean} + */ + isGroup: false, + + /** + * Drift element + * @param {number} dx dx on the global space + * @param {number} dy dy on the global space + */ + drift: function (dx, dy) { + switch (this.draggable) { + case 'horizontal': + dy = 0; + break; + case 'vertical': + dx = 0; + break; + } + + var m = this.transform; + if (!m) { + m = this.transform = [1, 0, 0, 1, 0, 0]; + } + m[4] += dx; + m[5] += dy; + + this.decomposeTransform(); + this.dirty(false); + }, + + /** + * Hook before update + */ + beforeUpdate: function () {}, + /** + * Hook after update + */ + afterUpdate: function () {}, + /** + * Update each frame + */ + update: function () { + this.updateTransform(); + }, + + /** + * @param {Function} cb + * @param {} context + */ + traverse: function (cb, context) {}, + + /** + * @protected + */ + attrKV: function (key, value) { + if (key === 'position' || key === 'scale' || key === 'origin') { + // Copy the array + if (value) { + var target = this[key]; + if (!target) { + target = this[key] = []; + } + target[0] = value[0]; + target[1] = value[1]; + } + } + else { + this[key] = value; + } + }, + + /** + * Hide the element + */ + hide: function () { + this.ignore = true; + this.__zr && this.__zr.refresh(); + }, + + /** + * Show the element + */ + show: function () { + this.ignore = false; + this.__zr && this.__zr.refresh(); + }, + + /** + * @param {string|Object} key + * @param {*} value + */ + attr: function (key, value) { + if (typeof key === 'string') { + this.attrKV(key, value); + } + else if (isObject$1(key)) { + for (var name in key) { + if (key.hasOwnProperty(name)) { + this.attrKV(name, key[name]); + } + } + } + + this.dirty(false); + + return this; + }, + + /** + * @param {module:zrender/graphic/Path} clipPath + */ + setClipPath: function (clipPath) { + var zr = this.__zr; + if (zr) { + clipPath.addSelfToZr(zr); + } + + // Remove previous clip path + if (this.clipPath && this.clipPath !== clipPath) { + this.removeClipPath(); + } + + this.clipPath = clipPath; + clipPath.__zr = zr; + clipPath.__clipTarget = this; + + this.dirty(false); + }, + + /** + */ + removeClipPath: function () { + var clipPath = this.clipPath; + if (clipPath) { + if (clipPath.__zr) { + clipPath.removeSelfFromZr(clipPath.__zr); + } + + clipPath.__zr = null; + clipPath.__clipTarget = null; + this.clipPath = null; + + this.dirty(false); + } + }, + + /** + * Add self from zrender instance. + * Not recursively because it will be invoked when element added to storage. + * @param {module:zrender/ZRender} zr + */ + addSelfToZr: function (zr) { + this.__zr = zr; + // 添加动画 + var animators = this.animators; + if (animators) { + for (var i = 0; i < animators.length; i++) { + zr.animation.addAnimator(animators[i]); + } + } + + if (this.clipPath) { + this.clipPath.addSelfToZr(zr); + } + }, + + /** + * Remove self from zrender instance. + * Not recursively because it will be invoked when element added to storage. + * @param {module:zrender/ZRender} zr + */ + removeSelfFromZr: function (zr) { + this.__zr = null; + // 移除动画 + var animators = this.animators; + if (animators) { + for (var i = 0; i < animators.length; i++) { + zr.animation.removeAnimator(animators[i]); + } + } + + if (this.clipPath) { + this.clipPath.removeSelfFromZr(zr); + } + } +}; + +mixin(Element, Animatable); +mixin(Element, Transformable); +mixin(Element, Eventful); + +/** + * @module echarts/core/BoundingRect + */ + +var v2ApplyTransform = applyTransform; +var mathMin = Math.min; +var mathMax = Math.max; + +/** + * @alias module:echarts/core/BoundingRect + */ +function BoundingRect(x, y, width, height) { + + if (width < 0) { + x = x + width; + width = -width; + } + if (height < 0) { + y = y + height; + height = -height; + } + + /** + * @type {number} + */ + this.x = x; + /** + * @type {number} + */ + this.y = y; + /** + * @type {number} + */ + this.width = width; + /** + * @type {number} + */ + this.height = height; +} + +BoundingRect.prototype = { + + constructor: BoundingRect, + + /** + * @param {module:echarts/core/BoundingRect} other + */ + union: function (other) { + var x = mathMin(other.x, this.x); + var y = mathMin(other.y, this.y); + + this.width = mathMax( + other.x + other.width, + this.x + this.width + ) - x; + this.height = mathMax( + other.y + other.height, + this.y + this.height + ) - y; + this.x = x; + this.y = y; + }, + + /** + * @param {Array.<number>} m + * @methods + */ + applyTransform: (function () { + var lt = []; + var rb = []; + var lb = []; + var rt = []; + return function (m) { + // In case usage like this + // el.getBoundingRect().applyTransform(el.transform) + // And element has no transform + if (!m) { + return; + } + lt[0] = lb[0] = this.x; + lt[1] = rt[1] = this.y; + rb[0] = rt[0] = this.x + this.width; + rb[1] = lb[1] = this.y + this.height; + + v2ApplyTransform(lt, lt, m); + v2ApplyTransform(rb, rb, m); + v2ApplyTransform(lb, lb, m); + v2ApplyTransform(rt, rt, m); + + this.x = mathMin(lt[0], rb[0], lb[0], rt[0]); + this.y = mathMin(lt[1], rb[1], lb[1], rt[1]); + var maxX = mathMax(lt[0], rb[0], lb[0], rt[0]); + var maxY = mathMax(lt[1], rb[1], lb[1], rt[1]); + this.width = maxX - this.x; + this.height = maxY - this.y; + }; + })(), + + /** + * Calculate matrix of transforming from self to target rect + * @param {module:zrender/core/BoundingRect} b + * @return {Array.<number>} + */ + calculateTransform: function (b) { + var a = this; + var sx = b.width / a.width; + var sy = b.height / a.height; + + var m = create$1(); + + // 矩阵右乘 + translate(m, m, [-a.x, -a.y]); + scale$1(m, m, [sx, sy]); + translate(m, m, [b.x, b.y]); + + return m; + }, + + /** + * @param {(module:echarts/core/BoundingRect|Object)} b + * @return {boolean} + */ + intersect: function (b) { + if (!b) { + return false; + } + + if (!(b instanceof BoundingRect)) { + // Normalize negative width/height. + b = BoundingRect.create(b); + } + + var a = this; + var ax0 = a.x; + var ax1 = a.x + a.width; + var ay0 = a.y; + var ay1 = a.y + a.height; + + var bx0 = b.x; + var bx1 = b.x + b.width; + var by0 = b.y; + var by1 = b.y + b.height; + + return ! (ax1 < bx0 || bx1 < ax0 || ay1 < by0 || by1 < ay0); + }, + + contain: function (x, y) { + var rect = this; + return x >= rect.x + && x <= (rect.x + rect.width) + && y >= rect.y + && y <= (rect.y + rect.height); + }, + + /** + * @return {module:echarts/core/BoundingRect} + */ + clone: function () { + return new BoundingRect(this.x, this.y, this.width, this.height); + }, + + /** + * Copy from another rect + */ + copy: function (other) { + this.x = other.x; + this.y = other.y; + this.width = other.width; + this.height = other.height; + }, + + plain: function () { + return { + x: this.x, + y: this.y, + width: this.width, + height: this.height + }; + } +}; + +/** + * @param {Object|module:zrender/core/BoundingRect} rect + * @param {number} rect.x + * @param {number} rect.y + * @param {number} rect.width + * @param {number} rect.height + * @return {module:zrender/core/BoundingRect} + */ +BoundingRect.create = function (rect) { + return new BoundingRect(rect.x, rect.y, rect.width, rect.height); +}; + +/** + * Group是一个容器,可以插入子节点,Group的变换也会被应用到子节点上 + * @module zrender/graphic/Group + * @example + * var Group = require('zrender/container/Group'); + * var Circle = require('zrender/graphic/shape/Circle'); + * var g = new Group(); + * g.position[0] = 100; + * g.position[1] = 100; + * g.add(new Circle({ + * style: { + * x: 100, + * y: 100, + * r: 20, + * } + * })); + * zr.add(g); + */ + +/** + * @alias module:zrender/graphic/Group + * @constructor + * @extends module:zrender/mixin/Transformable + * @extends module:zrender/mixin/Eventful + */ +var Group = function (opts) { + + opts = opts || {}; + + Element.call(this, opts); + + for (var key in opts) { + if (opts.hasOwnProperty(key)) { + this[key] = opts[key]; + } + } + + this._children = []; + + this.__storage = null; + + this.__dirty = true; +}; + +Group.prototype = { + + constructor: Group, + + isGroup: true, + + /** + * @type {string} + */ + type: 'group', + + /** + * 所有子孙元素是否响应鼠标事件 + * @name module:/zrender/container/Group#silent + * @type {boolean} + * @default false + */ + silent: false, + + /** + * @return {Array.<module:zrender/Element>} + */ + children: function () { + return this._children.slice(); + }, + + /** + * 获取指定 index 的儿子节点 + * @param {number} idx + * @return {module:zrender/Element} + */ + childAt: function (idx) { + return this._children[idx]; + }, + + /** + * 获取指定名字的儿子节点 + * @param {string} name + * @return {module:zrender/Element} + */ + childOfName: function (name) { + var children = this._children; + for (var i = 0; i < children.length; i++) { + if (children[i].name === name) { + return children[i]; + } + } + }, + + /** + * @return {number} + */ + childCount: function () { + return this._children.length; + }, + + /** + * 添加子节点到最后 + * @param {module:zrender/Element} child + */ + add: function (child) { + if (child && child !== this && child.parent !== this) { + + this._children.push(child); + + this._doAdd(child); + } + + return this; + }, + + /** + * 添加子节点在 nextSibling 之前 + * @param {module:zrender/Element} child + * @param {module:zrender/Element} nextSibling + */ + addBefore: function (child, nextSibling) { + if (child && child !== this && child.parent !== this + && nextSibling && nextSibling.parent === this) { + + var children = this._children; + var idx = children.indexOf(nextSibling); + + if (idx >= 0) { + children.splice(idx, 0, child); + this._doAdd(child); + } + } + + return this; + }, + + _doAdd: function (child) { + if (child.parent) { + child.parent.remove(child); + } + + child.parent = this; + + var storage = this.__storage; + var zr = this.__zr; + if (storage && storage !== child.__storage) { + + storage.addToStorage(child); + + if (child instanceof Group) { + child.addChildrenToStorage(storage); + } + } + + zr && zr.refresh(); + }, + + /** + * 移除子节点 + * @param {module:zrender/Element} child + */ + remove: function (child) { + var zr = this.__zr; + var storage = this.__storage; + var children = this._children; + + var idx = indexOf(children, child); + if (idx < 0) { + return this; + } + children.splice(idx, 1); + + child.parent = null; + + if (storage) { + + storage.delFromStorage(child); + + if (child instanceof Group) { + child.delChildrenFromStorage(storage); + } + } + + zr && zr.refresh(); + + return this; + }, + + /** + * 移除所有子节点 + */ + removeAll: function () { + var children = this._children; + var storage = this.__storage; + var child; + var i; + for (i = 0; i < children.length; i++) { + child = children[i]; + if (storage) { + storage.delFromStorage(child); + if (child instanceof Group) { + child.delChildrenFromStorage(storage); + } + } + child.parent = null; + } + children.length = 0; + + return this; + }, + + /** + * 遍历所有子节点 + * @param {Function} cb + * @param {} context + */ + eachChild: function (cb, context) { + var children = this._children; + for (var i = 0; i < children.length; i++) { + var child = children[i]; + cb.call(context, child, i); + } + return this; + }, + + /** + * 深度优先遍历所有子孙节点 + * @param {Function} cb + * @param {} context + */ + traverse: function (cb, context) { + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + cb.call(context, child); + + if (child.type === 'group') { + child.traverse(cb, context); + } + } + return this; + }, + + addChildrenToStorage: function (storage) { + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + storage.addToStorage(child); + if (child instanceof Group) { + child.addChildrenToStorage(storage); + } + } + }, + + delChildrenFromStorage: function (storage) { + for (var i = 0; i < this._children.length; i++) { + var child = this._children[i]; + storage.delFromStorage(child); + if (child instanceof Group) { + child.delChildrenFromStorage(storage); + } + } + }, + + dirty: function () { + this.__dirty = true; + this.__zr && this.__zr.refresh(); + return this; + }, + + /** + * @return {module:zrender/core/BoundingRect} + */ + getBoundingRect: function (includeChildren) { + // TODO Caching + var rect = null; + var tmpRect = new BoundingRect(0, 0, 0, 0); + var children = includeChildren || this._children; + var tmpMat = []; + + for (var i = 0; i < children.length; i++) { + var child = children[i]; + if (child.ignore || child.invisible) { + continue; + } + + var childRect = child.getBoundingRect(); + var transform = child.getLocalTransform(tmpMat); + // TODO + // The boundingRect cacluated by transforming original + // rect may be bigger than the actual bundingRect when rotation + // is used. (Consider a circle rotated aginst its center, where + // the actual boundingRect should be the same as that not be + // rotated.) But we can not find better approach to calculate + // actual boundingRect yet, considering performance. + if (transform) { + tmpRect.copy(childRect); + tmpRect.applyTransform(transform); + rect = rect || tmpRect.clone(); + rect.union(tmpRect); + } + else { + rect = rect || childRect.clone(); + rect.union(childRect); + } + } + return rect || tmpRect; + } +}; + +inherits(Group, Element); + +// https://github.com/mziccard/node-timsort +var DEFAULT_MIN_MERGE = 32; + +var DEFAULT_MIN_GALLOPING = 7; + +function minRunLength(n) { + var r = 0; + + while (n >= DEFAULT_MIN_MERGE) { + r |= n & 1; + n >>= 1; + } + + return n + r; +} + +function makeAscendingRun(array, lo, hi, compare) { + var runHi = lo + 1; + + if (runHi === hi) { + return 1; + } + + if (compare(array[runHi++], array[lo]) < 0) { + while (runHi < hi && compare(array[runHi], array[runHi - 1]) < 0) { + runHi++; + } + + reverseRun(array, lo, runHi); + } + else { + while (runHi < hi && compare(array[runHi], array[runHi - 1]) >= 0) { + runHi++; + } + } + + return runHi - lo; +} + +function reverseRun(array, lo, hi) { + hi--; + + while (lo < hi) { + var t = array[lo]; + array[lo++] = array[hi]; + array[hi--] = t; + } +} + +function binaryInsertionSort(array, lo, hi, start, compare) { + if (start === lo) { + start++; + } + + for (; start < hi; start++) { + var pivot = array[start]; + + var left = lo; + var right = start; + var mid; + + while (left < right) { + mid = left + right >>> 1; + + if (compare(pivot, array[mid]) < 0) { + right = mid; + } + else { + left = mid + 1; + } + } + + var n = start - left; + + switch (n) { + case 3: + array[left + 3] = array[left + 2]; + + case 2: + array[left + 2] = array[left + 1]; + + case 1: + array[left + 1] = array[left]; + break; + default: + while (n > 0) { + array[left + n] = array[left + n - 1]; + n--; + } + } + + array[left] = pivot; + } +} + +function gallopLeft(value, array, start, length, hint, compare) { + var lastOffset = 0; + var maxOffset = 0; + var offset = 1; + + if (compare(value, array[start + hint]) > 0) { + maxOffset = length - hint; + + while (offset < maxOffset && compare(value, array[start + hint + offset]) > 0) { + lastOffset = offset; + offset = (offset << 1) + 1; + + if (offset <= 0) { + offset = maxOffset; + } + } + + if (offset > maxOffset) { + offset = maxOffset; + } + + lastOffset += hint; + offset += hint; + } + else { + maxOffset = hint + 1; + while (offset < maxOffset && compare(value, array[start + hint - offset]) <= 0) { + lastOffset = offset; + offset = (offset << 1) + 1; + + if (offset <= 0) { + offset = maxOffset; + } + } + if (offset > maxOffset) { + offset = maxOffset; + } + + var tmp = lastOffset; + lastOffset = hint - offset; + offset = hint - tmp; + } + + lastOffset++; + while (lastOffset < offset) { + var m = lastOffset + (offset - lastOffset >>> 1); + + if (compare(value, array[start + m]) > 0) { + lastOffset = m + 1; + } + else { + offset = m; + } + } + return offset; +} + +function gallopRight(value, array, start, length, hint, compare) { + var lastOffset = 0; + var maxOffset = 0; + var offset = 1; + + if (compare(value, array[start + hint]) < 0) { + maxOffset = hint + 1; + + while (offset < maxOffset && compare(value, array[start + hint - offset]) < 0) { + lastOffset = offset; + offset = (offset << 1) + 1; + + if (offset <= 0) { + offset = maxOffset; + } + } + + if (offset > maxOffset) { + offset = maxOffset; + } + + var tmp = lastOffset; + lastOffset = hint - offset; + offset = hint - tmp; + } + else { + maxOffset = length - hint; + + while (offset < maxOffset && compare(value, array[start + hint + offset]) >= 0) { + lastOffset = offset; + offset = (offset << 1) + 1; + + if (offset <= 0) { + offset = maxOffset; + } + } + + if (offset > maxOffset) { + offset = maxOffset; + } + + lastOffset += hint; + offset += hint; + } + + lastOffset++; + + while (lastOffset < offset) { + var m = lastOffset + (offset - lastOffset >>> 1); + + if (compare(value, array[start + m]) < 0) { + offset = m; + } + else { + lastOffset = m + 1; + } + } + + return offset; +} + +function TimSort(array, compare) { + var minGallop = DEFAULT_MIN_GALLOPING; + var runStart; + var runLength; + var stackSize = 0; + + var tmp = []; + + runStart = []; + runLength = []; + + function pushRun(_runStart, _runLength) { + runStart[stackSize] = _runStart; + runLength[stackSize] = _runLength; + stackSize += 1; + } + + function mergeRuns() { + while (stackSize > 1) { + var n = stackSize - 2; + + if (n >= 1 && runLength[n - 1] <= runLength[n] + runLength[n + 1] || n >= 2 && runLength[n - 2] <= runLength[n] + runLength[n - 1]) { + if (runLength[n - 1] < runLength[n + 1]) { + n--; + } + } + else if (runLength[n] > runLength[n + 1]) { + break; + } + mergeAt(n); + } + } + + function forceMergeRuns() { + while (stackSize > 1) { + var n = stackSize - 2; + + if (n > 0 && runLength[n - 1] < runLength[n + 1]) { + n--; + } + + mergeAt(n); + } + } + + function mergeAt(i) { + var start1 = runStart[i]; + var length1 = runLength[i]; + var start2 = runStart[i + 1]; + var length2 = runLength[i + 1]; + + runLength[i] = length1 + length2; + + if (i === stackSize - 3) { + runStart[i + 1] = runStart[i + 2]; + runLength[i + 1] = runLength[i + 2]; + } + + stackSize--; + + var k = gallopRight(array[start2], array, start1, length1, 0, compare); + start1 += k; + length1 -= k; + + if (length1 === 0) { + return; + } + + length2 = gallopLeft(array[start1 + length1 - 1], array, start2, length2, length2 - 1, compare); + + if (length2 === 0) { + return; + } + + if (length1 <= length2) { + mergeLow(start1, length1, start2, length2); + } + else { + mergeHigh(start1, length1, start2, length2); + } + } + + function mergeLow(start1, length1, start2, length2) { + var i = 0; + + for (i = 0; i < length1; i++) { + tmp[i] = array[start1 + i]; + } + + var cursor1 = 0; + var cursor2 = start2; + var dest = start1; + + array[dest++] = array[cursor2++]; + + if (--length2 === 0) { + for (i = 0; i < length1; i++) { + array[dest + i] = tmp[cursor1 + i]; + } + return; + } + + if (length1 === 1) { + for (i = 0; i < length2; i++) { + array[dest + i] = array[cursor2 + i]; + } + array[dest + length2] = tmp[cursor1]; + return; + } + + var _minGallop = minGallop; + var count1, count2, exit; + + while (1) { + count1 = 0; + count2 = 0; + exit = false; + + do { + if (compare(array[cursor2], tmp[cursor1]) < 0) { + array[dest++] = array[cursor2++]; + count2++; + count1 = 0; + + if (--length2 === 0) { + exit = true; + break; + } + } + else { + array[dest++] = tmp[cursor1++]; + count1++; + count2 = 0; + if (--length1 === 1) { + exit = true; + break; + } + } + } while ((count1 | count2) < _minGallop); + + if (exit) { + break; + } + + do { + count1 = gallopRight(array[cursor2], tmp, cursor1, length1, 0, compare); + + if (count1 !== 0) { + for (i = 0; i < count1; i++) { + array[dest + i] = tmp[cursor1 + i]; + } + + dest += count1; + cursor1 += count1; + length1 -= count1; + if (length1 <= 1) { + exit = true; + break; + } + } + + array[dest++] = array[cursor2++]; + + if (--length2 === 0) { + exit = true; + break; + } + + count2 = gallopLeft(tmp[cursor1], array, cursor2, length2, 0, compare); + + if (count2 !== 0) { + for (i = 0; i < count2; i++) { + array[dest + i] = array[cursor2 + i]; + } + + dest += count2; + cursor2 += count2; + length2 -= count2; + + if (length2 === 0) { + exit = true; + break; + } + } + array[dest++] = tmp[cursor1++]; + + if (--length1 === 1) { + exit = true; + break; + } + + _minGallop--; + } while (count1 >= DEFAULT_MIN_GALLOPING || count2 >= DEFAULT_MIN_GALLOPING); + + if (exit) { + break; + } + + if (_minGallop < 0) { + _minGallop = 0; + } + + _minGallop += 2; + } + + minGallop = _minGallop; + + minGallop < 1 && (minGallop = 1); + + if (length1 === 1) { + for (i = 0; i < length2; i++) { + array[dest + i] = array[cursor2 + i]; + } + array[dest + length2] = tmp[cursor1]; + } + else if (length1 === 0) { + throw new Error(); + // throw new Error('mergeLow preconditions were not respected'); + } + else { + for (i = 0; i < length1; i++) { + array[dest + i] = tmp[cursor1 + i]; + } + } + } + + function mergeHigh (start1, length1, start2, length2) { + var i = 0; + + for (i = 0; i < length2; i++) { + tmp[i] = array[start2 + i]; + } + + var cursor1 = start1 + length1 - 1; + var cursor2 = length2 - 1; + var dest = start2 + length2 - 1; + var customCursor = 0; + var customDest = 0; + + array[dest--] = array[cursor1--]; + + if (--length1 === 0) { + customCursor = dest - (length2 - 1); + + for (i = 0; i < length2; i++) { + array[customCursor + i] = tmp[i]; + } + + return; + } + + if (length2 === 1) { + dest -= length1; + cursor1 -= length1; + customDest = dest + 1; + customCursor = cursor1 + 1; + + for (i = length1 - 1; i >= 0; i--) { + array[customDest + i] = array[customCursor + i]; + } + + array[dest] = tmp[cursor2]; + return; + } + + var _minGallop = minGallop; + + while (true) { + var count1 = 0; + var count2 = 0; + var exit = false; + + do { + if (compare(tmp[cursor2], array[cursor1]) < 0) { + array[dest--] = array[cursor1--]; + count1++; + count2 = 0; + if (--length1 === 0) { + exit = true; + break; + } + } + else { + array[dest--] = tmp[cursor2--]; + count2++; + count1 = 0; + if (--length2 === 1) { + exit = true; + break; + } + } + } while ((count1 | count2) < _minGallop); + + if (exit) { + break; + } + + do { + count1 = length1 - gallopRight(tmp[cursor2], array, start1, length1, length1 - 1, compare); + + if (count1 !== 0) { + dest -= count1; + cursor1 -= count1; + length1 -= count1; + customDest = dest + 1; + customCursor = cursor1 + 1; + + for (i = count1 - 1; i >= 0; i--) { + array[customDest + i] = array[customCursor + i]; + } + + if (length1 === 0) { + exit = true; + break; + } + } + + array[dest--] = tmp[cursor2--]; + + if (--length2 === 1) { + exit = true; + break; + } + + count2 = length2 - gallopLeft(array[cursor1], tmp, 0, length2, length2 - 1, compare); + + if (count2 !== 0) { + dest -= count2; + cursor2 -= count2; + length2 -= count2; + customDest = dest + 1; + customCursor = cursor2 + 1; + + for (i = 0; i < count2; i++) { + array[customDest + i] = tmp[customCursor + i]; + } + + if (length2 <= 1) { + exit = true; + break; + } + } + + array[dest--] = array[cursor1--]; + + if (--length1 === 0) { + exit = true; + break; + } + + _minGallop--; + } while (count1 >= DEFAULT_MIN_GALLOPING || count2 >= DEFAULT_MIN_GALLOPING); + + if (exit) { + break; + } + + if (_minGallop < 0) { + _minGallop = 0; + } + + _minGallop += 2; + } + + minGallop = _minGallop; + + if (minGallop < 1) { + minGallop = 1; + } + + if (length2 === 1) { + dest -= length1; + cursor1 -= length1; + customDest = dest + 1; + customCursor = cursor1 + 1; + + for (i = length1 - 1; i >= 0; i--) { + array[customDest + i] = array[customCursor + i]; + } + + array[dest] = tmp[cursor2]; + } + else if (length2 === 0) { + throw new Error(); + // throw new Error('mergeHigh preconditions were not respected'); + } + else { + customCursor = dest - (length2 - 1); + for (i = 0; i < length2; i++) { + array[customCursor + i] = tmp[i]; + } + } + } + + this.mergeRuns = mergeRuns; + this.forceMergeRuns = forceMergeRuns; + this.pushRun = pushRun; +} + +function sort(array, compare, lo, hi) { + if (!lo) { + lo = 0; + } + if (!hi) { + hi = array.length; + } + + var remaining = hi - lo; + + if (remaining < 2) { + return; + } + + var runLength = 0; + + if (remaining < DEFAULT_MIN_MERGE) { + runLength = makeAscendingRun(array, lo, hi, compare); + binaryInsertionSort(array, lo, hi, lo + runLength, compare); + return; + } + + var ts = new TimSort(array, compare); + + var minRun = minRunLength(remaining); + + do { + runLength = makeAscendingRun(array, lo, hi, compare); + if (runLength < minRun) { + var force = remaining; + if (force > minRun) { + force = minRun; + } + + binaryInsertionSort(array, lo, lo + force, lo + runLength, compare); + runLength = force; + } + + ts.pushRun(lo, runLength); + ts.mergeRuns(); + + remaining -= runLength; + lo += runLength; + } while (remaining !== 0); + + ts.forceMergeRuns(); +} + +// Use timsort because in most case elements are partially sorted +// https://jsfiddle.net/pissang/jr4x7mdm/8/ +function shapeCompareFunc(a, b) { + if (a.zlevel === b.zlevel) { + if (a.z === b.z) { + // if (a.z2 === b.z2) { + // // FIXME Slow has renderidx compare + // // http://stackoverflow.com/questions/20883421/sorting-in-javascript-should-every-compare-function-have-a-return-0-statement + // // https://github.com/v8/v8/blob/47cce544a31ed5577ffe2963f67acb4144ee0232/src/js/array.js#L1012 + // return a.__renderidx - b.__renderidx; + // } + return a.z2 - b.z2; + } + return a.z - b.z; + } + return a.zlevel - b.zlevel; +} +/** + * 内容仓库 (M) + * @alias module:zrender/Storage + * @constructor + */ +var Storage = function () { // jshint ignore:line + this._roots = []; + + this._displayList = []; + + this._displayListLen = 0; +}; + +Storage.prototype = { + + constructor: Storage, + + /** + * @param {Function} cb + * + */ + traverse: function (cb, context) { + for (var i = 0; i < this._roots.length; i++) { + this._roots[i].traverse(cb, context); + } + }, + + /** + * 返回所有图形的绘制队列 + * @param {boolean} [update=false] 是否在返回前更新该数组 + * @param {boolean} [includeIgnore=false] 是否包含 ignore 的数组, 在 update 为 true 的时候有效 + * + * 详见{@link module:zrender/graphic/Displayable.prototype.updateDisplayList} + * @return {Array.<module:zrender/graphic/Displayable>} + */ + getDisplayList: function (update, includeIgnore) { + includeIgnore = includeIgnore || false; + if (update) { + this.updateDisplayList(includeIgnore); + } + return this._displayList; + }, + + /** + * 更新图形的绘制队列。 + * 每次绘制前都会调用,该方法会先深度优先遍历整个树,更新所有Group和Shape的变换并且把所有可见的Shape保存到数组中, + * 最后根据绘制的优先级(zlevel > z > 插入顺序)排序得到绘制队列 + * @param {boolean} [includeIgnore=false] 是否包含 ignore 的数组 + */ + updateDisplayList: function (includeIgnore) { + this._displayListLen = 0; + + var roots = this._roots; + var displayList = this._displayList; + for (var i = 0, len = roots.length; i < len; i++) { + this._updateAndAddDisplayable(roots[i], null, includeIgnore); + } + + displayList.length = this._displayListLen; + + env$1.canvasSupported && sort(displayList, shapeCompareFunc); + }, + + _updateAndAddDisplayable: function (el, clipPaths, includeIgnore) { + + if (el.ignore && !includeIgnore) { + return; + } + + el.beforeUpdate(); + + if (el.__dirty) { + + el.update(); + + } + + el.afterUpdate(); + + var userSetClipPath = el.clipPath; + if (userSetClipPath) { + + // FIXME 效率影响 + if (clipPaths) { + clipPaths = clipPaths.slice(); + } + else { + clipPaths = []; + } + + var currentClipPath = userSetClipPath; + var parentClipPath = el; + // Recursively add clip path + while (currentClipPath) { + // clipPath 的变换是基于使用这个 clipPath 的元素 + currentClipPath.parent = parentClipPath; + currentClipPath.updateTransform(); + + clipPaths.push(currentClipPath); + + parentClipPath = currentClipPath; + currentClipPath = currentClipPath.clipPath; + } + } + + if (el.isGroup) { + var children = el._children; + + for (var i = 0; i < children.length; i++) { + var child = children[i]; + + // Force to mark as dirty if group is dirty + // FIXME __dirtyPath ? + if (el.__dirty) { + child.__dirty = true; + } + + this._updateAndAddDisplayable(child, clipPaths, includeIgnore); + } + + // Mark group clean here + el.__dirty = false; + + } + else { + el.__clipPaths = clipPaths; + + this._displayList[this._displayListLen++] = el; + } + }, + + /** + * 添加图形(Shape)或者组(Group)到根节点 + * @param {module:zrender/Element} el + */ + addRoot: function (el) { + if (el.__storage === this) { + return; + } + + if (el instanceof Group) { + el.addChildrenToStorage(this); + } + + this.addToStorage(el); + this._roots.push(el); + }, + + /** + * 删除指定的图形(Shape)或者组(Group) + * @param {string|Array.<string>} [el] 如果为空清空整个Storage + */ + delRoot: function (el) { + if (el == null) { + // 不指定el清空 + for (var i = 0; i < this._roots.length; i++) { + var root = this._roots[i]; + if (root instanceof Group) { + root.delChildrenFromStorage(this); + } + } + + this._roots = []; + this._displayList = []; + this._displayListLen = 0; + + return; + } + + if (el instanceof Array) { + for (var i = 0, l = el.length; i < l; i++) { + this.delRoot(el[i]); + } + return; + } + + + var idx = indexOf(this._roots, el); + if (idx >= 0) { + this.delFromStorage(el); + this._roots.splice(idx, 1); + if (el instanceof Group) { + el.delChildrenFromStorage(this); + } + } + }, + + addToStorage: function (el) { + if (el) { + el.__storage = this; + el.dirty(false); + } + return this; + }, + + delFromStorage: function (el) { + if (el) { + el.__storage = null; + } + + return this; + }, + + /** + * 清空并且释放Storage + */ + dispose: function () { + this._renderList = + this._roots = null; + }, + + displayableSortFunc: shapeCompareFunc +}; + +var SHADOW_PROPS = { + 'shadowBlur': 1, + 'shadowOffsetX': 1, + 'shadowOffsetY': 1, + 'textShadowBlur': 1, + 'textShadowOffsetX': 1, + 'textShadowOffsetY': 1, + 'textBoxShadowBlur': 1, + 'textBoxShadowOffsetX': 1, + 'textBoxShadowOffsetY': 1 +}; + +var fixShadow = function (ctx, propName, value) { + if (SHADOW_PROPS.hasOwnProperty(propName)) { + return value *= ctx.dpr; + } + return value; +}; + +var STYLE_COMMON_PROPS = [ + ['shadowBlur', 0], ['shadowOffsetX', 0], ['shadowOffsetY', 0], ['shadowColor', '#000'], + ['lineCap', 'butt'], ['lineJoin', 'miter'], ['miterLimit', 10] +]; + +// var SHADOW_PROPS = STYLE_COMMON_PROPS.slice(0, 4); +// var LINE_PROPS = STYLE_COMMON_PROPS.slice(4); + +var Style = function (opts, host) { + this.extendFrom(opts, false); + this.host = host; +}; + +function createLinearGradient(ctx, obj, rect) { + var x = obj.x == null ? 0 : obj.x; + var x2 = obj.x2 == null ? 1 : obj.x2; + var y = obj.y == null ? 0 : obj.y; + var y2 = obj.y2 == null ? 0 : obj.y2; + + if (!obj.global) { + x = x * rect.width + rect.x; + x2 = x2 * rect.width + rect.x; + y = y * rect.height + rect.y; + y2 = y2 * rect.height + rect.y; + } + + // Fix NaN when rect is Infinity + x = isNaN(x) ? 0 : x; + x2 = isNaN(x2) ? 1 : x2; + y = isNaN(y) ? 0 : y; + y2 = isNaN(y2) ? 0 : y2; + + var canvasGradient = ctx.createLinearGradient(x, y, x2, y2); + + return canvasGradient; +} + +function createRadialGradient(ctx, obj, rect) { + var width = rect.width; + var height = rect.height; + var min = Math.min(width, height); + + var x = obj.x == null ? 0.5 : obj.x; + var y = obj.y == null ? 0.5 : obj.y; + var r = obj.r == null ? 0.5 : obj.r; + if (!obj.global) { + x = x * width + rect.x; + y = y * height + rect.y; + r = r * min; + } + + var canvasGradient = ctx.createRadialGradient(x, y, 0, x, y, r); + + return canvasGradient; +} + + +Style.prototype = { + + constructor: Style, + + /** + * @type {module:zrender/graphic/Displayable} + */ + host: null, + + /** + * @type {string} + */ + fill: '#000', + + /** + * @type {string} + */ + stroke: null, + + /** + * @type {number} + */ + opacity: 1, + + /** + * @type {Array.<number>} + */ + lineDash: null, + + /** + * @type {number} + */ + lineDashOffset: 0, + + /** + * @type {number} + */ + shadowBlur: 0, + + /** + * @type {number} + */ + shadowOffsetX: 0, + + /** + * @type {number} + */ + shadowOffsetY: 0, + + /** + * @type {number} + */ + lineWidth: 1, + + /** + * If stroke ignore scale + * @type {Boolean} + */ + strokeNoScale: false, + + // Bounding rect text configuration + // Not affected by element transform + /** + * @type {string} + */ + text: null, + + /** + * If `fontSize` or `fontFamily` exists, `font` will be reset by + * `fontSize`, `fontStyle`, `fontWeight`, `fontFamily`. + * So do not visit it directly in upper application (like echarts), + * but use `contain/text#makeFont` instead. + * @type {string} + */ + font: null, + + /** + * The same as font. Use font please. + * @deprecated + * @type {string} + */ + textFont: null, + + /** + * It helps merging respectively, rather than parsing an entire font string. + * @type {string} + */ + fontStyle: null, + + /** + * It helps merging respectively, rather than parsing an entire font string. + * @type {string} + */ + fontWeight: null, + + /** + * It helps merging respectively, rather than parsing an entire font string. + * Should be 12 but not '12px'. + * @type {number} + */ + fontSize: null, + + /** + * It helps merging respectively, rather than parsing an entire font string. + * @type {string} + */ + fontFamily: null, + + /** + * Reserved for special functinality, like 'hr'. + * @type {string} + */ + textTag: null, + + /** + * @type {string} + */ + textFill: '#000', + + /** + * @type {string} + */ + textStroke: null, + + /** + * @type {number} + */ + textWidth: null, + + /** + * Only for textBackground. + * @type {number} + */ + textHeight: null, + + /** + * textStroke may be set as some color as a default + * value in upper applicaion, where the default value + * of textStrokeWidth should be 0 to make sure that + * user can choose to do not use text stroke. + * @type {number} + */ + textStrokeWidth: 0, + + /** + * @type {number} + */ + textLineHeight: null, + + /** + * 'inside', 'left', 'right', 'top', 'bottom' + * [x, y] + * Based on x, y of rect. + * @type {string|Array.<number>} + * @default 'inside' + */ + textPosition: 'inside', + + /** + * If not specified, use the boundingRect of a `displayable`. + * @type {Object} + */ + textRect: null, + + /** + * [x, y] + * @type {Array.<number>} + */ + textOffset: null, + + /** + * @type {string} + */ + textAlign: null, + + /** + * @type {string} + */ + textVerticalAlign: null, + + /** + * @type {number} + */ + textDistance: 5, + + /** + * @type {string} + */ + textShadowColor: 'transparent', + + /** + * @type {number} + */ + textShadowBlur: 0, + + /** + * @type {number} + */ + textShadowOffsetX: 0, + + /** + * @type {number} + */ + textShadowOffsetY: 0, + + /** + * @type {string} + */ + textBoxShadowColor: 'transparent', + + /** + * @type {number} + */ + textBoxShadowBlur: 0, + + /** + * @type {number} + */ + textBoxShadowOffsetX: 0, + + /** + * @type {number} + */ + textBoxShadowOffsetY: 0, + + /** + * Whether transform text. + * Only useful in Path and Image element + * @type {boolean} + */ + transformText: false, + + /** + * Text rotate around position of Path or Image + * Only useful in Path and Image element and transformText is false. + */ + textRotation: 0, + + /** + * Text origin of text rotation, like [10, 40]. + * Based on x, y of rect. + * Useful in label rotation of circular symbol. + * By default, this origin is textPosition. + * Can be 'center'. + * @type {string|Array.<number>} + */ + textOrigin: null, + + /** + * @type {string} + */ + textBackgroundColor: null, + + /** + * @type {string} + */ + textBorderColor: null, + + /** + * @type {number} + */ + textBorderWidth: 0, + + /** + * @type {number} + */ + textBorderRadius: 0, + + /** + * Can be `2` or `[2, 4]` or `[2, 3, 4, 5]` + * @type {number|Array.<number>} + */ + textPadding: null, + + /** + * Text styles for rich text. + * @type {Object} + */ + rich: null, + + /** + * {outerWidth, outerHeight, ellipsis, placeholder} + * @type {Object} + */ + truncate: null, + + /** + * https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation + * @type {string} + */ + blend: null, + + /** + * @param {CanvasRenderingContext2D} ctx + */ + bind: function (ctx, el, prevEl) { + var style = this; + var prevStyle = prevEl && prevEl.style; + var firstDraw = !prevStyle; + + for (var i = 0; i < STYLE_COMMON_PROPS.length; i++) { + var prop = STYLE_COMMON_PROPS[i]; + var styleName = prop[0]; + + if (firstDraw || style[styleName] !== prevStyle[styleName]) { + // FIXME Invalid property value will cause style leak from previous element. + ctx[styleName] = + fixShadow(ctx, styleName, style[styleName] || prop[1]); + } + } + + if ((firstDraw || style.fill !== prevStyle.fill)) { + ctx.fillStyle = style.fill; + } + if ((firstDraw || style.stroke !== prevStyle.stroke)) { + ctx.strokeStyle = style.stroke; + } + if ((firstDraw || style.opacity !== prevStyle.opacity)) { + ctx.globalAlpha = style.opacity == null ? 1 : style.opacity; + } + + if ((firstDraw || style.blend !== prevStyle.blend)) { + ctx.globalCompositeOperation = style.blend || 'source-over'; + } + if (this.hasStroke()) { + var lineWidth = style.lineWidth; + ctx.lineWidth = lineWidth / ( + (this.strokeNoScale && el && el.getLineScale) ? el.getLineScale() : 1 + ); + } + }, + + hasFill: function () { + var fill = this.fill; + return fill != null && fill !== 'none'; + }, + + hasStroke: function () { + var stroke = this.stroke; + return stroke != null && stroke !== 'none' && this.lineWidth > 0; + }, + + /** + * Extend from other style + * @param {zrender/graphic/Style} otherStyle + * @param {boolean} overwrite true: overwrirte any way. + * false: overwrite only when !target.hasOwnProperty + * others: overwrite when property is not null/undefined. + */ + extendFrom: function (otherStyle, overwrite) { + if (otherStyle) { + for (var name in otherStyle) { + if (otherStyle.hasOwnProperty(name) + && (overwrite === true + || ( + overwrite === false + ? !this.hasOwnProperty(name) + : otherStyle[name] != null + ) + ) + ) { + this[name] = otherStyle[name]; + } + } + } + }, + + /** + * Batch setting style with a given object + * @param {Object|string} obj + * @param {*} [obj] + */ + set: function (obj, value) { + if (typeof obj === 'string') { + this[obj] = value; + } + else { + this.extendFrom(obj, true); + } + }, + + /** + * Clone + * @return {zrender/graphic/Style} [description] + */ + clone: function () { + var newStyle = new this.constructor(); + newStyle.extendFrom(this, true); + return newStyle; + }, + + getGradient: function (ctx, obj, rect) { + var method = obj.type === 'radial' ? createRadialGradient : createLinearGradient; + var canvasGradient = method(ctx, obj, rect); + var colorStops = obj.colorStops; + for (var i = 0; i < colorStops.length; i++) { + canvasGradient.addColorStop( + colorStops[i].offset, colorStops[i].color + ); + } + return canvasGradient; + } + +}; + +var styleProto = Style.prototype; +for (var i = 0; i < STYLE_COMMON_PROPS.length; i++) { + var prop = STYLE_COMMON_PROPS[i]; + if (!(prop[0] in styleProto)) { + styleProto[prop[0]] = prop[1]; + } +} + +// Provide for others +Style.getGradient = styleProto.getGradient; + +var Pattern = function (image, repeat) { + // Should do nothing more in this constructor. Because gradient can be + // declard by `color: {image: ...}`, where this constructor will not be called. + + this.image = image; + this.repeat = repeat; + + // Can be cloned + this.type = 'pattern'; +}; + +Pattern.prototype.getCanvasPattern = function (ctx) { + return ctx.createPattern(this.image, this.repeat || 'repeat'); +}; + +/** + * @module zrender/Layer + * @author pissang(https://www.github.com/pissang) + */ + +function returnFalse() { + return false; +} + +/** + * 创建dom + * + * @inner + * @param {string} id dom id 待用 + * @param {Painter} painter painter instance + * @param {number} number + */ +function createDom(id, painter, dpr) { + var newDom = createCanvas(); + var width = painter.getWidth(); + var height = painter.getHeight(); + + var newDomStyle = newDom.style; + if (newDomStyle) { // In node or some other non-browser environment + newDomStyle.position = 'absolute'; + newDomStyle.left = 0; + newDomStyle.top = 0; + newDomStyle.width = width + 'px'; + newDomStyle.height = height + 'px'; + + newDom.setAttribute('data-zr-dom-id', id); + } + + newDom.width = width * dpr; + newDom.height = height * dpr; + + return newDom; +} + +/** + * @alias module:zrender/Layer + * @constructor + * @extends module:zrender/mixin/Transformable + * @param {string} id + * @param {module:zrender/Painter} painter + * @param {number} [dpr] + */ +var Layer = function(id, painter, dpr) { + var dom; + dpr = dpr || devicePixelRatio; + if (typeof id === 'string') { + dom = createDom(id, painter, dpr); + } + // Not using isDom because in node it will return false + else if (isObject$1(id)) { + dom = id; + id = dom.id; + } + this.id = id; + this.dom = dom; + + var domStyle = dom.style; + if (domStyle) { // Not in node + dom.onselectstart = returnFalse; // 避免页面选中的尴尬 + domStyle['-webkit-user-select'] = 'none'; + domStyle['user-select'] = 'none'; + domStyle['-webkit-touch-callout'] = 'none'; + domStyle['-webkit-tap-highlight-color'] = 'rgba(0,0,0,0)'; + domStyle['padding'] = 0; + domStyle['margin'] = 0; + domStyle['border-width'] = 0; + } + + this.domBack = null; + this.ctxBack = null; + + this.painter = painter; + + this.config = null; + + // Configs + /** + * 每次清空画布的颜色 + * @type {string} + * @default 0 + */ + this.clearColor = 0; + /** + * 是否开启动态模糊 + * @type {boolean} + * @default false + */ + this.motionBlur = false; + /** + * 在开启动态模糊的时候使用,与上一帧混合的alpha值,值越大尾迹越明显 + * @type {number} + * @default 0.7 + */ + this.lastFrameAlpha = 0.7; + + /** + * Layer dpr + * @type {number} + */ + this.dpr = dpr; +}; + +Layer.prototype = { + + constructor: Layer, + + __dirty: true, + + __used: false, + + __drawIndex: 0, + __startIndex: 0, + __endIndex: 0, + + incremental: false, + + getElementCount: function () { + return this.__endIndex - this.__startIndex; + }, + + initContext: function () { + this.ctx = this.dom.getContext('2d'); + this.ctx.dpr = this.dpr; + }, + + createBackBuffer: function () { + var dpr = this.dpr; + + this.domBack = createDom('back-' + this.id, this.painter, dpr); + this.ctxBack = this.domBack.getContext('2d'); + + if (dpr != 1) { + this.ctxBack.scale(dpr, dpr); + } + }, + + /** + * @param {number} width + * @param {number} height + */ + resize: function (width, height) { + var dpr = this.dpr; + + var dom = this.dom; + var domStyle = dom.style; + var domBack = this.domBack; + + if (domStyle) { + domStyle.width = width + 'px'; + domStyle.height = height + 'px'; + } + + dom.width = width * dpr; + dom.height = height * dpr; + + if (domBack) { + domBack.width = width * dpr; + domBack.height = height * dpr; + + if (dpr != 1) { + this.ctxBack.scale(dpr, dpr); + } + } + }, + + /** + * 清空该层画布 + * @param {boolean} [clearAll]=false Clear all with out motion blur + * @param {Color} [clearColor] + */ + clear: function (clearAll, clearColor) { + var dom = this.dom; + var ctx = this.ctx; + var width = dom.width; + var height = dom.height; + + var clearColor = clearColor || this.clearColor; + var haveMotionBLur = this.motionBlur && !clearAll; + var lastFrameAlpha = this.lastFrameAlpha; + + var dpr = this.dpr; + + if (haveMotionBLur) { + if (!this.domBack) { + this.createBackBuffer(); + } + + this.ctxBack.globalCompositeOperation = 'copy'; + this.ctxBack.drawImage( + dom, 0, 0, + width / dpr, + height / dpr + ); + } + + ctx.clearRect(0, 0, width, height); + if (clearColor && clearColor !== 'transparent') { + var clearColorGradientOrPattern; + // Gradient + if (clearColor.colorStops) { + // Cache canvas gradient + clearColorGradientOrPattern = clearColor.__canvasGradient || Style.getGradient(ctx, clearColor, { + x: 0, + y: 0, + width: width, + height: height + }); + + clearColor.__canvasGradient = clearColorGradientOrPattern; + } + // Pattern + else if (clearColor.image) { + clearColorGradientOrPattern = Pattern.prototype.getCanvasPattern.call(clearColor, ctx); + } + ctx.save(); + ctx.fillStyle = clearColorGradientOrPattern || clearColor; + ctx.fillRect(0, 0, width, height); + ctx.restore(); + } + + if (haveMotionBLur) { + var domBack = this.domBack; + ctx.save(); + ctx.globalAlpha = lastFrameAlpha; + ctx.drawImage(domBack, 0, 0, width, height); + ctx.restore(); + } + } +}; + +var requestAnimationFrame = ( + typeof window !== 'undefined' + && ( + (window.requestAnimationFrame && window.requestAnimationFrame.bind(window)) + // https://github.com/ecomfe/zrender/issues/189#issuecomment-224919809 + || (window.msRequestAnimationFrame && window.msRequestAnimationFrame.bind(window)) + || window.mozRequestAnimationFrame + || window.webkitRequestAnimationFrame + ) +) || function (func) { + setTimeout(func, 16); +}; + +var globalImageCache = new LRU(50); + +/** + * @param {string|HTMLImageElement|HTMLCanvasElement|Canvas} newImageOrSrc + * @return {HTMLImageElement|HTMLCanvasElement|Canvas} image + */ +function findExistImage(newImageOrSrc) { + if (typeof newImageOrSrc === 'string') { + var cachedImgObj = globalImageCache.get(newImageOrSrc); + return cachedImgObj && cachedImgObj.image; + } + else { + return newImageOrSrc; + } +} + +/** + * Caution: User should cache loaded images, but not just count on LRU. + * Consider if required images more than LRU size, will dead loop occur? + * + * @param {string|HTMLImageElement|HTMLCanvasElement|Canvas} newImageOrSrc + * @param {HTMLImageElement|HTMLCanvasElement|Canvas} image Existent image. + * @param {module:zrender/Element} [hostEl] For calling `dirty`. + * @param {Function} [cb] params: (image, cbPayload) + * @param {Object} [cbPayload] Payload on cb calling. + * @return {HTMLImageElement|HTMLCanvasElement|Canvas} image + */ +function createOrUpdateImage(newImageOrSrc, image, hostEl, cb, cbPayload) { + if (!newImageOrSrc) { + return image; + } + else if (typeof newImageOrSrc === 'string') { + + // Image should not be loaded repeatly. + if ((image && image.__zrImageSrc === newImageOrSrc) || !hostEl) { + return image; + } + + // Only when there is no existent image or existent image src + // is different, this method is responsible for load. + var cachedImgObj = globalImageCache.get(newImageOrSrc); + + var pendingWrap = {hostEl: hostEl, cb: cb, cbPayload: cbPayload}; + + if (cachedImgObj) { + image = cachedImgObj.image; + !isImageReady(image) && cachedImgObj.pending.push(pendingWrap); + } + else { + !image && (image = new Image()); + image.onload = imageOnLoad; + + globalImageCache.put( + newImageOrSrc, + image.__cachedImgObj = { + image: image, + pending: [pendingWrap] + } + ); + + image.src = image.__zrImageSrc = newImageOrSrc; + } + + return image; + } + // newImageOrSrc is an HTMLImageElement or HTMLCanvasElement or Canvas + else { + return newImageOrSrc; + } +} + +function imageOnLoad() { + var cachedImgObj = this.__cachedImgObj; + this.onload = this.__cachedImgObj = null; + + for (var i = 0; i < cachedImgObj.pending.length; i++) { + var pendingWrap = cachedImgObj.pending[i]; + var cb = pendingWrap.cb; + cb && cb(this, pendingWrap.cbPayload); + pendingWrap.hostEl.dirty(); + } + cachedImgObj.pending.length = 0; +} + +function isImageReady(image) { + return image && image.width && image.height; +} + +var textWidthCache = {}; +var textWidthCacheCounter = 0; + +var TEXT_CACHE_MAX = 5000; +var STYLE_REG = /\{([a-zA-Z0-9_]+)\|([^}]*)\}/g; + +var DEFAULT_FONT = '12px sans-serif'; + +// Avoid assign to an exported variable, for transforming to cjs. +var methods$1 = {}; + +function $override$1(name, fn) { + methods$1[name] = fn; +} + +/** + * @public + * @param {string} text + * @param {string} font + * @return {number} width + */ +function getWidth(text, font) { + font = font || DEFAULT_FONT; + var key = text + ':' + font; + if (textWidthCache[key]) { + return textWidthCache[key]; + } + + var textLines = (text + '').split('\n'); + var width = 0; + + for (var i = 0, l = textLines.length; i < l; i++) { + // textContain.measureText may be overrided in SVG or VML + width = Math.max(measureText(textLines[i], font).width, width); + } + + if (textWidthCacheCounter > TEXT_CACHE_MAX) { + textWidthCacheCounter = 0; + textWidthCache = {}; + } + textWidthCacheCounter++; + textWidthCache[key] = width; + + return width; +} + +/** + * @public + * @param {string} text + * @param {string} font + * @param {string} [textAlign='left'] + * @param {string} [textVerticalAlign='top'] + * @param {Array.<number>} [textPadding] + * @param {Object} [rich] + * @param {Object} [truncate] + * @return {Object} {x, y, width, height, lineHeight} + */ +function getBoundingRect(text, font, textAlign, textVerticalAlign, textPadding, rich, truncate) { + return rich + ? getRichTextRect(text, font, textAlign, textVerticalAlign, textPadding, rich, truncate) + : getPlainTextRect(text, font, textAlign, textVerticalAlign, textPadding, truncate); +} + +function getPlainTextRect(text, font, textAlign, textVerticalAlign, textPadding, truncate) { + var contentBlock = parsePlainText(text, font, textPadding, truncate); + var outerWidth = getWidth(text, font); + if (textPadding) { + outerWidth += textPadding[1] + textPadding[3]; + } + var outerHeight = contentBlock.outerHeight; + + var x = adjustTextX(0, outerWidth, textAlign); + var y = adjustTextY(0, outerHeight, textVerticalAlign); + + var rect = new BoundingRect(x, y, outerWidth, outerHeight); + rect.lineHeight = contentBlock.lineHeight; + + return rect; +} + +function getRichTextRect(text, font, textAlign, textVerticalAlign, textPadding, rich, truncate) { + var contentBlock = parseRichText(text, { + rich: rich, + truncate: truncate, + font: font, + textAlign: textAlign, + textPadding: textPadding + }); + var outerWidth = contentBlock.outerWidth; + var outerHeight = contentBlock.outerHeight; + + var x = adjustTextX(0, outerWidth, textAlign); + var y = adjustTextY(0, outerHeight, textVerticalAlign); + + return new BoundingRect(x, y, outerWidth, outerHeight); +} + +/** + * @public + * @param {number} x + * @param {number} width + * @param {string} [textAlign='left'] + * @return {number} Adjusted x. + */ +function adjustTextX(x, width, textAlign) { + // FIXME Right to left language + if (textAlign === 'right') { + x -= width; + } + else if (textAlign === 'center') { + x -= width / 2; + } + return x; +} + +/** + * @public + * @param {number} y + * @param {number} height + * @param {string} [textVerticalAlign='top'] + * @return {number} Adjusted y. + */ +function adjustTextY(y, height, textVerticalAlign) { + if (textVerticalAlign === 'middle') { + y -= height / 2; + } + else if (textVerticalAlign === 'bottom') { + y -= height; + } + return y; +} + +/** + * @public + * @param {stirng} textPosition + * @param {Object} rect {x, y, width, height} + * @param {number} distance + * @return {Object} {x, y, textAlign, textVerticalAlign} + */ +function adjustTextPositionOnRect(textPosition, rect, distance) { + + var x = rect.x; + var y = rect.y; + + var height = rect.height; + var width = rect.width; + var halfHeight = height / 2; + + var textAlign = 'left'; + var textVerticalAlign = 'top'; + + switch (textPosition) { + case 'left': + x -= distance; + y += halfHeight; + textAlign = 'right'; + textVerticalAlign = 'middle'; + break; + case 'right': + x += distance + width; + y += halfHeight; + textVerticalAlign = 'middle'; + break; + case 'top': + x += width / 2; + y -= distance; + textAlign = 'center'; + textVerticalAlign = 'bottom'; + break; + case 'bottom': + x += width / 2; + y += height + distance; + textAlign = 'center'; + break; + case 'inside': + x += width / 2; + y += halfHeight; + textAlign = 'center'; + textVerticalAlign = 'middle'; + break; + case 'insideLeft': + x += distance; + y += halfHeight; + textVerticalAlign = 'middle'; + break; + case 'insideRight': + x += width - distance; + y += halfHeight; + textAlign = 'right'; + textVerticalAlign = 'middle'; + break; + case 'insideTop': + x += width / 2; + y += distance; + textAlign = 'center'; + break; + case 'insideBottom': + x += width / 2; + y += height - distance; + textAlign = 'center'; + textVerticalAlign = 'bottom'; + break; + case 'insideTopLeft': + x += distance; + y += distance; + break; + case 'insideTopRight': + x += width - distance; + y += distance; + textAlign = 'right'; + break; + case 'insideBottomLeft': + x += distance; + y += height - distance; + textVerticalAlign = 'bottom'; + break; + case 'insideBottomRight': + x += width - distance; + y += height - distance; + textAlign = 'right'; + textVerticalAlign = 'bottom'; + break; + } + + return { + x: x, + y: y, + textAlign: textAlign, + textVerticalAlign: textVerticalAlign + }; +} + +/** + * Show ellipsis if overflow. + * + * @public + * @param {string} text + * @param {string} containerWidth + * @param {string} font + * @param {number} [ellipsis='...'] + * @param {Object} [options] + * @param {number} [options.maxIterations=3] + * @param {number} [options.minChar=0] If truncate result are less + * then minChar, ellipsis will not show, which is + * better for user hint in some cases. + * @param {number} [options.placeholder=''] When all truncated, use the placeholder. + * @return {string} + */ +function truncateText(text, containerWidth, font, ellipsis, options) { + if (!containerWidth) { + return ''; + } + + var textLines = (text + '').split('\n'); + options = prepareTruncateOptions(containerWidth, font, ellipsis, options); + + // FIXME + // It is not appropriate that every line has '...' when truncate multiple lines. + for (var i = 0, len = textLines.length; i < len; i++) { + textLines[i] = truncateSingleLine(textLines[i], options); + } + + return textLines.join('\n'); +} + +function prepareTruncateOptions(containerWidth, font, ellipsis, options) { + options = extend({}, options); + + options.font = font; + var ellipsis = retrieve2(ellipsis, '...'); + options.maxIterations = retrieve2(options.maxIterations, 2); + var minChar = options.minChar = retrieve2(options.minChar, 0); + // FIXME + // Other languages? + options.cnCharWidth = getWidth('国', font); + // FIXME + // Consider proportional font? + var ascCharWidth = options.ascCharWidth = getWidth('a', font); + options.placeholder = retrieve2(options.placeholder, ''); + + // Example 1: minChar: 3, text: 'asdfzxcv', truncate result: 'asdf', but not: 'a...'. + // Example 2: minChar: 3, text: '维度', truncate result: '维', but not: '...'. + var contentWidth = containerWidth = Math.max(0, containerWidth - 1); // Reserve some gap. + for (var i = 0; i < minChar && contentWidth >= ascCharWidth; i++) { + contentWidth -= ascCharWidth; + } + + var ellipsisWidth = getWidth(ellipsis); + if (ellipsisWidth > contentWidth) { + ellipsis = ''; + ellipsisWidth = 0; + } + + contentWidth = containerWidth - ellipsisWidth; + + options.ellipsis = ellipsis; + options.ellipsisWidth = ellipsisWidth; + options.contentWidth = contentWidth; + options.containerWidth = containerWidth; + + return options; +} + +function truncateSingleLine(textLine, options) { + var containerWidth = options.containerWidth; + var font = options.font; + var contentWidth = options.contentWidth; + + if (!containerWidth) { + return ''; + } + + var lineWidth = getWidth(textLine, font); + + if (lineWidth <= containerWidth) { + return textLine; + } + + for (var j = 0;; j++) { + if (lineWidth <= contentWidth || j >= options.maxIterations) { + textLine += options.ellipsis; + break; + } + + var subLength = j === 0 + ? estimateLength(textLine, contentWidth, options.ascCharWidth, options.cnCharWidth) + : lineWidth > 0 + ? Math.floor(textLine.length * contentWidth / lineWidth) + : 0; + + textLine = textLine.substr(0, subLength); + lineWidth = getWidth(textLine, font); + } + + if (textLine === '') { + textLine = options.placeholder; + } + + return textLine; +} + +function estimateLength(text, contentWidth, ascCharWidth, cnCharWidth) { + var width = 0; + var i = 0; + for (var len = text.length; i < len && width < contentWidth; i++) { + var charCode = text.charCodeAt(i); + width += (0 <= charCode && charCode <= 127) ? ascCharWidth : cnCharWidth; + } + return i; +} + +/** + * @public + * @param {string} font + * @return {number} line height + */ +function getLineHeight(font) { + // FIXME A rough approach. + return getWidth('国', font); +} + +/** + * @public + * @param {string} text + * @param {string} font + * @return {Object} width + */ +function measureText(text, font) { + return methods$1.measureText(text, font); +} + +// Avoid assign to an exported variable, for transforming to cjs. +methods$1.measureText = function (text, font) { + var ctx = getContext(); + ctx.font = font || DEFAULT_FONT; + return ctx.measureText(text); +}; + +/** + * @public + * @param {string} text + * @param {string} font + * @param {Object} [truncate] + * @return {Object} block: {lineHeight, lines, height, outerHeight} + * Notice: for performance, do not calculate outerWidth util needed. + */ +function parsePlainText(text, font, padding, truncate) { + text != null && (text += ''); + + var lineHeight = getLineHeight(font); + var lines = text ? text.split('\n') : []; + var height = lines.length * lineHeight; + var outerHeight = height; + + if (padding) { + outerHeight += padding[0] + padding[2]; + } + + if (text && truncate) { + var truncOuterHeight = truncate.outerHeight; + var truncOuterWidth = truncate.outerWidth; + if (truncOuterHeight != null && outerHeight > truncOuterHeight) { + text = ''; + lines = []; + } + else if (truncOuterWidth != null) { + var options = prepareTruncateOptions( + truncOuterWidth - (padding ? padding[1] + padding[3] : 0), + font, + truncate.ellipsis, + {minChar: truncate.minChar, placeholder: truncate.placeholder} + ); + + // FIXME + // It is not appropriate that every line has '...' when truncate multiple lines. + for (var i = 0, len = lines.length; i < len; i++) { + lines[i] = truncateSingleLine(lines[i], options); + } + } + } + + return { + lines: lines, + height: height, + outerHeight: outerHeight, + lineHeight: lineHeight + }; +} + +/** + * For example: 'some text {a|some text}other text{b|some text}xxx{c|}xxx' + * Also consider 'bbbb{a|xxx\nzzz}xxxx\naaaa'. + * + * @public + * @param {string} text + * @param {Object} style + * @return {Object} block + * { + * width, + * height, + * lines: [{ + * lineHeight, + * width, + * tokens: [[{ + * styleName, + * text, + * width, // include textPadding + * height, // include textPadding + * textWidth, // pure text width + * textHeight, // pure text height + * lineHeihgt, + * font, + * textAlign, + * textVerticalAlign + * }], [...], ...] + * }, ...] + * } + * If styleName is undefined, it is plain text. + */ +function parseRichText(text, style) { + var contentBlock = {lines: [], width: 0, height: 0}; + + text != null && (text += ''); + if (!text) { + return contentBlock; + } + + var lastIndex = STYLE_REG.lastIndex = 0; + var result; + while ((result = STYLE_REG.exec(text)) != null) { + var matchedIndex = result.index; + if (matchedIndex > lastIndex) { + pushTokens(contentBlock, text.substring(lastIndex, matchedIndex)); + } + pushTokens(contentBlock, result[2], result[1]); + lastIndex = STYLE_REG.lastIndex; + } + + if (lastIndex < text.length) { + pushTokens(contentBlock, text.substring(lastIndex, text.length)); + } + + var lines = contentBlock.lines; + var contentHeight = 0; + var contentWidth = 0; + // For `textWidth: 100%` + var pendingList = []; + + var stlPadding = style.textPadding; + + var truncate = style.truncate; + var truncateWidth = truncate && truncate.outerWidth; + var truncateHeight = truncate && truncate.outerHeight; + if (stlPadding) { + truncateWidth != null && (truncateWidth -= stlPadding[1] + stlPadding[3]); + truncateHeight != null && (truncateHeight -= stlPadding[0] + stlPadding[2]); + } + + // Calculate layout info of tokens. + for (var i = 0; i < lines.length; i++) { + var line = lines[i]; + var lineHeight = 0; + var lineWidth = 0; + + for (var j = 0; j < line.tokens.length; j++) { + var token = line.tokens[j]; + var tokenStyle = token.styleName && style.rich[token.styleName] || {}; + // textPadding should not inherit from style. + var textPadding = token.textPadding = tokenStyle.textPadding; + + // textFont has been asigned to font by `normalizeStyle`. + var font = token.font = tokenStyle.font || style.font; + + // textHeight can be used when textVerticalAlign is specified in token. + var tokenHeight = token.textHeight = retrieve2( + // textHeight should not be inherited, consider it can be specified + // as box height of the block. + tokenStyle.textHeight, getLineHeight(font) + ); + textPadding && (tokenHeight += textPadding[0] + textPadding[2]); + token.height = tokenHeight; + token.lineHeight = retrieve3( + tokenStyle.textLineHeight, style.textLineHeight, tokenHeight + ); + + token.textAlign = tokenStyle && tokenStyle.textAlign || style.textAlign; + token.textVerticalAlign = tokenStyle && tokenStyle.textVerticalAlign || 'middle'; + + if (truncateHeight != null && contentHeight + token.lineHeight > truncateHeight) { + return {lines: [], width: 0, height: 0}; + } + + token.textWidth = getWidth(token.text, font); + var tokenWidth = tokenStyle.textWidth; + var tokenWidthNotSpecified = tokenWidth == null || tokenWidth === 'auto'; + + // Percent width, can be `100%`, can be used in drawing separate + // line when box width is needed to be auto. + if (typeof tokenWidth === 'string' && tokenWidth.charAt(tokenWidth.length - 1) === '%') { + token.percentWidth = tokenWidth; + pendingList.push(token); + tokenWidth = 0; + // Do not truncate in this case, because there is no user case + // and it is too complicated. + } + else { + if (tokenWidthNotSpecified) { + tokenWidth = token.textWidth; + + // FIXME: If image is not loaded and textWidth is not specified, calling + // `getBoundingRect()` will not get correct result. + var textBackgroundColor = tokenStyle.textBackgroundColor; + var bgImg = textBackgroundColor && textBackgroundColor.image; + + // Use cases: + // (1) If image is not loaded, it will be loaded at render phase and call + // `dirty()` and `textBackgroundColor.image` will be replaced with the loaded + // image, and then the right size will be calculated here at the next tick. + // See `graphic/helper/text.js`. + // (2) If image loaded, and `textBackgroundColor.image` is image src string, + // use `imageHelper.findExistImage` to find cached image. + // `imageHelper.findExistImage` will always be called here before + // `imageHelper.createOrUpdateImage` in `graphic/helper/text.js#renderRichText` + // which ensures that image will not be rendered before correct size calcualted. + if (bgImg) { + bgImg = findExistImage(bgImg); + if (isImageReady(bgImg)) { + tokenWidth = Math.max(tokenWidth, bgImg.width * tokenHeight / bgImg.height); + } + } + } + + var paddingW = textPadding ? textPadding[1] + textPadding[3] : 0; + tokenWidth += paddingW; + + var remianTruncWidth = truncateWidth != null ? truncateWidth - lineWidth : null; + + if (remianTruncWidth != null && remianTruncWidth < tokenWidth) { + if (!tokenWidthNotSpecified || remianTruncWidth < paddingW) { + token.text = ''; + token.textWidth = tokenWidth = 0; + } + else { + token.text = truncateText( + token.text, remianTruncWidth - paddingW, font, truncate.ellipsis, + {minChar: truncate.minChar} + ); + token.textWidth = getWidth(token.text, font); + tokenWidth = token.textWidth + paddingW; + } + } + } + + lineWidth += (token.width = tokenWidth); + tokenStyle && (lineHeight = Math.max(lineHeight, token.lineHeight)); + } + + line.width = lineWidth; + line.lineHeight = lineHeight; + contentHeight += lineHeight; + contentWidth = Math.max(contentWidth, lineWidth); + } + + contentBlock.outerWidth = contentBlock.width = retrieve2(style.textWidth, contentWidth); + contentBlock.outerHeight = contentBlock.height = retrieve2(style.textHeight, contentHeight); + + if (stlPadding) { + contentBlock.outerWidth += stlPadding[1] + stlPadding[3]; + contentBlock.outerHeight += stlPadding[0] + stlPadding[2]; + } + + for (var i = 0; i < pendingList.length; i++) { + var token = pendingList[i]; + var percentWidth = token.percentWidth; + // Should not base on outerWidth, because token can not be placed out of padding. + token.width = parseInt(percentWidth, 10) / 100 * contentWidth; + } + + return contentBlock; +} + +function pushTokens(block, str, styleName) { + var isEmptyStr = str === ''; + var strs = str.split('\n'); + var lines = block.lines; + + for (var i = 0; i < strs.length; i++) { + var text = strs[i]; + var token = { + styleName: styleName, + text: text, + isLineHolder: !text && !isEmptyStr + }; + + // The first token should be appended to the last line. + if (!i) { + var tokens = (lines[lines.length - 1] || (lines[0] = {tokens: []})).tokens; + + // Consider cases: + // (1) ''.split('\n') => ['', '\n', ''], the '' at the first item + // (which is a placeholder) should be replaced by new token. + // (2) A image backage, where token likes {a|}. + // (3) A redundant '' will affect textAlign in line. + // (4) tokens with the same tplName should not be merged, because + // they should be displayed in different box (with border and padding). + var tokensLen = tokens.length; + (tokensLen === 1 && tokens[0].isLineHolder) + ? (tokens[0] = token) + // Consider text is '', only insert when it is the "lineHolder" or + // "emptyStr". Otherwise a redundant '' will affect textAlign in line. + : ((text || !tokensLen || isEmptyStr) && tokens.push(token)); + } + // Other tokens always start a new line. + else { + // If there is '', insert it as a placeholder. + lines.push({tokens: [token]}); + } + } +} + +function makeFont(style) { + // FIXME in node-canvas fontWeight is before fontStyle + // Use `fontSize` `fontFamily` to check whether font properties are defined. + var font = (style.fontSize || style.fontFamily) && [ + style.fontStyle, + style.fontWeight, + (style.fontSize || 12) + 'px', + // If font properties are defined, `fontFamily` should not be ignored. + style.fontFamily || 'sans-serif' + ].join(' '); + return font && trim(font) || style.textFont || style.font; +} + +function buildPath(ctx, shape) { + var x = shape.x; + var y = shape.y; + var width = shape.width; + var height = shape.height; + var r = shape.r; + var r1; + var r2; + var r3; + var r4; + + // Convert width and height to positive for better borderRadius + if (width < 0) { + x = x + width; + width = -width; + } + if (height < 0) { + y = y + height; + height = -height; + } + + if (typeof r === 'number') { + r1 = r2 = r3 = r4 = r; + } + else if (r instanceof Array) { + if (r.length === 1) { + r1 = r2 = r3 = r4 = r[0]; + } + else if (r.length === 2) { + r1 = r3 = r[0]; + r2 = r4 = r[1]; + } + else if (r.length === 3) { + r1 = r[0]; + r2 = r4 = r[1]; + r3 = r[2]; + } + else { + r1 = r[0]; + r2 = r[1]; + r3 = r[2]; + r4 = r[3]; + } + } + else { + r1 = r2 = r3 = r4 = 0; + } + + var total; + if (r1 + r2 > width) { + total = r1 + r2; + r1 *= width / total; + r2 *= width / total; + } + if (r3 + r4 > width) { + total = r3 + r4; + r3 *= width / total; + r4 *= width / total; + } + if (r2 + r3 > height) { + total = r2 + r3; + r2 *= height / total; + r3 *= height / total; + } + if (r1 + r4 > height) { + total = r1 + r4; + r1 *= height / total; + r4 *= height / total; + } + ctx.moveTo(x + r1, y); + ctx.lineTo(x + width - r2, y); + r2 !== 0 && ctx.arc(x + width - r2, y + r2, r2, -Math.PI / 2, 0); + ctx.lineTo(x + width, y + height - r3); + r3 !== 0 && ctx.arc(x + width - r3, y + height - r3, r3, 0, Math.PI / 2); + ctx.lineTo(x + r4, y + height); + r4 !== 0 && ctx.arc(x + r4, y + height - r4, r4, Math.PI / 2, Math.PI); + ctx.lineTo(x, y + r1); + r1 !== 0 && ctx.arc(x + r1, y + r1, r1, Math.PI, Math.PI * 1.5); +} + +// TODO: Have not support 'start', 'end' yet. +var VALID_TEXT_ALIGN = {left: 1, right: 1, center: 1}; +var VALID_TEXT_VERTICAL_ALIGN = {top: 1, bottom: 1, middle: 1}; + +/** + * @param {module:zrender/graphic/Style} style + * @return {module:zrender/graphic/Style} The input style. + */ +function normalizeTextStyle(style) { + normalizeStyle(style); + each$1(style.rich, normalizeStyle); + return style; +} + +function normalizeStyle(style) { + if (style) { + + style.font = makeFont(style); + + var textAlign = style.textAlign; + textAlign === 'middle' && (textAlign = 'center'); + style.textAlign = ( + textAlign == null || VALID_TEXT_ALIGN[textAlign] + ) ? textAlign : 'left'; + + // Compatible with textBaseline. + var textVerticalAlign = style.textVerticalAlign || style.textBaseline; + textVerticalAlign === 'center' && (textVerticalAlign = 'middle'); + style.textVerticalAlign = ( + textVerticalAlign == null || VALID_TEXT_VERTICAL_ALIGN[textVerticalAlign] + ) ? textVerticalAlign : 'top'; + + var textPadding = style.textPadding; + if (textPadding) { + style.textPadding = normalizeCssArray(style.textPadding); + } + } +} + +/** + * @param {CanvasRenderingContext2D} ctx + * @param {string} text + * @param {module:zrender/graphic/Style} style + * @param {Object|boolean} [rect] {x, y, width, height} + * If set false, rect text is not used. + */ +function renderText(hostEl, ctx, text, style, rect) { + style.rich + ? renderRichText(hostEl, ctx, text, style, rect) + : renderPlainText(hostEl, ctx, text, style, rect); +} + +function renderPlainText(hostEl, ctx, text, style, rect) { + var font = setCtx(ctx, 'font', style.font || DEFAULT_FONT); + + var textPadding = style.textPadding; + + var contentBlock = hostEl.__textCotentBlock; + if (!contentBlock || hostEl.__dirty) { + contentBlock = hostEl.__textCotentBlock = parsePlainText( + text, font, textPadding, style.truncate + ); + } + + var outerHeight = contentBlock.outerHeight; + + var textLines = contentBlock.lines; + var lineHeight = contentBlock.lineHeight; + + var boxPos = getBoxPosition(outerHeight, style, rect); + var baseX = boxPos.baseX; + var baseY = boxPos.baseY; + var textAlign = boxPos.textAlign; + var textVerticalAlign = boxPos.textVerticalAlign; + + // Origin of textRotation should be the base point of text drawing. + applyTextRotation(ctx, style, rect, baseX, baseY); + + var boxY = adjustTextY(baseY, outerHeight, textVerticalAlign); + var textX = baseX; + var textY = boxY; + + var needDrawBg = needDrawBackground(style); + if (needDrawBg || textPadding) { + // Consider performance, do not call getTextWidth util necessary. + var textWidth = getWidth(text, font); + var outerWidth = textWidth; + textPadding && (outerWidth += textPadding[1] + textPadding[3]); + var boxX = adjustTextX(baseX, outerWidth, textAlign); + + needDrawBg && drawBackground(hostEl, ctx, style, boxX, boxY, outerWidth, outerHeight); + + if (textPadding) { + textX = getTextXForPadding(baseX, textAlign, textPadding); + textY += textPadding[0]; + } + } + + setCtx(ctx, 'textAlign', textAlign || 'left'); + // Force baseline to be "middle". Otherwise, if using "top", the + // text will offset downward a little bit in font "Microsoft YaHei". + setCtx(ctx, 'textBaseline', 'middle'); + + // Always set shadowBlur and shadowOffset to avoid leak from displayable. + setCtx(ctx, 'shadowBlur', style.textShadowBlur || 0); + setCtx(ctx, 'shadowColor', style.textShadowColor || 'transparent'); + setCtx(ctx, 'shadowOffsetX', style.textShadowOffsetX || 0); + setCtx(ctx, 'shadowOffsetY', style.textShadowOffsetY || 0); + + // `textBaseline` is set as 'middle'. + textY += lineHeight / 2; + + var textStrokeWidth = style.textStrokeWidth; + var textStroke = getStroke(style.textStroke, textStrokeWidth); + var textFill = getFill(style.textFill); + + if (textStroke) { + setCtx(ctx, 'lineWidth', textStrokeWidth); + setCtx(ctx, 'strokeStyle', textStroke); + } + if (textFill) { + setCtx(ctx, 'fillStyle', textFill); + } + + for (var i = 0; i < textLines.length; i++) { + // Fill after stroke so the outline will not cover the main part. + textStroke && ctx.strokeText(textLines[i], textX, textY); + textFill && ctx.fillText(textLines[i], textX, textY); + textY += lineHeight; + } +} + +function renderRichText(hostEl, ctx, text, style, rect) { + var contentBlock = hostEl.__textCotentBlock; + + if (!contentBlock || hostEl.__dirty) { + contentBlock = hostEl.__textCotentBlock = parseRichText(text, style); + } + + drawRichText(hostEl, ctx, contentBlock, style, rect); +} + +function drawRichText(hostEl, ctx, contentBlock, style, rect) { + var contentWidth = contentBlock.width; + var outerWidth = contentBlock.outerWidth; + var outerHeight = contentBlock.outerHeight; + var textPadding = style.textPadding; + + var boxPos = getBoxPosition(outerHeight, style, rect); + var baseX = boxPos.baseX; + var baseY = boxPos.baseY; + var textAlign = boxPos.textAlign; + var textVerticalAlign = boxPos.textVerticalAlign; + + // Origin of textRotation should be the base point of text drawing. + applyTextRotation(ctx, style, rect, baseX, baseY); + + var boxX = adjustTextX(baseX, outerWidth, textAlign); + var boxY = adjustTextY(baseY, outerHeight, textVerticalAlign); + var xLeft = boxX; + var lineTop = boxY; + if (textPadding) { + xLeft += textPadding[3]; + lineTop += textPadding[0]; + } + var xRight = xLeft + contentWidth; + + needDrawBackground(style) && drawBackground( + hostEl, ctx, style, boxX, boxY, outerWidth, outerHeight + ); + + for (var i = 0; i < contentBlock.lines.length; i++) { + var line = contentBlock.lines[i]; + var tokens = line.tokens; + var tokenCount = tokens.length; + var lineHeight = line.lineHeight; + var usedWidth = line.width; + + var leftIndex = 0; + var lineXLeft = xLeft; + var lineXRight = xRight; + var rightIndex = tokenCount - 1; + var token; + + while ( + leftIndex < tokenCount + && (token = tokens[leftIndex], !token.textAlign || token.textAlign === 'left') + ) { + placeToken(hostEl, ctx, token, style, lineHeight, lineTop, lineXLeft, 'left'); + usedWidth -= token.width; + lineXLeft += token.width; + leftIndex++; + } + + while ( + rightIndex >= 0 + && (token = tokens[rightIndex], token.textAlign === 'right') + ) { + placeToken(hostEl, ctx, token, style, lineHeight, lineTop, lineXRight, 'right'); + usedWidth -= token.width; + lineXRight -= token.width; + rightIndex--; + } + + // The other tokens are placed as textAlign 'center' if there is enough space. + lineXLeft += (contentWidth - (lineXLeft - xLeft) - (xRight - lineXRight) - usedWidth) / 2; + while (leftIndex <= rightIndex) { + token = tokens[leftIndex]; + // Consider width specified by user, use 'center' rather than 'left'. + placeToken(hostEl, ctx, token, style, lineHeight, lineTop, lineXLeft + token.width / 2, 'center'); + lineXLeft += token.width; + leftIndex++; + } + + lineTop += lineHeight; + } +} + +function applyTextRotation(ctx, style, rect, x, y) { + // textRotation only apply in RectText. + if (rect && style.textRotation) { + var origin = style.textOrigin; + if (origin === 'center') { + x = rect.width / 2 + rect.x; + y = rect.height / 2 + rect.y; + } + else if (origin) { + x = origin[0] + rect.x; + y = origin[1] + rect.y; + } + + ctx.translate(x, y); + // Positive: anticlockwise + ctx.rotate(-style.textRotation); + ctx.translate(-x, -y); + } +} + +function placeToken(hostEl, ctx, token, style, lineHeight, lineTop, x, textAlign) { + var tokenStyle = style.rich[token.styleName] || {}; + + // 'ctx.textBaseline' is always set as 'middle', for sake of + // the bias of "Microsoft YaHei". + var textVerticalAlign = token.textVerticalAlign; + var y = lineTop + lineHeight / 2; + if (textVerticalAlign === 'top') { + y = lineTop + token.height / 2; + } + else if (textVerticalAlign === 'bottom') { + y = lineTop + lineHeight - token.height / 2; + } + + !token.isLineHolder && needDrawBackground(tokenStyle) && drawBackground( + hostEl, + ctx, + tokenStyle, + textAlign === 'right' + ? x - token.width + : textAlign === 'center' + ? x - token.width / 2 + : x, + y - token.height / 2, + token.width, + token.height + ); + + var textPadding = token.textPadding; + if (textPadding) { + x = getTextXForPadding(x, textAlign, textPadding); + y -= token.height / 2 - textPadding[2] - token.textHeight / 2; + } + + setCtx(ctx, 'shadowBlur', retrieve3(tokenStyle.textShadowBlur, style.textShadowBlur, 0)); + setCtx(ctx, 'shadowColor', tokenStyle.textShadowColor || style.textShadowColor || 'transparent'); + setCtx(ctx, 'shadowOffsetX', retrieve3(tokenStyle.textShadowOffsetX, style.textShadowOffsetX, 0)); + setCtx(ctx, 'shadowOffsetY', retrieve3(tokenStyle.textShadowOffsetY, style.textShadowOffsetY, 0)); + + setCtx(ctx, 'textAlign', textAlign); + // Force baseline to be "middle". Otherwise, if using "top", the + // text will offset downward a little bit in font "Microsoft YaHei". + setCtx(ctx, 'textBaseline', 'middle'); + + setCtx(ctx, 'font', token.font || DEFAULT_FONT); + + var textStroke = getStroke(tokenStyle.textStroke || style.textStroke, textStrokeWidth); + var textFill = getFill(tokenStyle.textFill || style.textFill); + var textStrokeWidth = retrieve2(tokenStyle.textStrokeWidth, style.textStrokeWidth); + + // Fill after stroke so the outline will not cover the main part. + if (textStroke) { + setCtx(ctx, 'lineWidth', textStrokeWidth); + setCtx(ctx, 'strokeStyle', textStroke); + ctx.strokeText(token.text, x, y); + } + if (textFill) { + setCtx(ctx, 'fillStyle', textFill); + ctx.fillText(token.text, x, y); + } +} + +function needDrawBackground(style) { + return style.textBackgroundColor + || (style.textBorderWidth && style.textBorderColor); +} + +// style: {textBackgroundColor, textBorderWidth, textBorderColor, textBorderRadius} +// shape: {x, y, width, height} +function drawBackground(hostEl, ctx, style, x, y, width, height) { + var textBackgroundColor = style.textBackgroundColor; + var textBorderWidth = style.textBorderWidth; + var textBorderColor = style.textBorderColor; + var isPlainBg = isString(textBackgroundColor); + + setCtx(ctx, 'shadowBlur', style.textBoxShadowBlur || 0); + setCtx(ctx, 'shadowColor', style.textBoxShadowColor || 'transparent'); + setCtx(ctx, 'shadowOffsetX', style.textBoxShadowOffsetX || 0); + setCtx(ctx, 'shadowOffsetY', style.textBoxShadowOffsetY || 0); + + if (isPlainBg || (textBorderWidth && textBorderColor)) { + ctx.beginPath(); + var textBorderRadius = style.textBorderRadius; + if (!textBorderRadius) { + ctx.rect(x, y, width, height); + } + else { + buildPath(ctx, { + x: x, y: y, width: width, height: height, r: textBorderRadius + }); + } + ctx.closePath(); + } + + if (isPlainBg) { + setCtx(ctx, 'fillStyle', textBackgroundColor); + ctx.fill(); + } + else if (isObject$1(textBackgroundColor)) { + var image = textBackgroundColor.image; + + image = createOrUpdateImage( + image, null, hostEl, onBgImageLoaded, textBackgroundColor + ); + if (image && isImageReady(image)) { + ctx.drawImage(image, x, y, width, height); + } + } + + if (textBorderWidth && textBorderColor) { + setCtx(ctx, 'lineWidth', textBorderWidth); + setCtx(ctx, 'strokeStyle', textBorderColor); + ctx.stroke(); + } +} + +function onBgImageLoaded(image, textBackgroundColor) { + // Replace image, so that `contain/text.js#parseRichText` + // will get correct result in next tick. + textBackgroundColor.image = image; +} + +function getBoxPosition(blockHeiht, style, rect) { + var baseX = style.x || 0; + var baseY = style.y || 0; + var textAlign = style.textAlign; + var textVerticalAlign = style.textVerticalAlign; + + // Text position represented by coord + if (rect) { + var textPosition = style.textPosition; + if (textPosition instanceof Array) { + // Percent + baseX = rect.x + parsePercent(textPosition[0], rect.width); + baseY = rect.y + parsePercent(textPosition[1], rect.height); + } + else { + var res = adjustTextPositionOnRect( + textPosition, rect, style.textDistance + ); + baseX = res.x; + baseY = res.y; + // Default align and baseline when has textPosition + textAlign = textAlign || res.textAlign; + textVerticalAlign = textVerticalAlign || res.textVerticalAlign; + } + + // textOffset is only support in RectText, otherwise + // we have to adjust boundingRect for textOffset. + var textOffset = style.textOffset; + if (textOffset) { + baseX += textOffset[0]; + baseY += textOffset[1]; + } + } + + return { + baseX: baseX, + baseY: baseY, + textAlign: textAlign, + textVerticalAlign: textVerticalAlign + }; +} + +function setCtx(ctx, prop, value) { + ctx[prop] = fixShadow(ctx, prop, value); + return ctx[prop]; +} + +/** + * @param {string} [stroke] If specified, do not check style.textStroke. + * @param {string} [lineWidth] If specified, do not check style.textStroke. + * @param {number} style + */ +function getStroke(stroke, lineWidth) { + return (stroke == null || lineWidth <= 0 || stroke === 'transparent' || stroke === 'none') + ? null + // TODO pattern and gradient? + : (stroke.image || stroke.colorStops) + ? '#000' + : stroke; +} + +function getFill(fill) { + return (fill == null || fill === 'none') + ? null + // TODO pattern and gradient? + : (fill.image || fill.colorStops) + ? '#000' + : fill; +} + +function parsePercent(value, maxValue) { + if (typeof value === 'string') { + if (value.lastIndexOf('%') >= 0) { + return parseFloat(value) / 100 * maxValue; + } + return parseFloat(value); + } + return value; +} + +function getTextXForPadding(x, textAlign, textPadding) { + return textAlign === 'right' + ? (x - textPadding[1]) + : textAlign === 'center' + ? (x + textPadding[3] / 2 - textPadding[1] / 2) + : (x + textPadding[3]); +} + +/** + * @param {string} text + * @param {module:zrender/Style} style + * @return {boolean} + */ +function needDrawText(text, style) { + return text != null + && (text + || style.textBackgroundColor + || (style.textBorderWidth && style.textBorderColor) + || style.textPadding + ); +} + +/** + * Mixin for drawing text in a element bounding rect + * @module zrender/mixin/RectText + */ + +var tmpRect$1 = new BoundingRect(); + +var RectText = function () {}; + +RectText.prototype = { + + constructor: RectText, + + /** + * Draw text in a rect with specified position. + * @param {CanvasRenderingContext2D} ctx + * @param {Object} rect Displayable rect + */ + drawRectText: function (ctx, rect) { + var style = this.style; + + rect = style.textRect || rect; + + // Optimize, avoid normalize every time. + this.__dirty && normalizeTextStyle(style, true); + + var text = style.text; + + // Convert to string + text != null && (text += ''); + + if (!needDrawText(text, style)) { + return; + } + + // FIXME + ctx.save(); + + // Transform rect to view space + var transform = this.transform; + if (!style.transformText) { + if (transform) { + tmpRect$1.copy(rect); + tmpRect$1.applyTransform(transform); + rect = tmpRect$1; + } + } + else { + this.setTransform(ctx); + } + + // transformText and textRotation can not be used at the same time. + renderText(this, ctx, text, style, rect); + + ctx.restore(); + } +}; + +/** + * 可绘制的图形基类 + * Base class of all displayable graphic objects + * @module zrender/graphic/Displayable + */ + + +/** + * @alias module:zrender/graphic/Displayable + * @extends module:zrender/Element + * @extends module:zrender/graphic/mixin/RectText + */ +function Displayable(opts) { + + opts = opts || {}; + + Element.call(this, opts); + + // Extend properties + for (var name in opts) { + if ( + opts.hasOwnProperty(name) && + name !== 'style' + ) { + this[name] = opts[name]; + } + } + + /** + * @type {module:zrender/graphic/Style} + */ + this.style = new Style(opts.style, this); + + this._rect = null; + // Shapes for cascade clipping. + this.__clipPaths = []; + + // FIXME Stateful must be mixined after style is setted + // Stateful.call(this, opts); +} + +Displayable.prototype = { + + constructor: Displayable, + + type: 'displayable', + + /** + * Displayable 是否为脏,Painter 中会根据该标记判断是否需要是否需要重新绘制 + * Dirty flag. From which painter will determine if this displayable object needs brush + * @name module:zrender/graphic/Displayable#__dirty + * @type {boolean} + */ + __dirty: true, + + /** + * 图形是否可见,为true时不绘制图形,但是仍能触发鼠标事件 + * If ignore drawing of the displayable object. Mouse event will still be triggered + * @name module:/zrender/graphic/Displayable#invisible + * @type {boolean} + * @default false + */ + invisible: false, + + /** + * @name module:/zrender/graphic/Displayable#z + * @type {number} + * @default 0 + */ + z: 0, + + /** + * @name module:/zrender/graphic/Displayable#z + * @type {number} + * @default 0 + */ + z2: 0, + + /** + * z层level,决定绘画在哪层canvas中 + * @name module:/zrender/graphic/Displayable#zlevel + * @type {number} + * @default 0 + */ + zlevel: 0, + + /** + * 是否可拖拽 + * @name module:/zrender/graphic/Displayable#draggable + * @type {boolean} + * @default false + */ + draggable: false, + + /** + * 是否正在拖拽 + * @name module:/zrender/graphic/Displayable#draggable + * @type {boolean} + * @default false + */ + dragging: false, + + /** + * 是否相应鼠标事件 + * @name module:/zrender/graphic/Displayable#silent + * @type {boolean} + * @default false + */ + silent: false, + + /** + * If enable culling + * @type {boolean} + * @default false + */ + culling: false, + + /** + * Mouse cursor when hovered + * @name module:/zrender/graphic/Displayable#cursor + * @type {string} + */ + cursor: 'pointer', + + /** + * If hover area is bounding rect + * @name module:/zrender/graphic/Displayable#rectHover + * @type {string} + */ + rectHover: false, + + /** + * Render the element progressively when the value >= 0, + * usefull for large data. + * @type {boolean} + */ + progressive: false, + + /** + * @type {boolean} + */ + incremental: false, + // inplace is used with incremental + inplace: false, + + beforeBrush: function (ctx) {}, + + afterBrush: function (ctx) {}, + + /** + * 图形绘制方法 + * @param {CanvasRenderingContext2D} ctx + */ + // Interface + brush: function (ctx, prevEl) {}, + + /** + * 获取最小包围盒 + * @return {module:zrender/core/BoundingRect} + */ + // Interface + getBoundingRect: function () {}, + + /** + * 判断坐标 x, y 是否在图形上 + * If displayable element contain coord x, y + * @param {number} x + * @param {number} y + * @return {boolean} + */ + contain: function (x, y) { + return this.rectContain(x, y); + }, + + /** + * @param {Function} cb + * @param {} context + */ + traverse: function (cb, context) { + cb.call(context, this); + }, + + /** + * 判断坐标 x, y 是否在图形的包围盒上 + * If bounding rect of element contain coord x, y + * @param {number} x + * @param {number} y + * @return {boolean} + */ + rectContain: function (x, y) { + var coord = this.transformCoordToLocal(x, y); + var rect = this.getBoundingRect(); + return rect.contain(coord[0], coord[1]); + }, + + /** + * 标记图形元素为脏,并且在下一帧重绘 + * Mark displayable element dirty and refresh next frame + */ + dirty: function () { + this.__dirty = true; + + this._rect = null; + + this.__zr && this.__zr.refresh(); + }, + + /** + * 图形是否会触发事件 + * If displayable object binded any event + * @return {boolean} + */ + // TODO, 通过 bind 绑定的事件 + // isSilent: function () { + // return !( + // this.hoverable || this.draggable + // || this.onmousemove || this.onmouseover || this.onmouseout + // || this.onmousedown || this.onmouseup || this.onclick + // || this.ondragenter || this.ondragover || this.ondragleave + // || this.ondrop + // ); + // }, + /** + * Alias for animate('style') + * @param {boolean} loop + */ + animateStyle: function (loop) { + return this.animate('style', loop); + }, + + attrKV: function (key, value) { + if (key !== 'style') { + Element.prototype.attrKV.call(this, key, value); + } + else { + this.style.set(value); + } + }, + + /** + * @param {Object|string} key + * @param {*} value + */ + setStyle: function (key, value) { + this.style.set(key, value); + this.dirty(false); + return this; + }, + + /** + * Use given style object + * @param {Object} obj + */ + useStyle: function (obj) { + this.style = new Style(obj, this); + this.dirty(false); + return this; + } +}; + +inherits(Displayable, Element); + +mixin(Displayable, RectText); + +/** + * @alias zrender/graphic/Image + * @extends module:zrender/graphic/Displayable + * @constructor + * @param {Object} opts + */ +function ZImage(opts) { + Displayable.call(this, opts); +} + +ZImage.prototype = { + + constructor: ZImage, + + type: 'image', + + brush: function (ctx, prevEl) { + var style = this.style; + var src = style.image; + + // Must bind each time + style.bind(ctx, this, prevEl); + + var image = this._image = createOrUpdateImage( + src, + this._image, + this, + this.onload + ); + + if (!image || !isImageReady(image)) { + return; + } + + // 图片已经加载完成 + // if (image.nodeName.toUpperCase() == 'IMG') { + // if (!image.complete) { + // return; + // } + // } + // Else is canvas + + var x = style.x || 0; + var y = style.y || 0; + var width = style.width; + var height = style.height; + var aspect = image.width / image.height; + if (width == null && height != null) { + // Keep image/height ratio + width = height * aspect; + } + else if (height == null && width != null) { + height = width / aspect; + } + else if (width == null && height == null) { + width = image.width; + height = image.height; + } + + // 设置transform + this.setTransform(ctx); + + if (style.sWidth && style.sHeight) { + var sx = style.sx || 0; + var sy = style.sy || 0; + ctx.drawImage( + image, + sx, sy, style.sWidth, style.sHeight, + x, y, width, height + ); + } + else if (style.sx && style.sy) { + var sx = style.sx; + var sy = style.sy; + var sWidth = width - sx; + var sHeight = height - sy; + ctx.drawImage( + image, + sx, sy, sWidth, sHeight, + x, y, width, height + ); + } + else { + ctx.drawImage(image, x, y, width, height); + } + + // Draw rect text + if (style.text != null) { + // Only restore transform when needs draw text. + this.restoreTransform(ctx); + this.drawRectText(ctx, this.getBoundingRect()); + } + }, + + getBoundingRect: function () { + var style = this.style; + if (! this._rect) { + this._rect = new BoundingRect( + style.x || 0, style.y || 0, style.width || 0, style.height || 0 + ); + } + return this._rect; + } +}; + +inherits(ZImage, Displayable); + +var HOVER_LAYER_ZLEVEL = 1e5; +var CANVAS_ZLEVEL = 314159; + +var EL_AFTER_INCREMENTAL_INC = 0.01; +var INCREMENTAL_INC = 0.001; + +function parseInt10(val) { + return parseInt(val, 10); +} + +function isLayerValid(layer) { + if (!layer) { + return false; + } + + if (layer.__builtin__) { + return true; + } + + if (typeof(layer.resize) !== 'function' + || typeof(layer.refresh) !== 'function' + ) { + return false; + } + + return true; +} + +var tmpRect = new BoundingRect(0, 0, 0, 0); +var viewRect = new BoundingRect(0, 0, 0, 0); +function isDisplayableCulled(el, width, height) { + tmpRect.copy(el.getBoundingRect()); + if (el.transform) { + tmpRect.applyTransform(el.transform); + } + viewRect.width = width; + viewRect.height = height; + return !tmpRect.intersect(viewRect); +} + +function isClipPathChanged(clipPaths, prevClipPaths) { + if (clipPaths == prevClipPaths) { // Can both be null or undefined + return false; + } + + if (!clipPaths || !prevClipPaths || (clipPaths.length !== prevClipPaths.length)) { + return true; + } + for (var i = 0; i < clipPaths.length; i++) { + if (clipPaths[i] !== prevClipPaths[i]) { + return true; + } + } +} + +function doClip(clipPaths, ctx) { + for (var i = 0; i < clipPaths.length; i++) { + var clipPath = clipPaths[i]; + + clipPath.setTransform(ctx); + ctx.beginPath(); + clipPath.buildPath(ctx, clipPath.shape); + ctx.clip(); + // Transform back + clipPath.restoreTransform(ctx); + } +} + +function createRoot(width, height) { + var domRoot = document.createElement('div'); + + // domRoot.onselectstart = returnFalse; // 避免页面选中的尴尬 + domRoot.style.cssText = [ + 'position:relative', + 'overflow:hidden', + 'width:' + width + 'px', + 'height:' + height + 'px', + 'padding:0', + 'margin:0', + 'border-width:0' + ].join(';') + ';'; + + return domRoot; +} + + +/** + * @alias module:zrender/Painter + * @constructor + * @param {HTMLElement} root 绘图容器 + * @param {module:zrender/Storage} storage + * @param {Object} opts + */ +var Painter = function (root, storage, opts) { + + this.type = 'canvas'; + + // In node environment using node-canvas + var singleCanvas = !root.nodeName // In node ? + || root.nodeName.toUpperCase() === 'CANVAS'; + + this._opts = opts = extend({}, opts || {}); + + /** + * @type {number} + */ + this.dpr = opts.devicePixelRatio || devicePixelRatio; + /** + * @type {boolean} + * @private + */ + this._singleCanvas = singleCanvas; + /** + * 绘图容器 + * @type {HTMLElement} + */ + this.root = root; + + var rootStyle = root.style; + + if (rootStyle) { + rootStyle['-webkit-tap-highlight-color'] = 'transparent'; + rootStyle['-webkit-user-select'] = + rootStyle['user-select'] = + rootStyle['-webkit-touch-callout'] = 'none'; + + root.innerHTML = ''; + } + + /** + * @type {module:zrender/Storage} + */ + this.storage = storage; + + /** + * @type {Array.<number>} + * @private + */ + var zlevelList = this._zlevelList = []; + + /** + * @type {Object.<string, module:zrender/Layer>} + * @private + */ + var layers = this._layers = {}; + + /** + * @type {Object.<string, Object>} + * @private + */ + this._layerConfig = {}; + + /** + * zrender will do compositing when root is a canvas and have multiple zlevels. + */ + this._needsManuallyCompositing = false; + + if (!singleCanvas) { + this._width = this._getSize(0); + this._height = this._getSize(1); + + var domRoot = this._domRoot = createRoot( + this._width, this._height + ); + root.appendChild(domRoot); + } + else { + var width = root.width; + var height = root.height; + + if (opts.width != null) { + width = opts.width; + } + if (opts.height != null) { + height = opts.height; + } + this.dpr = opts.devicePixelRatio || 1; + + // Use canvas width and height directly + root.width = width * this.dpr; + root.height = height * this.dpr; + + this._width = width; + this._height = height; + + // Create layer if only one given canvas + // Device can be specified to create a high dpi image. + var mainLayer = new Layer(root, this, this.dpr); + mainLayer.__builtin__ = true; + mainLayer.initContext(); + // FIXME Use canvas width and height + // mainLayer.resize(width, height); + layers[CANVAS_ZLEVEL] = mainLayer; + mainLayer.zlevel = CANVAS_ZLEVEL; + // Not use common zlevel. + zlevelList.push(CANVAS_ZLEVEL); + + this._domRoot = root; + } + + /** + * @type {module:zrender/Layer} + * @private + */ + this._hoverlayer = null; + + this._hoverElements = []; +}; + +Painter.prototype = { + + constructor: Painter, + + getType: function () { + return 'canvas'; + }, + + /** + * If painter use a single canvas + * @return {boolean} + */ + isSingleCanvas: function () { + return this._singleCanvas; + }, + /** + * @return {HTMLDivElement} + */ + getViewportRoot: function () { + return this._domRoot; + }, + + getViewportRootOffset: function () { + var viewportRoot = this.getViewportRoot(); + if (viewportRoot) { + return { + offsetLeft: viewportRoot.offsetLeft || 0, + offsetTop: viewportRoot.offsetTop || 0 + }; + } + }, + + /** + * 刷新 + * @param {boolean} [paintAll=false] 强制绘制所有displayable + */ + refresh: function (paintAll) { + + var list = this.storage.getDisplayList(true); + + var zlevelList = this._zlevelList; + + this._redrawId = Math.random(); + + this._paintList(list, paintAll, this._redrawId); + + // Paint custum layers + for (var i = 0; i < zlevelList.length; i++) { + var z = zlevelList[i]; + var layer = this._layers[z]; + if (!layer.__builtin__ && layer.refresh) { + var clearColor = i === 0 ? this._backgroundColor : null; + layer.refresh(clearColor); + } + } + + this.refreshHover(); + + return this; + }, + + addHover: function (el, hoverStyle) { + if (el.__hoverMir) { + return; + } + var elMirror = new el.constructor({ + style: el.style, + shape: el.shape + }); + elMirror.__from = el; + el.__hoverMir = elMirror; + elMirror.setStyle(hoverStyle); + this._hoverElements.push(elMirror); + }, + + removeHover: function (el) { + var elMirror = el.__hoverMir; + var hoverElements = this._hoverElements; + var idx = indexOf(hoverElements, elMirror); + if (idx >= 0) { + hoverElements.splice(idx, 1); + } + el.__hoverMir = null; + }, + + clearHover: function (el) { + var hoverElements = this._hoverElements; + for (var i = 0; i < hoverElements.length; i++) { + var from = hoverElements[i].__from; + if (from) { + from.__hoverMir = null; + } + } + hoverElements.length = 0; + }, + + refreshHover: function () { + var hoverElements = this._hoverElements; + var len = hoverElements.length; + var hoverLayer = this._hoverlayer; + hoverLayer && hoverLayer.clear(); + + if (!len) { + return; + } + sort(hoverElements, this.storage.displayableSortFunc); + + // Use a extream large zlevel + // FIXME? + if (!hoverLayer) { + hoverLayer = this._hoverlayer = this.getLayer(HOVER_LAYER_ZLEVEL); + } + + var scope = {}; + hoverLayer.ctx.save(); + for (var i = 0; i < len;) { + var el = hoverElements[i]; + var originalEl = el.__from; + // Original el is removed + // PENDING + if (!(originalEl && originalEl.__zr)) { + hoverElements.splice(i, 1); + originalEl.__hoverMir = null; + len--; + continue; + } + i++; + + // Use transform + // FIXME style and shape ? + if (!originalEl.invisible) { + el.transform = originalEl.transform; + el.invTransform = originalEl.invTransform; + el.__clipPaths = originalEl.__clipPaths; + // el. + this._doPaintEl(el, hoverLayer, true, scope); + } + } + hoverLayer.ctx.restore(); + }, + + getHoverLayer: function () { + return this.getLayer(HOVER_LAYER_ZLEVEL); + }, + + _paintList: function (list, paintAll, redrawId) { + if (this._redrawId !== redrawId) { + return; + } + + paintAll = paintAll || false; + + this._updateLayerStatus(list); + + var finished = this._doPaintList(list, paintAll); + + if (this._needsManuallyCompositing) { + this._compositeManually(); + } + + if (!finished) { + var self = this; + requestAnimationFrame(function () { + self._paintList(list, paintAll, redrawId); + }); + } + }, + + _compositeManually: function () { + var ctx = this.getLayer(CANVAS_ZLEVEL).ctx; + var width = this._domRoot.width; + var height = this._domRoot.height; + ctx.clearRect(0, 0, width, height); + // PENDING, If only builtin layer? + this.eachBuiltinLayer(function (layer) { + if (layer.virtual) { + ctx.drawImage(layer.dom, 0, 0, width, height); + } + }); + }, + + _doPaintList: function (list, paintAll) { + var layerList = []; + for (var zi = 0; zi < this._zlevelList.length; zi++) { + var zlevel = this._zlevelList[zi]; + var layer = this._layers[zlevel]; + if (layer.__builtin__ + && layer !== this._hoverlayer + && (layer.__dirty || paintAll) + ) { + layerList.push(layer); + } + } + + var finished = true; + + for (var k = 0; k < layerList.length; k++) { + var layer = layerList[k]; + var ctx = layer.ctx; + var scope = {}; + ctx.save(); + + var start = paintAll ? layer.__startIndex : layer.__drawIndex; + + var useTimer = !paintAll && layer.incremental && Date.now; + var startTime = useTimer && Date.now(); + + var clearColor = layer.zlevel === this._zlevelList[0] + ? this._backgroundColor : null; + // All elements in this layer are cleared. + if (layer.__startIndex === layer.__endIndex) { + layer.clear(false, clearColor); + } + else if (start === layer.__startIndex) { + var firstEl = list[start]; + if (!firstEl.incremental || !firstEl.notClear || paintAll) { + layer.clear(false, clearColor); + } + } + if (start === -1) { + console.error('For some unknown reason. drawIndex is -1'); + start = layer.__startIndex; + } + for (var i = start; i < layer.__endIndex; i++) { + var el = list[i]; + this._doPaintEl(el, layer, paintAll, scope); + el.__dirty = false; + + if (useTimer) { + // Date.now can be executed in 13,025,305 ops/second. + var dTime = Date.now() - startTime; + // Give 15 millisecond to draw. + // The rest elements will be drawn in the next frame. + if (dTime > 15) { + break; + } + } + } + + layer.__drawIndex = i; + + if (layer.__drawIndex < layer.__endIndex) { + finished = false; + } + + if (scope.prevElClipPaths) { + // Needs restore the state. If last drawn element is in the clipping area. + ctx.restore(); + } + + ctx.restore(); + } + + if (env$1.wxa) { + // Flush for weixin application + each$1(this._layers, function (layer) { + if (layer && layer.ctx && layer.ctx.draw) { + layer.ctx.draw(); + } + }); + } + + return finished; + }, + + _doPaintEl: function (el, currentLayer, forcePaint, scope) { + var ctx = currentLayer.ctx; + var m = el.transform; + if ( + (currentLayer.__dirty || forcePaint) + // Ignore invisible element + && !el.invisible + // Ignore transparent element + && el.style.opacity !== 0 + // Ignore scale 0 element, in some environment like node-canvas + // Draw a scale 0 element can cause all following draw wrong + // And setTransform with scale 0 will cause set back transform failed. + && !(m && !m[0] && !m[3]) + // Ignore culled element + && !(el.culling && isDisplayableCulled(el, this._width, this._height)) + ) { + + var clipPaths = el.__clipPaths; + + // Optimize when clipping on group with several elements + if (!scope.prevElClipPaths + || isClipPathChanged(clipPaths, scope.prevElClipPaths) + ) { + // If has previous clipping state, restore from it + if (scope.prevElClipPaths) { + currentLayer.ctx.restore(); + scope.prevElClipPaths = null; + + // Reset prevEl since context has been restored + scope.prevEl = null; + } + // New clipping state + if (clipPaths) { + ctx.save(); + doClip(clipPaths, ctx); + scope.prevElClipPaths = clipPaths; + } + } + el.beforeBrush && el.beforeBrush(ctx); + + el.brush(ctx, scope.prevEl || null); + scope.prevEl = el; + + el.afterBrush && el.afterBrush(ctx); + } + }, + + /** + * 获取 zlevel 所在层,如果不存在则会创建一个新的层 + * @param {number} zlevel + * @param {boolean} virtual Virtual layer will not be inserted into dom. + * @return {module:zrender/Layer} + */ + getLayer: function (zlevel, virtual) { + if (this._singleCanvas && !this._needsManuallyCompositing) { + zlevel = CANVAS_ZLEVEL; + } + var layer = this._layers[zlevel]; + if (!layer) { + // Create a new layer + layer = new Layer('zr_' + zlevel, this, this.dpr); + layer.zlevel = zlevel; + layer.__builtin__ = true; + + if (this._layerConfig[zlevel]) { + merge(layer, this._layerConfig[zlevel], true); + } + + if (virtual) { + layer.virtual = virtual; + } + + this.insertLayer(zlevel, layer); + + // Context is created after dom inserted to document + // Or excanvas will get 0px clientWidth and clientHeight + layer.initContext(); + } + + return layer; + }, + + insertLayer: function (zlevel, layer) { + + var layersMap = this._layers; + var zlevelList = this._zlevelList; + var len = zlevelList.length; + var prevLayer = null; + var i = -1; + var domRoot = this._domRoot; + + if (layersMap[zlevel]) { + zrLog('ZLevel ' + zlevel + ' has been used already'); + return; + } + // Check if is a valid layer + if (!isLayerValid(layer)) { + zrLog('Layer of zlevel ' + zlevel + ' is not valid'); + return; + } + + if (len > 0 && zlevel > zlevelList[0]) { + for (i = 0; i < len - 1; i++) { + if ( + zlevelList[i] < zlevel + && zlevelList[i + 1] > zlevel + ) { + break; + } + } + prevLayer = layersMap[zlevelList[i]]; + } + zlevelList.splice(i + 1, 0, zlevel); + + layersMap[zlevel] = layer; + + // Vitual layer will not directly show on the screen. + // (It can be a WebGL layer and assigned to a ZImage element) + // But it still under management of zrender. + if (!layer.virtual) { + if (prevLayer) { + var prevDom = prevLayer.dom; + if (prevDom.nextSibling) { + domRoot.insertBefore( + layer.dom, + prevDom.nextSibling + ); + } + else { + domRoot.appendChild(layer.dom); + } + } + else { + if (domRoot.firstChild) { + domRoot.insertBefore(layer.dom, domRoot.firstChild); + } + else { + domRoot.appendChild(layer.dom); + } + } + } + }, + + // Iterate each layer + eachLayer: function (cb, context) { + var zlevelList = this._zlevelList; + var z; + var i; + for (i = 0; i < zlevelList.length; i++) { + z = zlevelList[i]; + cb.call(context, this._layers[z], z); + } + }, + + // Iterate each buildin layer + eachBuiltinLayer: function (cb, context) { + var zlevelList = this._zlevelList; + var layer; + var z; + var i; + for (i = 0; i < zlevelList.length; i++) { + z = zlevelList[i]; + layer = this._layers[z]; + if (layer.__builtin__) { + cb.call(context, layer, z); + } + } + }, + + // Iterate each other layer except buildin layer + eachOtherLayer: function (cb, context) { + var zlevelList = this._zlevelList; + var layer; + var z; + var i; + for (i = 0; i < zlevelList.length; i++) { + z = zlevelList[i]; + layer = this._layers[z]; + if (!layer.__builtin__) { + cb.call(context, layer, z); + } + } + }, + + /** + * 获取所有已创建的层 + * @param {Array.<module:zrender/Layer>} [prevLayer] + */ + getLayers: function () { + return this._layers; + }, + + _updateLayerStatus: function (list) { + + this.eachBuiltinLayer(function (layer, z) { + layer.__dirty = layer.__used = false; + }); + + function updatePrevLayer(idx) { + if (prevLayer) { + if (prevLayer.__endIndex !== idx) { + prevLayer.__dirty = true; + } + prevLayer.__endIndex = idx; + } + } + + if (this._singleCanvas) { + for (var i = 1; i < list.length; i++) { + var el = list[i]; + if (el.zlevel !== list[i - 1].zlevel || el.incremental) { + this._needsManuallyCompositing = true; + break; + } + } + } + + var prevLayer = null; + var incrementalLayerCount = 0; + for (var i = 0; i < list.length; i++) { + var el = list[i]; + var zlevel = el.zlevel; + var layer; + // PENDING If change one incremental element style ? + // TODO Where there are non-incremental elements between incremental elements. + if (el.incremental) { + layer = this.getLayer(zlevel + INCREMENTAL_INC, this._needsManuallyCompositing); + layer.incremental = true; + incrementalLayerCount = 1; + } + else { + layer = this.getLayer(zlevel + (incrementalLayerCount > 0 ? EL_AFTER_INCREMENTAL_INC : 0), this._needsManuallyCompositing); + } + + if (!layer.__builtin__) { + zrLog('ZLevel ' + zlevel + ' has been used by unkown layer ' + layer.id); + } + + if (layer !== prevLayer) { + layer.__used = true; + if (layer.__startIndex !== i) { + layer.__dirty = true; + } + layer.__startIndex = i; + if (!layer.incremental) { + layer.__drawIndex = i; + } + else { + // Mark layer draw index needs to update. + layer.__drawIndex = -1; + } + updatePrevLayer(i); + prevLayer = layer; + } + if (el.__dirty) { + layer.__dirty = true; + if (layer.incremental && layer.__drawIndex < 0) { + // Start draw from the first dirty element. + layer.__drawIndex = i; + } + } + } + + updatePrevLayer(i); + + this.eachBuiltinLayer(function (layer, z) { + // Used in last frame but not in this frame. Needs clear + if (!layer.__used && layer.getElementCount() > 0) { + layer.__dirty = true; + layer.__startIndex = layer.__endIndex = layer.__drawIndex = 0; + } + // For incremental layer. In case start index changed and no elements are dirty. + if (layer.__dirty && layer.__drawIndex < 0) { + layer.__drawIndex = layer.__startIndex; + } + }); + }, + + /** + * 清除hover层外所有内容 + */ + clear: function () { + this.eachBuiltinLayer(this._clearLayer); + return this; + }, + + _clearLayer: function (layer) { + layer.clear(); + }, + + setBackgroundColor: function (backgroundColor) { + this._backgroundColor = backgroundColor; + }, + + /** + * 修改指定zlevel的绘制参数 + * + * @param {string} zlevel + * @param {Object} config 配置对象 + * @param {string} [config.clearColor=0] 每次清空画布的颜色 + * @param {string} [config.motionBlur=false] 是否开启动态模糊 + * @param {number} [config.lastFrameAlpha=0.7] + * 在开启动态模糊的时候使用,与上一帧混合的alpha值,值越大尾迹越明显 + */ + configLayer: function (zlevel, config) { + if (config) { + var layerConfig = this._layerConfig; + if (!layerConfig[zlevel]) { + layerConfig[zlevel] = config; + } + else { + merge(layerConfig[zlevel], config, true); + } + + for (var i = 0; i < this._zlevelList.length; i++) { + var _zlevel = this._zlevelList[i]; + if (_zlevel === zlevel || _zlevel === zlevel + EL_AFTER_INCREMENTAL_INC) { + var layer = this._layers[_zlevel]; + merge(layer, layerConfig[zlevel], true); + } + } + } + }, + + /** + * 删除指定层 + * @param {number} zlevel 层所在的zlevel + */ + delLayer: function (zlevel) { + var layers = this._layers; + var zlevelList = this._zlevelList; + var layer = layers[zlevel]; + if (!layer) { + return; + } + layer.dom.parentNode.removeChild(layer.dom); + delete layers[zlevel]; + + zlevelList.splice(indexOf(zlevelList, zlevel), 1); + }, + + /** + * 区域大小变化后重绘 + */ + resize: function (width, height) { + if (!this._domRoot.style) { // Maybe in node or worker + if (width == null || height == null) { + return; + } + this._width = width; + this._height = height; + + this.getLayer(CANVAS_ZLEVEL).resize(width, height); + } + else { + var domRoot = this._domRoot; + // FIXME Why ? + domRoot.style.display = 'none'; + + // Save input w/h + var opts = this._opts; + width != null && (opts.width = width); + height != null && (opts.height = height); + + width = this._getSize(0); + height = this._getSize(1); + + domRoot.style.display = ''; + + // 优化没有实际改变的resize + if (this._width != width || height != this._height) { + domRoot.style.width = width + 'px'; + domRoot.style.height = height + 'px'; + + for (var id in this._layers) { + if (this._layers.hasOwnProperty(id)) { + this._layers[id].resize(width, height); + } + } + each$1(this._progressiveLayers, function (layer) { + layer.resize(width, height); + }); + + this.refresh(true); + } + + this._width = width; + this._height = height; + + } + return this; + }, + + /** + * 清除单独的一个层 + * @param {number} zlevel + */ + clearLayer: function (zlevel) { + var layer = this._layers[zlevel]; + if (layer) { + layer.clear(); + } + }, + + /** + * 释放 + */ + dispose: function () { + this.root.innerHTML = ''; + + this.root = + this.storage = + + this._domRoot = + this._layers = null; + }, + + /** + * Get canvas which has all thing rendered + * @param {Object} opts + * @param {string} [opts.backgroundColor] + * @param {number} [opts.pixelRatio] + */ + getRenderedCanvas: function (opts) { + opts = opts || {}; + if (this._singleCanvas && !this._compositeManually) { + return this._layers[CANVAS_ZLEVEL].dom; + } + + var imageLayer = new Layer('image', this, opts.pixelRatio || this.dpr); + imageLayer.initContext(); + imageLayer.clear(false, opts.backgroundColor || this._backgroundColor); + + if (opts.pixelRatio <= this.dpr) { + this.refresh(); + + var width = imageLayer.dom.width; + var height = imageLayer.dom.height; + var ctx = imageLayer.ctx; + this.eachLayer(function (layer) { + if (layer.__builtin__) { + ctx.drawImage(layer.dom, 0, 0, width, height); + } + else if (layer.renderToCanvas) { + imageLayer.ctx.save(); + layer.renderToCanvas(imageLayer.ctx); + imageLayer.ctx.restore(); + } + }); + } + else { + // PENDING, echarts-gl and incremental rendering. + var scope = {}; + var displayList = this.storage.getDisplayList(true); + for (var i = 0; i < displayList.length; i++) { + var el = displayList[i]; + this._doPaintEl(el, imageLayer, true, scope); + } + } + + return imageLayer.dom; + }, + /** + * 获取绘图区域宽度 + */ + getWidth: function () { + return this._width; + }, + + /** + * 获取绘图区域高度 + */ + getHeight: function () { + return this._height; + }, + + _getSize: function (whIdx) { + var opts = this._opts; + var wh = ['width', 'height'][whIdx]; + var cwh = ['clientWidth', 'clientHeight'][whIdx]; + var plt = ['paddingLeft', 'paddingTop'][whIdx]; + var prb = ['paddingRight', 'paddingBottom'][whIdx]; + + if (opts[wh] != null && opts[wh] !== 'auto') { + return parseFloat(opts[wh]); + } + + var root = this.root; + // IE8 does not support getComputedStyle, but it use VML. + var stl = document.defaultView.getComputedStyle(root); + + return ( + (root[cwh] || parseInt10(stl[wh]) || parseInt10(root.style[wh])) + - (parseInt10(stl[plt]) || 0) + - (parseInt10(stl[prb]) || 0) + ) | 0; + }, + + pathToImage: function (path, dpr) { + dpr = dpr || this.dpr; + + var canvas = document.createElement('canvas'); + var ctx = canvas.getContext('2d'); + var rect = path.getBoundingRect(); + var style = path.style; + var shadowBlurSize = style.shadowBlur * dpr; + var shadowOffsetX = style.shadowOffsetX * dpr; + var shadowOffsetY = style.shadowOffsetY * dpr; + var lineWidth = style.hasStroke() ? style.lineWidth : 0; + + var leftMargin = Math.max(lineWidth / 2, -shadowOffsetX + shadowBlurSize); + var rightMargin = Math.max(lineWidth / 2, shadowOffsetX + shadowBlurSize); + var topMargin = Math.max(lineWidth / 2, -shadowOffsetY + shadowBlurSize); + var bottomMargin = Math.max(lineWidth / 2, shadowOffsetY + shadowBlurSize); + var width = rect.width + leftMargin + rightMargin; + var height = rect.height + topMargin + bottomMargin; + + canvas.width = width * dpr; + canvas.height = height * dpr; + + ctx.scale(dpr, dpr); + ctx.clearRect(0, 0, width, height); + ctx.dpr = dpr; + + var pathTransform = { + position: path.position, + rotation: path.rotation, + scale: path.scale + }; + path.position = [leftMargin - rect.x, topMargin - rect.y]; + path.rotation = 0; + path.scale = [1, 1]; + path.updateTransform(); + if (path) { + path.brush(ctx); + } + + var ImageShape = ZImage; + var imgShape = new ImageShape({ + style: { + x: 0, + y: 0, + image: canvas + } + }); + + if (pathTransform.position != null) { + imgShape.position = path.position = pathTransform.position; + } + + if (pathTransform.rotation != null) { + imgShape.rotation = path.rotation = pathTransform.rotation; + } + + if (pathTransform.scale != null) { + imgShape.scale = path.scale = pathTransform.scale; + } + + return imgShape; + } +}; + +/** + * 事件辅助类 + * @module zrender/core/event + * @author Kener (@Kener-林峰, kener.linfeng@gmail.com) + */ + +var isDomLevel2 = (typeof window !== 'undefined') && !!window.addEventListener; + +var MOUSE_EVENT_REG = /^(?:mouse|pointer|contextmenu|drag|drop)|click/; + +function getBoundingClientRect(el) { + // BlackBerry 5, iOS 3 (original iPhone) don't have getBoundingRect + return el.getBoundingClientRect ? el.getBoundingClientRect() : {left: 0, top: 0}; +} + +// `calculate` is optional, default false +function clientToLocal(el, e, out, calculate) { + out = out || {}; + + // According to the W3C Working Draft, offsetX and offsetY should be relative + // to the padding edge of the target element. The only browser using this convention + // is IE. Webkit uses the border edge, Opera uses the content edge, and FireFox does + // not support the properties. + // (see http://www.jacklmoore.com/notes/mouse-position/) + // In zr painter.dom, padding edge equals to border edge. + + // FIXME + // When mousemove event triggered on ec tooltip, target is not zr painter.dom, and + // offsetX/Y is relative to e.target, where the calculation of zrX/Y via offsetX/Y + // is too complex. So css-transfrom dont support in this case temporarily. + if (calculate || !env$1.canvasSupported) { + defaultGetZrXY(el, e, out); + } + // Caution: In FireFox, layerX/layerY Mouse position relative to the closest positioned + // ancestor element, so we should make sure el is positioned (e.g., not position:static). + // BTW1, Webkit don't return the same results as FF in non-simple cases (like add + // zoom-factor, overflow / opacity layers, transforms ...) + // BTW2, (ev.offsetY || ev.pageY - $(ev.target).offset().top) is not correct in preserve-3d. + // <https://bugs.jquery.com/ticket/8523#comment:14> + // BTW3, In ff, offsetX/offsetY is always 0. + else if (env$1.browser.firefox && e.layerX != null && e.layerX !== e.offsetX) { + out.zrX = e.layerX; + out.zrY = e.layerY; + } + // For IE6+, chrome, safari, opera. (When will ff support offsetX?) + else if (e.offsetX != null) { + out.zrX = e.offsetX; + out.zrY = e.offsetY; + } + // For some other device, e.g., IOS safari. + else { + defaultGetZrXY(el, e, out); + } + + return out; +} + +function defaultGetZrXY(el, e, out) { + // This well-known method below does not support css transform. + var box = getBoundingClientRect(el); + out.zrX = e.clientX - box.left; + out.zrY = e.clientY - box.top; +} + +/** + * 如果存在第三方嵌入的一些dom触发的事件,或touch事件,需要转换一下事件坐标. + * `calculate` is optional, default false. + */ +function normalizeEvent(el, e, calculate) { + + e = e || window.event; + + if (e.zrX != null) { + return e; + } + + var eventType = e.type; + var isTouch = eventType && eventType.indexOf('touch') >= 0; + + if (!isTouch) { + clientToLocal(el, e, e, calculate); + e.zrDelta = (e.wheelDelta) ? e.wheelDelta / 120 : -(e.detail || 0) / 3; + } + else { + var touch = eventType != 'touchend' + ? e.targetTouches[0] + : e.changedTouches[0]; + touch && clientToLocal(el, touch, e, calculate); + } + + // Add which for click: 1 === left; 2 === middle; 3 === right; otherwise: 0; + // See jQuery: https://github.com/jquery/jquery/blob/master/src/event.js + // If e.which has been defined, if may be readonly, + // see: https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/which + var button = e.button; + if (e.which == null && button !== undefined && MOUSE_EVENT_REG.test(e.type)) { + e.which = (button & 1 ? 1 : (button & 2 ? 3 : (button & 4 ? 2 : 0))); + } + + return e; +} + +/** + * @param {HTMLElement} el + * @param {string} name + * @param {Function} handler + */ +function addEventListener(el, name, handler) { + if (isDomLevel2) { + // Reproduct the console warning: + // [Violation] Added non-passive event listener to a scroll-blocking <some> event. + // Consider marking event handler as 'passive' to make the page more responsive. + // Just set console log level: verbose in chrome dev tool. + // then the warning log will be printed when addEventListener called. + // See https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md + // We have not yet found a neat way to using passive. Because in zrender the dom event + // listener delegate all of the upper events of element. Some of those events need + // to prevent default. For example, the feature `preventDefaultMouseMove` of echarts. + // Before passive can be adopted, these issues should be considered: + // (1) Whether and how a zrender user specifies an event listener passive. And by default, + // passive or not. + // (2) How to tread that some zrender event listener is passive, and some is not. If + // we use other way but not preventDefault of mousewheel and touchmove, browser + // compatibility should be handled. + + // var opts = (env.passiveSupported && name === 'mousewheel') + // ? {passive: true} + // // By default, the third param of el.addEventListener is `capture: false`. + // : void 0; + // el.addEventListener(name, handler /* , opts */); + el.addEventListener(name, handler); + } + else { + el.attachEvent('on' + name, handler); + } +} + +function removeEventListener(el, name, handler) { + if (isDomLevel2) { + el.removeEventListener(name, handler); + } + else { + el.detachEvent('on' + name, handler); + } +} + +/** + * preventDefault and stopPropagation. + * Notice: do not do that in zrender. Upper application + * do that if necessary. + * + * @memberOf module:zrender/core/event + * @method + * @param {Event} e : event对象 + */ +var stop = isDomLevel2 + ? function (e) { + e.preventDefault(); + e.stopPropagation(); + e.cancelBubble = true; + } + : function (e) { + e.returnValue = false; + e.cancelBubble = true; + }; + +function notLeftMouse(e) { + // If e.which is undefined, considered as left mouse event. + return e.which > 1; +} + +/** + * 动画主类, 调度和管理所有动画控制器 + * + * @module zrender/animation/Animation + * @author pissang(https://github.com/pissang) + */ +// TODO Additive animation +// http://iosoteric.com/additive-animations-animatewithduration-in-ios-8/ +// https://developer.apple.com/videos/wwdc2014/#236 + +/** + * @typedef {Object} IZRenderStage + * @property {Function} update + */ + +/** + * @alias module:zrender/animation/Animation + * @constructor + * @param {Object} [options] + * @param {Function} [options.onframe] + * @param {IZRenderStage} [options.stage] + * @example + * var animation = new Animation(); + * var obj = { + * x: 100, + * y: 100 + * }; + * animation.animate(node.position) + * .when(1000, { + * x: 500, + * y: 500 + * }) + * .when(2000, { + * x: 100, + * y: 100 + * }) + * .start('spline'); + */ +var Animation = function (options) { + + options = options || {}; + + this.stage = options.stage || {}; + + this.onframe = options.onframe || function() {}; + + // private properties + this._clips = []; + + this._running = false; + + this._time; + + this._pausedTime; + + this._pauseStart; + + this._paused = false; + + Eventful.call(this); +}; + +Animation.prototype = { + + constructor: Animation, + /** + * 添加 clip + * @param {module:zrender/animation/Clip} clip + */ + addClip: function (clip) { + this._clips.push(clip); + }, + /** + * 添加 animator + * @param {module:zrender/animation/Animator} animator + */ + addAnimator: function (animator) { + animator.animation = this; + var clips = animator.getClips(); + for (var i = 0; i < clips.length; i++) { + this.addClip(clips[i]); + } + }, + /** + * 删除动画片段 + * @param {module:zrender/animation/Clip} clip + */ + removeClip: function(clip) { + var idx = indexOf(this._clips, clip); + if (idx >= 0) { + this._clips.splice(idx, 1); + } + }, + + /** + * 删除动画片段 + * @param {module:zrender/animation/Animator} animator + */ + removeAnimator: function (animator) { + var clips = animator.getClips(); + for (var i = 0; i < clips.length; i++) { + this.removeClip(clips[i]); + } + animator.animation = null; + }, + + _update: function() { + var time = new Date().getTime() - this._pausedTime; + var delta = time - this._time; + var clips = this._clips; + var len = clips.length; + + var deferredEvents = []; + var deferredClips = []; + for (var i = 0; i < len; i++) { + var clip = clips[i]; + var e = clip.step(time, delta); + // Throw out the events need to be called after + // stage.update, like destroy + if (e) { + deferredEvents.push(e); + deferredClips.push(clip); + } + } + + // Remove the finished clip + for (var i = 0; i < len;) { + if (clips[i]._needsRemove) { + clips[i] = clips[len - 1]; + clips.pop(); + len--; + } + else { + i++; + } + } + + len = deferredEvents.length; + for (var i = 0; i < len; i++) { + deferredClips[i].fire(deferredEvents[i]); + } + + this._time = time; + + this.onframe(delta); + + // 'frame' should be triggered before stage, because upper application + // depends on the sequence (e.g., echarts-stream and finish + // event judge) + this.trigger('frame', delta); + + if (this.stage.update) { + this.stage.update(); + } + }, + + _startLoop: function () { + var self = this; + + this._running = true; + + function step() { + if (self._running) { + + requestAnimationFrame(step); + + !self._paused && self._update(); + } + } + + requestAnimationFrame(step); + }, + + /** + * Start animation. + */ + start: function () { + + this._time = new Date().getTime(); + this._pausedTime = 0; + + this._startLoop(); + }, + + /** + * Stop animation. + */ + stop: function () { + this._running = false; + }, + + /** + * Pause animation. + */ + pause: function () { + if (!this._paused) { + this._pauseStart = new Date().getTime(); + this._paused = true; + } + }, + + /** + * Resume animation. + */ + resume: function () { + if (this._paused) { + this._pausedTime += (new Date().getTime()) - this._pauseStart; + this._paused = false; + } + }, + + /** + * Clear animation. + */ + clear: function () { + this._clips = []; + }, + + /** + * Whether animation finished. + */ + isFinished: function () { + return !this._clips.length; + }, + + /** + * Creat animator for a target, whose props can be animated. + * + * @param {Object} target + * @param {Object} options + * @param {boolean} [options.loop=false] Whether loop animation. + * @param {Function} [options.getter=null] Get value from target. + * @param {Function} [options.setter=null] Set value to target. + * @return {module:zrender/animation/Animation~Animator} + */ + // TODO Gap + animate: function (target, options) { + options = options || {}; + + var animator = new Animator( + target, + options.loop, + options.getter, + options.setter + ); + + this.addAnimator(animator); + + return animator; + } +}; + +mixin(Animation, Eventful); + +/** + * Only implements needed gestures for mobile. + */ + +var GestureMgr = function () { + + /** + * @private + * @type {Array.<Object>} + */ + this._track = []; +}; + +GestureMgr.prototype = { + + constructor: GestureMgr, + + recognize: function (event, target, root) { + this._doTrack(event, target, root); + return this._recognize(event); + }, + + clear: function () { + this._track.length = 0; + return this; + }, + + _doTrack: function (event, target, root) { + var touches = event.touches; + + if (!touches) { + return; + } + + var trackItem = { + points: [], + touches: [], + target: target, + event: event + }; + + for (var i = 0, len = touches.length; i < len; i++) { + var touch = touches[i]; + var pos = clientToLocal(root, touch, {}); + trackItem.points.push([pos.zrX, pos.zrY]); + trackItem.touches.push(touch); + } + + this._track.push(trackItem); + }, + + _recognize: function (event) { + for (var eventName in recognizers) { + if (recognizers.hasOwnProperty(eventName)) { + var gestureInfo = recognizers[eventName](this._track, event); + if (gestureInfo) { + return gestureInfo; + } + } + } + } +}; + +function dist$1(pointPair) { + var dx = pointPair[1][0] - pointPair[0][0]; + var dy = pointPair[1][1] - pointPair[0][1]; + + return Math.sqrt(dx * dx + dy * dy); +} + +function center(pointPair) { + return [ + (pointPair[0][0] + pointPair[1][0]) / 2, + (pointPair[0][1] + pointPair[1][1]) / 2 + ]; +} + +var recognizers = { + + pinch: function (track, event) { + var trackLen = track.length; + + if (!trackLen) { + return; + } + + var pinchEnd = (track[trackLen - 1] || {}).points; + var pinchPre = (track[trackLen - 2] || {}).points || pinchEnd; + + if (pinchPre + && pinchPre.length > 1 + && pinchEnd + && pinchEnd.length > 1 + ) { + var pinchScale = dist$1(pinchEnd) / dist$1(pinchPre); + !isFinite(pinchScale) && (pinchScale = 1); + + event.pinchScale = pinchScale; + + var pinchCenter = center(pinchEnd); + event.pinchX = pinchCenter[0]; + event.pinchY = pinchCenter[1]; + + return { + type: 'pinch', + target: track[0].target, + event: event + }; + } + } + + // Only pinch currently. +}; + +var TOUCH_CLICK_DELAY = 300; + +var mouseHandlerNames = [ + 'click', 'dblclick', 'mousewheel', 'mouseout', + 'mouseup', 'mousedown', 'mousemove', 'contextmenu' +]; + +var touchHandlerNames = [ + 'touchstart', 'touchend', 'touchmove' +]; + +var pointerEventNames = { + pointerdown: 1, pointerup: 1, pointermove: 1, pointerout: 1 +}; + +var pointerHandlerNames = map(mouseHandlerNames, function (name) { + var nm = name.replace('mouse', 'pointer'); + return pointerEventNames[nm] ? nm : name; +}); + +function eventNameFix(name) { + return (name === 'mousewheel' && env$1.browser.firefox) ? 'DOMMouseScroll' : name; +} + +function processGesture(proxy, event, stage) { + var gestureMgr = proxy._gestureMgr; + + stage === 'start' && gestureMgr.clear(); + + var gestureInfo = gestureMgr.recognize( + event, + proxy.handler.findHover(event.zrX, event.zrY, null).target, + proxy.dom + ); + + stage === 'end' && gestureMgr.clear(); + + // Do not do any preventDefault here. Upper application do that if necessary. + if (gestureInfo) { + var type = gestureInfo.type; + event.gestureEvent = type; + + proxy.handler.dispatchToElement({target: gestureInfo.target}, type, gestureInfo.event); + } +} + +// function onMSGestureChange(proxy, event) { +// if (event.translationX || event.translationY) { +// // mousemove is carried by MSGesture to reduce the sensitivity. +// proxy.handler.dispatchToElement(event.target, 'mousemove', event); +// } +// if (event.scale !== 1) { +// event.pinchX = event.offsetX; +// event.pinchY = event.offsetY; +// event.pinchScale = event.scale; +// proxy.handler.dispatchToElement(event.target, 'pinch', event); +// } +// } + +/** + * Prevent mouse event from being dispatched after Touch Events action + * @see <https://github.com/deltakosh/handjs/blob/master/src/hand.base.js> + * 1. Mobile browsers dispatch mouse events 300ms after touchend. + * 2. Chrome for Android dispatch mousedown for long-touch about 650ms + * Result: Blocking Mouse Events for 700ms. + */ +function setTouchTimer(instance) { + instance._touching = true; + clearTimeout(instance._touchTimer); + instance._touchTimer = setTimeout(function () { + instance._touching = false; + }, 700); +} + + +var domHandlers = { + /** + * Mouse move handler + * @inner + * @param {Event} event + */ + mousemove: function (event) { + event = normalizeEvent(this.dom, event); + + this.trigger('mousemove', event); + }, + + /** + * Mouse out handler + * @inner + * @param {Event} event + */ + mouseout: function (event) { + event = normalizeEvent(this.dom, event); + + var element = event.toElement || event.relatedTarget; + if (element != this.dom) { + while (element && element.nodeType != 9) { + // 忽略包含在root中的dom引起的mouseOut + if (element === this.dom) { + return; + } + + element = element.parentNode; + } + } + + this.trigger('mouseout', event); + }, + + /** + * Touch开始响应函数 + * @inner + * @param {Event} event + */ + touchstart: function (event) { + // Default mouse behaviour should not be disabled here. + // For example, page may needs to be slided. + event = normalizeEvent(this.dom, event); + + // Mark touch, which is useful in distinguish touch and + // mouse event in upper applicatoin. + event.zrByTouch = true; + + this._lastTouchMoment = new Date(); + + processGesture(this, event, 'start'); + + // In touch device, trigger `mousemove`(`mouseover`) should + // be triggered, and must before `mousedown` triggered. + domHandlers.mousemove.call(this, event); + + domHandlers.mousedown.call(this, event); + + setTouchTimer(this); + }, + + /** + * Touch移动响应函数 + * @inner + * @param {Event} event + */ + touchmove: function (event) { + + event = normalizeEvent(this.dom, event); + + // Mark touch, which is useful in distinguish touch and + // mouse event in upper applicatoin. + event.zrByTouch = true; + + processGesture(this, event, 'change'); + + // Mouse move should always be triggered no matter whether + // there is gestrue event, because mouse move and pinch may + // be used at the same time. + domHandlers.mousemove.call(this, event); + + setTouchTimer(this); + }, + + /** + * Touch结束响应函数 + * @inner + * @param {Event} event + */ + touchend: function (event) { + + event = normalizeEvent(this.dom, event); + + // Mark touch, which is useful in distinguish touch and + // mouse event in upper applicatoin. + event.zrByTouch = true; + + processGesture(this, event, 'end'); + + domHandlers.mouseup.call(this, event); + + // Do not trigger `mouseout` here, in spite of `mousemove`(`mouseover`) is + // triggered in `touchstart`. This seems to be illogical, but by this mechanism, + // we can conveniently implement "hover style" in both PC and touch device just + // by listening to `mouseover` to add "hover style" and listening to `mouseout` + // to remove "hover style" on an element, without any additional code for + // compatibility. (`mouseout` will not be triggered in `touchend`, so "hover + // style" will remain for user view) + + // click event should always be triggered no matter whether + // there is gestrue event. System click can not be prevented. + if (+new Date() - this._lastTouchMoment < TOUCH_CLICK_DELAY) { + domHandlers.click.call(this, event); + } + + setTouchTimer(this); + }, + + pointerdown: function (event) { + domHandlers.mousedown.call(this, event); + + // if (useMSGuesture(this, event)) { + // this._msGesture.addPointer(event.pointerId); + // } + }, + + pointermove: function (event) { + // FIXME + // pointermove is so sensitive that it always triggered when + // tap(click) on touch screen, which affect some judgement in + // upper application. So, we dont support mousemove on MS touch + // device yet. + if (!isPointerFromTouch(event)) { + domHandlers.mousemove.call(this, event); + } + }, + + pointerup: function (event) { + domHandlers.mouseup.call(this, event); + }, + + pointerout: function (event) { + // pointerout will be triggered when tap on touch screen + // (IE11+/Edge on MS Surface) after click event triggered, + // which is inconsistent with the mousout behavior we defined + // in touchend. So we unify them. + // (check domHandlers.touchend for detailed explanation) + if (!isPointerFromTouch(event)) { + domHandlers.mouseout.call(this, event); + } + } +}; + +function isPointerFromTouch(event) { + var pointerType = event.pointerType; + return pointerType === 'pen' || pointerType === 'touch'; +} + +// function useMSGuesture(handlerProxy, event) { +// return isPointerFromTouch(event) && !!handlerProxy._msGesture; +// } + +// Common handlers +each$1(['click', 'mousedown', 'mouseup', 'mousewheel', 'dblclick', 'contextmenu'], function (name) { + domHandlers[name] = function (event) { + event = normalizeEvent(this.dom, event); + this.trigger(name, event); + }; +}); + +/** + * 为控制类实例初始化dom 事件处理函数 + * + * @inner + * @param {module:zrender/Handler} instance 控制类实例 + */ +function initDomHandler(instance) { + each$1(touchHandlerNames, function (name) { + instance._handlers[name] = bind(domHandlers[name], instance); + }); + + each$1(pointerHandlerNames, function (name) { + instance._handlers[name] = bind(domHandlers[name], instance); + }); + + each$1(mouseHandlerNames, function (name) { + instance._handlers[name] = makeMouseHandler(domHandlers[name], instance); + }); + + function makeMouseHandler(fn, instance) { + return function () { + if (instance._touching) { + return; + } + return fn.apply(instance, arguments); + }; + } +} + + +function HandlerDomProxy(dom) { + Eventful.call(this); + + this.dom = dom; + + /** + * @private + * @type {boolean} + */ + this._touching = false; + + /** + * @private + * @type {number} + */ + this._touchTimer; + + /** + * @private + * @type {module:zrender/core/GestureMgr} + */ + this._gestureMgr = new GestureMgr(); + + this._handlers = {}; + + initDomHandler(this); + + if (env$1.pointerEventsSupported) { // Only IE11+/Edge + // 1. On devices that both enable touch and mouse (e.g., MS Surface and lenovo X240), + // IE11+/Edge do not trigger touch event, but trigger pointer event and mouse event + // at the same time. + // 2. On MS Surface, it probablely only trigger mousedown but no mouseup when tap on + // screen, which do not occurs in pointer event. + // So we use pointer event to both detect touch gesture and mouse behavior. + mountHandlers(pointerHandlerNames, this); + + // FIXME + // Note: MS Gesture require CSS touch-action set. But touch-action is not reliable, + // which does not prevent defuault behavior occasionally (which may cause view port + // zoomed in but use can not zoom it back). And event.preventDefault() does not work. + // So we have to not to use MSGesture and not to support touchmove and pinch on MS + // touch screen. And we only support click behavior on MS touch screen now. + + // MS Gesture Event is only supported on IE11+/Edge and on Windows 8+. + // We dont support touch on IE on win7. + // See <https://msdn.microsoft.com/en-us/library/dn433243(v=vs.85).aspx> + // if (typeof MSGesture === 'function') { + // (this._msGesture = new MSGesture()).target = dom; // jshint ignore:line + // dom.addEventListener('MSGestureChange', onMSGestureChange); + // } + } + else { + if (env$1.touchEventsSupported) { + mountHandlers(touchHandlerNames, this); + // Handler of 'mouseout' event is needed in touch mode, which will be mounted below. + // addEventListener(root, 'mouseout', this._mouseoutHandler); + } + + // 1. Considering some devices that both enable touch and mouse event (like on MS Surface + // and lenovo X240, @see #2350), we make mouse event be always listened, otherwise + // mouse event can not be handle in those devices. + // 2. On MS Surface, Chrome will trigger both touch event and mouse event. How to prevent + // mouseevent after touch event triggered, see `setTouchTimer`. + mountHandlers(mouseHandlerNames, this); + } + + function mountHandlers(handlerNames, instance) { + each$1(handlerNames, function (name) { + addEventListener(dom, eventNameFix(name), instance._handlers[name]); + }, instance); + } +} + +var handlerDomProxyProto = HandlerDomProxy.prototype; +handlerDomProxyProto.dispose = function () { + var handlerNames = mouseHandlerNames.concat(touchHandlerNames); + + for (var i = 0; i < handlerNames.length; i++) { + var name = handlerNames[i]; + removeEventListener(this.dom, eventNameFix(name), this._handlers[name]); + } +}; + +handlerDomProxyProto.setCursor = function (cursorStyle) { + this.dom.style && (this.dom.style.cursor = cursorStyle || 'default'); +}; + +mixin(HandlerDomProxy, Eventful); + +/*! +* ZRender, a high performance 2d drawing library. +* +* Copyright (c) 2013, Baidu Inc. +* All rights reserved. +* +* LICENSE +* https://github.com/ecomfe/zrender/blob/master/LICENSE.txt +*/ + +var useVML = !env$1.canvasSupported; + +var painterCtors = { + canvas: Painter +}; + +var instances$1 = {}; // ZRender实例map索引 + +/** + * @type {string} + */ +var version$1 = '4.0.4'; + +/** + * Initializing a zrender instance + * @param {HTMLElement} dom + * @param {Object} opts + * @param {string} [opts.renderer='canvas'] 'canvas' or 'svg' + * @param {number} [opts.devicePixelRatio] + * @param {number|string} [opts.width] Can be 'auto' (the same as null/undefined) + * @param {number|string} [opts.height] Can be 'auto' (the same as null/undefined) + * @return {module:zrender/ZRender} + */ +function init$1(dom, opts) { + var zr = new ZRender(guid(), dom, opts); + instances$1[zr.id] = zr; + return zr; +} + +/** + * Dispose zrender instance + * @param {module:zrender/ZRender} zr + */ +function dispose$1(zr) { + if (zr) { + zr.dispose(); + } + else { + for (var key in instances$1) { + if (instances$1.hasOwnProperty(key)) { + instances$1[key].dispose(); + } + } + instances$1 = {}; + } + + return this; +} + +/** + * Get zrender instance by id + * @param {string} id zrender instance id + * @return {module:zrender/ZRender} + */ +function getInstance(id) { + return instances$1[id]; +} + +function registerPainter(name, Ctor) { + painterCtors[name] = Ctor; +} + +function delInstance(id) { + delete instances$1[id]; +} + +/** + * @module zrender/ZRender + */ +/** + * @constructor + * @alias module:zrender/ZRender + * @param {string} id + * @param {HTMLElement} dom + * @param {Object} opts + * @param {string} [opts.renderer='canvas'] 'canvas' or 'svg' + * @param {number} [opts.devicePixelRatio] + * @param {number} [opts.width] Can be 'auto' (the same as null/undefined) + * @param {number} [opts.height] Can be 'auto' (the same as null/undefined) + */ +var ZRender = function (id, dom, opts) { + + opts = opts || {}; + + /** + * @type {HTMLDomElement} + */ + this.dom = dom; + + /** + * @type {string} + */ + this.id = id; + + var self = this; + var storage = new Storage(); + + var rendererType = opts.renderer; + // TODO WebGL + if (useVML) { + if (!painterCtors.vml) { + throw new Error('You need to require \'zrender/vml/vml\' to support IE8'); + } + rendererType = 'vml'; + } + else if (!rendererType || !painterCtors[rendererType]) { + rendererType = 'canvas'; + } + var painter = new painterCtors[rendererType](dom, storage, opts, id); + + this.storage = storage; + this.painter = painter; + + var handerProxy = (!env$1.node && !env$1.worker) ? new HandlerDomProxy(painter.getViewportRoot()) : null; + this.handler = new Handler(storage, painter, handerProxy, painter.root); + + /** + * @type {module:zrender/animation/Animation} + */ + this.animation = new Animation({ + stage: { + update: bind(this.flush, this) + } + }); + this.animation.start(); + + /** + * @type {boolean} + * @private + */ + this._needsRefresh; + + // 修改 storage.delFromStorage, 每次删除元素之前删除动画 + // FIXME 有点ugly + var oldDelFromStorage = storage.delFromStorage; + var oldAddToStorage = storage.addToStorage; + + storage.delFromStorage = function (el) { + oldDelFromStorage.call(storage, el); + + el && el.removeSelfFromZr(self); + }; + + storage.addToStorage = function (el) { + oldAddToStorage.call(storage, el); + + el.addSelfToZr(self); + }; +}; + +ZRender.prototype = { + + constructor: ZRender, + /** + * 获取实例唯一标识 + * @return {string} + */ + getId: function () { + return this.id; + }, + + /** + * 添加元素 + * @param {module:zrender/Element} el + */ + add: function (el) { + this.storage.addRoot(el); + this._needsRefresh = true; + }, + + /** + * 删除元素 + * @param {module:zrender/Element} el + */ + remove: function (el) { + this.storage.delRoot(el); + this._needsRefresh = true; + }, + + /** + * Change configuration of layer + * @param {string} zLevel + * @param {Object} config + * @param {string} [config.clearColor=0] Clear color + * @param {string} [config.motionBlur=false] If enable motion blur + * @param {number} [config.lastFrameAlpha=0.7] Motion blur factor. Larger value cause longer trailer + */ + configLayer: function (zLevel, config) { + if (this.painter.configLayer) { + this.painter.configLayer(zLevel, config); + } + this._needsRefresh = true; + }, + + /** + * Set background color + * @param {string} backgroundColor + */ + setBackgroundColor: function (backgroundColor) { + if (this.painter.setBackgroundColor) { + this.painter.setBackgroundColor(backgroundColor); + } + this._needsRefresh = true; + }, + + /** + * Repaint the canvas immediately + */ + refreshImmediately: function () { + // var start = new Date(); + // Clear needsRefresh ahead to avoid something wrong happens in refresh + // Or it will cause zrender refreshes again and again. + this._needsRefresh = false; + this.painter.refresh(); + /** + * Avoid trigger zr.refresh in Element#beforeUpdate hook + */ + this._needsRefresh = false; + // var end = new Date(); + // var log = document.getElementById('log'); + // if (log) { + // log.innerHTML = log.innerHTML + '<br>' + (end - start); + // } + }, + + /** + * Mark and repaint the canvas in the next frame of browser + */ + refresh: function() { + this._needsRefresh = true; + }, + + /** + * Perform all refresh + */ + flush: function () { + var triggerRendered; + + if (this._needsRefresh) { + triggerRendered = true; + this.refreshImmediately(); + } + if (this._needsRefreshHover) { + triggerRendered = true; + this.refreshHoverImmediately(); + } + + triggerRendered && this.trigger('rendered'); + }, + + /** + * Add element to hover layer + * @param {module:zrender/Element} el + * @param {Object} style + */ + addHover: function (el, style) { + if (this.painter.addHover) { + this.painter.addHover(el, style); + this.refreshHover(); + } + }, + + /** + * Add element from hover layer + * @param {module:zrender/Element} el + */ + removeHover: function (el) { + if (this.painter.removeHover) { + this.painter.removeHover(el); + this.refreshHover(); + } + }, + + /** + * Clear all hover elements in hover layer + * @param {module:zrender/Element} el + */ + clearHover: function () { + if (this.painter.clearHover) { + this.painter.clearHover(); + this.refreshHover(); + } + }, + + /** + * Refresh hover in next frame + */ + refreshHover: function () { + this._needsRefreshHover = true; + }, + + /** + * Refresh hover immediately + */ + refreshHoverImmediately: function () { + this._needsRefreshHover = false; + this.painter.refreshHover && this.painter.refreshHover(); + }, + + /** + * Resize the canvas. + * Should be invoked when container size is changed + * @param {Object} [opts] + * @param {number|string} [opts.width] Can be 'auto' (the same as null/undefined) + * @param {number|string} [opts.height] Can be 'auto' (the same as null/undefined) + */ + resize: function(opts) { + opts = opts || {}; + this.painter.resize(opts.width, opts.height); + this.handler.resize(); + }, + + /** + * Stop and clear all animation immediately + */ + clearAnimation: function () { + this.animation.clear(); + }, + + /** + * Get container width + */ + getWidth: function() { + return this.painter.getWidth(); + }, + + /** + * Get container height + */ + getHeight: function() { + return this.painter.getHeight(); + }, + + /** + * Export the canvas as Base64 URL + * @param {string} type + * @param {string} [backgroundColor='#fff'] + * @return {string} Base64 URL + */ + // toDataURL: function(type, backgroundColor) { + // return this.painter.getRenderedCanvas({ + // backgroundColor: backgroundColor + // }).toDataURL(type); + // }, + + /** + * Converting a path to image. + * It has much better performance of drawing image rather than drawing a vector path. + * @param {module:zrender/graphic/Path} e + * @param {number} width + * @param {number} height + */ + pathToImage: function(e, dpr) { + return this.painter.pathToImage(e, dpr); + }, + + /** + * Set default cursor + * @param {string} [cursorStyle='default'] 例如 crosshair + */ + setCursorStyle: function (cursorStyle) { + this.handler.setCursorStyle(cursorStyle); + }, + + /** + * Find hovered element + * @param {number} x + * @param {number} y + * @return {Object} {target, topTarget} + */ + findHover: function (x, y) { + return this.handler.findHover(x, y); + }, + + /** + * Bind event + * + * @param {string} eventName Event name + * @param {Function} eventHandler Handler function + * @param {Object} [context] Context object + */ + on: function(eventName, eventHandler, context) { + this.handler.on(eventName, eventHandler, context); + }, + + /** + * Unbind event + * @param {string} eventName Event name + * @param {Function} [eventHandler] Handler function + */ + off: function(eventName, eventHandler) { + this.handler.off(eventName, eventHandler); + }, + + /** + * Trigger event manually + * + * @param {string} eventName Event name + * @param {event=} event Event object + */ + trigger: function (eventName, event) { + this.handler.trigger(eventName, event); + }, + + + /** + * Clear all objects and the canvas. + */ + clear: function () { + this.storage.delRoot(); + this.painter.clear(); + }, + + /** + * Dispose self. + */ + dispose: function () { + this.animation.stop(); + + this.clear(); + this.storage.dispose(); + this.painter.dispose(); + this.handler.dispose(); + + this.animation = + this.storage = + this.painter = + this.handler = null; + + delInstance(this.id); + } +}; + + + +var zrender = (Object.freeze || Object)({ + version: version$1, + init: init$1, + dispose: dispose$1, + getInstance: getInstance, + registerPainter: registerPainter +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var each$2 = each$1; +var isObject$2 = isObject$1; +var isArray$1 = isArray; + +/** + * Make the name displayable. But we should + * make sure it is not duplicated with user + * specified name, so use '\0'; + */ +var DUMMY_COMPONENT_NAME_PREFIX = 'series\0'; + +/** + * If value is not array, then translate it to array. + * @param {*} value + * @return {Array} [value] or value + */ +function normalizeToArray(value) { + return value instanceof Array + ? value + : value == null + ? [] + : [value]; +} + +/** + * Sync default option between normal and emphasis like `position` and `show` + * In case some one will write code like + * label: { + * show: false, + * position: 'outside', + * fontSize: 18 + * }, + * emphasis: { + * label: { show: true } + * } + * @param {Object} opt + * @param {string} key + * @param {Array.<string>} subOpts + */ +function defaultEmphasis(opt, key, subOpts) { + // Caution: performance sensitive. + if (opt) { + opt[key] = opt[key] || {}; + opt.emphasis = opt.emphasis || {}; + opt.emphasis[key] = opt.emphasis[key] || {}; + + // Default emphasis option from normal + for (var i = 0, len = subOpts.length; i < len; i++) { + var subOptName = subOpts[i]; + if (!opt.emphasis[key].hasOwnProperty(subOptName) + && opt[key].hasOwnProperty(subOptName) + ) { + opt.emphasis[key][subOptName] = opt[key][subOptName]; + } + } + } +} + +var TEXT_STYLE_OPTIONS = [ + 'fontStyle', 'fontWeight', 'fontSize', 'fontFamily', + 'rich', 'tag', 'color', 'textBorderColor', 'textBorderWidth', + 'width', 'height', 'lineHeight', 'align', 'verticalAlign', 'baseline', + 'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY', + 'textShadowColor', 'textShadowBlur', 'textShadowOffsetX', 'textShadowOffsetY', + 'backgroundColor', 'borderColor', 'borderWidth', 'borderRadius', 'padding' +]; + +// modelUtil.LABEL_OPTIONS = modelUtil.TEXT_STYLE_OPTIONS.concat([ +// 'position', 'offset', 'rotate', 'origin', 'show', 'distance', 'formatter', +// 'fontStyle', 'fontWeight', 'fontSize', 'fontFamily', +// // FIXME: deprecated, check and remove it. +// 'textStyle' +// ]); + +/** + * The method do not ensure performance. + * data could be [12, 2323, {value: 223}, [1221, 23], {value: [2, 23]}] + * This helper method retieves value from data. + * @param {string|number|Date|Array|Object} dataItem + * @return {number|string|Date|Array.<number|string|Date>} + */ +function getDataItemValue(dataItem) { + return (isObject$2(dataItem) && !isArray$1(dataItem) && !(dataItem instanceof Date)) + ? dataItem.value : dataItem; +} + +/** + * data could be [12, 2323, {value: 223}, [1221, 23], {value: [2, 23]}] + * This helper method determine if dataItem has extra option besides value + * @param {string|number|Date|Array|Object} dataItem + */ +function isDataItemOption(dataItem) { + return isObject$2(dataItem) + && !(dataItem instanceof Array); + // // markLine data can be array + // && !(dataItem[0] && isObject(dataItem[0]) && !(dataItem[0] instanceof Array)); +} + +/** + * Mapping to exists for merge. + * + * @public + * @param {Array.<Object>|Array.<module:echarts/model/Component>} exists + * @param {Object|Array.<Object>} newCptOptions + * @return {Array.<Object>} Result, like [{exist: ..., option: ...}, {}], + * index of which is the same as exists. + */ +function mappingToExists(exists, newCptOptions) { + // Mapping by the order by original option (but not order of + // new option) in merge mode. Because we should ensure + // some specified index (like xAxisIndex) is consistent with + // original option, which is easy to understand, espatially in + // media query. And in most case, merge option is used to + // update partial option but not be expected to change order. + newCptOptions = (newCptOptions || []).slice(); + + var result = map(exists || [], function (obj, index) { + return {exist: obj}; + }); + + // Mapping by id or name if specified. + each$2(newCptOptions, function (cptOption, index) { + if (!isObject$2(cptOption)) { + return; + } + + // id has highest priority. + for (var i = 0; i < result.length; i++) { + if (!result[i].option // Consider name: two map to one. + && cptOption.id != null + && result[i].exist.id === cptOption.id + '' + ) { + result[i].option = cptOption; + newCptOptions[index] = null; + return; + } + } + + for (var i = 0; i < result.length; i++) { + var exist = result[i].exist; + if (!result[i].option // Consider name: two map to one. + // Can not match when both ids exist but different. + && (exist.id == null || cptOption.id == null) + && cptOption.name != null + && !isIdInner(cptOption) + && !isIdInner(exist) + && exist.name === cptOption.name + '' + ) { + result[i].option = cptOption; + newCptOptions[index] = null; + return; + } + } + }); + + // Otherwise mapping by index. + each$2(newCptOptions, function (cptOption, index) { + if (!isObject$2(cptOption)) { + return; + } + + var i = 0; + for (; i < result.length; i++) { + var exist = result[i].exist; + if (!result[i].option + // Existing model that already has id should be able to + // mapped to (because after mapping performed model may + // be assigned with a id, whish should not affect next + // mapping), except those has inner id. + && !isIdInner(exist) + // Caution: + // Do not overwrite id. But name can be overwritten, + // because axis use name as 'show label text'. + // 'exist' always has id and name and we dont + // need to check it. + && cptOption.id == null + ) { + result[i].option = cptOption; + break; + } + } + + if (i >= result.length) { + result.push({option: cptOption}); + } + }); + + return result; +} + +/** + * Make id and name for mapping result (result of mappingToExists) + * into `keyInfo` field. + * + * @public + * @param {Array.<Object>} Result, like [{exist: ..., option: ...}, {}], + * which order is the same as exists. + * @return {Array.<Object>} The input. + */ +function makeIdAndName(mapResult) { + // We use this id to hash component models and view instances + // in echarts. id can be specified by user, or auto generated. + + // The id generation rule ensures new view instance are able + // to mapped to old instance when setOption are called in + // no-merge mode. So we generate model id by name and plus + // type in view id. + + // name can be duplicated among components, which is convenient + // to specify multi components (like series) by one name. + + // Ensure that each id is distinct. + var idMap = createHashMap(); + + each$2(mapResult, function (item, index) { + var existCpt = item.exist; + existCpt && idMap.set(existCpt.id, item); + }); + + each$2(mapResult, function (item, index) { + var opt = item.option; + + assert$1( + !opt || opt.id == null || !idMap.get(opt.id) || idMap.get(opt.id) === item, + 'id duplicates: ' + (opt && opt.id) + ); + + opt && opt.id != null && idMap.set(opt.id, item); + !item.keyInfo && (item.keyInfo = {}); + }); + + // Make name and id. + each$2(mapResult, function (item, index) { + var existCpt = item.exist; + var opt = item.option; + var keyInfo = item.keyInfo; + + if (!isObject$2(opt)) { + return; + } + + // name can be overwitten. Consider case: axis.name = '20km'. + // But id generated by name will not be changed, which affect + // only in that case: setOption with 'not merge mode' and view + // instance will be recreated, which can be accepted. + keyInfo.name = opt.name != null + ? opt.name + '' + : existCpt + ? existCpt.name + // Avoid diffferent series has the same name, + // because name may be used like in color pallet. + : DUMMY_COMPONENT_NAME_PREFIX + index; + + if (existCpt) { + keyInfo.id = existCpt.id; + } + else if (opt.id != null) { + keyInfo.id = opt.id + ''; + } + else { + // Consider this situatoin: + // optionA: [{name: 'a'}, {name: 'a'}, {..}] + // optionB [{..}, {name: 'a'}, {name: 'a'}] + // Series with the same name between optionA and optionB + // should be mapped. + var idNum = 0; + do { + keyInfo.id = '\0' + keyInfo.name + '\0' + idNum++; + } + while (idMap.get(keyInfo.id)); + } + + idMap.set(keyInfo.id, item); + }); +} + +function isNameSpecified(componentModel) { + var name = componentModel.name; + // Is specified when `indexOf` get -1 or > 0. + return !!(name && name.indexOf(DUMMY_COMPONENT_NAME_PREFIX)); +} + +/** + * @public + * @param {Object} cptOption + * @return {boolean} + */ +function isIdInner(cptOption) { + return isObject$2(cptOption) + && cptOption.id + && (cptOption.id + '').indexOf('\0_ec_\0') === 0; +} + +/** + * A helper for removing duplicate items between batchA and batchB, + * and in themselves, and categorize by series. + * + * @param {Array.<Object>} batchA Like: [{seriesId: 2, dataIndex: [32, 4, 5]}, ...] + * @param {Array.<Object>} batchB Like: [{seriesId: 2, dataIndex: [32, 4, 5]}, ...] + * @return {Array.<Array.<Object>, Array.<Object>>} result: [resultBatchA, resultBatchB] + */ +function compressBatches(batchA, batchB) { + var mapA = {}; + var mapB = {}; + + makeMap(batchA || [], mapA); + makeMap(batchB || [], mapB, mapA); + + return [mapToArray(mapA), mapToArray(mapB)]; + + function makeMap(sourceBatch, map$$1, otherMap) { + for (var i = 0, len = sourceBatch.length; i < len; i++) { + var seriesId = sourceBatch[i].seriesId; + var dataIndices = normalizeToArray(sourceBatch[i].dataIndex); + var otherDataIndices = otherMap && otherMap[seriesId]; + + for (var j = 0, lenj = dataIndices.length; j < lenj; j++) { + var dataIndex = dataIndices[j]; + + if (otherDataIndices && otherDataIndices[dataIndex]) { + otherDataIndices[dataIndex] = null; + } + else { + (map$$1[seriesId] || (map$$1[seriesId] = {}))[dataIndex] = 1; + } + } + } + } + + function mapToArray(map$$1, isData) { + var result = []; + for (var i in map$$1) { + if (map$$1.hasOwnProperty(i) && map$$1[i] != null) { + if (isData) { + result.push(+i); + } + else { + var dataIndices = mapToArray(map$$1[i], true); + dataIndices.length && result.push({seriesId: i, dataIndex: dataIndices}); + } + } + } + return result; + } +} + +/** + * @param {module:echarts/data/List} data + * @param {Object} payload Contains dataIndex (means rawIndex) / dataIndexInside / name + * each of which can be Array or primary type. + * @return {number|Array.<number>} dataIndex If not found, return undefined/null. + */ +function queryDataIndex(data, payload) { + if (payload.dataIndexInside != null) { + return payload.dataIndexInside; + } + else if (payload.dataIndex != null) { + return isArray(payload.dataIndex) + ? map(payload.dataIndex, function (value) { + return data.indexOfRawIndex(value); + }) + : data.indexOfRawIndex(payload.dataIndex); + } + else if (payload.name != null) { + return isArray(payload.name) + ? map(payload.name, function (value) { + return data.indexOfName(value); + }) + : data.indexOfName(payload.name); + } +} + +/** + * Enable property storage to any host object. + * Notice: Serialization is not supported. + * + * For example: + * var inner = zrUitl.makeInner(); + * + * function some1(hostObj) { + * inner(hostObj).someProperty = 1212; + * ... + * } + * function some2() { + * var fields = inner(this); + * fields.someProperty1 = 1212; + * fields.someProperty2 = 'xx'; + * ... + * } + * + * @return {Function} + */ +function makeInner() { + // Consider different scope by es module import. + var key = '__\0ec_inner_' + innerUniqueIndex++ + '_' + Math.random().toFixed(5); + return function (hostObj) { + return hostObj[key] || (hostObj[key] = {}); + }; +} +var innerUniqueIndex = 0; + +/** + * @param {module:echarts/model/Global} ecModel + * @param {string|Object} finder + * If string, e.g., 'geo', means {geoIndex: 0}. + * If Object, could contain some of these properties below: + * { + * seriesIndex, seriesId, seriesName, + * geoIndex, geoId, geoName, + * bmapIndex, bmapId, bmapName, + * xAxisIndex, xAxisId, xAxisName, + * yAxisIndex, yAxisId, yAxisName, + * gridIndex, gridId, gridName, + * ... (can be extended) + * } + * Each properties can be number|string|Array.<number>|Array.<string> + * For example, a finder could be + * { + * seriesIndex: 3, + * geoId: ['aa', 'cc'], + * gridName: ['xx', 'rr'] + * } + * xxxIndex can be set as 'all' (means all xxx) or 'none' (means not specify) + * If nothing or null/undefined specified, return nothing. + * @param {Object} [opt] + * @param {string} [opt.defaultMainType] + * @param {Array.<string>} [opt.includeMainTypes] + * @return {Object} result like: + * { + * seriesModels: [seriesModel1, seriesModel2], + * seriesModel: seriesModel1, // The first model + * geoModels: [geoModel1, geoModel2], + * geoModel: geoModel1, // The first model + * ... + * } + */ +function parseFinder(ecModel, finder, opt) { + if (isString(finder)) { + var obj = {}; + obj[finder + 'Index'] = 0; + finder = obj; + } + + var defaultMainType = opt && opt.defaultMainType; + if (defaultMainType + && !has(finder, defaultMainType + 'Index') + && !has(finder, defaultMainType + 'Id') + && !has(finder, defaultMainType + 'Name') + ) { + finder[defaultMainType + 'Index'] = 0; + } + + var result = {}; + + each$2(finder, function (value, key) { + var value = finder[key]; + + // Exclude 'dataIndex' and other illgal keys. + if (key === 'dataIndex' || key === 'dataIndexInside') { + result[key] = value; + return; + } + + var parsedKey = key.match(/^(\w+)(Index|Id|Name)$/) || []; + var mainType = parsedKey[1]; + var queryType = (parsedKey[2] || '').toLowerCase(); + + if (!mainType + || !queryType + || value == null + || (queryType === 'index' && value === 'none') + || (opt && opt.includeMainTypes && indexOf(opt.includeMainTypes, mainType) < 0) + ) { + return; + } + + var queryParam = {mainType: mainType}; + if (queryType !== 'index' || value !== 'all') { + queryParam[queryType] = value; + } + + var models = ecModel.queryComponents(queryParam); + result[mainType + 'Models'] = models; + result[mainType + 'Model'] = models[0]; + }); + + return result; +} + +function has(obj, prop) { + return obj && obj.hasOwnProperty(prop); +} + +function setAttribute(dom, key, value) { + dom.setAttribute + ? dom.setAttribute(key, value) + : (dom[key] = value); +} + +function getAttribute(dom, key) { + return dom.getAttribute + ? dom.getAttribute(key) + : dom[key]; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var TYPE_DELIMITER = '.'; +var IS_CONTAINER = '___EC__COMPONENT__CONTAINER___'; + +/** + * Notice, parseClassType('') should returns {main: '', sub: ''} + * @public + */ +function parseClassType$1(componentType) { + var ret = {main: '', sub: ''}; + if (componentType) { + componentType = componentType.split(TYPE_DELIMITER); + ret.main = componentType[0] || ''; + ret.sub = componentType[1] || ''; + } + return ret; +} + +/** + * @public + */ +function checkClassType(componentType) { + assert$1( + /^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(componentType), + 'componentType "' + componentType + '" illegal' + ); +} + +/** + * @public + */ +function enableClassExtend(RootClass, mandatoryMethods) { + + RootClass.$constructor = RootClass; + RootClass.extend = function (proto) { + + if (__DEV__) { + each$1(mandatoryMethods, function (method) { + if (!proto[method]) { + console.warn( + 'Method `' + method + '` should be implemented' + + (proto.type ? ' in ' + proto.type : '') + '.' + ); + } + }); + } + + var superClass = this; + var ExtendedClass = function () { + if (!proto.$constructor) { + superClass.apply(this, arguments); + } + else { + proto.$constructor.apply(this, arguments); + } + }; + + extend(ExtendedClass.prototype, proto); + + ExtendedClass.extend = this.extend; + ExtendedClass.superCall = superCall; + ExtendedClass.superApply = superApply; + inherits(ExtendedClass, this); + ExtendedClass.superClass = superClass; + + return ExtendedClass; + }; +} + +var classBase = 0; + +/** + * Can not use instanceof, consider different scope by + * cross domain or es module import in ec extensions. + * Mount a method "isInstance()" to Clz. + */ +function enableClassCheck(Clz) { + var classAttr = ['__\0is_clz', classBase++, Math.random().toFixed(3)].join('_'); + Clz.prototype[classAttr] = true; + + if (__DEV__) { + assert$1(!Clz.isInstance, 'The method "is" can not be defined.'); + } + + Clz.isInstance = function (obj) { + return !!(obj && obj[classAttr]); + }; +} + +// superCall should have class info, which can not be fetch from 'this'. +// Consider this case: +// class A has method f, +// class B inherits class A, overrides method f, f call superApply('f'), +// class C inherits class B, do not overrides method f, +// then when method of class C is called, dead loop occured. +function superCall(context, methodName) { + var args = slice(arguments, 2); + return this.superClass.prototype[methodName].apply(context, args); +} + +function superApply(context, methodName, args) { + return this.superClass.prototype[methodName].apply(context, args); +} + +/** + * @param {Object} entity + * @param {Object} options + * @param {boolean} [options.registerWhenExtend] + * @public + */ +function enableClassManagement(entity, options) { + options = options || {}; + + /** + * Component model classes + * key: componentType, + * value: + * componentClass, when componentType is 'xxx' + * or Object.<subKey, componentClass>, when componentType is 'xxx.yy' + * @type {Object} + */ + var storage = {}; + + entity.registerClass = function (Clazz, componentType) { + if (componentType) { + checkClassType(componentType); + componentType = parseClassType$1(componentType); + + if (!componentType.sub) { + if (__DEV__) { + if (storage[componentType.main]) { + console.warn(componentType.main + ' exists.'); + } + } + storage[componentType.main] = Clazz; + } + else if (componentType.sub !== IS_CONTAINER) { + var container = makeContainer(componentType); + container[componentType.sub] = Clazz; + } + } + return Clazz; + }; + + entity.getClass = function (componentMainType, subType, throwWhenNotFound) { + var Clazz = storage[componentMainType]; + + if (Clazz && Clazz[IS_CONTAINER]) { + Clazz = subType ? Clazz[subType] : null; + } + + if (throwWhenNotFound && !Clazz) { + throw new Error( + !subType + ? componentMainType + '.' + 'type should be specified.' + : 'Component ' + componentMainType + '.' + (subType || '') + ' not exists. Load it first.' + ); + } + + return Clazz; + }; + + entity.getClassesByMainType = function (componentType) { + componentType = parseClassType$1(componentType); + + var result = []; + var obj = storage[componentType.main]; + + if (obj && obj[IS_CONTAINER]) { + each$1(obj, function (o, type) { + type !== IS_CONTAINER && result.push(o); + }); + } + else { + result.push(obj); + } + + return result; + }; + + entity.hasClass = function (componentType) { + // Just consider componentType.main. + componentType = parseClassType$1(componentType); + return !!storage[componentType.main]; + }; + + /** + * @return {Array.<string>} Like ['aa', 'bb'], but can not be ['aa.xx'] + */ + entity.getAllClassMainTypes = function () { + var types = []; + each$1(storage, function (obj, type) { + types.push(type); + }); + return types; + }; + + /** + * If a main type is container and has sub types + * @param {string} mainType + * @return {boolean} + */ + entity.hasSubTypes = function (componentType) { + componentType = parseClassType$1(componentType); + var obj = storage[componentType.main]; + return obj && obj[IS_CONTAINER]; + }; + + entity.parseClassType = parseClassType$1; + + function makeContainer(componentType) { + var container = storage[componentType.main]; + if (!container || !container[IS_CONTAINER]) { + container = storage[componentType.main] = {}; + container[IS_CONTAINER] = true; + } + return container; + } + + if (options.registerWhenExtend) { + var originalExtend = entity.extend; + if (originalExtend) { + entity.extend = function (proto) { + var ExtendedClass = originalExtend.call(this, proto); + return entity.registerClass(ExtendedClass, proto.type); + }; + } + } + + return entity; +} + +/** + * @param {string|Array.<string>} properties + */ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// TODO Parse shadow style +// TODO Only shallow path support +var makeStyleMapper = function (properties) { + // Normalize + for (var i = 0; i < properties.length; i++) { + if (!properties[i][1]) { + properties[i][1] = properties[i][0]; + } + } + return function (model, excludes, includes) { + var style = {}; + for (var i = 0; i < properties.length; i++) { + var propName = properties[i][1]; + if ((excludes && indexOf(excludes, propName) >= 0) + || (includes && indexOf(includes, propName) < 0) + ) { + continue; + } + var val = model.getShallow(propName); + if (val != null) { + style[properties[i][0]] = val; + } + } + return style; + }; +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var getLineStyle = makeStyleMapper( + [ + ['lineWidth', 'width'], + ['stroke', 'color'], + ['opacity'], + ['shadowBlur'], + ['shadowOffsetX'], + ['shadowOffsetY'], + ['shadowColor'] + ] +); + +var lineStyleMixin = { + getLineStyle: function (excludes) { + var style = getLineStyle(this, excludes); + var lineDash = this.getLineDash(style.lineWidth); + lineDash && (style.lineDash = lineDash); + return style; + }, + + getLineDash: function (lineWidth) { + if (lineWidth == null) { + lineWidth = 1; + } + var lineType = this.get('type'); + var dotSize = Math.max(lineWidth, 2); + var dashSize = lineWidth * 4; + return (lineType === 'solid' || lineType == null) ? null + : (lineType === 'dashed' ? [dashSize, dashSize] : [dotSize, dotSize]); + } +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var getAreaStyle = makeStyleMapper( + [ + ['fill', 'color'], + ['shadowBlur'], + ['shadowOffsetX'], + ['shadowOffsetY'], + ['opacity'], + ['shadowColor'] + ] +); + +var areaStyleMixin = { + getAreaStyle: function (excludes, includes) { + return getAreaStyle(this, excludes, includes); + } +}; + +/** + * 曲线辅助模块 + * @module zrender/core/curve + * @author pissang(https://www.github.com/pissang) + */ + +var mathPow = Math.pow; +var mathSqrt$2 = Math.sqrt; + +var EPSILON$1 = 1e-8; +var EPSILON_NUMERIC = 1e-4; + +var THREE_SQRT = mathSqrt$2(3); +var ONE_THIRD = 1 / 3; + +// 临时变量 +var _v0 = create(); +var _v1 = create(); +var _v2 = create(); + +function isAroundZero(val) { + return val > -EPSILON$1 && val < EPSILON$1; +} +function isNotAroundZero$1(val) { + return val > EPSILON$1 || val < -EPSILON$1; +} +/** + * 计算三次贝塞尔值 + * @memberOf module:zrender/core/curve + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} p3 + * @param {number} t + * @return {number} + */ +function cubicAt(p0, p1, p2, p3, t) { + var onet = 1 - t; + return onet * onet * (onet * p0 + 3 * t * p1) + + t * t * (t * p3 + 3 * onet * p2); +} + +/** + * 计算三次贝塞尔导数值 + * @memberOf module:zrender/core/curve + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} p3 + * @param {number} t + * @return {number} + */ +function cubicDerivativeAt(p0, p1, p2, p3, t) { + var onet = 1 - t; + return 3 * ( + ((p1 - p0) * onet + 2 * (p2 - p1) * t) * onet + + (p3 - p2) * t * t + ); +} + +/** + * 计算三次贝塞尔方程根,使用盛金公式 + * @memberOf module:zrender/core/curve + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} p3 + * @param {number} val + * @param {Array.<number>} roots + * @return {number} 有效根数目 + */ +function cubicRootAt(p0, p1, p2, p3, val, roots) { + // Evaluate roots of cubic functions + var a = p3 + 3 * (p1 - p2) - p0; + var b = 3 * (p2 - p1 * 2 + p0); + var c = 3 * (p1 - p0); + var d = p0 - val; + + var A = b * b - 3 * a * c; + var B = b * c - 9 * a * d; + var C = c * c - 3 * b * d; + + var n = 0; + + if (isAroundZero(A) && isAroundZero(B)) { + if (isAroundZero(b)) { + roots[0] = 0; + } + else { + var t1 = -c / b; //t1, t2, t3, b is not zero + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } + } + else { + var disc = B * B - 4 * A * C; + + if (isAroundZero(disc)) { + var K = B / A; + var t1 = -b / a + K; // t1, a is not zero + var t2 = -K / 2; // t2, t3 + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + roots[n++] = t2; + } + } + else if (disc > 0) { + var discSqrt = mathSqrt$2(disc); + var Y1 = A * b + 1.5 * a * (-B + discSqrt); + var Y2 = A * b + 1.5 * a * (-B - discSqrt); + if (Y1 < 0) { + Y1 = -mathPow(-Y1, ONE_THIRD); + } + else { + Y1 = mathPow(Y1, ONE_THIRD); + } + if (Y2 < 0) { + Y2 = -mathPow(-Y2, ONE_THIRD); + } + else { + Y2 = mathPow(Y2, ONE_THIRD); + } + var t1 = (-b - (Y1 + Y2)) / (3 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } + else { + var T = (2 * A * b - 3 * a * B) / (2 * mathSqrt$2(A * A * A)); + var theta = Math.acos(T) / 3; + var ASqrt = mathSqrt$2(A); + var tmp = Math.cos(theta); + + var t1 = (-b - 2 * ASqrt * tmp) / (3 * a); + var t2 = (-b + ASqrt * (tmp + THREE_SQRT * Math.sin(theta))) / (3 * a); + var t3 = (-b + ASqrt * (tmp - THREE_SQRT * Math.sin(theta))) / (3 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + roots[n++] = t2; + } + if (t3 >= 0 && t3 <= 1) { + roots[n++] = t3; + } + } + } + return n; +} + +/** + * 计算三次贝塞尔方程极限值的位置 + * @memberOf module:zrender/core/curve + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} p3 + * @param {Array.<number>} extrema + * @return {number} 有效数目 + */ +function cubicExtrema(p0, p1, p2, p3, extrema) { + var b = 6 * p2 - 12 * p1 + 6 * p0; + var a = 9 * p1 + 3 * p3 - 3 * p0 - 9 * p2; + var c = 3 * p1 - 3 * p0; + + var n = 0; + if (isAroundZero(a)) { + if (isNotAroundZero$1(b)) { + var t1 = -c / b; + if (t1 >= 0 && t1 <=1) { + extrema[n++] = t1; + } + } + } + else { + var disc = b * b - 4 * a * c; + if (isAroundZero(disc)) { + extrema[0] = -b / (2 * a); + } + else if (disc > 0) { + var discSqrt = mathSqrt$2(disc); + var t1 = (-b + discSqrt) / (2 * a); + var t2 = (-b - discSqrt) / (2 * a); + if (t1 >= 0 && t1 <= 1) { + extrema[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + extrema[n++] = t2; + } + } + } + return n; +} + +/** + * 细分三次贝塞尔曲线 + * @memberOf module:zrender/core/curve + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} p3 + * @param {number} t + * @param {Array.<number>} out + */ +function cubicSubdivide(p0, p1, p2, p3, t, out) { + var p01 = (p1 - p0) * t + p0; + var p12 = (p2 - p1) * t + p1; + var p23 = (p3 - p2) * t + p2; + + var p012 = (p12 - p01) * t + p01; + var p123 = (p23 - p12) * t + p12; + + var p0123 = (p123 - p012) * t + p012; + // Seg0 + out[0] = p0; + out[1] = p01; + out[2] = p012; + out[3] = p0123; + // Seg1 + out[4] = p0123; + out[5] = p123; + out[6] = p23; + out[7] = p3; +} + +/** + * 投射点到三次贝塞尔曲线上,返回投射距离。 + * 投射点有可能会有一个或者多个,这里只返回其中距离最短的一个。 + * @param {number} x0 + * @param {number} y0 + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {number} x3 + * @param {number} y3 + * @param {number} x + * @param {number} y + * @param {Array.<number>} [out] 投射点 + * @return {number} + */ +function cubicProjectPoint( + x0, y0, x1, y1, x2, y2, x3, y3, + x, y, out +) { + // http://pomax.github.io/bezierinfo/#projections + var t; + var interval = 0.005; + var d = Infinity; + var prev; + var next; + var d1; + var d2; + + _v0[0] = x; + _v0[1] = y; + + // 先粗略估计一下可能的最小距离的 t 值 + // PENDING + for (var _t = 0; _t < 1; _t += 0.05) { + _v1[0] = cubicAt(x0, x1, x2, x3, _t); + _v1[1] = cubicAt(y0, y1, y2, y3, _t); + d1 = distSquare(_v0, _v1); + if (d1 < d) { + t = _t; + d = d1; + } + } + d = Infinity; + + // At most 32 iteration + for (var i = 0; i < 32; i++) { + if (interval < EPSILON_NUMERIC) { + break; + } + prev = t - interval; + next = t + interval; + // t - interval + _v1[0] = cubicAt(x0, x1, x2, x3, prev); + _v1[1] = cubicAt(y0, y1, y2, y3, prev); + + d1 = distSquare(_v1, _v0); + + if (prev >= 0 && d1 < d) { + t = prev; + d = d1; + } + else { + // t + interval + _v2[0] = cubicAt(x0, x1, x2, x3, next); + _v2[1] = cubicAt(y0, y1, y2, y3, next); + d2 = distSquare(_v2, _v0); + + if (next <= 1 && d2 < d) { + t = next; + d = d2; + } + else { + interval *= 0.5; + } + } + } + // t + if (out) { + out[0] = cubicAt(x0, x1, x2, x3, t); + out[1] = cubicAt(y0, y1, y2, y3, t); + } + // console.log(interval, i); + return mathSqrt$2(d); +} + +/** + * 计算二次方贝塞尔值 + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} t + * @return {number} + */ +function quadraticAt(p0, p1, p2, t) { + var onet = 1 - t; + return onet * (onet * p0 + 2 * t * p1) + t * t * p2; +} + +/** + * 计算二次方贝塞尔导数值 + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} t + * @return {number} + */ +function quadraticDerivativeAt(p0, p1, p2, t) { + return 2 * ((1 - t) * (p1 - p0) + t * (p2 - p1)); +} + +/** + * 计算二次方贝塞尔方程根 + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} t + * @param {Array.<number>} roots + * @return {number} 有效根数目 + */ +function quadraticRootAt(p0, p1, p2, val, roots) { + var a = p0 - 2 * p1 + p2; + var b = 2 * (p1 - p0); + var c = p0 - val; + + var n = 0; + if (isAroundZero(a)) { + if (isNotAroundZero$1(b)) { + var t1 = -c / b; + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } + } + else { + var disc = b * b - 4 * a * c; + if (isAroundZero(disc)) { + var t1 = -b / (2 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + } + else if (disc > 0) { + var discSqrt = mathSqrt$2(disc); + var t1 = (-b + discSqrt) / (2 * a); + var t2 = (-b - discSqrt) / (2 * a); + if (t1 >= 0 && t1 <= 1) { + roots[n++] = t1; + } + if (t2 >= 0 && t2 <= 1) { + roots[n++] = t2; + } + } + } + return n; +} + +/** + * 计算二次贝塞尔方程极限值 + * @memberOf module:zrender/core/curve + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @return {number} + */ +function quadraticExtremum(p0, p1, p2) { + var divider = p0 + p2 - 2 * p1; + if (divider === 0) { + // p1 is center of p0 and p2 + return 0.5; + } + else { + return (p0 - p1) / divider; + } +} + +/** + * 细分二次贝塞尔曲线 + * @memberOf module:zrender/core/curve + * @param {number} p0 + * @param {number} p1 + * @param {number} p2 + * @param {number} t + * @param {Array.<number>} out + */ +function quadraticSubdivide(p0, p1, p2, t, out) { + var p01 = (p1 - p0) * t + p0; + var p12 = (p2 - p1) * t + p1; + var p012 = (p12 - p01) * t + p01; + + // Seg0 + out[0] = p0; + out[1] = p01; + out[2] = p012; + + // Seg1 + out[3] = p012; + out[4] = p12; + out[5] = p2; +} + +/** + * 投射点到二次贝塞尔曲线上,返回投射距离。 + * 投射点有可能会有一个或者多个,这里只返回其中距离最短的一个。 + * @param {number} x0 + * @param {number} y0 + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {number} x + * @param {number} y + * @param {Array.<number>} out 投射点 + * @return {number} + */ +function quadraticProjectPoint( + x0, y0, x1, y1, x2, y2, + x, y, out +) { + // http://pomax.github.io/bezierinfo/#projections + var t; + var interval = 0.005; + var d = Infinity; + + _v0[0] = x; + _v0[1] = y; + + // 先粗略估计一下可能的最小距离的 t 值 + // PENDING + for (var _t = 0; _t < 1; _t += 0.05) { + _v1[0] = quadraticAt(x0, x1, x2, _t); + _v1[1] = quadraticAt(y0, y1, y2, _t); + var d1 = distSquare(_v0, _v1); + if (d1 < d) { + t = _t; + d = d1; + } + } + d = Infinity; + + // At most 32 iteration + for (var i = 0; i < 32; i++) { + if (interval < EPSILON_NUMERIC) { + break; + } + var prev = t - interval; + var next = t + interval; + // t - interval + _v1[0] = quadraticAt(x0, x1, x2, prev); + _v1[1] = quadraticAt(y0, y1, y2, prev); + + var d1 = distSquare(_v1, _v0); + + if (prev >= 0 && d1 < d) { + t = prev; + d = d1; + } + else { + // t + interval + _v2[0] = quadraticAt(x0, x1, x2, next); + _v2[1] = quadraticAt(y0, y1, y2, next); + var d2 = distSquare(_v2, _v0); + if (next <= 1 && d2 < d) { + t = next; + d = d2; + } + else { + interval *= 0.5; + } + } + } + // t + if (out) { + out[0] = quadraticAt(x0, x1, x2, t); + out[1] = quadraticAt(y0, y1, y2, t); + } + // console.log(interval, i); + return mathSqrt$2(d); +} + +/** + * @author Yi Shen(https://github.com/pissang) + */ + +var mathMin$3 = Math.min; +var mathMax$3 = Math.max; +var mathSin$2 = Math.sin; +var mathCos$2 = Math.cos; +var PI2 = Math.PI * 2; + +var start = create(); +var end = create(); +var extremity = create(); + +/** + * 从顶点数组中计算出最小包围盒,写入`min`和`max`中 + * @module zrender/core/bbox + * @param {Array<Object>} points 顶点数组 + * @param {number} min + * @param {number} max + */ +function fromPoints(points, min$$1, max$$1) { + if (points.length === 0) { + return; + } + var p = points[0]; + var left = p[0]; + var right = p[0]; + var top = p[1]; + var bottom = p[1]; + var i; + + for (i = 1; i < points.length; i++) { + p = points[i]; + left = mathMin$3(left, p[0]); + right = mathMax$3(right, p[0]); + top = mathMin$3(top, p[1]); + bottom = mathMax$3(bottom, p[1]); + } + + min$$1[0] = left; + min$$1[1] = top; + max$$1[0] = right; + max$$1[1] = bottom; +} + +/** + * @memberOf module:zrender/core/bbox + * @param {number} x0 + * @param {number} y0 + * @param {number} x1 + * @param {number} y1 + * @param {Array.<number>} min + * @param {Array.<number>} max + */ +function fromLine(x0, y0, x1, y1, min$$1, max$$1) { + min$$1[0] = mathMin$3(x0, x1); + min$$1[1] = mathMin$3(y0, y1); + max$$1[0] = mathMax$3(x0, x1); + max$$1[1] = mathMax$3(y0, y1); +} + +var xDim = []; +var yDim = []; +/** + * 从三阶贝塞尔曲线(p0, p1, p2, p3)中计算出最小包围盒,写入`min`和`max`中 + * @memberOf module:zrender/core/bbox + * @param {number} x0 + * @param {number} y0 + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {number} x3 + * @param {number} y3 + * @param {Array.<number>} min + * @param {Array.<number>} max + */ +function fromCubic( + x0, y0, x1, y1, x2, y2, x3, y3, min$$1, max$$1 +) { + var cubicExtrema$$1 = cubicExtrema; + var cubicAt$$1 = cubicAt; + var i; + var n = cubicExtrema$$1(x0, x1, x2, x3, xDim); + min$$1[0] = Infinity; + min$$1[1] = Infinity; + max$$1[0] = -Infinity; + max$$1[1] = -Infinity; + + for (i = 0; i < n; i++) { + var x = cubicAt$$1(x0, x1, x2, x3, xDim[i]); + min$$1[0] = mathMin$3(x, min$$1[0]); + max$$1[0] = mathMax$3(x, max$$1[0]); + } + n = cubicExtrema$$1(y0, y1, y2, y3, yDim); + for (i = 0; i < n; i++) { + var y = cubicAt$$1(y0, y1, y2, y3, yDim[i]); + min$$1[1] = mathMin$3(y, min$$1[1]); + max$$1[1] = mathMax$3(y, max$$1[1]); + } + + min$$1[0] = mathMin$3(x0, min$$1[0]); + max$$1[0] = mathMax$3(x0, max$$1[0]); + min$$1[0] = mathMin$3(x3, min$$1[0]); + max$$1[0] = mathMax$3(x3, max$$1[0]); + + min$$1[1] = mathMin$3(y0, min$$1[1]); + max$$1[1] = mathMax$3(y0, max$$1[1]); + min$$1[1] = mathMin$3(y3, min$$1[1]); + max$$1[1] = mathMax$3(y3, max$$1[1]); +} + +/** + * 从二阶贝塞尔曲线(p0, p1, p2)中计算出最小包围盒,写入`min`和`max`中 + * @memberOf module:zrender/core/bbox + * @param {number} x0 + * @param {number} y0 + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {Array.<number>} min + * @param {Array.<number>} max + */ +function fromQuadratic(x0, y0, x1, y1, x2, y2, min$$1, max$$1) { + var quadraticExtremum$$1 = quadraticExtremum; + var quadraticAt$$1 = quadraticAt; + // Find extremities, where derivative in x dim or y dim is zero + var tx = + mathMax$3( + mathMin$3(quadraticExtremum$$1(x0, x1, x2), 1), 0 + ); + var ty = + mathMax$3( + mathMin$3(quadraticExtremum$$1(y0, y1, y2), 1), 0 + ); + + var x = quadraticAt$$1(x0, x1, x2, tx); + var y = quadraticAt$$1(y0, y1, y2, ty); + + min$$1[0] = mathMin$3(x0, x2, x); + min$$1[1] = mathMin$3(y0, y2, y); + max$$1[0] = mathMax$3(x0, x2, x); + max$$1[1] = mathMax$3(y0, y2, y); +} + +/** + * 从圆弧中计算出最小包围盒,写入`min`和`max`中 + * @method + * @memberOf module:zrender/core/bbox + * @param {number} x + * @param {number} y + * @param {number} rx + * @param {number} ry + * @param {number} startAngle + * @param {number} endAngle + * @param {number} anticlockwise + * @param {Array.<number>} min + * @param {Array.<number>} max + */ +function fromArc( + x, y, rx, ry, startAngle, endAngle, anticlockwise, min$$1, max$$1 +) { + var vec2Min = min; + var vec2Max = max; + + var diff = Math.abs(startAngle - endAngle); + + + if (diff % PI2 < 1e-4 && diff > 1e-4) { + // Is a circle + min$$1[0] = x - rx; + min$$1[1] = y - ry; + max$$1[0] = x + rx; + max$$1[1] = y + ry; + return; + } + + start[0] = mathCos$2(startAngle) * rx + x; + start[1] = mathSin$2(startAngle) * ry + y; + + end[0] = mathCos$2(endAngle) * rx + x; + end[1] = mathSin$2(endAngle) * ry + y; + + vec2Min(min$$1, start, end); + vec2Max(max$$1, start, end); + + // Thresh to [0, Math.PI * 2] + startAngle = startAngle % (PI2); + if (startAngle < 0) { + startAngle = startAngle + PI2; + } + endAngle = endAngle % (PI2); + if (endAngle < 0) { + endAngle = endAngle + PI2; + } + + if (startAngle > endAngle && !anticlockwise) { + endAngle += PI2; + } + else if (startAngle < endAngle && anticlockwise) { + startAngle += PI2; + } + if (anticlockwise) { + var tmp = endAngle; + endAngle = startAngle; + startAngle = tmp; + } + + // var number = 0; + // var step = (anticlockwise ? -Math.PI : Math.PI) / 2; + for (var angle = 0; angle < endAngle; angle += Math.PI / 2) { + if (angle > startAngle) { + extremity[0] = mathCos$2(angle) * rx + x; + extremity[1] = mathSin$2(angle) * ry + y; + + vec2Min(min$$1, extremity, min$$1); + vec2Max(max$$1, extremity, max$$1); + } + } +} + +/** + * Path 代理,可以在`buildPath`中用于替代`ctx`, 会保存每个path操作的命令到pathCommands属性中 + * 可以用于 isInsidePath 判断以及获取boundingRect + * + * @module zrender/core/PathProxy + * @author Yi Shen (http://www.github.com/pissang) + */ + +// TODO getTotalLength, getPointAtLength + +var CMD = { + M: 1, + L: 2, + C: 3, + Q: 4, + A: 5, + Z: 6, + // Rect + R: 7 +}; + +// var CMD_MEM_SIZE = { +// M: 3, +// L: 3, +// C: 7, +// Q: 5, +// A: 9, +// R: 5, +// Z: 1 +// }; + +var min$1 = []; +var max$1 = []; +var min2 = []; +var max2 = []; +var mathMin$2 = Math.min; +var mathMax$2 = Math.max; +var mathCos$1 = Math.cos; +var mathSin$1 = Math.sin; +var mathSqrt$1 = Math.sqrt; +var mathAbs = Math.abs; + +var hasTypedArray = typeof Float32Array != 'undefined'; + +/** + * @alias module:zrender/core/PathProxy + * @constructor + */ +var PathProxy = function (notSaveData) { + + this._saveData = !(notSaveData || false); + + if (this._saveData) { + /** + * Path data. Stored as flat array + * @type {Array.<Object>} + */ + this.data = []; + } + + this._ctx = null; +}; + +/** + * 快速计算Path包围盒(并不是最小包围盒) + * @return {Object} + */ +PathProxy.prototype = { + + constructor: PathProxy, + + _xi: 0, + _yi: 0, + + _x0: 0, + _y0: 0, + // Unit x, Unit y. Provide for avoiding drawing that too short line segment + _ux: 0, + _uy: 0, + + _len: 0, + + _lineDash: null, + + _dashOffset: 0, + + _dashIdx: 0, + + _dashSum: 0, + + /** + * @readOnly + */ + setScale: function (sx, sy) { + this._ux = mathAbs(1 / devicePixelRatio / sx) || 0; + this._uy = mathAbs(1 / devicePixelRatio / sy) || 0; + }, + + getContext: function () { + return this._ctx; + }, + + /** + * @param {CanvasRenderingContext2D} ctx + * @return {module:zrender/core/PathProxy} + */ + beginPath: function (ctx) { + + this._ctx = ctx; + + ctx && ctx.beginPath(); + + ctx && (this.dpr = ctx.dpr); + + // Reset + if (this._saveData) { + this._len = 0; + } + + if (this._lineDash) { + this._lineDash = null; + + this._dashOffset = 0; + } + + return this; + }, + + /** + * @param {number} x + * @param {number} y + * @return {module:zrender/core/PathProxy} + */ + moveTo: function (x, y) { + this.addData(CMD.M, x, y); + this._ctx && this._ctx.moveTo(x, y); + + // x0, y0, xi, yi 是记录在 _dashedXXXXTo 方法中使用 + // xi, yi 记录当前点, x0, y0 在 closePath 的时候回到起始点。 + // 有可能在 beginPath 之后直接调用 lineTo,这时候 x0, y0 需要 + // 在 lineTo 方法中记录,这里先不考虑这种情况,dashed line 也只在 IE10- 中不支持 + this._x0 = x; + this._y0 = y; + + this._xi = x; + this._yi = y; + + return this; + }, + + /** + * @param {number} x + * @param {number} y + * @return {module:zrender/core/PathProxy} + */ + lineTo: function (x, y) { + var exceedUnit = mathAbs(x - this._xi) > this._ux + || mathAbs(y - this._yi) > this._uy + // Force draw the first segment + || this._len < 5; + + this.addData(CMD.L, x, y); + + if (this._ctx && exceedUnit) { + this._needsDash() ? this._dashedLineTo(x, y) + : this._ctx.lineTo(x, y); + } + if (exceedUnit) { + this._xi = x; + this._yi = y; + } + + return this; + }, + + /** + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {number} x3 + * @param {number} y3 + * @return {module:zrender/core/PathProxy} + */ + bezierCurveTo: function (x1, y1, x2, y2, x3, y3) { + this.addData(CMD.C, x1, y1, x2, y2, x3, y3); + if (this._ctx) { + this._needsDash() ? this._dashedBezierTo(x1, y1, x2, y2, x3, y3) + : this._ctx.bezierCurveTo(x1, y1, x2, y2, x3, y3); + } + this._xi = x3; + this._yi = y3; + return this; + }, + + /** + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @return {module:zrender/core/PathProxy} + */ + quadraticCurveTo: function (x1, y1, x2, y2) { + this.addData(CMD.Q, x1, y1, x2, y2); + if (this._ctx) { + this._needsDash() ? this._dashedQuadraticTo(x1, y1, x2, y2) + : this._ctx.quadraticCurveTo(x1, y1, x2, y2); + } + this._xi = x2; + this._yi = y2; + return this; + }, + + /** + * @param {number} cx + * @param {number} cy + * @param {number} r + * @param {number} startAngle + * @param {number} endAngle + * @param {boolean} anticlockwise + * @return {module:zrender/core/PathProxy} + */ + arc: function (cx, cy, r, startAngle, endAngle, anticlockwise) { + this.addData( + CMD.A, cx, cy, r, r, startAngle, endAngle - startAngle, 0, anticlockwise ? 0 : 1 + ); + this._ctx && this._ctx.arc(cx, cy, r, startAngle, endAngle, anticlockwise); + + this._xi = mathCos$1(endAngle) * r + cx; + this._yi = mathSin$1(endAngle) * r + cx; + return this; + }, + + // TODO + arcTo: function (x1, y1, x2, y2, radius) { + if (this._ctx) { + this._ctx.arcTo(x1, y1, x2, y2, radius); + } + return this; + }, + + // TODO + rect: function (x, y, w, h) { + this._ctx && this._ctx.rect(x, y, w, h); + this.addData(CMD.R, x, y, w, h); + return this; + }, + + /** + * @return {module:zrender/core/PathProxy} + */ + closePath: function () { + this.addData(CMD.Z); + + var ctx = this._ctx; + var x0 = this._x0; + var y0 = this._y0; + if (ctx) { + this._needsDash() && this._dashedLineTo(x0, y0); + ctx.closePath(); + } + + this._xi = x0; + this._yi = y0; + return this; + }, + + /** + * Context 从外部传入,因为有可能是 rebuildPath 完之后再 fill。 + * stroke 同样 + * @param {CanvasRenderingContext2D} ctx + * @return {module:zrender/core/PathProxy} + */ + fill: function (ctx) { + ctx && ctx.fill(); + this.toStatic(); + }, + + /** + * @param {CanvasRenderingContext2D} ctx + * @return {module:zrender/core/PathProxy} + */ + stroke: function (ctx) { + ctx && ctx.stroke(); + this.toStatic(); + }, + + /** + * 必须在其它绘制命令前调用 + * Must be invoked before all other path drawing methods + * @return {module:zrender/core/PathProxy} + */ + setLineDash: function (lineDash) { + if (lineDash instanceof Array) { + this._lineDash = lineDash; + + this._dashIdx = 0; + + var lineDashSum = 0; + for (var i = 0; i < lineDash.length; i++) { + lineDashSum += lineDash[i]; + } + this._dashSum = lineDashSum; + } + return this; + }, + + /** + * 必须在其它绘制命令前调用 + * Must be invoked before all other path drawing methods + * @return {module:zrender/core/PathProxy} + */ + setLineDashOffset: function (offset) { + this._dashOffset = offset; + return this; + }, + + /** + * + * @return {boolean} + */ + len: function () { + return this._len; + }, + + /** + * 直接设置 Path 数据 + */ + setData: function (data) { + + var len$$1 = data.length; + + if (! (this.data && this.data.length == len$$1) && hasTypedArray) { + this.data = new Float32Array(len$$1); + } + + for (var i = 0; i < len$$1; i++) { + this.data[i] = data[i]; + } + + this._len = len$$1; + }, + + /** + * 添加子路径 + * @param {module:zrender/core/PathProxy|Array.<module:zrender/core/PathProxy>} path + */ + appendPath: function (path) { + if (!(path instanceof Array)) { + path = [path]; + } + var len$$1 = path.length; + var appendSize = 0; + var offset = this._len; + for (var i = 0; i < len$$1; i++) { + appendSize += path[i].len(); + } + if (hasTypedArray && (this.data instanceof Float32Array)) { + this.data = new Float32Array(offset + appendSize); + } + for (var i = 0; i < len$$1; i++) { + var appendPathData = path[i].data; + for (var k = 0; k < appendPathData.length; k++) { + this.data[offset++] = appendPathData[k]; + } + } + this._len = offset; + }, + + /** + * 填充 Path 数据。 + * 尽量复用而不申明新的数组。大部分图形重绘的指令数据长度都是不变的。 + */ + addData: function (cmd) { + if (!this._saveData) { + return; + } + + var data = this.data; + if (this._len + arguments.length > data.length) { + // 因为之前的数组已经转换成静态的 Float32Array + // 所以不够用时需要扩展一个新的动态数组 + this._expandData(); + data = this.data; + } + for (var i = 0; i < arguments.length; i++) { + data[this._len++] = arguments[i]; + } + + this._prevCmd = cmd; + }, + + _expandData: function () { + // Only if data is Float32Array + if (!(this.data instanceof Array)) { + var newData = []; + for (var i = 0; i < this._len; i++) { + newData[i] = this.data[i]; + } + this.data = newData; + } + }, + + /** + * If needs js implemented dashed line + * @return {boolean} + * @private + */ + _needsDash: function () { + return this._lineDash; + }, + + _dashedLineTo: function (x1, y1) { + var dashSum = this._dashSum; + var offset = this._dashOffset; + var lineDash = this._lineDash; + var ctx = this._ctx; + + var x0 = this._xi; + var y0 = this._yi; + var dx = x1 - x0; + var dy = y1 - y0; + var dist$$1 = mathSqrt$1(dx * dx + dy * dy); + var x = x0; + var y = y0; + var dash; + var nDash = lineDash.length; + var idx; + dx /= dist$$1; + dy /= dist$$1; + + if (offset < 0) { + // Convert to positive offset + offset = dashSum + offset; + } + offset %= dashSum; + x -= offset * dx; + y -= offset * dy; + + while ((dx > 0 && x <= x1) || (dx < 0 && x >= x1) + || (dx == 0 && ((dy > 0 && y <= y1) || (dy < 0 && y >= y1)))) { + idx = this._dashIdx; + dash = lineDash[idx]; + x += dx * dash; + y += dy * dash; + this._dashIdx = (idx + 1) % nDash; + // Skip positive offset + if ((dx > 0 && x < x0) || (dx < 0 && x > x0) || (dy > 0 && y < y0) || (dy < 0 && y > y0)) { + continue; + } + ctx[idx % 2 ? 'moveTo' : 'lineTo']( + dx >= 0 ? mathMin$2(x, x1) : mathMax$2(x, x1), + dy >= 0 ? mathMin$2(y, y1) : mathMax$2(y, y1) + ); + } + // Offset for next lineTo + dx = x - x1; + dy = y - y1; + this._dashOffset = -mathSqrt$1(dx * dx + dy * dy); + }, + + // Not accurate dashed line to + _dashedBezierTo: function (x1, y1, x2, y2, x3, y3) { + var dashSum = this._dashSum; + var offset = this._dashOffset; + var lineDash = this._lineDash; + var ctx = this._ctx; + + var x0 = this._xi; + var y0 = this._yi; + var t; + var dx; + var dy; + var cubicAt$$1 = cubicAt; + var bezierLen = 0; + var idx = this._dashIdx; + var nDash = lineDash.length; + + var x; + var y; + + var tmpLen = 0; + + if (offset < 0) { + // Convert to positive offset + offset = dashSum + offset; + } + offset %= dashSum; + // Bezier approx length + for (t = 0; t < 1; t += 0.1) { + dx = cubicAt$$1(x0, x1, x2, x3, t + 0.1) + - cubicAt$$1(x0, x1, x2, x3, t); + dy = cubicAt$$1(y0, y1, y2, y3, t + 0.1) + - cubicAt$$1(y0, y1, y2, y3, t); + bezierLen += mathSqrt$1(dx * dx + dy * dy); + } + + // Find idx after add offset + for (; idx < nDash; idx++) { + tmpLen += lineDash[idx]; + if (tmpLen > offset) { + break; + } + } + t = (tmpLen - offset) / bezierLen; + + while (t <= 1) { + + x = cubicAt$$1(x0, x1, x2, x3, t); + y = cubicAt$$1(y0, y1, y2, y3, t); + + // Use line to approximate dashed bezier + // Bad result if dash is long + idx % 2 ? ctx.moveTo(x, y) + : ctx.lineTo(x, y); + + t += lineDash[idx] / bezierLen; + + idx = (idx + 1) % nDash; + } + + // Finish the last segment and calculate the new offset + (idx % 2 !== 0) && ctx.lineTo(x3, y3); + dx = x3 - x; + dy = y3 - y; + this._dashOffset = -mathSqrt$1(dx * dx + dy * dy); + }, + + _dashedQuadraticTo: function (x1, y1, x2, y2) { + // Convert quadratic to cubic using degree elevation + var x3 = x2; + var y3 = y2; + x2 = (x2 + 2 * x1) / 3; + y2 = (y2 + 2 * y1) / 3; + x1 = (this._xi + 2 * x1) / 3; + y1 = (this._yi + 2 * y1) / 3; + + this._dashedBezierTo(x1, y1, x2, y2, x3, y3); + }, + + /** + * 转成静态的 Float32Array 减少堆内存占用 + * Convert dynamic array to static Float32Array + */ + toStatic: function () { + var data = this.data; + if (data instanceof Array) { + data.length = this._len; + if (hasTypedArray) { + this.data = new Float32Array(data); + } + } + }, + + /** + * @return {module:zrender/core/BoundingRect} + */ + getBoundingRect: function () { + min$1[0] = min$1[1] = min2[0] = min2[1] = Number.MAX_VALUE; + max$1[0] = max$1[1] = max2[0] = max2[1] = -Number.MAX_VALUE; + + var data = this.data; + var xi = 0; + var yi = 0; + var x0 = 0; + var y0 = 0; + + for (var i = 0; i < data.length;) { + var cmd = data[i++]; + + if (i == 1) { + // 如果第一个命令是 L, C, Q + // 则 previous point 同绘制命令的第一个 point + // + // 第一个命令为 Arc 的情况下会在后面特殊处理 + xi = data[i]; + yi = data[i + 1]; + + x0 = xi; + y0 = yi; + } + + switch (cmd) { + case CMD.M: + // moveTo 命令重新创建一个新的 subpath, 并且更新新的起点 + // 在 closePath 的时候使用 + x0 = data[i++]; + y0 = data[i++]; + xi = x0; + yi = y0; + min2[0] = x0; + min2[1] = y0; + max2[0] = x0; + max2[1] = y0; + break; + case CMD.L: + fromLine(xi, yi, data[i], data[i + 1], min2, max2); + xi = data[i++]; + yi = data[i++]; + break; + case CMD.C: + fromCubic( + xi, yi, data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], + min2, max2 + ); + xi = data[i++]; + yi = data[i++]; + break; + case CMD.Q: + fromQuadratic( + xi, yi, data[i++], data[i++], data[i], data[i + 1], + min2, max2 + ); + xi = data[i++]; + yi = data[i++]; + break; + case CMD.A: + // TODO Arc 判断的开销比较大 + var cx = data[i++]; + var cy = data[i++]; + var rx = data[i++]; + var ry = data[i++]; + var startAngle = data[i++]; + var endAngle = data[i++] + startAngle; + // TODO Arc 旋转 + var psi = data[i++]; + var anticlockwise = 1 - data[i++]; + + if (i == 1) { + // 直接使用 arc 命令 + // 第一个命令起点还未定义 + x0 = mathCos$1(startAngle) * rx + cx; + y0 = mathSin$1(startAngle) * ry + cy; + } + + fromArc( + cx, cy, rx, ry, startAngle, endAngle, + anticlockwise, min2, max2 + ); + + xi = mathCos$1(endAngle) * rx + cx; + yi = mathSin$1(endAngle) * ry + cy; + break; + case CMD.R: + x0 = xi = data[i++]; + y0 = yi = data[i++]; + var width = data[i++]; + var height = data[i++]; + // Use fromLine + fromLine(x0, y0, x0 + width, y0 + height, min2, max2); + break; + case CMD.Z: + xi = x0; + yi = y0; + break; + } + + // Union + min(min$1, min$1, min2); + max(max$1, max$1, max2); + } + + // No data + if (i === 0) { + min$1[0] = min$1[1] = max$1[0] = max$1[1] = 0; + } + + return new BoundingRect( + min$1[0], min$1[1], max$1[0] - min$1[0], max$1[1] - min$1[1] + ); + }, + + /** + * Rebuild path from current data + * Rebuild path will not consider javascript implemented line dash. + * @param {CanvasRenderingContext2D} ctx + */ + rebuildPath: function (ctx) { + var d = this.data; + var x0, y0; + var xi, yi; + var x, y; + var ux = this._ux; + var uy = this._uy; + var len$$1 = this._len; + for (var i = 0; i < len$$1;) { + var cmd = d[i++]; + + if (i == 1) { + // 如果第一个命令是 L, C, Q + // 则 previous point 同绘制命令的第一个 point + // + // 第一个命令为 Arc 的情况下会在后面特殊处理 + xi = d[i]; + yi = d[i + 1]; + + x0 = xi; + y0 = yi; + } + switch (cmd) { + case CMD.M: + x0 = xi = d[i++]; + y0 = yi = d[i++]; + ctx.moveTo(xi, yi); + break; + case CMD.L: + x = d[i++]; + y = d[i++]; + // Not draw too small seg between + if (mathAbs(x - xi) > ux || mathAbs(y - yi) > uy || i === len$$1 - 1) { + ctx.lineTo(x, y); + xi = x; + yi = y; + } + break; + case CMD.C: + ctx.bezierCurveTo( + d[i++], d[i++], d[i++], d[i++], d[i++], d[i++] + ); + xi = d[i - 2]; + yi = d[i - 1]; + break; + case CMD.Q: + ctx.quadraticCurveTo(d[i++], d[i++], d[i++], d[i++]); + xi = d[i - 2]; + yi = d[i - 1]; + break; + case CMD.A: + var cx = d[i++]; + var cy = d[i++]; + var rx = d[i++]; + var ry = d[i++]; + var theta = d[i++]; + var dTheta = d[i++]; + var psi = d[i++]; + var fs = d[i++]; + var r = (rx > ry) ? rx : ry; + var scaleX = (rx > ry) ? 1 : rx / ry; + var scaleY = (rx > ry) ? ry / rx : 1; + var isEllipse = Math.abs(rx - ry) > 1e-3; + var endAngle = theta + dTheta; + if (isEllipse) { + ctx.translate(cx, cy); + ctx.rotate(psi); + ctx.scale(scaleX, scaleY); + ctx.arc(0, 0, r, theta, endAngle, 1 - fs); + ctx.scale(1 / scaleX, 1 / scaleY); + ctx.rotate(-psi); + ctx.translate(-cx, -cy); + } + else { + ctx.arc(cx, cy, r, theta, endAngle, 1 - fs); + } + + if (i == 1) { + // 直接使用 arc 命令 + // 第一个命令起点还未定义 + x0 = mathCos$1(theta) * rx + cx; + y0 = mathSin$1(theta) * ry + cy; + } + xi = mathCos$1(endAngle) * rx + cx; + yi = mathSin$1(endAngle) * ry + cy; + break; + case CMD.R: + x0 = xi = d[i]; + y0 = yi = d[i + 1]; + ctx.rect(d[i++], d[i++], d[i++], d[i++]); + break; + case CMD.Z: + ctx.closePath(); + xi = x0; + yi = y0; + } + } + } +}; + +PathProxy.CMD = CMD; + +/** + * 线段包含判断 + * @param {number} x0 + * @param {number} y0 + * @param {number} x1 + * @param {number} y1 + * @param {number} lineWidth + * @param {number} x + * @param {number} y + * @return {boolean} + */ +function containStroke$1(x0, y0, x1, y1, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + var _a = 0; + var _b = x0; + // Quick reject + if ( + (y > y0 + _l && y > y1 + _l) + || (y < y0 - _l && y < y1 - _l) + || (x > x0 + _l && x > x1 + _l) + || (x < x0 - _l && x < x1 - _l) + ) { + return false; + } + + if (x0 !== x1) { + _a = (y0 - y1) / (x0 - x1); + _b = (x0 * y1 - x1 * y0) / (x0 - x1) ; + } + else { + return Math.abs(x - x0) <= _l / 2; + } + var tmp = _a * x - y + _b; + var _s = tmp * tmp / (_a * _a + 1); + return _s <= _l / 2 * _l / 2; +} + +/** + * 三次贝塞尔曲线描边包含判断 + * @param {number} x0 + * @param {number} y0 + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {number} x3 + * @param {number} y3 + * @param {number} lineWidth + * @param {number} x + * @param {number} y + * @return {boolean} + */ +function containStroke$2(x0, y0, x1, y1, x2, y2, x3, y3, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + // Quick reject + if ( + (y > y0 + _l && y > y1 + _l && y > y2 + _l && y > y3 + _l) + || (y < y0 - _l && y < y1 - _l && y < y2 - _l && y < y3 - _l) + || (x > x0 + _l && x > x1 + _l && x > x2 + _l && x > x3 + _l) + || (x < x0 - _l && x < x1 - _l && x < x2 - _l && x < x3 - _l) + ) { + return false; + } + var d = cubicProjectPoint( + x0, y0, x1, y1, x2, y2, x3, y3, + x, y, null + ); + return d <= _l / 2; +} + +/** + * 二次贝塞尔曲线描边包含判断 + * @param {number} x0 + * @param {number} y0 + * @param {number} x1 + * @param {number} y1 + * @param {number} x2 + * @param {number} y2 + * @param {number} lineWidth + * @param {number} x + * @param {number} y + * @return {boolean} + */ +function containStroke$3(x0, y0, x1, y1, x2, y2, lineWidth, x, y) { + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + // Quick reject + if ( + (y > y0 + _l && y > y1 + _l && y > y2 + _l) + || (y < y0 - _l && y < y1 - _l && y < y2 - _l) + || (x > x0 + _l && x > x1 + _l && x > x2 + _l) + || (x < x0 - _l && x < x1 - _l && x < x2 - _l) + ) { + return false; + } + var d = quadraticProjectPoint( + x0, y0, x1, y1, x2, y2, + x, y, null + ); + return d <= _l / 2; +} + +var PI2$3 = Math.PI * 2; + +function normalizeRadian(angle) { + angle %= PI2$3; + if (angle < 0) { + angle += PI2$3; + } + return angle; +} + +var PI2$2 = Math.PI * 2; + +/** + * 圆弧描边包含判断 + * @param {number} cx + * @param {number} cy + * @param {number} r + * @param {number} startAngle + * @param {number} endAngle + * @param {boolean} anticlockwise + * @param {number} lineWidth + * @param {number} x + * @param {number} y + * @return {Boolean} + */ +function containStroke$4( + cx, cy, r, startAngle, endAngle, anticlockwise, + lineWidth, x, y +) { + + if (lineWidth === 0) { + return false; + } + var _l = lineWidth; + + x -= cx; + y -= cy; + var d = Math.sqrt(x * x + y * y); + + if ((d - _l > r) || (d + _l < r)) { + return false; + } + if (Math.abs(startAngle - endAngle) % PI2$2 < 1e-4) { + // Is a circle + return true; + } + if (anticlockwise) { + var tmp = startAngle; + startAngle = normalizeRadian(endAngle); + endAngle = normalizeRadian(tmp); + } else { + startAngle = normalizeRadian(startAngle); + endAngle = normalizeRadian(endAngle); + } + if (startAngle > endAngle) { + endAngle += PI2$2; + } + + var angle = Math.atan2(y, x); + if (angle < 0) { + angle += PI2$2; + } + return (angle >= startAngle && angle <= endAngle) + || (angle + PI2$2 >= startAngle && angle + PI2$2 <= endAngle); +} + +function windingLine(x0, y0, x1, y1, x, y) { + if ((y > y0 && y > y1) || (y < y0 && y < y1)) { + return 0; + } + // Ignore horizontal line + if (y1 === y0) { + return 0; + } + var dir = y1 < y0 ? 1 : -1; + var t = (y - y0) / (y1 - y0); + + // Avoid winding error when intersection point is the connect point of two line of polygon + if (t === 1 || t === 0) { + dir = y1 < y0 ? 0.5 : -0.5; + } + + var x_ = t * (x1 - x0) + x0; + + // If (x, y) on the line, considered as "contain". + return x_ === x ? Infinity : x_ > x ? dir : 0; +} + +var CMD$1 = PathProxy.CMD; +var PI2$1 = Math.PI * 2; + +var EPSILON$2 = 1e-4; + +function isAroundEqual(a, b) { + return Math.abs(a - b) < EPSILON$2; +} + +// 临时数组 +var roots = [-1, -1, -1]; +var extrema = [-1, -1]; + +function swapExtrema() { + var tmp = extrema[0]; + extrema[0] = extrema[1]; + extrema[1] = tmp; +} + +function windingCubic(x0, y0, x1, y1, x2, y2, x3, y3, x, y) { + // Quick reject + if ( + (y > y0 && y > y1 && y > y2 && y > y3) + || (y < y0 && y < y1 && y < y2 && y < y3) + ) { + return 0; + } + var nRoots = cubicRootAt(y0, y1, y2, y3, y, roots); + if (nRoots === 0) { + return 0; + } + else { + var w = 0; + var nExtrema = -1; + var y0_, y1_; + for (var i = 0; i < nRoots; i++) { + var t = roots[i]; + + // Avoid winding error when intersection point is the connect point of two line of polygon + var unit = (t === 0 || t === 1) ? 0.5 : 1; + + var x_ = cubicAt(x0, x1, x2, x3, t); + if (x_ < x) { // Quick reject + continue; + } + if (nExtrema < 0) { + nExtrema = cubicExtrema(y0, y1, y2, y3, extrema); + if (extrema[1] < extrema[0] && nExtrema > 1) { + swapExtrema(); + } + y0_ = cubicAt(y0, y1, y2, y3, extrema[0]); + if (nExtrema > 1) { + y1_ = cubicAt(y0, y1, y2, y3, extrema[1]); + } + } + if (nExtrema == 2) { + // 分成三段单调函数 + if (t < extrema[0]) { + w += y0_ < y0 ? unit : -unit; + } + else if (t < extrema[1]) { + w += y1_ < y0_ ? unit : -unit; + } + else { + w += y3 < y1_ ? unit : -unit; + } + } + else { + // 分成两段单调函数 + if (t < extrema[0]) { + w += y0_ < y0 ? unit : -unit; + } + else { + w += y3 < y0_ ? unit : -unit; + } + } + } + return w; + } +} + +function windingQuadratic(x0, y0, x1, y1, x2, y2, x, y) { + // Quick reject + if ( + (y > y0 && y > y1 && y > y2) + || (y < y0 && y < y1 && y < y2) + ) { + return 0; + } + var nRoots = quadraticRootAt(y0, y1, y2, y, roots); + if (nRoots === 0) { + return 0; + } + else { + var t = quadraticExtremum(y0, y1, y2); + if (t >= 0 && t <= 1) { + var w = 0; + var y_ = quadraticAt(y0, y1, y2, t); + for (var i = 0; i < nRoots; i++) { + // Remove one endpoint. + var unit = (roots[i] === 0 || roots[i] === 1) ? 0.5 : 1; + + var x_ = quadraticAt(x0, x1, x2, roots[i]); + if (x_ < x) { // Quick reject + continue; + } + if (roots[i] < t) { + w += y_ < y0 ? unit : -unit; + } + else { + w += y2 < y_ ? unit : -unit; + } + } + return w; + } + else { + // Remove one endpoint. + var unit = (roots[0] === 0 || roots[0] === 1) ? 0.5 : 1; + + var x_ = quadraticAt(x0, x1, x2, roots[0]); + if (x_ < x) { // Quick reject + return 0; + } + return y2 < y0 ? unit : -unit; + } + } +} + +// TODO +// Arc 旋转 +function windingArc( + cx, cy, r, startAngle, endAngle, anticlockwise, x, y +) { + y -= cy; + if (y > r || y < -r) { + return 0; + } + var tmp = Math.sqrt(r * r - y * y); + roots[0] = -tmp; + roots[1] = tmp; + + var diff = Math.abs(startAngle - endAngle); + if (diff < 1e-4) { + return 0; + } + if (diff % PI2$1 < 1e-4) { + // Is a circle + startAngle = 0; + endAngle = PI2$1; + var dir = anticlockwise ? 1 : -1; + if (x >= roots[0] + cx && x <= roots[1] + cx) { + return dir; + } else { + return 0; + } + } + + if (anticlockwise) { + var tmp = startAngle; + startAngle = normalizeRadian(endAngle); + endAngle = normalizeRadian(tmp); + } + else { + startAngle = normalizeRadian(startAngle); + endAngle = normalizeRadian(endAngle); + } + if (startAngle > endAngle) { + endAngle += PI2$1; + } + + var w = 0; + for (var i = 0; i < 2; i++) { + var x_ = roots[i]; + if (x_ + cx > x) { + var angle = Math.atan2(y, x_); + var dir = anticlockwise ? 1 : -1; + if (angle < 0) { + angle = PI2$1 + angle; + } + if ( + (angle >= startAngle && angle <= endAngle) + || (angle + PI2$1 >= startAngle && angle + PI2$1 <= endAngle) + ) { + if (angle > Math.PI / 2 && angle < Math.PI * 1.5) { + dir = -dir; + } + w += dir; + } + } + } + return w; +} + +function containPath(data, lineWidth, isStroke, x, y) { + var w = 0; + var xi = 0; + var yi = 0; + var x0 = 0; + var y0 = 0; + + for (var i = 0; i < data.length;) { + var cmd = data[i++]; + // Begin a new subpath + if (cmd === CMD$1.M && i > 1) { + // Close previous subpath + if (!isStroke) { + w += windingLine(xi, yi, x0, y0, x, y); + } + // 如果被任何一个 subpath 包含 + // if (w !== 0) { + // return true; + // } + } + + if (i == 1) { + // 如果第一个命令是 L, C, Q + // 则 previous point 同绘制命令的第一个 point + // + // 第一个命令为 Arc 的情况下会在后面特殊处理 + xi = data[i]; + yi = data[i + 1]; + + x0 = xi; + y0 = yi; + } + + switch (cmd) { + case CMD$1.M: + // moveTo 命令重新创建一个新的 subpath, 并且更新新的起点 + // 在 closePath 的时候使用 + x0 = data[i++]; + y0 = data[i++]; + xi = x0; + yi = y0; + break; + case CMD$1.L: + if (isStroke) { + if (containStroke$1(xi, yi, data[i], data[i + 1], lineWidth, x, y)) { + return true; + } + } + else { + // NOTE 在第一个命令为 L, C, Q 的时候会计算出 NaN + w += windingLine(xi, yi, data[i], data[i + 1], x, y) || 0; + } + xi = data[i++]; + yi = data[i++]; + break; + case CMD$1.C: + if (isStroke) { + if (containStroke$2(xi, yi, + data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], + lineWidth, x, y + )) { + return true; + } + } + else { + w += windingCubic( + xi, yi, + data[i++], data[i++], data[i++], data[i++], data[i], data[i + 1], + x, y + ) || 0; + } + xi = data[i++]; + yi = data[i++]; + break; + case CMD$1.Q: + if (isStroke) { + if (containStroke$3(xi, yi, + data[i++], data[i++], data[i], data[i + 1], + lineWidth, x, y + )) { + return true; + } + } + else { + w += windingQuadratic( + xi, yi, + data[i++], data[i++], data[i], data[i + 1], + x, y + ) || 0; + } + xi = data[i++]; + yi = data[i++]; + break; + case CMD$1.A: + // TODO Arc 判断的开销比较大 + var cx = data[i++]; + var cy = data[i++]; + var rx = data[i++]; + var ry = data[i++]; + var theta = data[i++]; + var dTheta = data[i++]; + // TODO Arc 旋转 + var psi = data[i++]; + var anticlockwise = 1 - data[i++]; + var x1 = Math.cos(theta) * rx + cx; + var y1 = Math.sin(theta) * ry + cy; + // 不是直接使用 arc 命令 + if (i > 1) { + w += windingLine(xi, yi, x1, y1, x, y); + } + else { + // 第一个命令起点还未定义 + x0 = x1; + y0 = y1; + } + // zr 使用scale来模拟椭圆, 这里也对x做一定的缩放 + var _x = (x - cx) * ry / rx + cx; + if (isStroke) { + if (containStroke$4( + cx, cy, ry, theta, theta + dTheta, anticlockwise, + lineWidth, _x, y + )) { + return true; + } + } + else { + w += windingArc( + cx, cy, ry, theta, theta + dTheta, anticlockwise, + _x, y + ); + } + xi = Math.cos(theta + dTheta) * rx + cx; + yi = Math.sin(theta + dTheta) * ry + cy; + break; + case CMD$1.R: + x0 = xi = data[i++]; + y0 = yi = data[i++]; + var width = data[i++]; + var height = data[i++]; + var x1 = x0 + width; + var y1 = y0 + height; + if (isStroke) { + if (containStroke$1(x0, y0, x1, y0, lineWidth, x, y) + || containStroke$1(x1, y0, x1, y1, lineWidth, x, y) + || containStroke$1(x1, y1, x0, y1, lineWidth, x, y) + || containStroke$1(x0, y1, x0, y0, lineWidth, x, y) + ) { + return true; + } + } + else { + // FIXME Clockwise ? + w += windingLine(x1, y0, x1, y1, x, y); + w += windingLine(x0, y1, x0, y0, x, y); + } + break; + case CMD$1.Z: + if (isStroke) { + if (containStroke$1( + xi, yi, x0, y0, lineWidth, x, y + )) { + return true; + } + } + else { + // Close a subpath + w += windingLine(xi, yi, x0, y0, x, y); + // 如果被任何一个 subpath 包含 + // FIXME subpaths may overlap + // if (w !== 0) { + // return true; + // } + } + xi = x0; + yi = y0; + break; + } + } + if (!isStroke && !isAroundEqual(yi, y0)) { + w += windingLine(xi, yi, x0, y0, x, y) || 0; + } + return w !== 0; +} + +function contain(pathData, x, y) { + return containPath(pathData, 0, false, x, y); +} + +function containStroke(pathData, lineWidth, x, y) { + return containPath(pathData, lineWidth, true, x, y); +} + +var getCanvasPattern = Pattern.prototype.getCanvasPattern; + +var abs = Math.abs; + +var pathProxyForDraw = new PathProxy(true); +/** + * @alias module:zrender/graphic/Path + * @extends module:zrender/graphic/Displayable + * @constructor + * @param {Object} opts + */ +function Path(opts) { + Displayable.call(this, opts); + + /** + * @type {module:zrender/core/PathProxy} + * @readOnly + */ + this.path = null; +} + +Path.prototype = { + + constructor: Path, + + type: 'path', + + __dirtyPath: true, + + strokeContainThreshold: 5, + + brush: function (ctx, prevEl) { + var style = this.style; + var path = this.path || pathProxyForDraw; + var hasStroke = style.hasStroke(); + var hasFill = style.hasFill(); + var fill = style.fill; + var stroke = style.stroke; + var hasFillGradient = hasFill && !!(fill.colorStops); + var hasStrokeGradient = hasStroke && !!(stroke.colorStops); + var hasFillPattern = hasFill && !!(fill.image); + var hasStrokePattern = hasStroke && !!(stroke.image); + + style.bind(ctx, this, prevEl); + this.setTransform(ctx); + + if (this.__dirty) { + var rect; + // Update gradient because bounding rect may changed + if (hasFillGradient) { + rect = rect || this.getBoundingRect(); + this._fillGradient = style.getGradient(ctx, fill, rect); + } + if (hasStrokeGradient) { + rect = rect || this.getBoundingRect(); + this._strokeGradient = style.getGradient(ctx, stroke, rect); + } + } + // Use the gradient or pattern + if (hasFillGradient) { + // PENDING If may have affect the state + ctx.fillStyle = this._fillGradient; + } + else if (hasFillPattern) { + ctx.fillStyle = getCanvasPattern.call(fill, ctx); + } + if (hasStrokeGradient) { + ctx.strokeStyle = this._strokeGradient; + } + else if (hasStrokePattern) { + ctx.strokeStyle = getCanvasPattern.call(stroke, ctx); + } + + var lineDash = style.lineDash; + var lineDashOffset = style.lineDashOffset; + + var ctxLineDash = !!ctx.setLineDash; + + // Update path sx, sy + var scale = this.getGlobalScale(); + path.setScale(scale[0], scale[1]); + + // Proxy context + // Rebuild path in following 2 cases + // 1. Path is dirty + // 2. Path needs javascript implemented lineDash stroking. + // In this case, lineDash information will not be saved in PathProxy + if (this.__dirtyPath + || (lineDash && !ctxLineDash && hasStroke) + ) { + path.beginPath(ctx); + + // Setting line dash before build path + if (lineDash && !ctxLineDash) { + path.setLineDash(lineDash); + path.setLineDashOffset(lineDashOffset); + } + + this.buildPath(path, this.shape, false); + + // Clear path dirty flag + if (this.path) { + this.__dirtyPath = false; + } + } + else { + // Replay path building + ctx.beginPath(); + this.path.rebuildPath(ctx); + } + + hasFill && path.fill(ctx); + + if (lineDash && ctxLineDash) { + ctx.setLineDash(lineDash); + ctx.lineDashOffset = lineDashOffset; + } + + hasStroke && path.stroke(ctx); + + if (lineDash && ctxLineDash) { + // PENDING + // Remove lineDash + ctx.setLineDash([]); + } + + // Draw rect text + if (style.text != null) { + // Only restore transform when needs draw text. + this.restoreTransform(ctx); + this.drawRectText(ctx, this.getBoundingRect()); + } + }, + + // When bundling path, some shape may decide if use moveTo to begin a new subpath or closePath + // Like in circle + buildPath: function (ctx, shapeCfg, inBundle) {}, + + createPathProxy: function () { + this.path = new PathProxy(); + }, + + getBoundingRect: function () { + var rect = this._rect; + var style = this.style; + var needsUpdateRect = !rect; + if (needsUpdateRect) { + var path = this.path; + if (!path) { + // Create path on demand. + path = this.path = new PathProxy(); + } + if (this.__dirtyPath) { + path.beginPath(); + this.buildPath(path, this.shape, false); + } + rect = path.getBoundingRect(); + } + this._rect = rect; + + if (style.hasStroke()) { + // Needs update rect with stroke lineWidth when + // 1. Element changes scale or lineWidth + // 2. Shape is changed + var rectWithStroke = this._rectWithStroke || (this._rectWithStroke = rect.clone()); + if (this.__dirty || needsUpdateRect) { + rectWithStroke.copy(rect); + // FIXME Must after updateTransform + var w = style.lineWidth; + // PENDING, Min line width is needed when line is horizontal or vertical + var lineScale = style.strokeNoScale ? this.getLineScale() : 1; + + // Only add extra hover lineWidth when there are no fill + if (!style.hasFill()) { + w = Math.max(w, this.strokeContainThreshold || 4); + } + // Consider line width + // Line scale can't be 0; + if (lineScale > 1e-10) { + rectWithStroke.width += w / lineScale; + rectWithStroke.height += w / lineScale; + rectWithStroke.x -= w / lineScale / 2; + rectWithStroke.y -= w / lineScale / 2; + } + } + + // Return rect with stroke + return rectWithStroke; + } + + return rect; + }, + + contain: function (x, y) { + var localPos = this.transformCoordToLocal(x, y); + var rect = this.getBoundingRect(); + var style = this.style; + x = localPos[0]; + y = localPos[1]; + + if (rect.contain(x, y)) { + var pathData = this.path.data; + if (style.hasStroke()) { + var lineWidth = style.lineWidth; + var lineScale = style.strokeNoScale ? this.getLineScale() : 1; + // Line scale can't be 0; + if (lineScale > 1e-10) { + // Only add extra hover lineWidth when there are no fill + if (!style.hasFill()) { + lineWidth = Math.max(lineWidth, this.strokeContainThreshold); + } + if (containStroke( + pathData, lineWidth / lineScale, x, y + )) { + return true; + } + } + } + if (style.hasFill()) { + return contain(pathData, x, y); + } + } + return false; + }, + + /** + * @param {boolean} dirtyPath + */ + dirty: function (dirtyPath) { + if (dirtyPath == null) { + dirtyPath = true; + } + // Only mark dirty, not mark clean + if (dirtyPath) { + this.__dirtyPath = dirtyPath; + this._rect = null; + } + + this.__dirty = true; + + this.__zr && this.__zr.refresh(); + + // Used as a clipping path + if (this.__clipTarget) { + this.__clipTarget.dirty(); + } + }, + + /** + * Alias for animate('shape') + * @param {boolean} loop + */ + animateShape: function (loop) { + return this.animate('shape', loop); + }, + + // Overwrite attrKV + attrKV: function (key, value) { + // FIXME + if (key === 'shape') { + this.setShape(value); + this.__dirtyPath = true; + this._rect = null; + } + else { + Displayable.prototype.attrKV.call(this, key, value); + } + }, + + /** + * @param {Object|string} key + * @param {*} value + */ + setShape: function (key, value) { + var shape = this.shape; + // Path from string may not have shape + if (shape) { + if (isObject$1(key)) { + for (var name in key) { + if (key.hasOwnProperty(name)) { + shape[name] = key[name]; + } + } + } + else { + shape[key] = value; + } + this.dirty(true); + } + return this; + }, + + getLineScale: function () { + var m = this.transform; + // Get the line scale. + // Determinant of `m` means how much the area is enlarged by the + // transformation. So its square root can be used as a scale factor + // for width. + return m && abs(m[0] - 1) > 1e-10 && abs(m[3] - 1) > 1e-10 + ? Math.sqrt(abs(m[0] * m[3] - m[2] * m[1])) + : 1; + } +}; + +/** + * 扩展一个 Path element, 比如星形,圆等。 + * Extend a path element + * @param {Object} props + * @param {string} props.type Path type + * @param {Function} props.init Initialize + * @param {Function} props.buildPath Overwrite buildPath method + * @param {Object} [props.style] Extended default style config + * @param {Object} [props.shape] Extended default shape config + */ +Path.extend = function (defaults$$1) { + var Sub = function (opts) { + Path.call(this, opts); + + if (defaults$$1.style) { + // Extend default style + this.style.extendFrom(defaults$$1.style, false); + } + + // Extend default shape + var defaultShape = defaults$$1.shape; + if (defaultShape) { + this.shape = this.shape || {}; + var thisShape = this.shape; + for (var name in defaultShape) { + if ( + ! thisShape.hasOwnProperty(name) + && defaultShape.hasOwnProperty(name) + ) { + thisShape[name] = defaultShape[name]; + } + } + } + + defaults$$1.init && defaults$$1.init.call(this, opts); + }; + + inherits(Sub, Path); + + // FIXME 不能 extend position, rotation 等引用对象 + for (var name in defaults$$1) { + // Extending prototype values and methods + if (name !== 'style' && name !== 'shape') { + Sub.prototype[name] = defaults$$1[name]; + } + } + + return Sub; +}; + +inherits(Path, Displayable); + +var CMD$2 = PathProxy.CMD; + +var points = [[], [], []]; +var mathSqrt$3 = Math.sqrt; +var mathAtan2 = Math.atan2; + +var transformPath = function (path, m) { + var data = path.data; + var cmd; + var nPoint; + var i; + var j; + var k; + var p; + + var M = CMD$2.M; + var C = CMD$2.C; + var L = CMD$2.L; + var R = CMD$2.R; + var A = CMD$2.A; + var Q = CMD$2.Q; + + for (i = 0, j = 0; i < data.length;) { + cmd = data[i++]; + j = i; + nPoint = 0; + + switch (cmd) { + case M: + nPoint = 1; + break; + case L: + nPoint = 1; + break; + case C: + nPoint = 3; + break; + case Q: + nPoint = 2; + break; + case A: + var x = m[4]; + var y = m[5]; + var sx = mathSqrt$3(m[0] * m[0] + m[1] * m[1]); + var sy = mathSqrt$3(m[2] * m[2] + m[3] * m[3]); + var angle = mathAtan2(-m[1] / sy, m[0] / sx); + // cx + data[i] *= sx; + data[i++] += x; + // cy + data[i] *= sy; + data[i++] += y; + // Scale rx and ry + // FIXME Assume psi is 0 here + data[i++] *= sx; + data[i++] *= sy; + + // Start angle + data[i++] += angle; + // end angle + data[i++] += angle; + // FIXME psi + i += 2; + j = i; + break; + case R: + // x0, y0 + p[0] = data[i++]; + p[1] = data[i++]; + applyTransform(p, p, m); + data[j++] = p[0]; + data[j++] = p[1]; + // x1, y1 + p[0] += data[i++]; + p[1] += data[i++]; + applyTransform(p, p, m); + data[j++] = p[0]; + data[j++] = p[1]; + } + + for (k = 0; k < nPoint; k++) { + var p = points[k]; + p[0] = data[i++]; + p[1] = data[i++]; + + applyTransform(p, p, m); + // Write back + data[j++] = p[0]; + data[j++] = p[1]; + } + } +}; + +// command chars +var cc = [ + 'm', 'M', 'l', 'L', 'v', 'V', 'h', 'H', 'z', 'Z', + 'c', 'C', 'q', 'Q', 't', 'T', 's', 'S', 'a', 'A' +]; + +var mathSqrt = Math.sqrt; +var mathSin = Math.sin; +var mathCos = Math.cos; +var PI = Math.PI; + +var vMag = function(v) { + return Math.sqrt(v[0] * v[0] + v[1] * v[1]); +}; +var vRatio = function(u, v) { + return (u[0] * v[0] + u[1] * v[1]) / (vMag(u) * vMag(v)); +}; +var vAngle = function(u, v) { + return (u[0] * v[1] < u[1] * v[0] ? -1 : 1) + * Math.acos(vRatio(u, v)); +}; + +function processArc(x1, y1, x2, y2, fa, fs, rx, ry, psiDeg, cmd, path) { + var psi = psiDeg * (PI / 180.0); + var xp = mathCos(psi) * (x1 - x2) / 2.0 + + mathSin(psi) * (y1 - y2) / 2.0; + var yp = -1 * mathSin(psi) * (x1 - x2) / 2.0 + + mathCos(psi) * (y1 - y2) / 2.0; + + var lambda = (xp * xp) / (rx * rx) + (yp * yp) / (ry * ry); + + if (lambda > 1) { + rx *= mathSqrt(lambda); + ry *= mathSqrt(lambda); + } + + var f = (fa === fs ? -1 : 1) + * mathSqrt((((rx * rx) * (ry * ry)) + - ((rx * rx) * (yp * yp)) + - ((ry * ry) * (xp * xp))) / ((rx * rx) * (yp * yp) + + (ry * ry) * (xp * xp)) + ) || 0; + + var cxp = f * rx * yp / ry; + var cyp = f * -ry * xp / rx; + + var cx = (x1 + x2) / 2.0 + + mathCos(psi) * cxp + - mathSin(psi) * cyp; + var cy = (y1 + y2) / 2.0 + + mathSin(psi) * cxp + + mathCos(psi) * cyp; + + var theta = vAngle([ 1, 0 ], [ (xp - cxp) / rx, (yp - cyp) / ry ]); + var u = [ (xp - cxp) / rx, (yp - cyp) / ry ]; + var v = [ (-1 * xp - cxp) / rx, (-1 * yp - cyp) / ry ]; + var dTheta = vAngle(u, v); + + if (vRatio(u, v) <= -1) { + dTheta = PI; + } + if (vRatio(u, v) >= 1) { + dTheta = 0; + } + if (fs === 0 && dTheta > 0) { + dTheta = dTheta - 2 * PI; + } + if (fs === 1 && dTheta < 0) { + dTheta = dTheta + 2 * PI; + } + + path.addData(cmd, cx, cy, rx, ry, theta, dTheta, psi, fs); +} + +function createPathProxyFromString(data) { + if (!data) { + return []; + } + + // command string + var cs = data.replace(/-/g, ' -') + .replace(/ /g, ' ') + .replace(/ /g, ',') + .replace(/,,/g, ','); + + var n; + // create pipes so that we can split the data + for (n = 0; n < cc.length; n++) { + cs = cs.replace(new RegExp(cc[n], 'g'), '|' + cc[n]); + } + + // create array + var arr = cs.split('|'); + // init context point + var cpx = 0; + var cpy = 0; + + var path = new PathProxy(); + var CMD = PathProxy.CMD; + + var prevCmd; + for (n = 1; n < arr.length; n++) { + var str = arr[n]; + var c = str.charAt(0); + var off = 0; + var p = str.slice(1).replace(/e,-/g, 'e-').split(','); + var cmd; + + if (p.length > 0 && p[0] === '') { + p.shift(); + } + + for (var i = 0; i < p.length; i++) { + p[i] = parseFloat(p[i]); + } + while (off < p.length && !isNaN(p[off])) { + if (isNaN(p[0])) { + break; + } + var ctlPtx; + var ctlPty; + + var rx; + var ry; + var psi; + var fa; + var fs; + + var x1 = cpx; + var y1 = cpy; + + // convert l, H, h, V, and v to L + switch (c) { + case 'l': + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'L': + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'm': + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.M; + path.addData(cmd, cpx, cpy); + c = 'l'; + break; + case 'M': + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.M; + path.addData(cmd, cpx, cpy); + c = 'L'; + break; + case 'h': + cpx += p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'H': + cpx = p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'v': + cpy += p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'V': + cpy = p[off++]; + cmd = CMD.L; + path.addData(cmd, cpx, cpy); + break; + case 'C': + cmd = CMD.C; + path.addData( + cmd, p[off++], p[off++], p[off++], p[off++], p[off++], p[off++] + ); + cpx = p[off - 2]; + cpy = p[off - 1]; + break; + case 'c': + cmd = CMD.C; + path.addData( + cmd, + p[off++] + cpx, p[off++] + cpy, + p[off++] + cpx, p[off++] + cpy, + p[off++] + cpx, p[off++] + cpy + ); + cpx += p[off - 2]; + cpy += p[off - 1]; + break; + case 'S': + ctlPtx = cpx; + ctlPty = cpy; + var len = path.len(); + var pathData = path.data; + if (prevCmd === CMD.C) { + ctlPtx += cpx - pathData[len - 4]; + ctlPty += cpy - pathData[len - 3]; + } + cmd = CMD.C; + x1 = p[off++]; + y1 = p[off++]; + cpx = p[off++]; + cpy = p[off++]; + path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy); + break; + case 's': + ctlPtx = cpx; + ctlPty = cpy; + var len = path.len(); + var pathData = path.data; + if (prevCmd === CMD.C) { + ctlPtx += cpx - pathData[len - 4]; + ctlPty += cpy - pathData[len - 3]; + } + cmd = CMD.C; + x1 = cpx + p[off++]; + y1 = cpy + p[off++]; + cpx += p[off++]; + cpy += p[off++]; + path.addData(cmd, ctlPtx, ctlPty, x1, y1, cpx, cpy); + break; + case 'Q': + x1 = p[off++]; + y1 = p[off++]; + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.Q; + path.addData(cmd, x1, y1, cpx, cpy); + break; + case 'q': + x1 = p[off++] + cpx; + y1 = p[off++] + cpy; + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.Q; + path.addData(cmd, x1, y1, cpx, cpy); + break; + case 'T': + ctlPtx = cpx; + ctlPty = cpy; + var len = path.len(); + var pathData = path.data; + if (prevCmd === CMD.Q) { + ctlPtx += cpx - pathData[len - 4]; + ctlPty += cpy - pathData[len - 3]; + } + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.Q; + path.addData(cmd, ctlPtx, ctlPty, cpx, cpy); + break; + case 't': + ctlPtx = cpx; + ctlPty = cpy; + var len = path.len(); + var pathData = path.data; + if (prevCmd === CMD.Q) { + ctlPtx += cpx - pathData[len - 4]; + ctlPty += cpy - pathData[len - 3]; + } + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.Q; + path.addData(cmd, ctlPtx, ctlPty, cpx, cpy); + break; + case 'A': + rx = p[off++]; + ry = p[off++]; + psi = p[off++]; + fa = p[off++]; + fs = p[off++]; + + x1 = cpx, y1 = cpy; + cpx = p[off++]; + cpy = p[off++]; + cmd = CMD.A; + processArc( + x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path + ); + break; + case 'a': + rx = p[off++]; + ry = p[off++]; + psi = p[off++]; + fa = p[off++]; + fs = p[off++]; + + x1 = cpx, y1 = cpy; + cpx += p[off++]; + cpy += p[off++]; + cmd = CMD.A; + processArc( + x1, y1, cpx, cpy, fa, fs, rx, ry, psi, cmd, path + ); + break; + } + } + + if (c === 'z' || c === 'Z') { + cmd = CMD.Z; + path.addData(cmd); + } + + prevCmd = cmd; + } + + path.toStatic(); + + return path; +} + +// TODO Optimize double memory cost problem +function createPathOptions(str, opts) { + var pathProxy = createPathProxyFromString(str); + opts = opts || {}; + opts.buildPath = function (path) { + if (path.setData) { + path.setData(pathProxy.data); + // Svg and vml renderer don't have context + var ctx = path.getContext(); + if (ctx) { + path.rebuildPath(ctx); + } + } + else { + var ctx = path; + pathProxy.rebuildPath(ctx); + } + }; + + opts.applyTransform = function (m) { + transformPath(pathProxy, m); + this.dirty(true); + }; + + return opts; +} + +/** + * Create a Path object from path string data + * http://www.w3.org/TR/SVG/paths.html#PathData + * @param {Object} opts Other options + */ +function createFromString(str, opts) { + return new Path(createPathOptions(str, opts)); +} + +/** + * Create a Path class from path string data + * @param {string} str + * @param {Object} opts Other options + */ +function extendFromString(str, opts) { + return Path.extend(createPathOptions(str, opts)); +} + +/** + * Merge multiple paths + */ +// TODO Apply transform +// TODO stroke dash +// TODO Optimize double memory cost problem +function mergePath$1(pathEls, opts) { + var pathList = []; + var len = pathEls.length; + for (var i = 0; i < len; i++) { + var pathEl = pathEls[i]; + if (!pathEl.path) { + pathEl.createPathProxy(); + } + if (pathEl.__dirtyPath) { + pathEl.buildPath(pathEl.path, pathEl.shape, true); + } + pathList.push(pathEl.path); + } + + var pathBundle = new Path(opts); + // Need path proxy. + pathBundle.createPathProxy(); + pathBundle.buildPath = function (path) { + path.appendPath(pathList); + // Svg and vml renderer don't have context + var ctx = path.getContext(); + if (ctx) { + path.rebuildPath(ctx); + } + }; + + return pathBundle; +} + +/** + * @alias zrender/graphic/Text + * @extends module:zrender/graphic/Displayable + * @constructor + * @param {Object} opts + */ +var Text = function (opts) { // jshint ignore:line + Displayable.call(this, opts); +}; + +Text.prototype = { + + constructor: Text, + + type: 'text', + + brush: function (ctx, prevEl) { + var style = this.style; + + // Optimize, avoid normalize every time. + this.__dirty && normalizeTextStyle(style, true); + + // Use props with prefix 'text'. + style.fill = style.stroke = style.shadowBlur = style.shadowColor = + style.shadowOffsetX = style.shadowOffsetY = null; + + var text = style.text; + // Convert to string + text != null && (text += ''); + + // Always bind style + style.bind(ctx, this, prevEl); + + if (!needDrawText(text, style)) { + return; + } + + this.setTransform(ctx); + + renderText(this, ctx, text, style); + + this.restoreTransform(ctx); + }, + + getBoundingRect: function () { + var style = this.style; + + // Optimize, avoid normalize every time. + this.__dirty && normalizeTextStyle(style, true); + + if (!this._rect) { + var text = style.text; + text != null ? (text += '') : (text = ''); + + var rect = getBoundingRect( + style.text + '', + style.font, + style.textAlign, + style.textVerticalAlign, + style.textPadding, + style.rich + ); + + rect.x += style.x || 0; + rect.y += style.y || 0; + + if (getStroke(style.textStroke, style.textStrokeWidth)) { + var w = style.textStrokeWidth; + rect.x -= w / 2; + rect.y -= w / 2; + rect.width += w; + rect.height += w; + } + + this._rect = rect; + } + + return this._rect; + } +}; + +inherits(Text, Displayable); + +/** + * 圆形 + * @module zrender/shape/Circle + */ + +var Circle = Path.extend({ + + type: 'circle', + + shape: { + cx: 0, + cy: 0, + r: 0 + }, + + + buildPath : function (ctx, shape, inBundle) { + // Better stroking in ShapeBundle + // Always do it may have performence issue ( fill may be 2x more cost) + if (inBundle) { + ctx.moveTo(shape.cx + shape.r, shape.cy); + } + // else { + // if (ctx.allocate && !ctx.data.length) { + // ctx.allocate(ctx.CMD_MEM_SIZE.A); + // } + // } + // Better stroking in ShapeBundle + // ctx.moveTo(shape.cx + shape.r, shape.cy); + ctx.arc(shape.cx, shape.cy, shape.r, 0, Math.PI * 2, true); + } +}); + +// Fix weird bug in some version of IE11 (like 11.0.9600.178**), +// where exception "unexpected call to method or property access" +// might be thrown when calling ctx.fill or ctx.stroke after a path +// whose area size is zero is drawn and ctx.clip() is called and +// shadowBlur is set. See #4572, #3112, #5777. +// (e.g., +// ctx.moveTo(10, 10); +// ctx.lineTo(20, 10); +// ctx.closePath(); +// ctx.clip(); +// ctx.shadowBlur = 10; +// ... +// ctx.fill(); +// ) + +var shadowTemp = [ + ['shadowBlur', 0], + ['shadowColor', '#000'], + ['shadowOffsetX', 0], + ['shadowOffsetY', 0] +]; + +var fixClipWithShadow = function (orignalBrush) { + + // version string can be: '11.0' + return (env$1.browser.ie && env$1.browser.version >= 11) + + ? function () { + var clipPaths = this.__clipPaths; + var style = this.style; + var modified; + + if (clipPaths) { + for (var i = 0; i < clipPaths.length; i++) { + var clipPath = clipPaths[i]; + var shape = clipPath && clipPath.shape; + var type = clipPath && clipPath.type; + + if (shape && ( + (type === 'sector' && shape.startAngle === shape.endAngle) + || (type === 'rect' && (!shape.width || !shape.height)) + )) { + for (var j = 0; j < shadowTemp.length; j++) { + // It is save to put shadowTemp static, because shadowTemp + // will be all modified each item brush called. + shadowTemp[j][2] = style[shadowTemp[j][0]]; + style[shadowTemp[j][0]] = shadowTemp[j][1]; + } + modified = true; + break; + } + } + } + + orignalBrush.apply(this, arguments); + + if (modified) { + for (var j = 0; j < shadowTemp.length; j++) { + style[shadowTemp[j][0]] = shadowTemp[j][2]; + } + } + } + + : orignalBrush; +}; + +/** + * 扇形 + * @module zrender/graphic/shape/Sector + */ + +var Sector = Path.extend({ + + type: 'sector', + + shape: { + + cx: 0, + + cy: 0, + + r0: 0, + + r: 0, + + startAngle: 0, + + endAngle: Math.PI * 2, + + clockwise: true + }, + + brush: fixClipWithShadow(Path.prototype.brush), + + buildPath: function (ctx, shape) { + + var x = shape.cx; + var y = shape.cy; + var r0 = Math.max(shape.r0 || 0, 0); + var r = Math.max(shape.r, 0); + var startAngle = shape.startAngle; + var endAngle = shape.endAngle; + var clockwise = shape.clockwise; + + var unitX = Math.cos(startAngle); + var unitY = Math.sin(startAngle); + + ctx.moveTo(unitX * r0 + x, unitY * r0 + y); + + ctx.lineTo(unitX * r + x, unitY * r + y); + + ctx.arc(x, y, r, startAngle, endAngle, !clockwise); + + ctx.lineTo( + Math.cos(endAngle) * r0 + x, + Math.sin(endAngle) * r0 + y + ); + + if (r0 !== 0) { + ctx.arc(x, y, r0, endAngle, startAngle, clockwise); + } + + ctx.closePath(); + } +}); + +/** + * 圆环 + * @module zrender/graphic/shape/Ring + */ + +var Ring = Path.extend({ + + type: 'ring', + + shape: { + cx: 0, + cy: 0, + r: 0, + r0: 0 + }, + + buildPath: function (ctx, shape) { + var x = shape.cx; + var y = shape.cy; + var PI2 = Math.PI * 2; + ctx.moveTo(x + shape.r, y); + ctx.arc(x, y, shape.r, 0, PI2, false); + ctx.moveTo(x + shape.r0, y); + ctx.arc(x, y, shape.r0, 0, PI2, true); + } +}); + +/** + * Catmull-Rom spline 插值折线 + * @module zrender/shape/util/smoothSpline + * @author pissang (https://www.github.com/pissang) + * Kener (@Kener-林峰, kener.linfeng@gmail.com) + * errorrik (errorrik@gmail.com) + */ + +/** + * @inner + */ +function interpolate(p0, p1, p2, p3, t, t2, t3) { + var v0 = (p2 - p0) * 0.5; + var v1 = (p3 - p1) * 0.5; + return (2 * (p1 - p2) + v0 + v1) * t3 + + (-3 * (p1 - p2) - 2 * v0 - v1) * t2 + + v0 * t + p1; +} + +/** + * @alias module:zrender/shape/util/smoothSpline + * @param {Array} points 线段顶点数组 + * @param {boolean} isLoop + * @return {Array} + */ +var smoothSpline = function (points, isLoop) { + var len$$1 = points.length; + var ret = []; + + var distance$$1 = 0; + for (var i = 1; i < len$$1; i++) { + distance$$1 += distance(points[i - 1], points[i]); + } + + var segs = distance$$1 / 2; + segs = segs < len$$1 ? len$$1 : segs; + for (var i = 0; i < segs; i++) { + var pos = i / (segs - 1) * (isLoop ? len$$1 : len$$1 - 1); + var idx = Math.floor(pos); + + var w = pos - idx; + + var p0; + var p1 = points[idx % len$$1]; + var p2; + var p3; + if (!isLoop) { + p0 = points[idx === 0 ? idx : idx - 1]; + p2 = points[idx > len$$1 - 2 ? len$$1 - 1 : idx + 1]; + p3 = points[idx > len$$1 - 3 ? len$$1 - 1 : idx + 2]; + } + else { + p0 = points[(idx - 1 + len$$1) % len$$1]; + p2 = points[(idx + 1) % len$$1]; + p3 = points[(idx + 2) % len$$1]; + } + + var w2 = w * w; + var w3 = w * w2; + + ret.push([ + interpolate(p0[0], p1[0], p2[0], p3[0], w, w2, w3), + interpolate(p0[1], p1[1], p2[1], p3[1], w, w2, w3) + ]); + } + return ret; +}; + +/** + * 贝塞尔平滑曲线 + * @module zrender/shape/util/smoothBezier + * @author pissang (https://www.github.com/pissang) + * Kener (@Kener-林峰, kener.linfeng@gmail.com) + * errorrik (errorrik@gmail.com) + */ + +/** + * 贝塞尔平滑曲线 + * @alias module:zrender/shape/util/smoothBezier + * @param {Array} points 线段顶点数组 + * @param {number} smooth 平滑等级, 0-1 + * @param {boolean} isLoop + * @param {Array} constraint 将计算出来的控制点约束在一个包围盒内 + * 比如 [[0, 0], [100, 100]], 这个包围盒会与 + * 整个折线的包围盒做一个并集用来约束控制点。 + * @param {Array} 计算出来的控制点数组 + */ +var smoothBezier = function (points, smooth, isLoop, constraint) { + var cps = []; + + var v = []; + var v1 = []; + var v2 = []; + var prevPoint; + var nextPoint; + + var min$$1, max$$1; + if (constraint) { + min$$1 = [Infinity, Infinity]; + max$$1 = [-Infinity, -Infinity]; + for (var i = 0, len$$1 = points.length; i < len$$1; i++) { + min(min$$1, min$$1, points[i]); + max(max$$1, max$$1, points[i]); + } + // 与指定的包围盒做并集 + min(min$$1, min$$1, constraint[0]); + max(max$$1, max$$1, constraint[1]); + } + + for (var i = 0, len$$1 = points.length; i < len$$1; i++) { + var point = points[i]; + + if (isLoop) { + prevPoint = points[i ? i - 1 : len$$1 - 1]; + nextPoint = points[(i + 1) % len$$1]; + } + else { + if (i === 0 || i === len$$1 - 1) { + cps.push(clone$1(points[i])); + continue; + } + else { + prevPoint = points[i - 1]; + nextPoint = points[i + 1]; + } + } + + sub(v, nextPoint, prevPoint); + + // use degree to scale the handle length + scale(v, v, smooth); + + var d0 = distance(point, prevPoint); + var d1 = distance(point, nextPoint); + var sum = d0 + d1; + if (sum !== 0) { + d0 /= sum; + d1 /= sum; + } + + scale(v1, v, -d0); + scale(v2, v, d1); + var cp0 = add([], point, v1); + var cp1 = add([], point, v2); + if (constraint) { + max(cp0, cp0, min$$1); + min(cp0, cp0, max$$1); + max(cp1, cp1, min$$1); + min(cp1, cp1, max$$1); + } + cps.push(cp0); + cps.push(cp1); + } + + if (isLoop) { + cps.push(cps.shift()); + } + + return cps; +}; + +function buildPath$1(ctx, shape, closePath) { + var points = shape.points; + var smooth = shape.smooth; + if (points && points.length >= 2) { + if (smooth && smooth !== 'spline') { + var controlPoints = smoothBezier( + points, smooth, closePath, shape.smoothConstraint + ); + + ctx.moveTo(points[0][0], points[0][1]); + var len = points.length; + for (var i = 0; i < (closePath ? len : len - 1); i++) { + var cp1 = controlPoints[i * 2]; + var cp2 = controlPoints[i * 2 + 1]; + var p = points[(i + 1) % len]; + ctx.bezierCurveTo( + cp1[0], cp1[1], cp2[0], cp2[1], p[0], p[1] + ); + } + } + else { + if (smooth === 'spline') { + points = smoothSpline(points, closePath); + } + + ctx.moveTo(points[0][0], points[0][1]); + for (var i = 1, l = points.length; i < l; i++) { + ctx.lineTo(points[i][0], points[i][1]); + } + } + + closePath && ctx.closePath(); + } +} + +/** + * 多边形 + * @module zrender/shape/Polygon + */ + +var Polygon = Path.extend({ + + type: 'polygon', + + shape: { + points: null, + + smooth: false, + + smoothConstraint: null + }, + + buildPath: function (ctx, shape) { + buildPath$1(ctx, shape, true); + } +}); + +/** + * @module zrender/graphic/shape/Polyline + */ + +var Polyline = Path.extend({ + + type: 'polyline', + + shape: { + points: null, + + smooth: false, + + smoothConstraint: null + }, + + style: { + stroke: '#000', + + fill: null + }, + + buildPath: function (ctx, shape) { + buildPath$1(ctx, shape, false); + } +}); + +/** + * 矩形 + * @module zrender/graphic/shape/Rect + */ + +var Rect = Path.extend({ + + type: 'rect', + + shape: { + // 左上、右上、右下、左下角的半径依次为r1、r2、r3、r4 + // r缩写为1 相当于 [1, 1, 1, 1] + // r缩写为[1] 相当于 [1, 1, 1, 1] + // r缩写为[1, 2] 相当于 [1, 2, 1, 2] + // r缩写为[1, 2, 3] 相当于 [1, 2, 3, 2] + r: 0, + + x: 0, + y: 0, + width: 0, + height: 0 + }, + + buildPath: function (ctx, shape) { + var x = shape.x; + var y = shape.y; + var width = shape.width; + var height = shape.height; + if (!shape.r) { + ctx.rect(x, y, width, height); + } + else { + buildPath(ctx, shape); + } + ctx.closePath(); + return; + } +}); + +/** + * 直线 + * @module zrender/graphic/shape/Line + */ + +var Line = Path.extend({ + + type: 'line', + + shape: { + // Start point + x1: 0, + y1: 0, + // End point + x2: 0, + y2: 0, + + percent: 1 + }, + + style: { + stroke: '#000', + fill: null + }, + + buildPath: function (ctx, shape) { + var x1 = shape.x1; + var y1 = shape.y1; + var x2 = shape.x2; + var y2 = shape.y2; + var percent = shape.percent; + + if (percent === 0) { + return; + } + + ctx.moveTo(x1, y1); + + if (percent < 1) { + x2 = x1 * (1 - percent) + x2 * percent; + y2 = y1 * (1 - percent) + y2 * percent; + } + ctx.lineTo(x2, y2); + }, + + /** + * Get point at percent + * @param {number} percent + * @return {Array.<number>} + */ + pointAt: function (p) { + var shape = this.shape; + return [ + shape.x1 * (1 - p) + shape.x2 * p, + shape.y1 * (1 - p) + shape.y2 * p + ]; + } +}); + +/** + * 贝塞尔曲线 + * @module zrender/shape/BezierCurve + */ + +var out = []; + +function someVectorAt(shape, t, isTangent) { + var cpx2 = shape.cpx2; + var cpy2 = shape.cpy2; + if (cpx2 === null || cpy2 === null) { + return [ + (isTangent ? cubicDerivativeAt : cubicAt)(shape.x1, shape.cpx1, shape.cpx2, shape.x2, t), + (isTangent ? cubicDerivativeAt : cubicAt)(shape.y1, shape.cpy1, shape.cpy2, shape.y2, t) + ]; + } + else { + return [ + (isTangent ? quadraticDerivativeAt : quadraticAt)(shape.x1, shape.cpx1, shape.x2, t), + (isTangent ? quadraticDerivativeAt : quadraticAt)(shape.y1, shape.cpy1, shape.y2, t) + ]; + } +} + +var BezierCurve = Path.extend({ + + type: 'bezier-curve', + + shape: { + x1: 0, + y1: 0, + x2: 0, + y2: 0, + cpx1: 0, + cpy1: 0, + // cpx2: 0, + // cpy2: 0 + + // Curve show percent, for animating + percent: 1 + }, + + style: { + stroke: '#000', + fill: null + }, + + buildPath: function (ctx, shape) { + var x1 = shape.x1; + var y1 = shape.y1; + var x2 = shape.x2; + var y2 = shape.y2; + var cpx1 = shape.cpx1; + var cpy1 = shape.cpy1; + var cpx2 = shape.cpx2; + var cpy2 = shape.cpy2; + var percent = shape.percent; + if (percent === 0) { + return; + } + + ctx.moveTo(x1, y1); + + if (cpx2 == null || cpy2 == null) { + if (percent < 1) { + quadraticSubdivide( + x1, cpx1, x2, percent, out + ); + cpx1 = out[1]; + x2 = out[2]; + quadraticSubdivide( + y1, cpy1, y2, percent, out + ); + cpy1 = out[1]; + y2 = out[2]; + } + + ctx.quadraticCurveTo( + cpx1, cpy1, + x2, y2 + ); + } + else { + if (percent < 1) { + cubicSubdivide( + x1, cpx1, cpx2, x2, percent, out + ); + cpx1 = out[1]; + cpx2 = out[2]; + x2 = out[3]; + cubicSubdivide( + y1, cpy1, cpy2, y2, percent, out + ); + cpy1 = out[1]; + cpy2 = out[2]; + y2 = out[3]; + } + ctx.bezierCurveTo( + cpx1, cpy1, + cpx2, cpy2, + x2, y2 + ); + } + }, + + /** + * Get point at percent + * @param {number} t + * @return {Array.<number>} + */ + pointAt: function (t) { + return someVectorAt(this.shape, t, false); + }, + + /** + * Get tangent at percent + * @param {number} t + * @return {Array.<number>} + */ + tangentAt: function (t) { + var p = someVectorAt(this.shape, t, true); + return normalize(p, p); + } +}); + +/** + * 圆弧 + * @module zrender/graphic/shape/Arc + */ + +var Arc = Path.extend({ + + type: 'arc', + + shape: { + + cx: 0, + + cy: 0, + + r: 0, + + startAngle: 0, + + endAngle: Math.PI * 2, + + clockwise: true + }, + + style: { + + stroke: '#000', + + fill: null + }, + + buildPath: function (ctx, shape) { + + var x = shape.cx; + var y = shape.cy; + var r = Math.max(shape.r, 0); + var startAngle = shape.startAngle; + var endAngle = shape.endAngle; + var clockwise = shape.clockwise; + + var unitX = Math.cos(startAngle); + var unitY = Math.sin(startAngle); + + ctx.moveTo(unitX * r + x, unitY * r + y); + ctx.arc(x, y, r, startAngle, endAngle, !clockwise); + } +}); + +// CompoundPath to improve performance + +var CompoundPath = Path.extend({ + + type: 'compound', + + shape: { + + paths: null + }, + + _updatePathDirty: function () { + var dirtyPath = this.__dirtyPath; + var paths = this.shape.paths; + for (var i = 0; i < paths.length; i++) { + // Mark as dirty if any subpath is dirty + dirtyPath = dirtyPath || paths[i].__dirtyPath; + } + this.__dirtyPath = dirtyPath; + this.__dirty = this.__dirty || dirtyPath; + }, + + beforeBrush: function () { + this._updatePathDirty(); + var paths = this.shape.paths || []; + var scale = this.getGlobalScale(); + // Update path scale + for (var i = 0; i < paths.length; i++) { + if (!paths[i].path) { + paths[i].createPathProxy(); + } + paths[i].path.setScale(scale[0], scale[1]); + } + }, + + buildPath: function (ctx, shape) { + var paths = shape.paths || []; + for (var i = 0; i < paths.length; i++) { + paths[i].buildPath(ctx, paths[i].shape, true); + } + }, + + afterBrush: function () { + var paths = this.shape.paths || []; + for (var i = 0; i < paths.length; i++) { + paths[i].__dirtyPath = false; + } + }, + + getBoundingRect: function () { + this._updatePathDirty(); + return Path.prototype.getBoundingRect.call(this); + } +}); + +/** + * @param {Array.<Object>} colorStops + */ +var Gradient = function (colorStops) { + + this.colorStops = colorStops || []; + +}; + +Gradient.prototype = { + + constructor: Gradient, + + addColorStop: function (offset, color) { + this.colorStops.push({ + + offset: offset, + + color: color + }); + } + +}; + +/** + * x, y, x2, y2 are all percent from 0 to 1 + * @param {number} [x=0] + * @param {number} [y=0] + * @param {number} [x2=1] + * @param {number} [y2=0] + * @param {Array.<Object>} colorStops + * @param {boolean} [globalCoord=false] + */ +var LinearGradient = function (x, y, x2, y2, colorStops, globalCoord) { + // Should do nothing more in this constructor. Because gradient can be + // declard by `color: {type: 'linear', colorStops: ...}`, where + // this constructor will not be called. + + this.x = x == null ? 0 : x; + + this.y = y == null ? 0 : y; + + this.x2 = x2 == null ? 1 : x2; + + this.y2 = y2 == null ? 0 : y2; + + // Can be cloned + this.type = 'linear'; + + // If use global coord + this.global = globalCoord || false; + + Gradient.call(this, colorStops); +}; + +LinearGradient.prototype = { + + constructor: LinearGradient +}; + +inherits(LinearGradient, Gradient); + +/** + * x, y, r are all percent from 0 to 1 + * @param {number} [x=0.5] + * @param {number} [y=0.5] + * @param {number} [r=0.5] + * @param {Array.<Object>} [colorStops] + * @param {boolean} [globalCoord=false] + */ +var RadialGradient = function (x, y, r, colorStops, globalCoord) { + // Should do nothing more in this constructor. Because gradient can be + // declard by `color: {type: 'radial', colorStops: ...}`, where + // this constructor will not be called. + + this.x = x == null ? 0.5 : x; + + this.y = y == null ? 0.5 : y; + + this.r = r == null ? 0.5 : r; + + // Can be cloned + this.type = 'radial'; + + // If use global coord + this.global = globalCoord || false; + + Gradient.call(this, colorStops); +}; + +RadialGradient.prototype = { + + constructor: RadialGradient +}; + +inherits(RadialGradient, Gradient); + +/** + * Displayable for incremental rendering. It will be rendered in a separate layer + * IncrementalDisplay have too main methods. `clearDisplayables` and `addDisplayables` + * addDisplayables will render the added displayables incremetally. + * + * It use a not clearFlag to tell the painter don't clear the layer if it's the first element. + */ +// TODO Style override ? +function IncrementalDisplayble(opts) { + + Displayable.call(this, opts); + + this._displayables = []; + + this._temporaryDisplayables = []; + + this._cursor = 0; + + this.notClear = true; +} + +IncrementalDisplayble.prototype.incremental = true; + +IncrementalDisplayble.prototype.clearDisplaybles = function () { + this._displayables = []; + this._temporaryDisplayables = []; + this._cursor = 0; + this.dirty(); + + this.notClear = false; +}; + +IncrementalDisplayble.prototype.addDisplayable = function (displayable, notPersistent) { + if (notPersistent) { + this._temporaryDisplayables.push(displayable); + } + else { + this._displayables.push(displayable); + } + this.dirty(); +}; + +IncrementalDisplayble.prototype.addDisplayables = function (displayables, notPersistent) { + notPersistent = notPersistent || false; + for (var i = 0; i < displayables.length; i++) { + this.addDisplayable(displayables[i], notPersistent); + } +}; + +IncrementalDisplayble.prototype.eachPendingDisplayable = function (cb) { + for (var i = this._cursor; i < this._displayables.length; i++) { + cb && cb(this._displayables[i]); + } + for (var i = 0; i < this._temporaryDisplayables.length; i++) { + cb && cb(this._temporaryDisplayables[i]); + } +}; + +IncrementalDisplayble.prototype.update = function () { + this.updateTransform(); + for (var i = this._cursor; i < this._displayables.length; i++) { + var displayable = this._displayables[i]; + // PENDING + displayable.parent = this; + displayable.update(); + displayable.parent = null; + } + for (var i = 0; i < this._temporaryDisplayables.length; i++) { + var displayable = this._temporaryDisplayables[i]; + // PENDING + displayable.parent = this; + displayable.update(); + displayable.parent = null; + } +}; + +IncrementalDisplayble.prototype.brush = function (ctx, prevEl) { + // Render persistant displayables. + for (var i = this._cursor; i < this._displayables.length; i++) { + var displayable = this._displayables[i]; + displayable.beforeBrush && displayable.beforeBrush(ctx); + displayable.brush(ctx, i === this._cursor ? null : this._displayables[i - 1]); + displayable.afterBrush && displayable.afterBrush(ctx); + } + this._cursor = i; + // Render temporary displayables. + for (var i = 0; i < this._temporaryDisplayables.length; i++) { + var displayable = this._temporaryDisplayables[i]; + displayable.beforeBrush && displayable.beforeBrush(ctx); + displayable.brush(ctx, i === 0 ? null : this._temporaryDisplayables[i - 1]); + displayable.afterBrush && displayable.afterBrush(ctx); + } + + this._temporaryDisplayables = []; + + this.notClear = true; +}; + +var m = []; +IncrementalDisplayble.prototype.getBoundingRect = function () { + if (!this._rect) { + var rect = new BoundingRect(Infinity, Infinity, -Infinity, -Infinity); + for (var i = 0; i < this._displayables.length; i++) { + var displayable = this._displayables[i]; + var childRect = displayable.getBoundingRect().clone(); + if (displayable.needLocalTransform()) { + childRect.applyTransform(displayable.getLocalTransform(m)); + } + rect.union(childRect); + } + this._rect = rect; + } + return this._rect; +}; + +IncrementalDisplayble.prototype.contain = function (x, y) { + var localPos = this.transformCoordToLocal(x, y); + var rect = this.getBoundingRect(); + + if (rect.contain(localPos[0], localPos[1])) { + for (var i = 0; i < this._displayables.length; i++) { + var displayable = this._displayables[i]; + if (displayable.contain(x, y)) { + return true; + } + } + } + return false; +}; + +inherits(IncrementalDisplayble, Displayable); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var round = Math.round; +var mathMax$1 = Math.max; +var mathMin$1 = Math.min; + +var EMPTY_OBJ = {}; + +/** + * Extend shape with parameters + */ +function extendShape(opts) { + return Path.extend(opts); +} + +/** + * Extend path + */ +function extendPath(pathData, opts) { + return extendFromString(pathData, opts); +} + +/** + * Create a path element from path data string + * @param {string} pathData + * @param {Object} opts + * @param {module:zrender/core/BoundingRect} rect + * @param {string} [layout=cover] 'center' or 'cover' + */ +function makePath(pathData, opts, rect, layout) { + var path = createFromString(pathData, opts); + var boundingRect = path.getBoundingRect(); + if (rect) { + if (layout === 'center') { + rect = centerGraphic(rect, boundingRect); + } + + resizePath(path, rect); + } + return path; +} + +/** + * Create a image element from image url + * @param {string} imageUrl image url + * @param {Object} opts options + * @param {module:zrender/core/BoundingRect} rect constrain rect + * @param {string} [layout=cover] 'center' or 'cover' + */ +function makeImage(imageUrl, rect, layout) { + var path = new ZImage({ + style: { + image: imageUrl, + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height + }, + onload: function (img) { + if (layout === 'center') { + var boundingRect = { + width: img.width, + height: img.height + }; + path.setStyle(centerGraphic(rect, boundingRect)); + } + } + }); + return path; +} + +/** + * Get position of centered element in bounding box. + * + * @param {Object} rect element local bounding box + * @param {Object} boundingRect constraint bounding box + * @return {Object} element position containing x, y, width, and height + */ +function centerGraphic(rect, boundingRect) { + // Set rect to center, keep width / height ratio. + var aspect = boundingRect.width / boundingRect.height; + var width = rect.height * aspect; + var height; + if (width <= rect.width) { + height = rect.height; + } + else { + width = rect.width; + height = width / aspect; + } + var cx = rect.x + rect.width / 2; + var cy = rect.y + rect.height / 2; + + return { + x: cx - width / 2, + y: cy - height / 2, + width: width, + height: height + }; +} + +var mergePath = mergePath$1; + +/** + * Resize a path to fit the rect + * @param {module:zrender/graphic/Path} path + * @param {Object} rect + */ +function resizePath(path, rect) { + if (!path.applyTransform) { + return; + } + + var pathRect = path.getBoundingRect(); + + var m = pathRect.calculateTransform(rect); + + path.applyTransform(m); +} + +/** + * Sub pixel optimize line for canvas + * + * @param {Object} param + * @param {Object} [param.shape] + * @param {number} [param.shape.x1] + * @param {number} [param.shape.y1] + * @param {number} [param.shape.x2] + * @param {number} [param.shape.y2] + * @param {Object} [param.style] + * @param {number} [param.style.lineWidth] + * @return {Object} Modified param + */ +function subPixelOptimizeLine(param) { + var shape = param.shape; + var lineWidth = param.style.lineWidth; + + if (round(shape.x1 * 2) === round(shape.x2 * 2)) { + shape.x1 = shape.x2 = subPixelOptimize(shape.x1, lineWidth, true); + } + if (round(shape.y1 * 2) === round(shape.y2 * 2)) { + shape.y1 = shape.y2 = subPixelOptimize(shape.y1, lineWidth, true); + } + return param; +} + +/** + * Sub pixel optimize rect for canvas + * + * @param {Object} param + * @param {Object} [param.shape] + * @param {number} [param.shape.x] + * @param {number} [param.shape.y] + * @param {number} [param.shape.width] + * @param {number} [param.shape.height] + * @param {Object} [param.style] + * @param {number} [param.style.lineWidth] + * @return {Object} Modified param + */ +function subPixelOptimizeRect(param) { + var shape = param.shape; + var lineWidth = param.style.lineWidth; + var originX = shape.x; + var originY = shape.y; + var originWidth = shape.width; + var originHeight = shape.height; + shape.x = subPixelOptimize(shape.x, lineWidth, true); + shape.y = subPixelOptimize(shape.y, lineWidth, true); + shape.width = Math.max( + subPixelOptimize(originX + originWidth, lineWidth, false) - shape.x, + originWidth === 0 ? 0 : 1 + ); + shape.height = Math.max( + subPixelOptimize(originY + originHeight, lineWidth, false) - shape.y, + originHeight === 0 ? 0 : 1 + ); + return param; +} + +/** + * Sub pixel optimize for canvas + * + * @param {number} position Coordinate, such as x, y + * @param {number} lineWidth Should be nonnegative integer. + * @param {boolean=} positiveOrNegative Default false (negative). + * @return {number} Optimized position. + */ +function subPixelOptimize(position, lineWidth, positiveOrNegative) { + // Assure that (position + lineWidth / 2) is near integer edge, + // otherwise line will be fuzzy in canvas. + var doubledPosition = round(position * 2); + return (doubledPosition + round(lineWidth)) % 2 === 0 + ? doubledPosition / 2 + : (doubledPosition + (positiveOrNegative ? 1 : -1)) / 2; +} + +function hasFillOrStroke(fillOrStroke) { + return fillOrStroke != null && fillOrStroke != 'none'; +} + +function liftColor(color) { + return typeof color === 'string' ? lift(color, -0.1) : color; +} + +/** + * @private + */ +function cacheElementStl(el) { + if (el.__hoverStlDirty) { + var stroke = el.style.stroke; + var fill = el.style.fill; + + // Create hoverStyle on mouseover + var hoverStyle = el.__hoverStl; + hoverStyle.fill = hoverStyle.fill + || (hasFillOrStroke(fill) ? liftColor(fill) : null); + hoverStyle.stroke = hoverStyle.stroke + || (hasFillOrStroke(stroke) ? liftColor(stroke) : null); + + var normalStyle = {}; + for (var name in hoverStyle) { + // See comment in `doSingleEnterHover`. + if (hoverStyle[name] != null) { + normalStyle[name] = el.style[name]; + } + } + + el.__normalStl = normalStyle; + + el.__hoverStlDirty = false; + } +} + +/** + * @private + */ +function doSingleEnterHover(el) { + if (el.__isHover) { + return; + } + + cacheElementStl(el); + + if (el.useHoverLayer) { + el.__zr && el.__zr.addHover(el, el.__hoverStl); + } + else { + var style = el.style; + var insideRollbackOpt = style.insideRollbackOpt; + + // Consider case: only `position: 'top'` is set on emphasis, then text + // color should be returned to `autoColor`, rather than remain '#fff'. + // So we should rollback then apply again after style merging. + insideRollbackOpt && rollbackInsideStyle(style); + + // styles can be: + // { + // label: { + // show: false, + // position: 'outside', + // fontSize: 18 + // }, + // emphasis: { + // label: { + // show: true + // } + // } + // }, + // where properties of `emphasis` may not appear in `normal`. We previously use + // module:echarts/util/model#defaultEmphasis to merge `normal` to `emphasis`. + // But consider rich text and setOption in merge mode, it is impossible to cover + // all properties in merge. So we use merge mode when setting style here, where + // only properties that is not `null/undefined` can be set. The disadventage: + // null/undefined can not be used to remove style any more in `emphasis`. + style.extendFrom(el.__hoverStl); + + // Do not save `insideRollback`. + if (insideRollbackOpt) { + applyInsideStyle(style, style.insideOriginalTextPosition, insideRollbackOpt); + + // textFill may be rollbacked to null. + if (style.textFill == null) { + style.textFill = insideRollbackOpt.autoColor; + } + } + + el.dirty(false); + el.z2 += 1; + } + + el.__isHover = true; +} + +/** + * @inner + */ +function doSingleLeaveHover(el) { + if (!el.__isHover) { + return; + } + + var normalStl = el.__normalStl; + if (el.useHoverLayer) { + el.__zr && el.__zr.removeHover(el); + } + else { + // Consider null/undefined value, should use + // `setStyle` but not `extendFrom(stl, true)`. + normalStl && el.setStyle(normalStl); + el.z2 -= 1; + } + + el.__isHover = false; +} + +/** + * @inner + */ +function doEnterHover(el) { + el.type === 'group' + ? el.traverse(function (child) { + if (child.type !== 'group') { + doSingleEnterHover(child); + } + }) + : doSingleEnterHover(el); +} + +function doLeaveHover(el) { + el.type === 'group' + ? el.traverse(function (child) { + if (child.type !== 'group') { + doSingleLeaveHover(child); + } + }) + : doSingleLeaveHover(el); +} + +/** + * @inner + */ +function setElementHoverStl(el, hoverStl) { + // If element has sepcified hoverStyle, then use it instead of given hoverStyle + // Often used when item group has a label element and it's hoverStyle is different + el.__hoverStl = el.hoverStyle || hoverStl || {}; + el.__hoverStlDirty = true; + + if (el.__isHover) { + cacheElementStl(el); + } +} + +/** + * @inner + */ +function onElementMouseOver(e) { + if (this.__hoverSilentOnTouch && e.zrByTouch) { + return; + } + + // Only if element is not in emphasis status + !this.__isEmphasis && doEnterHover(this); +} + +/** + * @inner + */ +function onElementMouseOut(e) { + if (this.__hoverSilentOnTouch && e.zrByTouch) { + return; + } + + // Only if element is not in emphasis status + !this.__isEmphasis && doLeaveHover(this); +} + +/** + * @inner + */ +function enterEmphasis() { + this.__isEmphasis = true; + doEnterHover(this); +} + +/** + * @inner + */ +function leaveEmphasis() { + this.__isEmphasis = false; + doLeaveHover(this); +} + +/** + * Set hover style of element. + * This method can be called repeatly without side-effects. + * @param {module:zrender/Element} el + * @param {Object} [hoverStyle] + * @param {Object} [opt] + * @param {boolean} [opt.hoverSilentOnTouch=false] + * In touch device, mouseover event will be trigger on touchstart event + * (see module:zrender/dom/HandlerProxy). By this mechanism, we can + * conviniently use hoverStyle when tap on touch screen without additional + * code for compatibility. + * But if the chart/component has select feature, which usually also use + * hoverStyle, there might be conflict between 'select-highlight' and + * 'hover-highlight' especially when roam is enabled (see geo for example). + * In this case, hoverSilentOnTouch should be used to disable hover-highlight + * on touch device. + */ +function setHoverStyle(el, hoverStyle, opt) { + el.__hoverSilentOnTouch = opt && opt.hoverSilentOnTouch; + + el.type === 'group' + ? el.traverse(function (child) { + if (child.type !== 'group') { + setElementHoverStl(child, hoverStyle); + } + }) + : setElementHoverStl(el, hoverStyle); + + // Duplicated function will be auto-ignored, see Eventful.js. + el.on('mouseover', onElementMouseOver) + .on('mouseout', onElementMouseOut); + + // Emphasis, normal can be triggered manually + el.on('emphasis', enterEmphasis) + .on('normal', leaveEmphasis); +} + +/** + * @param {Object|module:zrender/graphic/Style} normalStyle + * @param {Object} emphasisStyle + * @param {module:echarts/model/Model} normalModel + * @param {module:echarts/model/Model} emphasisModel + * @param {Object} opt Check `opt` of `setTextStyleCommon` to find other props. + * @param {string|Function} [opt.defaultText] + * @param {module:echarts/model/Model} [opt.labelFetcher] Fetch text by + * `opt.labelFetcher.getFormattedLabel(opt.labelDataIndex, 'normal'/'emphasis', null, opt.labelDimIndex)` + * @param {module:echarts/model/Model} [opt.labelDataIndex] Fetch text by + * `opt.textFetcher.getFormattedLabel(opt.labelDataIndex, 'normal'/'emphasis', null, opt.labelDimIndex)` + * @param {module:echarts/model/Model} [opt.labelDimIndex] Fetch text by + * `opt.textFetcher.getFormattedLabel(opt.labelDataIndex, 'normal'/'emphasis', null, opt.labelDimIndex)` + * @param {Object} [normalSpecified] + * @param {Object} [emphasisSpecified] + */ +function setLabelStyle( + normalStyle, emphasisStyle, + normalModel, emphasisModel, + opt, + normalSpecified, emphasisSpecified +) { + opt = opt || EMPTY_OBJ; + var labelFetcher = opt.labelFetcher; + var labelDataIndex = opt.labelDataIndex; + var labelDimIndex = opt.labelDimIndex; + + // This scenario, `label.normal.show = true; label.emphasis.show = false`, + // is not supported util someone requests. + + var showNormal = normalModel.getShallow('show'); + var showEmphasis = emphasisModel.getShallow('show'); + + // Consider performance, only fetch label when necessary. + // If `normal.show` is `false` and `emphasis.show` is `true` and `emphasis.formatter` is not set, + // label should be displayed, where text is fetched by `normal.formatter` or `opt.defaultText`. + var baseText; + if (showNormal || showEmphasis) { + if (labelFetcher) { + baseText = labelFetcher.getFormattedLabel(labelDataIndex, 'normal', null, labelDimIndex); + } + if (baseText == null) { + baseText = isFunction$1(opt.defaultText) ? opt.defaultText(labelDataIndex, opt) : opt.defaultText; + } + } + var normalStyleText = showNormal ? baseText : null; + var emphasisStyleText = showEmphasis + ? retrieve2( + labelFetcher + ? labelFetcher.getFormattedLabel(labelDataIndex, 'emphasis', null, labelDimIndex) + : null, + baseText + ) + : null; + + // Optimize: If style.text is null, text will not be drawn. + if (normalStyleText != null || emphasisStyleText != null) { + // Always set `textStyle` even if `normalStyle.text` is null, because default + // values have to be set on `normalStyle`. + // If we set default values on `emphasisStyle`, consider case: + // Firstly, `setOption(... label: {normal: {text: null}, emphasis: {show: true}} ...);` + // Secondly, `setOption(... label: {noraml: {show: true, text: 'abc', color: 'red'} ...);` + // Then the 'red' will not work on emphasis. + setTextStyle(normalStyle, normalModel, normalSpecified, opt); + setTextStyle(emphasisStyle, emphasisModel, emphasisSpecified, opt, true); + } + + normalStyle.text = normalStyleText; + emphasisStyle.text = emphasisStyleText; +} + +/** + * Set basic textStyle properties. + * @param {Object|module:zrender/graphic/Style} textStyle + * @param {module:echarts/model/Model} model + * @param {Object} [specifiedTextStyle] Can be overrided by settings in model. + * @param {Object} [opt] See `opt` of `setTextStyleCommon`. + * @param {boolean} [isEmphasis] + */ +function setTextStyle( + textStyle, textStyleModel, specifiedTextStyle, opt, isEmphasis +) { + setTextStyleCommon(textStyle, textStyleModel, opt, isEmphasis); + specifiedTextStyle && extend(textStyle, specifiedTextStyle); + textStyle.host && textStyle.host.dirty && textStyle.host.dirty(false); + + return textStyle; +} + +/** + * Set text option in the style. + * @deprecated + * @param {Object} textStyle + * @param {module:echarts/model/Model} labelModel + * @param {string|boolean} defaultColor Default text color. + * If set as false, it will be processed as a emphasis style. + */ +function setText(textStyle, labelModel, defaultColor) { + var opt = {isRectText: true}; + var isEmphasis; + + if (defaultColor === false) { + isEmphasis = true; + } + else { + // Support setting color as 'auto' to get visual color. + opt.autoColor = defaultColor; + } + setTextStyleCommon(textStyle, labelModel, opt, isEmphasis); + textStyle.host && textStyle.host.dirty && textStyle.host.dirty(false); +} + +/** + * { + * disableBox: boolean, Whether diable drawing box of block (outer most). + * isRectText: boolean, + * autoColor: string, specify a color when color is 'auto', + * for textFill, textStroke, textBackgroundColor, and textBorderColor. + * If autoColor specified, it is used as default textFill. + * useInsideStyle: + * `true`: Use inside style (textFill, textStroke, textStrokeWidth) + * if `textFill` is not specified. + * `false`: Do not use inside style. + * `null/undefined`: use inside style if `isRectText` is true and + * `textFill` is not specified and textPosition contains `'inside'`. + * forceRich: boolean + * } + */ +function setTextStyleCommon(textStyle, textStyleModel, opt, isEmphasis) { + // Consider there will be abnormal when merge hover style to normal style if given default value. + opt = opt || EMPTY_OBJ; + + if (opt.isRectText) { + var textPosition = textStyleModel.getShallow('position') + || (isEmphasis ? null : 'inside'); + // 'outside' is not a valid zr textPostion value, but used + // in bar series, and magric type should be considered. + textPosition === 'outside' && (textPosition = 'top'); + textStyle.textPosition = textPosition; + textStyle.textOffset = textStyleModel.getShallow('offset'); + var labelRotate = textStyleModel.getShallow('rotate'); + labelRotate != null && (labelRotate *= Math.PI / 180); + textStyle.textRotation = labelRotate; + textStyle.textDistance = retrieve2( + textStyleModel.getShallow('distance'), isEmphasis ? null : 5 + ); + } + + var ecModel = textStyleModel.ecModel; + var globalTextStyle = ecModel && ecModel.option.textStyle; + + // Consider case: + // { + // data: [{ + // value: 12, + // label: { + // rich: { + // // no 'a' here but using parent 'a'. + // } + // } + // }], + // rich: { + // a: { ... } + // } + // } + var richItemNames = getRichItemNames(textStyleModel); + var richResult; + if (richItemNames) { + richResult = {}; + for (var name in richItemNames) { + if (richItemNames.hasOwnProperty(name)) { + // Cascade is supported in rich. + var richTextStyle = textStyleModel.getModel(['rich', name]); + // In rich, never `disableBox`. + setTokenTextStyle(richResult[name] = {}, richTextStyle, globalTextStyle, opt, isEmphasis); + } + } + } + textStyle.rich = richResult; + + setTokenTextStyle(textStyle, textStyleModel, globalTextStyle, opt, isEmphasis, true); + + if (opt.forceRich && !opt.textStyle) { + opt.textStyle = {}; + } + + return textStyle; +} + +// Consider case: +// { +// data: [{ +// value: 12, +// label: { +// rich: { +// // no 'a' here but using parent 'a'. +// } +// } +// }], +// rich: { +// a: { ... } +// } +// } +function getRichItemNames(textStyleModel) { + // Use object to remove duplicated names. + var richItemNameMap; + while (textStyleModel && textStyleModel !== textStyleModel.ecModel) { + var rich = (textStyleModel.option || EMPTY_OBJ).rich; + if (rich) { + richItemNameMap = richItemNameMap || {}; + for (var name in rich) { + if (rich.hasOwnProperty(name)) { + richItemNameMap[name] = 1; + } + } + } + textStyleModel = textStyleModel.parentModel; + } + return richItemNameMap; +} + +function setTokenTextStyle(textStyle, textStyleModel, globalTextStyle, opt, isEmphasis, isBlock) { + // In merge mode, default value should not be given. + globalTextStyle = !isEmphasis && globalTextStyle || EMPTY_OBJ; + + textStyle.textFill = getAutoColor(textStyleModel.getShallow('color'), opt) + || globalTextStyle.color; + textStyle.textStroke = getAutoColor(textStyleModel.getShallow('textBorderColor'), opt) + || globalTextStyle.textBorderColor; + textStyle.textStrokeWidth = retrieve2( + textStyleModel.getShallow('textBorderWidth'), + globalTextStyle.textBorderWidth + ); + + if (!isEmphasis) { + if (isBlock) { + // Always set `insideRollback`, for clearing previous. + var originalTextPosition = textStyle.textPosition; + textStyle.insideRollback = applyInsideStyle(textStyle, originalTextPosition, opt); + // Save original textPosition, because style.textPosition will be repalced by + // real location (like [10, 30]) in zrender. + textStyle.insideOriginalTextPosition = originalTextPosition; + textStyle.insideRollbackOpt = opt; + } + + // Set default finally. + if (textStyle.textFill == null) { + textStyle.textFill = opt.autoColor; + } + } + + // Do not use `getFont` here, because merge should be supported, where + // part of these properties may be changed in emphasis style, and the + // others should remain their original value got from normal style. + textStyle.fontStyle = textStyleModel.getShallow('fontStyle') || globalTextStyle.fontStyle; + textStyle.fontWeight = textStyleModel.getShallow('fontWeight') || globalTextStyle.fontWeight; + textStyle.fontSize = textStyleModel.getShallow('fontSize') || globalTextStyle.fontSize; + textStyle.fontFamily = textStyleModel.getShallow('fontFamily') || globalTextStyle.fontFamily; + + textStyle.textAlign = textStyleModel.getShallow('align'); + textStyle.textVerticalAlign = textStyleModel.getShallow('verticalAlign') + || textStyleModel.getShallow('baseline'); + + textStyle.textLineHeight = textStyleModel.getShallow('lineHeight'); + textStyle.textWidth = textStyleModel.getShallow('width'); + textStyle.textHeight = textStyleModel.getShallow('height'); + textStyle.textTag = textStyleModel.getShallow('tag'); + + if (!isBlock || !opt.disableBox) { + textStyle.textBackgroundColor = getAutoColor(textStyleModel.getShallow('backgroundColor'), opt); + textStyle.textPadding = textStyleModel.getShallow('padding'); + textStyle.textBorderColor = getAutoColor(textStyleModel.getShallow('borderColor'), opt); + textStyle.textBorderWidth = textStyleModel.getShallow('borderWidth'); + textStyle.textBorderRadius = textStyleModel.getShallow('borderRadius'); + + textStyle.textBoxShadowColor = textStyleModel.getShallow('shadowColor'); + textStyle.textBoxShadowBlur = textStyleModel.getShallow('shadowBlur'); + textStyle.textBoxShadowOffsetX = textStyleModel.getShallow('shadowOffsetX'); + textStyle.textBoxShadowOffsetY = textStyleModel.getShallow('shadowOffsetY'); + } + + textStyle.textShadowColor = textStyleModel.getShallow('textShadowColor') + || globalTextStyle.textShadowColor; + textStyle.textShadowBlur = textStyleModel.getShallow('textShadowBlur') + || globalTextStyle.textShadowBlur; + textStyle.textShadowOffsetX = textStyleModel.getShallow('textShadowOffsetX') + || globalTextStyle.textShadowOffsetX; + textStyle.textShadowOffsetY = textStyleModel.getShallow('textShadowOffsetY') + || globalTextStyle.textShadowOffsetY; +} + +function getAutoColor(color, opt) { + return color !== 'auto' ? color : (opt && opt.autoColor) ? opt.autoColor : null; +} + +function applyInsideStyle(textStyle, textPosition, opt) { + var useInsideStyle = opt.useInsideStyle; + var insideRollback; + + if (textStyle.textFill == null + && useInsideStyle !== false + && (useInsideStyle === true + || (opt.isRectText + && textPosition + // textPosition can be [10, 30] + && typeof textPosition === 'string' + && textPosition.indexOf('inside') >= 0 + ) + ) + ) { + insideRollback = { + textFill: null, + textStroke: textStyle.textStroke, + textStrokeWidth: textStyle.textStrokeWidth + }; + textStyle.textFill = '#fff'; + // Consider text with #fff overflow its container. + if (textStyle.textStroke == null) { + textStyle.textStroke = opt.autoColor; + textStyle.textStrokeWidth == null && (textStyle.textStrokeWidth = 2); + } + } + + return insideRollback; +} + +function rollbackInsideStyle(style) { + var insideRollback = style.insideRollback; + if (insideRollback) { + style.textFill = insideRollback.textFill; + style.textStroke = insideRollback.textStroke; + style.textStrokeWidth = insideRollback.textStrokeWidth; + } +} + +function getFont(opt, ecModel) { + // ecModel or default text style model. + var gTextStyleModel = ecModel || ecModel.getModel('textStyle'); + return trim([ + // FIXME in node-canvas fontWeight is before fontStyle + opt.fontStyle || gTextStyleModel && gTextStyleModel.getShallow('fontStyle') || '', + opt.fontWeight || gTextStyleModel && gTextStyleModel.getShallow('fontWeight') || '', + (opt.fontSize || gTextStyleModel && gTextStyleModel.getShallow('fontSize') || 12) + 'px', + opt.fontFamily || gTextStyleModel && gTextStyleModel.getShallow('fontFamily') || 'sans-serif' + ].join(' ')); +} + +function animateOrSetProps(isUpdate, el, props, animatableModel, dataIndex, cb) { + if (typeof dataIndex === 'function') { + cb = dataIndex; + dataIndex = null; + } + // Do not check 'animation' property directly here. Consider this case: + // animation model is an `itemModel`, whose does not have `isAnimationEnabled` + // but its parent model (`seriesModel`) does. + var animationEnabled = animatableModel && animatableModel.isAnimationEnabled(); + + if (animationEnabled) { + var postfix = isUpdate ? 'Update' : ''; + var duration = animatableModel.getShallow('animationDuration' + postfix); + var animationEasing = animatableModel.getShallow('animationEasing' + postfix); + var animationDelay = animatableModel.getShallow('animationDelay' + postfix); + if (typeof animationDelay === 'function') { + animationDelay = animationDelay( + dataIndex, + animatableModel.getAnimationDelayParams + ? animatableModel.getAnimationDelayParams(el, dataIndex) + : null + ); + } + if (typeof duration === 'function') { + duration = duration(dataIndex); + } + + duration > 0 + ? el.animateTo(props, duration, animationDelay || 0, animationEasing, cb, !!cb) + : (el.stopAnimation(), el.attr(props), cb && cb()); + } + else { + el.stopAnimation(); + el.attr(props); + cb && cb(); + } +} + +/** + * Update graphic element properties with or without animation according to the + * configuration in series. + * + * Caution: this method will stop previous animation. + * So if do not use this method to one element twice before + * animation starts, unless you know what you are doing. + * + * @param {module:zrender/Element} el + * @param {Object} props + * @param {module:echarts/model/Model} [animatableModel] + * @param {number} [dataIndex] + * @param {Function} [cb] + * @example + * graphic.updateProps(el, { + * position: [100, 100] + * }, seriesModel, dataIndex, function () { console.log('Animation done!'); }); + * // Or + * graphic.updateProps(el, { + * position: [100, 100] + * }, seriesModel, function () { console.log('Animation done!'); }); + */ +function updateProps(el, props, animatableModel, dataIndex, cb) { + animateOrSetProps(true, el, props, animatableModel, dataIndex, cb); +} + +/** + * Init graphic element properties with or without animation according to the + * configuration in series. + * + * Caution: this method will stop previous animation. + * So if do not use this method to one element twice before + * animation starts, unless you know what you are doing. + * + * @param {module:zrender/Element} el + * @param {Object} props + * @param {module:echarts/model/Model} [animatableModel] + * @param {number} [dataIndex] + * @param {Function} cb + */ +function initProps(el, props, animatableModel, dataIndex, cb) { + animateOrSetProps(false, el, props, animatableModel, dataIndex, cb); +} + +/** + * Get transform matrix of target (param target), + * in coordinate of its ancestor (param ancestor) + * + * @param {module:zrender/mixin/Transformable} target + * @param {module:zrender/mixin/Transformable} [ancestor] + */ +function getTransform(target, ancestor) { + var mat = identity([]); + + while (target && target !== ancestor) { + mul$1(mat, target.getLocalTransform(), mat); + target = target.parent; + } + + return mat; +} + +/** + * Apply transform to an vertex. + * @param {Array.<number>} target [x, y] + * @param {Array.<number>|TypedArray.<number>|Object} transform Can be: + * + Transform matrix: like [1, 0, 0, 1, 0, 0] + * + {position, rotation, scale}, the same as `zrender/Transformable`. + * @param {boolean=} invert Whether use invert matrix. + * @return {Array.<number>} [x, y] + */ +function applyTransform$1(target, transform, invert$$1) { + if (transform && !isArrayLike(transform)) { + transform = Transformable.getLocalTransform(transform); + } + + if (invert$$1) { + transform = invert([], transform); + } + return applyTransform([], target, transform); +} + +/** + * @param {string} direction 'left' 'right' 'top' 'bottom' + * @param {Array.<number>} transform Transform matrix: like [1, 0, 0, 1, 0, 0] + * @param {boolean=} invert Whether use invert matrix. + * @return {string} Transformed direction. 'left' 'right' 'top' 'bottom' + */ +function transformDirection(direction, transform, invert$$1) { + + // Pick a base, ensure that transform result will not be (0, 0). + var hBase = (transform[4] === 0 || transform[5] === 0 || transform[0] === 0) + ? 1 : Math.abs(2 * transform[4] / transform[0]); + var vBase = (transform[4] === 0 || transform[5] === 0 || transform[2] === 0) + ? 1 : Math.abs(2 * transform[4] / transform[2]); + + var vertex = [ + direction === 'left' ? -hBase : direction === 'right' ? hBase : 0, + direction === 'top' ? -vBase : direction === 'bottom' ? vBase : 0 + ]; + + vertex = applyTransform$1(vertex, transform, invert$$1); + + return Math.abs(vertex[0]) > Math.abs(vertex[1]) + ? (vertex[0] > 0 ? 'right' : 'left') + : (vertex[1] > 0 ? 'bottom' : 'top'); +} + +/** + * Apply group transition animation from g1 to g2. + * If no animatableModel, no animation. + */ +function groupTransition(g1, g2, animatableModel, cb) { + if (!g1 || !g2) { + return; + } + + function getElMap(g) { + var elMap = {}; + g.traverse(function (el) { + if (!el.isGroup && el.anid) { + elMap[el.anid] = el; + } + }); + return elMap; + } + function getAnimatableProps(el) { + var obj = { + position: clone$1(el.position), + rotation: el.rotation + }; + if (el.shape) { + obj.shape = extend({}, el.shape); + } + return obj; + } + var elMap1 = getElMap(g1); + + g2.traverse(function (el) { + if (!el.isGroup && el.anid) { + var oldEl = elMap1[el.anid]; + if (oldEl) { + var newProp = getAnimatableProps(el); + el.attr(getAnimatableProps(oldEl)); + updateProps(el, newProp, animatableModel, el.dataIndex); + } + // else { + // if (el.previousProps) { + // graphic.updateProps + // } + // } + } + }); +} + +/** + * @param {Array.<Array.<number>>} points Like: [[23, 44], [53, 66], ...] + * @param {Object} rect {x, y, width, height} + * @return {Array.<Array.<number>>} A new clipped points. + */ +function clipPointsByRect(points, rect) { + return map(points, function (point) { + var x = point[0]; + x = mathMax$1(x, rect.x); + x = mathMin$1(x, rect.x + rect.width); + var y = point[1]; + y = mathMax$1(y, rect.y); + y = mathMin$1(y, rect.y + rect.height); + return [x, y]; + }); +} + +/** + * @param {Object} targetRect {x, y, width, height} + * @param {Object} rect {x, y, width, height} + * @return {Object} A new clipped rect. If rect size are negative, return undefined. + */ +function clipRectByRect(targetRect, rect) { + var x = mathMax$1(targetRect.x, rect.x); + var x2 = mathMin$1(targetRect.x + targetRect.width, rect.x + rect.width); + var y = mathMax$1(targetRect.y, rect.y); + var y2 = mathMin$1(targetRect.y + targetRect.height, rect.y + rect.height); + + if (x2 >= x && y2 >= y) { + return { + x: x, + y: y, + width: x2 - x, + height: y2 - y + }; + } +} + +/** + * @param {string} iconStr Support 'image://' or 'path://' or direct svg path. + * @param {Object} [opt] Properties of `module:zrender/Element`, except `style`. + * @param {Object} [rect] {x, y, width, height} + * @return {module:zrender/Element} Icon path or image element. + */ +function createIcon(iconStr, opt, rect) { + opt = extend({rectHover: true}, opt); + var style = opt.style = {strokeNoScale: true}; + rect = rect || {x: -1, y: -1, width: 2, height: 2}; + + if (iconStr) { + return iconStr.indexOf('image://') === 0 + ? ( + style.image = iconStr.slice(8), + defaults(style, rect), + new ZImage(opt) + ) + : ( + makePath( + iconStr.replace('path://', ''), + opt, + rect, + 'center' + ) + ); + } +} + + + + +var graphic = (Object.freeze || Object)({ + extendShape: extendShape, + extendPath: extendPath, + makePath: makePath, + makeImage: makeImage, + mergePath: mergePath, + resizePath: resizePath, + subPixelOptimizeLine: subPixelOptimizeLine, + subPixelOptimizeRect: subPixelOptimizeRect, + subPixelOptimize: subPixelOptimize, + setHoverStyle: setHoverStyle, + setLabelStyle: setLabelStyle, + setTextStyle: setTextStyle, + setText: setText, + getFont: getFont, + updateProps: updateProps, + initProps: initProps, + getTransform: getTransform, + applyTransform: applyTransform$1, + transformDirection: transformDirection, + groupTransition: groupTransition, + clipPointsByRect: clipPointsByRect, + clipRectByRect: clipRectByRect, + createIcon: createIcon, + Group: Group, + Image: ZImage, + Text: Text, + Circle: Circle, + Sector: Sector, + Ring: Ring, + Polygon: Polygon, + Polyline: Polyline, + Rect: Rect, + Line: Line, + BezierCurve: BezierCurve, + Arc: Arc, + IncrementalDisplayable: IncrementalDisplayble, + CompoundPath: CompoundPath, + LinearGradient: LinearGradient, + RadialGradient: RadialGradient, + BoundingRect: BoundingRect +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var PATH_COLOR = ['textStyle', 'color']; + +var textStyleMixin = { + /** + * Get color property or get color from option.textStyle.color + * @param {boolean} [isEmphasis] + * @return {string} + */ + getTextColor: function (isEmphasis) { + var ecModel = this.ecModel; + return this.getShallow('color') + || ( + (!isEmphasis && ecModel) ? ecModel.get(PATH_COLOR) : null + ); + }, + + /** + * Create font string from fontStyle, fontWeight, fontSize, fontFamily + * @return {string} + */ + getFont: function () { + return getFont({ + fontStyle: this.getShallow('fontStyle'), + fontWeight: this.getShallow('fontWeight'), + fontSize: this.getShallow('fontSize'), + fontFamily: this.getShallow('fontFamily') + }, this.ecModel); + }, + + getTextRect: function (text) { + return getBoundingRect( + text, + this.getFont(), + this.getShallow('align'), + this.getShallow('verticalAlign') || this.getShallow('baseline'), + this.getShallow('padding'), + this.getShallow('rich'), + this.getShallow('truncateText') + ); + } +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var getItemStyle = makeStyleMapper( + [ + ['fill', 'color'], + ['stroke', 'borderColor'], + ['lineWidth', 'borderWidth'], + ['opacity'], + ['shadowBlur'], + ['shadowOffsetX'], + ['shadowOffsetY'], + ['shadowColor'], + ['textPosition'], + ['textAlign'] + ] +); + +var itemStyleMixin = { + getItemStyle: function (excludes, includes) { + var style = getItemStyle(this, excludes, includes); + var lineDash = this.getBorderLineDash(); + lineDash && (style.lineDash = lineDash); + return style; + }, + + getBorderLineDash: function () { + var lineType = this.get('borderType'); + return (lineType === 'solid' || lineType == null) ? null + : (lineType === 'dashed' ? [5, 5] : [1, 1]); + } +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @module echarts/model/Model + */ + +var mixin$1 = mixin; +var inner = makeInner(); + +/** + * @alias module:echarts/model/Model + * @constructor + * @param {Object} option + * @param {module:echarts/model/Model} [parentModel] + * @param {module:echarts/model/Global} [ecModel] + */ +function Model(option, parentModel, ecModel) { + /** + * @type {module:echarts/model/Model} + * @readOnly + */ + this.parentModel = parentModel; + + /** + * @type {module:echarts/model/Global} + * @readOnly + */ + this.ecModel = ecModel; + + /** + * @type {Object} + * @protected + */ + this.option = option; + + // Simple optimization + // if (this.init) { + // if (arguments.length <= 4) { + // this.init(option, parentModel, ecModel, extraOpt); + // } + // else { + // this.init.apply(this, arguments); + // } + // } +} + +Model.prototype = { + + constructor: Model, + + /** + * Model 的初始化函数 + * @param {Object} option + */ + init: null, + + /** + * 从新的 Option merge + */ + mergeOption: function (option) { + merge(this.option, option, true); + }, + + /** + * @param {string|Array.<string>} path + * @param {boolean} [ignoreParent=false] + * @return {*} + */ + get: function (path, ignoreParent) { + if (path == null) { + return this.option; + } + + return doGet( + this.option, + this.parsePath(path), + !ignoreParent && getParent(this, path) + ); + }, + + /** + * @param {string} key + * @param {boolean} [ignoreParent=false] + * @return {*} + */ + getShallow: function (key, ignoreParent) { + var option = this.option; + + var val = option == null ? option : option[key]; + var parentModel = !ignoreParent && getParent(this, key); + if (val == null && parentModel) { + val = parentModel.getShallow(key); + } + return val; + }, + + /** + * @param {string|Array.<string>} [path] + * @param {module:echarts/model/Model} [parentModel] + * @return {module:echarts/model/Model} + */ + getModel: function (path, parentModel) { + var obj = path == null + ? this.option + : doGet(this.option, path = this.parsePath(path)); + + var thisParentModel; + parentModel = parentModel || ( + (thisParentModel = getParent(this, path)) + && thisParentModel.getModel(path) + ); + + return new Model(obj, parentModel, this.ecModel); + }, + + /** + * If model has option + */ + isEmpty: function () { + return this.option == null; + }, + + restoreData: function () {}, + + // Pending + clone: function () { + var Ctor = this.constructor; + return new Ctor(clone(this.option)); + }, + + setReadOnly: function (properties) { + // clazzUtil.setReadOnly(this, properties); + }, + + // If path is null/undefined, return null/undefined. + parsePath: function(path) { + if (typeof path === 'string') { + path = path.split('.'); + } + return path; + }, + + /** + * @param {Function} getParentMethod + * param {Array.<string>|string} path + * return {module:echarts/model/Model} + */ + customizeGetParent: function (getParentMethod) { + inner(this).getParent = getParentMethod; + }, + + isAnimationEnabled: function () { + if (!env$1.node) { + if (this.option.animation != null) { + return !!this.option.animation; + } + else if (this.parentModel) { + return this.parentModel.isAnimationEnabled(); + } + } + } + +}; + +function doGet(obj, pathArr, parentModel) { + for (var i = 0; i < pathArr.length; i++) { + // Ignore empty + if (!pathArr[i]) { + continue; + } + // obj could be number/string/... (like 0) + obj = (obj && typeof obj === 'object') ? obj[pathArr[i]] : null; + if (obj == null) { + break; + } + } + if (obj == null && parentModel) { + obj = parentModel.get(pathArr); + } + return obj; +} + +// `path` can be null/undefined +function getParent(model, path) { + var getParentMethod = inner(model).getParent; + return getParentMethod ? getParentMethod.call(model, path) : model.parentModel; +} + +// Enable Model.extend. +enableClassExtend(Model); +enableClassCheck(Model); + +mixin$1(Model, lineStyleMixin); +mixin$1(Model, areaStyleMixin); +mixin$1(Model, textStyleMixin); +mixin$1(Model, itemStyleMixin); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var base = 0; + +/** + * @public + * @param {string} type + * @return {string} + */ +function getUID(type) { + // Considering the case of crossing js context, + // use Math.random to make id as unique as possible. + return [(type || ''), base++, Math.random().toFixed(5)].join('_'); +} + +/** + * @inner + */ +function enableSubTypeDefaulter(entity) { + + var subTypeDefaulters = {}; + + entity.registerSubTypeDefaulter = function (componentType, defaulter) { + componentType = parseClassType$1(componentType); + subTypeDefaulters[componentType.main] = defaulter; + }; + + entity.determineSubType = function (componentType, option) { + var type = option.type; + if (!type) { + var componentTypeMain = parseClassType$1(componentType).main; + if (entity.hasSubTypes(componentType) && subTypeDefaulters[componentTypeMain]) { + type = subTypeDefaulters[componentTypeMain](option); + } + } + return type; + }; + + return entity; +} + +/** + * Topological travel on Activity Network (Activity On Vertices). + * Dependencies is defined in Model.prototype.dependencies, like ['xAxis', 'yAxis']. + * + * If 'xAxis' or 'yAxis' is absent in componentTypeList, just ignore it in topology. + * + * If there is circle dependencey, Error will be thrown. + * + */ +function enableTopologicalTravel(entity, dependencyGetter) { + + /** + * @public + * @param {Array.<string>} targetNameList Target Component type list. + * Can be ['aa', 'bb', 'aa.xx'] + * @param {Array.<string>} fullNameList By which we can build dependency graph. + * @param {Function} callback Params: componentType, dependencies. + * @param {Object} context Scope of callback. + */ + entity.topologicalTravel = function (targetNameList, fullNameList, callback, context) { + if (!targetNameList.length) { + return; + } + + var result = makeDepndencyGraph(fullNameList); + var graph = result.graph; + var stack = result.noEntryList; + + var targetNameSet = {}; + each$1(targetNameList, function (name) { + targetNameSet[name] = true; + }); + + while (stack.length) { + var currComponentType = stack.pop(); + var currVertex = graph[currComponentType]; + var isInTargetNameSet = !!targetNameSet[currComponentType]; + if (isInTargetNameSet) { + callback.call(context, currComponentType, currVertex.originalDeps.slice()); + delete targetNameSet[currComponentType]; + } + each$1( + currVertex.successor, + isInTargetNameSet ? removeEdgeAndAdd : removeEdge + ); + } + + each$1(targetNameSet, function () { + throw new Error('Circle dependency may exists'); + }); + + function removeEdge(succComponentType) { + graph[succComponentType].entryCount--; + if (graph[succComponentType].entryCount === 0) { + stack.push(succComponentType); + } + } + + // Consider this case: legend depends on series, and we call + // chart.setOption({series: [...]}), where only series is in option. + // If we do not have 'removeEdgeAndAdd', legendModel.mergeOption will + // not be called, but only sereis.mergeOption is called. Thus legend + // have no chance to update its local record about series (like which + // name of series is available in legend). + function removeEdgeAndAdd(succComponentType) { + targetNameSet[succComponentType] = true; + removeEdge(succComponentType); + } + }; + + /** + * DepndencyGraph: {Object} + * key: conponentType, + * value: { + * successor: [conponentTypes...], + * originalDeps: [conponentTypes...], + * entryCount: {number} + * } + */ + function makeDepndencyGraph(fullNameList) { + var graph = {}; + var noEntryList = []; + + each$1(fullNameList, function (name) { + + var thisItem = createDependencyGraphItem(graph, name); + var originalDeps = thisItem.originalDeps = dependencyGetter(name); + + var availableDeps = getAvailableDependencies(originalDeps, fullNameList); + thisItem.entryCount = availableDeps.length; + if (thisItem.entryCount === 0) { + noEntryList.push(name); + } + + each$1(availableDeps, function (dependentName) { + if (indexOf(thisItem.predecessor, dependentName) < 0) { + thisItem.predecessor.push(dependentName); + } + var thatItem = createDependencyGraphItem(graph, dependentName); + if (indexOf(thatItem.successor, dependentName) < 0) { + thatItem.successor.push(name); + } + }); + }); + + return {graph: graph, noEntryList: noEntryList}; + } + + function createDependencyGraphItem(graph, name) { + if (!graph[name]) { + graph[name] = {predecessor: [], successor: []}; + } + return graph[name]; + } + + function getAvailableDependencies(originalDeps, fullNameList) { + var availableDeps = []; + each$1(originalDeps, function (dep) { + indexOf(fullNameList, dep) >= 0 && availableDeps.push(dep); + }); + return availableDeps; + } +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var RADIAN_EPSILON = 1e-4; + +function _trim(str) { + return str.replace(/^\s+/, '').replace(/\s+$/, ''); +} + +/** + * Linear mapping a value from domain to range + * @memberOf module:echarts/util/number + * @param {(number|Array.<number>)} val + * @param {Array.<number>} domain Domain extent domain[0] can be bigger than domain[1] + * @param {Array.<number>} range Range extent range[0] can be bigger than range[1] + * @param {boolean} clamp + * @return {(number|Array.<number>} + */ +function linearMap(val, domain, range, clamp) { + var subDomain = domain[1] - domain[0]; + var subRange = range[1] - range[0]; + + if (subDomain === 0) { + return subRange === 0 + ? range[0] + : (range[0] + range[1]) / 2; + } + + // Avoid accuracy problem in edge, such as + // 146.39 - 62.83 === 83.55999999999999. + // See echarts/test/ut/spec/util/number.js#linearMap#accuracyError + // It is a little verbose for efficiency considering this method + // is a hotspot. + if (clamp) { + if (subDomain > 0) { + if (val <= domain[0]) { + return range[0]; + } + else if (val >= domain[1]) { + return range[1]; + } + } + else { + if (val >= domain[0]) { + return range[0]; + } + else if (val <= domain[1]) { + return range[1]; + } + } + } + else { + if (val === domain[0]) { + return range[0]; + } + if (val === domain[1]) { + return range[1]; + } + } + + return (val - domain[0]) / subDomain * subRange + range[0]; +} + +/** + * Convert a percent string to absolute number. + * Returns NaN if percent is not a valid string or number + * @memberOf module:echarts/util/number + * @param {string|number} percent + * @param {number} all + * @return {number} + */ +function parsePercent$1(percent, all) { + switch (percent) { + case 'center': + case 'middle': + percent = '50%'; + break; + case 'left': + case 'top': + percent = '0%'; + break; + case 'right': + case 'bottom': + percent = '100%'; + break; + } + if (typeof percent === 'string') { + if (_trim(percent).match(/%$/)) { + return parseFloat(percent) / 100 * all; + } + + return parseFloat(percent); + } + + return percent == null ? NaN : +percent; +} + +/** + * (1) Fix rounding error of float numbers. + * (2) Support return string to avoid scientific notation like '3.5e-7'. + * + * @param {number} x + * @param {number} [precision] + * @param {boolean} [returnStr] + * @return {number|string} + */ +function round$1(x, precision, returnStr) { + if (precision == null) { + precision = 10; + } + // Avoid range error + precision = Math.min(Math.max(0, precision), 20); + x = (+x).toFixed(precision); + return returnStr ? x : +x; +} + +function asc(arr) { + arr.sort(function (a, b) { + return a - b; + }); + return arr; +} + +/** + * Get precision + * @param {number} val + */ +function getPrecision(val) { + val = +val; + if (isNaN(val)) { + return 0; + } + // It is much faster than methods converting number to string as follows + // var tmp = val.toString(); + // return tmp.length - 1 - tmp.indexOf('.'); + // especially when precision is low + var e = 1; + var count = 0; + while (Math.round(val * e) / e !== val) { + e *= 10; + count++; + } + return count; +} + +/** + * @param {string|number} val + * @return {number} + */ +function getPrecisionSafe(val) { + var str = val.toString(); + + // Consider scientific notation: '3.4e-12' '3.4e+12' + var eIndex = str.indexOf('e'); + if (eIndex > 0) { + var precision = +str.slice(eIndex + 1); + return precision < 0 ? -precision : 0; + } + else { + var dotIndex = str.indexOf('.'); + return dotIndex < 0 ? 0 : str.length - 1 - dotIndex; + } +} + +/** + * Minimal dicernible data precisioin according to a single pixel. + * + * @param {Array.<number>} dataExtent + * @param {Array.<number>} pixelExtent + * @return {number} precision + */ +function getPixelPrecision(dataExtent, pixelExtent) { + var log = Math.log; + var LN10 = Math.LN10; + var dataQuantity = Math.floor(log(dataExtent[1] - dataExtent[0]) / LN10); + var sizeQuantity = Math.round(log(Math.abs(pixelExtent[1] - pixelExtent[0])) / LN10); + // toFixed() digits argument must be between 0 and 20. + var precision = Math.min(Math.max(-dataQuantity + sizeQuantity, 0), 20); + return !isFinite(precision) ? 20 : precision; +} + +/** + * Get a data of given precision, assuring the sum of percentages + * in valueList is 1. + * The largest remainer method is used. + * https://en.wikipedia.org/wiki/Largest_remainder_method + * + * @param {Array.<number>} valueList a list of all data + * @param {number} idx index of the data to be processed in valueList + * @param {number} precision integer number showing digits of precision + * @return {number} percent ranging from 0 to 100 + */ +function getPercentWithPrecision(valueList, idx, precision) { + if (!valueList[idx]) { + return 0; + } + + var sum = reduce(valueList, function (acc, val) { + return acc + (isNaN(val) ? 0 : val); + }, 0); + if (sum === 0) { + return 0; + } + + var digits = Math.pow(10, precision); + var votesPerQuota = map(valueList, function (val) { + return (isNaN(val) ? 0 : val) / sum * digits * 100; + }); + var targetSeats = digits * 100; + + var seats = map(votesPerQuota, function (votes) { + // Assign automatic seats. + return Math.floor(votes); + }); + var currentSum = reduce(seats, function (acc, val) { + return acc + val; + }, 0); + + var remainder = map(votesPerQuota, function (votes, idx) { + return votes - seats[idx]; + }); + + // Has remainding votes. + while (currentSum < targetSeats) { + // Find next largest remainder. + var max = Number.NEGATIVE_INFINITY; + var maxId = null; + for (var i = 0, len = remainder.length; i < len; ++i) { + if (remainder[i] > max) { + max = remainder[i]; + maxId = i; + } + } + + // Add a vote to max remainder. + ++seats[maxId]; + remainder[maxId] = 0; + ++currentSum; + } + + return seats[idx] / digits; +} + +// Number.MAX_SAFE_INTEGER, ie do not support. +var MAX_SAFE_INTEGER = 9007199254740991; + +/** + * To 0 - 2 * PI, considering negative radian. + * @param {number} radian + * @return {number} + */ +function remRadian(radian) { + var pi2 = Math.PI * 2; + return (radian % pi2 + pi2) % pi2; +} + +/** + * @param {type} radian + * @return {boolean} + */ +function isRadianAroundZero(val) { + return val > -RADIAN_EPSILON && val < RADIAN_EPSILON; +} + +var TIME_REG = /^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})(?::(\d\d)(?::(\d\d)(?:[.,](\d+))?)?)?(Z|[\+\-]\d\d:?\d\d)?)?)?)?)?$/; // jshint ignore:line + +/** + * @param {string|Date|number} value These values can be accepted: + * + An instance of Date, represent a time in its own time zone. + * + Or string in a subset of ISO 8601, only including: + * + only year, month, date: '2012-03', '2012-03-01', '2012-03-01 05', '2012-03-01 05:06', + * + separated with T or space: '2012-03-01T12:22:33.123', '2012-03-01 12:22:33.123', + * + time zone: '2012-03-01T12:22:33Z', '2012-03-01T12:22:33+8000', '2012-03-01T12:22:33-05:00', + * all of which will be treated as local time if time zone is not specified + * (see <https://momentjs.com/>). + * + Or other string format, including (all of which will be treated as loacal time): + * '2012', '2012-3-1', '2012/3/1', '2012/03/01', + * '2009/6/12 2:00', '2009/6/12 2:05:08', '2009/6/12 2:05:08.123' + * + a timestamp, which represent a time in UTC. + * @return {Date} date + */ +function parseDate(value) { + if (value instanceof Date) { + return value; + } + else if (typeof value === 'string') { + // Different browsers parse date in different way, so we parse it manually. + // Some other issues: + // new Date('1970-01-01') is UTC, + // new Date('1970/01/01') and new Date('1970-1-01') is local. + // See issue #3623 + var match = TIME_REG.exec(value); + + if (!match) { + // return Invalid Date. + return new Date(NaN); + } + + // Use local time when no timezone offset specifed. + if (!match[8]) { + // match[n] can only be string or undefined. + // But take care of '12' + 1 => '121'. + return new Date( + +match[1], + +(match[2] || 1) - 1, + +match[3] || 1, + +match[4] || 0, + +(match[5] || 0), + +match[6] || 0, + +match[7] || 0 + ); + } + // Timezoneoffset of Javascript Date has considered DST (Daylight Saving Time, + // https://tc39.github.io/ecma262/#sec-daylight-saving-time-adjustment). + // For example, system timezone is set as "Time Zone: America/Toronto", + // then these code will get different result: + // `new Date(1478411999999).getTimezoneOffset(); // get 240` + // `new Date(1478412000000).getTimezoneOffset(); // get 300` + // So we should not use `new Date`, but use `Date.UTC`. + else { + var hour = +match[4] || 0; + if (match[8].toUpperCase() !== 'Z') { + hour -= match[8].slice(0, 3); + } + return new Date(Date.UTC( + +match[1], + +(match[2] || 1) - 1, + +match[3] || 1, + hour, + +(match[5] || 0), + +match[6] || 0, + +match[7] || 0 + )); + } + } + else if (value == null) { + return new Date(NaN); + } + + return new Date(Math.round(value)); +} + +/** + * Quantity of a number. e.g. 0.1, 1, 10, 100 + * + * @param {number} val + * @return {number} + */ +function quantity(val) { + return Math.pow(10, quantityExponent(val)); +} + +function quantityExponent(val) { + return Math.floor(Math.log(val) / Math.LN10); +} + +/** + * find a “nice” number approximately equal to x. Round the number if round = true, + * take ceiling if round = false. The primary observation is that the “nicest” + * numbers in decimal are 1, 2, and 5, and all power-of-ten multiples of these numbers. + * + * See "Nice Numbers for Graph Labels" of Graphic Gems. + * + * @param {number} val Non-negative value. + * @param {boolean} round + * @return {number} + */ +function nice(val, round) { + var exponent = quantityExponent(val); + var exp10 = Math.pow(10, exponent); + var f = val / exp10; // 1 <= f < 10 + var nf; + if (round) { + if (f < 1.5) { nf = 1; } + else if (f < 2.5) { nf = 2; } + else if (f < 4) { nf = 3; } + else if (f < 7) { nf = 5; } + else { nf = 10; } + } + else { + if (f < 1) { nf = 1; } + else if (f < 2) { nf = 2; } + else if (f < 3) { nf = 3; } + else if (f < 5) { nf = 5; } + else { nf = 10; } + } + val = nf * exp10; + + // Fix 3 * 0.1 === 0.30000000000000004 issue (see IEEE 754). + // 20 is the uppper bound of toFixed. + return exponent >= -20 ? +val.toFixed(exponent < 0 ? -exponent : 0) : val; +} + +/** + * Order intervals asc, and split them when overlap. + * expect(numberUtil.reformIntervals([ + * {interval: [18, 62], close: [1, 1]}, + * {interval: [-Infinity, -70], close: [0, 0]}, + * {interval: [-70, -26], close: [1, 1]}, + * {interval: [-26, 18], close: [1, 1]}, + * {interval: [62, 150], close: [1, 1]}, + * {interval: [106, 150], close: [1, 1]}, + * {interval: [150, Infinity], close: [0, 0]} + * ])).toEqual([ + * {interval: [-Infinity, -70], close: [0, 0]}, + * {interval: [-70, -26], close: [1, 1]}, + * {interval: [-26, 18], close: [0, 1]}, + * {interval: [18, 62], close: [0, 1]}, + * {interval: [62, 150], close: [0, 1]}, + * {interval: [150, Infinity], close: [0, 0]} + * ]); + * @param {Array.<Object>} list, where `close` mean open or close + * of the interval, and Infinity can be used. + * @return {Array.<Object>} The origin list, which has been reformed. + */ +function reformIntervals(list) { + list.sort(function (a, b) { + return littleThan(a, b, 0) ? -1 : 1; + }); + + var curr = -Infinity; + var currClose = 1; + for (var i = 0; i < list.length;) { + var interval = list[i].interval; + var close = list[i].close; + + for (var lg = 0; lg < 2; lg++) { + if (interval[lg] <= curr) { + interval[lg] = curr; + close[lg] = !lg ? 1 - currClose : 1; + } + curr = interval[lg]; + currClose = close[lg]; + } + + if (interval[0] === interval[1] && close[0] * close[1] !== 1) { + list.splice(i, 1); + } + else { + i++; + } + } + + return list; + + function littleThan(a, b, lg) { + return a.interval[lg] < b.interval[lg] + || ( + a.interval[lg] === b.interval[lg] + && ( + (a.close[lg] - b.close[lg] === (!lg ? 1 : -1)) + || (!lg && littleThan(a, b, 1)) + ) + ); + } +} + +/** + * parseFloat NaNs numeric-cast false positives (null|true|false|"") + * ...but misinterprets leading-number strings, particularly hex literals ("0x...") + * subtraction forces infinities to NaN + * + * @param {*} v + * @return {boolean} + */ +function isNumeric(v) { + return v - parseFloat(v) >= 0; +} + + +var number = (Object.freeze || Object)({ + linearMap: linearMap, + parsePercent: parsePercent$1, + round: round$1, + asc: asc, + getPrecision: getPrecision, + getPrecisionSafe: getPrecisionSafe, + getPixelPrecision: getPixelPrecision, + getPercentWithPrecision: getPercentWithPrecision, + MAX_SAFE_INTEGER: MAX_SAFE_INTEGER, + remRadian: remRadian, + isRadianAroundZero: isRadianAroundZero, + parseDate: parseDate, + quantity: quantity, + nice: nice, + reformIntervals: reformIntervals, + isNumeric: isNumeric +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * 每三位默认加,格式化 + * @param {string|number} x + * @return {string} + */ +function addCommas(x) { + if (isNaN(x)) { + return '-'; + } + x = (x + '').split('.'); + return x[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,'$1,') + + (x.length > 1 ? ('.' + x[1]) : ''); +} + +/** + * @param {string} str + * @param {boolean} [upperCaseFirst=false] + * @return {string} str + */ +function toCamelCase(str, upperCaseFirst) { + str = (str || '').toLowerCase().replace(/-(.)/g, function(match, group1) { + return group1.toUpperCase(); + }); + + if (upperCaseFirst && str) { + str = str.charAt(0).toUpperCase() + str.slice(1); + } + + return str; +} + +var normalizeCssArray$1 = normalizeCssArray; + + +var replaceReg = /([&<>"'])/g; +var replaceMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + '\'': ''' +}; + +function encodeHTML(source) { + return source == null + ? '' + : (source + '').replace(replaceReg, function (str, c) { + return replaceMap[c]; + }); +} + +var TPL_VAR_ALIAS = ['a', 'b', 'c', 'd', 'e', 'f', 'g']; + +var wrapVar = function (varName, seriesIdx) { + return '{' + varName + (seriesIdx == null ? '' : seriesIdx) + '}'; +}; + +/** + * Template formatter + * @param {string} tpl + * @param {Array.<Object>|Object} paramsList + * @param {boolean} [encode=false] + * @return {string} + */ +function formatTpl(tpl, paramsList, encode) { + if (!isArray(paramsList)) { + paramsList = [paramsList]; + } + var seriesLen = paramsList.length; + if (!seriesLen) { + return ''; + } + + var $vars = paramsList[0].$vars || []; + for (var i = 0; i < $vars.length; i++) { + var alias = TPL_VAR_ALIAS[i]; + tpl = tpl.replace(wrapVar(alias), wrapVar(alias, 0)); + } + for (var seriesIdx = 0; seriesIdx < seriesLen; seriesIdx++) { + for (var k = 0; k < $vars.length; k++) { + var val = paramsList[seriesIdx][$vars[k]]; + tpl = tpl.replace( + wrapVar(TPL_VAR_ALIAS[k], seriesIdx), + encode ? encodeHTML(val) : val + ); + } + } + + return tpl; +} + +/** + * simple Template formatter + * + * @param {string} tpl + * @param {Object} param + * @param {boolean} [encode=false] + * @return {string} + */ +function formatTplSimple(tpl, param, encode) { + each$1(param, function (value, key) { + tpl = tpl.replace( + '{' + key + '}', + encode ? encodeHTML(value) : value + ); + }); + return tpl; +} + +/** + * @param {Object|string} [opt] If string, means color. + * @param {string} [opt.color] + * @param {string} [opt.extraCssText] + * @param {string} [opt.type='item'] 'item' or 'subItem' + * @return {string} + */ +function getTooltipMarker(opt, extraCssText) { + opt = isString(opt) ? {color: opt, extraCssText: extraCssText} : (opt || {}); + var color = opt.color; + var type = opt.type; + var extraCssText = opt.extraCssText; + + if (!color) { + return ''; + } + + return type === 'subItem' + ? '<span style="display:inline-block;vertical-align:middle;margin-right:8px;margin-left:3px;' + + 'border-radius:4px;width:4px;height:4px;background-color:' + + encodeHTML(color) + ';' + (extraCssText || '') + '"></span>' + : '<span style="display:inline-block;margin-right:5px;' + + 'border-radius:10px;width:10px;height:10px;background-color:' + + encodeHTML(color) + ';' + (extraCssText || '') + '"></span>'; +} + +function pad(str, len) { + str += ''; + return '0000'.substr(0, len - str.length) + str; +} + + +/** + * ISO Date format + * @param {string} tpl + * @param {number} value + * @param {boolean} [isUTC=false] Default in local time. + * see `module:echarts/scale/Time` + * and `module:echarts/util/number#parseDate`. + * @inner + */ +function formatTime(tpl, value, isUTC) { + if (tpl === 'week' + || tpl === 'month' + || tpl === 'quarter' + || tpl === 'half-year' + || tpl === 'year' + ) { + tpl = 'MM-dd\nyyyy'; + } + + var date = parseDate(value); + var utc = isUTC ? 'UTC' : ''; + var y = date['get' + utc + 'FullYear'](); + var M = date['get' + utc + 'Month']() + 1; + var d = date['get' + utc + 'Date'](); + var h = date['get' + utc + 'Hours'](); + var m = date['get' + utc + 'Minutes'](); + var s = date['get' + utc + 'Seconds'](); + var S = date['get' + utc + 'Milliseconds'](); + + tpl = tpl.replace('MM', pad(M, 2)) + .replace('M', M) + .replace('yyyy', y) + .replace('yy', y % 100) + .replace('dd', pad(d, 2)) + .replace('d', d) + .replace('hh', pad(h, 2)) + .replace('h', h) + .replace('mm', pad(m, 2)) + .replace('m', m) + .replace('ss', pad(s, 2)) + .replace('s', s) + .replace('SSS', pad(S, 3)); + + return tpl; +} + +/** + * Capital first + * @param {string} str + * @return {string} + */ +function capitalFirst(str) { + return str ? str.charAt(0).toUpperCase() + str.substr(1) : str; +} + +var truncateText$1 = truncateText; + +var getTextRect = getBoundingRect; + + +var format = (Object.freeze || Object)({ + addCommas: addCommas, + toCamelCase: toCamelCase, + normalizeCssArray: normalizeCssArray$1, + encodeHTML: encodeHTML, + formatTpl: formatTpl, + formatTplSimple: formatTplSimple, + getTooltipMarker: getTooltipMarker, + formatTime: formatTime, + capitalFirst: capitalFirst, + truncateText: truncateText$1, + getTextRect: getTextRect +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// Layout helpers for each component positioning + +var each$3 = each$1; + +/** + * @public + */ +var LOCATION_PARAMS = [ + 'left', 'right', 'top', 'bottom', 'width', 'height' +]; + +/** + * @public + */ +var HV_NAMES = [ + ['width', 'left', 'right'], + ['height', 'top', 'bottom'] +]; + +function boxLayout(orient, group, gap, maxWidth, maxHeight) { + var x = 0; + var y = 0; + + if (maxWidth == null) { + maxWidth = Infinity; + } + if (maxHeight == null) { + maxHeight = Infinity; + } + var currentLineMaxSize = 0; + + group.eachChild(function (child, idx) { + var position = child.position; + var rect = child.getBoundingRect(); + var nextChild = group.childAt(idx + 1); + var nextChildRect = nextChild && nextChild.getBoundingRect(); + var nextX; + var nextY; + + if (orient === 'horizontal') { + var moveX = rect.width + (nextChildRect ? (-nextChildRect.x + rect.x) : 0); + nextX = x + moveX; + // Wrap when width exceeds maxWidth or meet a `newline` group + // FIXME compare before adding gap? + if (nextX > maxWidth || child.newline) { + x = 0; + nextX = moveX; + y += currentLineMaxSize + gap; + currentLineMaxSize = rect.height; + } + else { + // FIXME: consider rect.y is not `0`? + currentLineMaxSize = Math.max(currentLineMaxSize, rect.height); + } + } + else { + var moveY = rect.height + (nextChildRect ? (-nextChildRect.y + rect.y) : 0); + nextY = y + moveY; + // Wrap when width exceeds maxHeight or meet a `newline` group + if (nextY > maxHeight || child.newline) { + x += currentLineMaxSize + gap; + y = 0; + nextY = moveY; + currentLineMaxSize = rect.width; + } + else { + currentLineMaxSize = Math.max(currentLineMaxSize, rect.width); + } + } + + if (child.newline) { + return; + } + + position[0] = x; + position[1] = y; + + orient === 'horizontal' + ? (x = nextX + gap) + : (y = nextY + gap); + }); +} + +/** + * VBox or HBox layouting + * @param {string} orient + * @param {module:zrender/container/Group} group + * @param {number} gap + * @param {number} [width=Infinity] + * @param {number} [height=Infinity] + */ +var box = boxLayout; + +/** + * VBox layouting + * @param {module:zrender/container/Group} group + * @param {number} gap + * @param {number} [width=Infinity] + * @param {number} [height=Infinity] + */ +var vbox = curry(boxLayout, 'vertical'); + +/** + * HBox layouting + * @param {module:zrender/container/Group} group + * @param {number} gap + * @param {number} [width=Infinity] + * @param {number} [height=Infinity] + */ +var hbox = curry(boxLayout, 'horizontal'); + +/** + * If x or x2 is not specified or 'center' 'left' 'right', + * the width would be as long as possible. + * If y or y2 is not specified or 'middle' 'top' 'bottom', + * the height would be as long as possible. + * + * @param {Object} positionInfo + * @param {number|string} [positionInfo.x] + * @param {number|string} [positionInfo.y] + * @param {number|string} [positionInfo.x2] + * @param {number|string} [positionInfo.y2] + * @param {Object} containerRect {width, height} + * @param {string|number} margin + * @return {Object} {width, height} + */ +function getAvailableSize(positionInfo, containerRect, margin) { + var containerWidth = containerRect.width; + var containerHeight = containerRect.height; + + var x = parsePercent$1(positionInfo.x, containerWidth); + var y = parsePercent$1(positionInfo.y, containerHeight); + var x2 = parsePercent$1(positionInfo.x2, containerWidth); + var y2 = parsePercent$1(positionInfo.y2, containerHeight); + + (isNaN(x) || isNaN(parseFloat(positionInfo.x))) && (x = 0); + (isNaN(x2) || isNaN(parseFloat(positionInfo.x2))) && (x2 = containerWidth); + (isNaN(y) || isNaN(parseFloat(positionInfo.y))) && (y = 0); + (isNaN(y2) || isNaN(parseFloat(positionInfo.y2))) && (y2 = containerHeight); + + margin = normalizeCssArray$1(margin || 0); + + return { + width: Math.max(x2 - x - margin[1] - margin[3], 0), + height: Math.max(y2 - y - margin[0] - margin[2], 0) + }; +} + +/** + * Parse position info. + * + * @param {Object} positionInfo + * @param {number|string} [positionInfo.left] + * @param {number|string} [positionInfo.top] + * @param {number|string} [positionInfo.right] + * @param {number|string} [positionInfo.bottom] + * @param {number|string} [positionInfo.width] + * @param {number|string} [positionInfo.height] + * @param {number|string} [positionInfo.aspect] Aspect is width / height + * @param {Object} containerRect + * @param {string|number} [margin] + * + * @return {module:zrender/core/BoundingRect} + */ +function getLayoutRect( + positionInfo, containerRect, margin +) { + margin = normalizeCssArray$1(margin || 0); + + var containerWidth = containerRect.width; + var containerHeight = containerRect.height; + + var left = parsePercent$1(positionInfo.left, containerWidth); + var top = parsePercent$1(positionInfo.top, containerHeight); + var right = parsePercent$1(positionInfo.right, containerWidth); + var bottom = parsePercent$1(positionInfo.bottom, containerHeight); + var width = parsePercent$1(positionInfo.width, containerWidth); + var height = parsePercent$1(positionInfo.height, containerHeight); + + var verticalMargin = margin[2] + margin[0]; + var horizontalMargin = margin[1] + margin[3]; + var aspect = positionInfo.aspect; + + // If width is not specified, calculate width from left and right + if (isNaN(width)) { + width = containerWidth - right - horizontalMargin - left; + } + if (isNaN(height)) { + height = containerHeight - bottom - verticalMargin - top; + } + + if (aspect != null) { + // If width and height are not given + // 1. Graph should not exceeds the container + // 2. Aspect must be keeped + // 3. Graph should take the space as more as possible + // FIXME + // Margin is not considered, because there is no case that both + // using margin and aspect so far. + if (isNaN(width) && isNaN(height)) { + if (aspect > containerWidth / containerHeight) { + width = containerWidth * 0.8; + } + else { + height = containerHeight * 0.8; + } + } + + // Calculate width or height with given aspect + if (isNaN(width)) { + width = aspect * height; + } + if (isNaN(height)) { + height = width / aspect; + } + } + + // If left is not specified, calculate left from right and width + if (isNaN(left)) { + left = containerWidth - right - width - horizontalMargin; + } + if (isNaN(top)) { + top = containerHeight - bottom - height - verticalMargin; + } + + // Align left and top + switch (positionInfo.left || positionInfo.right) { + case 'center': + left = containerWidth / 2 - width / 2 - margin[3]; + break; + case 'right': + left = containerWidth - width - horizontalMargin; + break; + } + switch (positionInfo.top || positionInfo.bottom) { + case 'middle': + case 'center': + top = containerHeight / 2 - height / 2 - margin[0]; + break; + case 'bottom': + top = containerHeight - height - verticalMargin; + break; + } + // If something is wrong and left, top, width, height are calculated as NaN + left = left || 0; + top = top || 0; + if (isNaN(width)) { + // Width may be NaN if only one value is given except width + width = containerWidth - horizontalMargin - left - (right || 0); + } + if (isNaN(height)) { + // Height may be NaN if only one value is given except height + height = containerHeight - verticalMargin - top - (bottom || 0); + } + + var rect = new BoundingRect(left + margin[3], top + margin[0], width, height); + rect.margin = margin; + return rect; +} + + +/** + * Position a zr element in viewport + * Group position is specified by either + * {left, top}, {right, bottom} + * If all properties exists, right and bottom will be igonred. + * + * Logic: + * 1. Scale (against origin point in parent coord) + * 2. Rotate (against origin point in parent coord) + * 3. Traslate (with el.position by this method) + * So this method only fixes the last step 'Traslate', which does not affect + * scaling and rotating. + * + * If be called repeatly with the same input el, the same result will be gotten. + * + * @param {module:zrender/Element} el Should have `getBoundingRect` method. + * @param {Object} positionInfo + * @param {number|string} [positionInfo.left] + * @param {number|string} [positionInfo.top] + * @param {number|string} [positionInfo.right] + * @param {number|string} [positionInfo.bottom] + * @param {number|string} [positionInfo.width] Only for opt.boundingModel: 'raw' + * @param {number|string} [positionInfo.height] Only for opt.boundingModel: 'raw' + * @param {Object} containerRect + * @param {string|number} margin + * @param {Object} [opt] + * @param {Array.<number>} [opt.hv=[1,1]] Only horizontal or only vertical. + * @param {Array.<number>} [opt.boundingMode='all'] + * Specify how to calculate boundingRect when locating. + * 'all': Position the boundingRect that is transformed and uioned + * both itself and its descendants. + * This mode simplies confine the elements in the bounding + * of their container (e.g., using 'right: 0'). + * 'raw': Position the boundingRect that is not transformed and only itself. + * This mode is useful when you want a element can overflow its + * container. (Consider a rotated circle needs to be located in a corner.) + * In this mode positionInfo.width/height can only be number. + */ +function positionElement(el, positionInfo, containerRect, margin, opt) { + var h = !opt || !opt.hv || opt.hv[0]; + var v = !opt || !opt.hv || opt.hv[1]; + var boundingMode = opt && opt.boundingMode || 'all'; + + if (!h && !v) { + return; + } + + var rect; + if (boundingMode === 'raw') { + rect = el.type === 'group' + ? new BoundingRect(0, 0, +positionInfo.width || 0, +positionInfo.height || 0) + : el.getBoundingRect(); + } + else { + rect = el.getBoundingRect(); + if (el.needLocalTransform()) { + var transform = el.getLocalTransform(); + // Notice: raw rect may be inner object of el, + // which should not be modified. + rect = rect.clone(); + rect.applyTransform(transform); + } + } + + // The real width and height can not be specified but calculated by the given el. + positionInfo = getLayoutRect( + defaults( + {width: rect.width, height: rect.height}, + positionInfo + ), + containerRect, + margin + ); + + // Because 'tranlate' is the last step in transform + // (see zrender/core/Transformable#getLocalTransform), + // we can just only modify el.position to get final result. + var elPos = el.position; + var dx = h ? positionInfo.x - rect.x : 0; + var dy = v ? positionInfo.y - rect.y : 0; + + el.attr('position', boundingMode === 'raw' ? [dx, dy] : [elPos[0] + dx, elPos[1] + dy]); +} + +/** + * @param {Object} option Contains some of the properties in HV_NAMES. + * @param {number} hvIdx 0: horizontal; 1: vertical. + */ +function sizeCalculable(option, hvIdx) { + return option[HV_NAMES[hvIdx][0]] != null + || (option[HV_NAMES[hvIdx][1]] != null && option[HV_NAMES[hvIdx][2]] != null); +} + +/** + * Consider Case: + * When defulat option has {left: 0, width: 100}, and we set {right: 0} + * through setOption or media query, using normal zrUtil.merge will cause + * {right: 0} does not take effect. + * + * @example + * ComponentModel.extend({ + * init: function () { + * ... + * var inputPositionParams = layout.getLayoutParams(option); + * this.mergeOption(inputPositionParams); + * }, + * mergeOption: function (newOption) { + * newOption && zrUtil.merge(thisOption, newOption, true); + * layout.mergeLayoutParam(thisOption, newOption); + * } + * }); + * + * @param {Object} targetOption + * @param {Object} newOption + * @param {Object|string} [opt] + * @param {boolean|Array.<boolean>} [opt.ignoreSize=false] Used for the components + * that width (or height) should not be calculated by left and right (or top and bottom). + */ +function mergeLayoutParam(targetOption, newOption, opt) { + !isObject$1(opt) && (opt = {}); + + var ignoreSize = opt.ignoreSize; + !isArray(ignoreSize) && (ignoreSize = [ignoreSize, ignoreSize]); + + var hResult = merge$$1(HV_NAMES[0], 0); + var vResult = merge$$1(HV_NAMES[1], 1); + + copy(HV_NAMES[0], targetOption, hResult); + copy(HV_NAMES[1], targetOption, vResult); + + function merge$$1(names, hvIdx) { + var newParams = {}; + var newValueCount = 0; + var merged = {}; + var mergedValueCount = 0; + var enoughParamNumber = 2; + + each$3(names, function (name) { + merged[name] = targetOption[name]; + }); + each$3(names, function (name) { + // Consider case: newOption.width is null, which is + // set by user for removing width setting. + hasProp(newOption, name) && (newParams[name] = merged[name] = newOption[name]); + hasValue(newParams, name) && newValueCount++; + hasValue(merged, name) && mergedValueCount++; + }); + + if (ignoreSize[hvIdx]) { + // Only one of left/right is premitted to exist. + if (hasValue(newOption, names[1])) { + merged[names[2]] = null; + } + else if (hasValue(newOption, names[2])) { + merged[names[1]] = null; + } + return merged; + } + + // Case: newOption: {width: ..., right: ...}, + // or targetOption: {right: ...} and newOption: {width: ...}, + // There is no conflict when merged only has params count + // little than enoughParamNumber. + if (mergedValueCount === enoughParamNumber || !newValueCount) { + return merged; + } + // Case: newOption: {width: ..., right: ...}, + // Than we can make sure user only want those two, and ignore + // all origin params in targetOption. + else if (newValueCount >= enoughParamNumber) { + return newParams; + } + else { + // Chose another param from targetOption by priority. + for (var i = 0; i < names.length; i++) { + var name = names[i]; + if (!hasProp(newParams, name) && hasProp(targetOption, name)) { + newParams[name] = targetOption[name]; + break; + } + } + return newParams; + } + } + + function hasProp(obj, name) { + return obj.hasOwnProperty(name); + } + + function hasValue(obj, name) { + return obj[name] != null && obj[name] !== 'auto'; + } + + function copy(names, target, source) { + each$3(names, function (name) { + target[name] = source[name]; + }); + } +} + +/** + * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object. + * @param {Object} source + * @return {Object} Result contains those props. + */ +function getLayoutParams(source) { + return copyLayoutParams({}, source); +} + +/** + * Retrieve 'left', 'right', 'top', 'bottom', 'width', 'height' from object. + * @param {Object} source + * @return {Object} Result contains those props. + */ +function copyLayoutParams(target, source) { + source && target && each$3(LOCATION_PARAMS, function (name) { + source.hasOwnProperty(name) && (target[name] = source[name]); + }); + return target; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +var boxLayoutMixin = { + getBoxLayoutParams: function () { + return { + left: this.get('left'), + top: this.get('top'), + right: this.get('right'), + bottom: this.get('bottom'), + width: this.get('width'), + height: this.get('height') + }; + } +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Component model + * + * @module echarts/model/Component + */ + +var inner$1 = makeInner(); + +/** + * @alias module:echarts/model/Component + * @constructor + * @param {Object} option + * @param {module:echarts/model/Model} parentModel + * @param {module:echarts/model/Model} ecModel + */ +var ComponentModel = Model.extend({ + + type: 'component', + + /** + * @readOnly + * @type {string} + */ + id: '', + + /** + * Because simplified concept is probably better, series.name (or component.name) + * has been having too many resposibilities: + * (1) Generating id (which requires name in option should not be modified). + * (2) As an index to mapping series when merging option or calling API (a name + * can refer to more then one components, which is convinient is some case). + * (3) Display. + * @readOnly + */ + name: '', + + /** + * @readOnly + * @type {string} + */ + mainType: '', + + /** + * @readOnly + * @type {string} + */ + subType: '', + + /** + * @readOnly + * @type {number} + */ + componentIndex: 0, + + /** + * @type {Object} + * @protected + */ + defaultOption: null, + + /** + * @type {module:echarts/model/Global} + * @readOnly + */ + ecModel: null, + + /** + * key: componentType + * value: Component model list, can not be null. + * @type {Object.<string, Array.<module:echarts/model/Model>>} + * @readOnly + */ + dependentModels: [], + + /** + * @type {string} + * @readOnly + */ + uid: null, + + /** + * Support merge layout params. + * Only support 'box' now (left/right/top/bottom/width/height). + * @type {string|Object} Object can be {ignoreSize: true} + * @readOnly + */ + layoutMode: null, + + $constructor: function (option, parentModel, ecModel, extraOpt) { + Model.call(this, option, parentModel, ecModel, extraOpt); + + this.uid = getUID('ec_cpt_model'); + }, + + init: function (option, parentModel, ecModel, extraOpt) { + this.mergeDefaultAndTheme(option, ecModel); + }, + + mergeDefaultAndTheme: function (option, ecModel) { + var layoutMode = this.layoutMode; + var inputPositionParams = layoutMode + ? getLayoutParams(option) : {}; + + var themeModel = ecModel.getTheme(); + merge(option, themeModel.get(this.mainType)); + merge(option, this.getDefaultOption()); + + if (layoutMode) { + mergeLayoutParam(option, inputPositionParams, layoutMode); + } + }, + + mergeOption: function (option, extraOpt) { + merge(this.option, option, true); + + var layoutMode = this.layoutMode; + if (layoutMode) { + mergeLayoutParam(this.option, option, layoutMode); + } + }, + + // Hooker after init or mergeOption + optionUpdated: function (newCptOption, isInit) {}, + + getDefaultOption: function () { + var fields = inner$1(this); + if (!fields.defaultOption) { + var optList = []; + var Class = this.constructor; + while (Class) { + var opt = Class.prototype.defaultOption; + opt && optList.push(opt); + Class = Class.superClass; + } + + var defaultOption = {}; + for (var i = optList.length - 1; i >= 0; i--) { + defaultOption = merge(defaultOption, optList[i], true); + } + fields.defaultOption = defaultOption; + } + return fields.defaultOption; + }, + + getReferringComponents: function (mainType) { + return this.ecModel.queryComponents({ + mainType: mainType, + index: this.get(mainType + 'Index', true), + id: this.get(mainType + 'Id', true) + }); + } + +}); + +// Reset ComponentModel.extend, add preConstruct. +// clazzUtil.enableClassExtend( +// ComponentModel, +// function (option, parentModel, ecModel, extraOpt) { +// // Set dependentModels, componentIndex, name, id, mainType, subType. +// zrUtil.extend(this, extraOpt); + +// this.uid = componentUtil.getUID('componentModel'); + +// // this.setReadOnly([ +// // 'type', 'id', 'uid', 'name', 'mainType', 'subType', +// // 'dependentModels', 'componentIndex' +// // ]); +// } +// ); + +// Add capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on. +enableClassManagement( + ComponentModel, {registerWhenExtend: true} +); +enableSubTypeDefaulter(ComponentModel); + +// Add capability of ComponentModel.topologicalTravel. +enableTopologicalTravel(ComponentModel, getDependencies); + +function getDependencies(componentType) { + var deps = []; + each$1(ComponentModel.getClassesByMainType(componentType), function (Clazz) { + deps = deps.concat(Clazz.prototype.dependencies || []); + }); + + // Ensure main type. + deps = map(deps, function (type) { + return parseClassType$1(type).main; + }); + + // Hack dataset for convenience. + if (componentType !== 'dataset' && indexOf(deps, 'dataset') <= 0) { + deps.unshift('dataset'); + } + + return deps; +} + +mixin(ComponentModel, boxLayoutMixin); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +var platform = ''; +// Navigator not exists in node +if (typeof navigator !== 'undefined') { + platform = navigator.platform || ''; +} + +var globalDefault = { + // backgroundColor: 'rgba(0,0,0,0)', + + // https://dribbble.com/shots/1065960-Infographic-Pie-chart-visualization + // color: ['#5793f3', '#d14a61', '#fd9c35', '#675bba', '#fec42c', '#dd4444', '#d4df5a', '#cd4870'], + // Light colors: + // color: ['#bcd3bb', '#e88f70', '#edc1a5', '#9dc5c8', '#e1e8c8', '#7b7c68', '#e5b5b5', '#f0b489', '#928ea8', '#bda29a'], + // color: ['#cc5664', '#9bd6ec', '#ea946e', '#8acaaa', '#f1ec64', '#ee8686', '#a48dc1', '#5da6bc', '#b9dcae'], + // Dark colors: + color: ['#c23531','#2f4554', '#61a0a8', '#d48265', '#91c7ae','#749f83', '#ca8622', '#bda29a','#6e7074', '#546570', '#c4ccd3'], + + gradientColor: ['#f6efa6', '#d88273', '#bf444c'], + + // If xAxis and yAxis declared, grid is created by default. + // grid: {}, + + textStyle: { + // color: '#000', + // decoration: 'none', + // PENDING + fontFamily: platform.match(/^Win/) ? 'Microsoft YaHei' : 'sans-serif', + // fontFamily: 'Arial, Verdana, sans-serif', + fontSize: 12, + fontStyle: 'normal', + fontWeight: 'normal' + }, + + // http://blogs.adobe.com/webplatform/2014/02/24/using-blend-modes-in-html-canvas/ + // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/globalCompositeOperation + // Default is source-over + blendMode: null, + + animation: 'auto', + animationDuration: 1000, + animationDurationUpdate: 300, + animationEasing: 'exponentialOut', + animationEasingUpdate: 'cubicOut', + + animationThreshold: 2000, + // Configuration for progressive/incremental rendering + progressiveThreshold: 3000, + progressive: 400, + + // Threshold of if use single hover layer to optimize. + // It is recommended that `hoverLayerThreshold` is equivalent to or less than + // `progressiveThreshold`, otherwise hover will cause restart of progressive, + // which is unexpected. + // see example <echarts/test/heatmap-large.html>. + hoverLayerThreshold: 3000, + + // See: module:echarts/scale/Time + useUTC: false +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var inner$2 = makeInner(); + +function getNearestColorPalette(colors, requestColorNum) { + var paletteNum = colors.length; + // TODO colors must be in order + for (var i = 0; i < paletteNum; i++) { + if (colors[i].length > requestColorNum) { + return colors[i]; + } + } + return colors[paletteNum - 1]; +} + +var colorPaletteMixin = { + clearColorPalette: function () { + inner$2(this).colorIdx = 0; + inner$2(this).colorNameMap = {}; + }, + + /** + * @param {string} name MUST NOT be null/undefined. Otherwise call this function + * twise with the same parameters will get different result. + * @param {Object} [scope=this] + * @param {Object} [requestColorNum] + * @return {string} color string. + */ + getColorFromPalette: function (name, scope, requestColorNum) { + scope = scope || this; + var scopeFields = inner$2(scope); + var colorIdx = scopeFields.colorIdx || 0; + var colorNameMap = scopeFields.colorNameMap = scopeFields.colorNameMap || {}; + // Use `hasOwnProperty` to avoid conflict with Object.prototype. + if (colorNameMap.hasOwnProperty(name)) { + return colorNameMap[name]; + } + var defaultColorPalette = normalizeToArray(this.get('color', true)); + var layeredColorPalette = this.get('colorLayer', true); + var colorPalette = ((requestColorNum == null || !layeredColorPalette) + ? defaultColorPalette : getNearestColorPalette(layeredColorPalette, requestColorNum)); + + // In case can't find in layered color palette. + colorPalette = colorPalette || defaultColorPalette; + + if (!colorPalette || !colorPalette.length) { + return; + } + + var color = colorPalette[colorIdx]; + if (name) { + colorNameMap[name] = color; + } + scopeFields.colorIdx = (colorIdx + 1) % colorPalette.length; + + return color; + } +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Helper for model references. + * There are many manners to refer axis/coordSys. + */ + +// TODO +// merge relevant logic to this file? +// check: "modelHelper" of tooltip and "BrushTargetManager". + +/** + * @return {Object} For example: + * { + * coordSysName: 'cartesian2d', + * coordSysDims: ['x', 'y', ...], + * axisMap: HashMap({ + * x: xAxisModel, + * y: yAxisModel + * }), + * categoryAxisMap: HashMap({ + * x: xAxisModel, + * y: undefined + * }), + * // It also indicate that whether there is category axis. + * firstCategoryDimIndex: 1, + * // To replace user specified encode. + * } + */ +function getCoordSysDefineBySeries(seriesModel) { + var coordSysName = seriesModel.get('coordinateSystem'); + var result = { + coordSysName: coordSysName, + coordSysDims: [], + axisMap: createHashMap(), + categoryAxisMap: createHashMap() + }; + var fetch = fetchers[coordSysName]; + if (fetch) { + fetch(seriesModel, result, result.axisMap, result.categoryAxisMap); + return result; + } +} + +var fetchers = { + + cartesian2d: function (seriesModel, result, axisMap, categoryAxisMap) { + var xAxisModel = seriesModel.getReferringComponents('xAxis')[0]; + var yAxisModel = seriesModel.getReferringComponents('yAxis')[0]; + + if (__DEV__) { + if (!xAxisModel) { + throw new Error('xAxis "' + retrieve( + seriesModel.get('xAxisIndex'), + seriesModel.get('xAxisId'), + 0 + ) + '" not found'); + } + if (!yAxisModel) { + throw new Error('yAxis "' + retrieve( + seriesModel.get('xAxisIndex'), + seriesModel.get('yAxisId'), + 0 + ) + '" not found'); + } + } + + result.coordSysDims = ['x', 'y']; + axisMap.set('x', xAxisModel); + axisMap.set('y', yAxisModel); + + if (isCategory(xAxisModel)) { + categoryAxisMap.set('x', xAxisModel); + result.firstCategoryDimIndex = 0; + } + if (isCategory(yAxisModel)) { + categoryAxisMap.set('y', yAxisModel); + result.firstCategoryDimIndex = 1; + } + }, + + singleAxis: function (seriesModel, result, axisMap, categoryAxisMap) { + var singleAxisModel = seriesModel.getReferringComponents('singleAxis')[0]; + + if (__DEV__) { + if (!singleAxisModel) { + throw new Error('singleAxis should be specified.'); + } + } + + result.coordSysDims = ['single']; + axisMap.set('single', singleAxisModel); + + if (isCategory(singleAxisModel)) { + categoryAxisMap.set('single', singleAxisModel); + result.firstCategoryDimIndex = 0; + } + }, + + polar: function (seriesModel, result, axisMap, categoryAxisMap) { + var polarModel = seriesModel.getReferringComponents('polar')[0]; + var radiusAxisModel = polarModel.findAxisModel('radiusAxis'); + var angleAxisModel = polarModel.findAxisModel('angleAxis'); + + if (__DEV__) { + if (!angleAxisModel) { + throw new Error('angleAxis option not found'); + } + if (!radiusAxisModel) { + throw new Error('radiusAxis option not found'); + } + } + + result.coordSysDims = ['radius', 'angle']; + axisMap.set('radius', radiusAxisModel); + axisMap.set('angle', angleAxisModel); + + if (isCategory(radiusAxisModel)) { + categoryAxisMap.set('radius', radiusAxisModel); + result.firstCategoryDimIndex = 0; + } + if (isCategory(angleAxisModel)) { + categoryAxisMap.set('angle', angleAxisModel); + result.firstCategoryDimIndex = 1; + } + }, + + geo: function (seriesModel, result, axisMap, categoryAxisMap) { + result.coordSysDims = ['lng', 'lat']; + }, + + parallel: function (seriesModel, result, axisMap, categoryAxisMap) { + var ecModel = seriesModel.ecModel; + var parallelModel = ecModel.getComponent( + 'parallel', seriesModel.get('parallelIndex') + ); + var coordSysDims = result.coordSysDims = parallelModel.dimensions.slice(); + + each$1(parallelModel.parallelAxisIndex, function (axisIndex, index) { + var axisModel = ecModel.getComponent('parallelAxis', axisIndex); + var axisDim = coordSysDims[index]; + axisMap.set(axisDim, axisModel); + + if (isCategory(axisModel) && result.firstCategoryDimIndex == null) { + categoryAxisMap.set(axisDim, axisModel); + result.firstCategoryDimIndex = index; + } + }); + } +}; + +function isCategory(axisModel) { + return axisModel.get('type') === 'category'; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// Avoid typo. +var SOURCE_FORMAT_ORIGINAL = 'original'; +var SOURCE_FORMAT_ARRAY_ROWS = 'arrayRows'; +var SOURCE_FORMAT_OBJECT_ROWS = 'objectRows'; +var SOURCE_FORMAT_KEYED_COLUMNS = 'keyedColumns'; +var SOURCE_FORMAT_UNKNOWN = 'unknown'; +// ??? CHANGE A NAME +var SOURCE_FORMAT_TYPED_ARRAY = 'typedArray'; + +var SERIES_LAYOUT_BY_COLUMN = 'column'; +var SERIES_LAYOUT_BY_ROW = 'row'; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * [sourceFormat] + * + * + "original": + * This format is only used in series.data, where + * itemStyle can be specified in data item. + * + * + "arrayRows": + * [ + * ['product', 'score', 'amount'], + * ['Matcha Latte', 89.3, 95.8], + * ['Milk Tea', 92.1, 89.4], + * ['Cheese Cocoa', 94.4, 91.2], + * ['Walnut Brownie', 85.4, 76.9] + * ] + * + * + "objectRows": + * [ + * {product: 'Matcha Latte', score: 89.3, amount: 95.8}, + * {product: 'Milk Tea', score: 92.1, amount: 89.4}, + * {product: 'Cheese Cocoa', score: 94.4, amount: 91.2}, + * {product: 'Walnut Brownie', score: 85.4, amount: 76.9} + * ] + * + * + "keyedColumns": + * { + * 'product': ['Matcha Latte', 'Milk Tea', 'Cheese Cocoa', 'Walnut Brownie'], + * 'count': [823, 235, 1042, 988], + * 'score': [95.8, 81.4, 91.2, 76.9] + * } + * + * + "typedArray" + * + * + "unknown" + */ + +/** + * @constructor + * @param {Object} fields + * @param {string} fields.sourceFormat + * @param {Array|Object} fields.fromDataset + * @param {Array|Object} [fields.data] + * @param {string} [seriesLayoutBy='column'] + * @param {Array.<Object|string>} [dimensionsDefine] + * @param {Objet|HashMap} [encodeDefine] + * @param {number} [startIndex=0] + * @param {number} [dimensionsDetectCount] + */ +function Source(fields) { + + /** + * @type {boolean} + */ + this.fromDataset = fields.fromDataset; + + /** + * Not null/undefined. + * @type {Array|Object} + */ + this.data = fields.data || ( + fields.sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS ? {} : [] + ); + + /** + * See also "detectSourceFormat". + * Not null/undefined. + * @type {string} + */ + this.sourceFormat = fields.sourceFormat || SOURCE_FORMAT_UNKNOWN; + + /** + * 'row' or 'column' + * Not null/undefined. + * @type {string} seriesLayoutBy + */ + this.seriesLayoutBy = fields.seriesLayoutBy || SERIES_LAYOUT_BY_COLUMN; + + /** + * dimensions definition in option. + * can be null/undefined. + * @type {Array.<Object|string>} + */ + this.dimensionsDefine = fields.dimensionsDefine; + + /** + * encode definition in option. + * can be null/undefined. + * @type {Objet|HashMap} + */ + this.encodeDefine = fields.encodeDefine && createHashMap(fields.encodeDefine); + + /** + * Not null/undefined, uint. + * @type {number} + */ + this.startIndex = fields.startIndex || 0; + + /** + * Can be null/undefined (when unknown), uint. + * @type {number} + */ + this.dimensionsDetectCount = fields.dimensionsDetectCount; +} + +/** + * Wrap original series data for some compatibility cases. + */ +Source.seriesDataToSource = function (data) { + return new Source({ + data: data, + sourceFormat: isTypedArray(data) + ? SOURCE_FORMAT_TYPED_ARRAY + : SOURCE_FORMAT_ORIGINAL, + fromDataset: false + }); +}; + +enableClassCheck(Source); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var inner$3 = makeInner(); + +/** + * @see {module:echarts/data/Source} + * @param {module:echarts/component/dataset/DatasetModel} datasetModel + * @return {string} sourceFormat + */ +function detectSourceFormat(datasetModel) { + var data = datasetModel.option.source; + var sourceFormat = SOURCE_FORMAT_UNKNOWN; + + if (isTypedArray(data)) { + sourceFormat = SOURCE_FORMAT_TYPED_ARRAY; + } + else if (isArray(data)) { + // FIXME Whether tolerate null in top level array? + for (var i = 0, len = data.length; i < len; i++) { + var item = data[i]; + + if (item == null) { + continue; + } + else if (isArray(item)) { + sourceFormat = SOURCE_FORMAT_ARRAY_ROWS; + break; + } + else if (isObject$1(item)) { + sourceFormat = SOURCE_FORMAT_OBJECT_ROWS; + break; + } + } + } + else if (isObject$1(data)) { + for (var key in data) { + if (data.hasOwnProperty(key) && isArrayLike(data[key])) { + sourceFormat = SOURCE_FORMAT_KEYED_COLUMNS; + break; + } + } + } + else if (data != null) { + throw new Error('Invalid data'); + } + + inner$3(datasetModel).sourceFormat = sourceFormat; +} + +/** + * [Scenarios]: + * (1) Provide source data directly: + * series: { + * encode: {...}, + * dimensions: [...] + * seriesLayoutBy: 'row', + * data: [[...]] + * } + * (2) Refer to datasetModel. + * series: [{ + * encode: {...} + * // Ignore datasetIndex means `datasetIndex: 0` + * // and the dimensions defination in dataset is used + * }, { + * encode: {...}, + * seriesLayoutBy: 'column', + * datasetIndex: 1 + * }] + * + * Get data from series itself or datset. + * @return {module:echarts/data/Source} source + */ +function getSource(seriesModel) { + return inner$3(seriesModel).source; +} + +/** + * MUST be called before mergeOption of all series. + * @param {module:echarts/model/Global} ecModel + */ +function resetSourceDefaulter(ecModel) { + // `datasetMap` is used to make default encode. + inner$3(ecModel).datasetMap = createHashMap(); +} + +/** + * [Caution]: + * MUST be called after series option merged and + * before "series.getInitailData()" called. + * + * [The rule of making default encode]: + * Category axis (if exists) alway map to the first dimension. + * Each other axis occupies a subsequent dimension. + * + * [Why make default encode]: + * Simplify the typing of encode in option, avoiding the case like that: + * series: [{encode: {x: 0, y: 1}}, {encode: {x: 0, y: 2}}, {encode: {x: 0, y: 3}}], + * where the "y" have to be manually typed as "1, 2, 3, ...". + * + * @param {module:echarts/model/Series} seriesModel + */ +function prepareSource(seriesModel) { + var seriesOption = seriesModel.option; + + var data = seriesOption.data; + var sourceFormat = isTypedArray(data) + ? SOURCE_FORMAT_TYPED_ARRAY : SOURCE_FORMAT_ORIGINAL; + var fromDataset = false; + + var seriesLayoutBy = seriesOption.seriesLayoutBy; + var sourceHeader = seriesOption.sourceHeader; + var dimensionsDefine = seriesOption.dimensions; + + var datasetModel = getDatasetModel(seriesModel); + if (datasetModel) { + var datasetOption = datasetModel.option; + + data = datasetOption.source; + sourceFormat = inner$3(datasetModel).sourceFormat; + fromDataset = true; + + // These settings from series has higher priority. + seriesLayoutBy = seriesLayoutBy || datasetOption.seriesLayoutBy; + sourceHeader == null && (sourceHeader = datasetOption.sourceHeader); + dimensionsDefine = dimensionsDefine || datasetOption.dimensions; + } + + var completeResult = completeBySourceData( + data, sourceFormat, seriesLayoutBy, sourceHeader, dimensionsDefine + ); + + // Note: dataset option does not have `encode`. + var encodeDefine = seriesOption.encode; + if (!encodeDefine && datasetModel) { + encodeDefine = makeDefaultEncode( + seriesModel, datasetModel, data, sourceFormat, seriesLayoutBy, completeResult + ); + } + + inner$3(seriesModel).source = new Source({ + data: data, + fromDataset: fromDataset, + seriesLayoutBy: seriesLayoutBy, + sourceFormat: sourceFormat, + dimensionsDefine: completeResult.dimensionsDefine, + startIndex: completeResult.startIndex, + dimensionsDetectCount: completeResult.dimensionsDetectCount, + encodeDefine: encodeDefine + }); +} + +// return {startIndex, dimensionsDefine, dimensionsCount} +function completeBySourceData(data, sourceFormat, seriesLayoutBy, sourceHeader, dimensionsDefine) { + if (!data) { + return {dimensionsDefine: normalizeDimensionsDefine(dimensionsDefine)}; + } + + var dimensionsDetectCount; + var startIndex; + var findPotentialName; + + if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) { + // Rule: Most of the first line are string: it is header. + // Caution: consider a line with 5 string and 1 number, + // it still can not be sure it is a head, because the + // 5 string may be 5 values of category columns. + if (sourceHeader === 'auto' || sourceHeader == null) { + arrayRowsTravelFirst(function (val) { + // '-' is regarded as null/undefined. + if (val != null && val !== '-') { + if (isString(val)) { + startIndex == null && (startIndex = 1); + } + else { + startIndex = 0; + } + } + // 10 is an experience number, avoid long loop. + }, seriesLayoutBy, data, 10); + } + else { + startIndex = sourceHeader ? 1 : 0; + } + + if (!dimensionsDefine && startIndex === 1) { + dimensionsDefine = []; + arrayRowsTravelFirst(function (val, index) { + dimensionsDefine[index] = val != null ? val : ''; + }, seriesLayoutBy, data); + } + + dimensionsDetectCount = dimensionsDefine + ? dimensionsDefine.length + : seriesLayoutBy === SERIES_LAYOUT_BY_ROW + ? data.length + : data[0] + ? data[0].length + : null; + } + else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) { + if (!dimensionsDefine) { + dimensionsDefine = objectRowsCollectDimensions(data); + findPotentialName = true; + } + } + else if (sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) { + if (!dimensionsDefine) { + dimensionsDefine = []; + findPotentialName = true; + each$1(data, function (colArr, key) { + dimensionsDefine.push(key); + }); + } + } + else if (sourceFormat === SOURCE_FORMAT_ORIGINAL) { + var value0 = getDataItemValue(data[0]); + dimensionsDetectCount = isArray(value0) && value0.length || 1; + } + else if (sourceFormat === SOURCE_FORMAT_TYPED_ARRAY) { + if (__DEV__) { + assert$1(!!dimensionsDefine, 'dimensions must be given if data is TypedArray.'); + } + } + + var potentialNameDimIndex; + if (findPotentialName) { + each$1(dimensionsDefine, function (dim, idx) { + if ((isObject$1(dim) ? dim.name : dim) === 'name') { + potentialNameDimIndex = idx; + } + }); + } + + return { + startIndex: startIndex, + dimensionsDefine: normalizeDimensionsDefine(dimensionsDefine), + dimensionsDetectCount: dimensionsDetectCount, + potentialNameDimIndex: potentialNameDimIndex + // TODO: potentialIdDimIdx + }; +} + +// Consider dimensions defined like ['A', 'price', 'B', 'price', 'C', 'price'], +// which is reasonable. But dimension name is duplicated. +// Returns undefined or an array contains only object without null/undefiend or string. +function normalizeDimensionsDefine(dimensionsDefine) { + if (!dimensionsDefine) { + // The meaning of null/undefined is different from empty array. + return; + } + var nameMap = createHashMap(); + return map(dimensionsDefine, function (item, index) { + item = extend({}, isObject$1(item) ? item : {name: item}); + + // User can set null in dimensions. + // We dont auto specify name, othewise a given name may + // cause it be refered unexpectedly. + if (item.name == null) { + return item; + } + + // Also consider number form like 2012. + item.name += ''; + // User may also specify displayName. + // displayName will always exists except user not + // specified or dim name is not specified or detected. + // (A auto generated dim name will not be used as + // displayName). + if (item.displayName == null) { + item.displayName = item.name; + } + + var exist = nameMap.get(item.name); + if (!exist) { + nameMap.set(item.name, {count: 1}); + } + else { + item.name += '-' + exist.count++; + } + + return item; + }); +} + +function arrayRowsTravelFirst(cb, seriesLayoutBy, data, maxLoop) { + maxLoop == null && (maxLoop = Infinity); + if (seriesLayoutBy === SERIES_LAYOUT_BY_ROW) { + for (var i = 0; i < data.length && i < maxLoop; i++) { + cb(data[i] ? data[i][0] : null, i); + } + } + else { + var value0 = data[0] || []; + for (var i = 0; i < value0.length && i < maxLoop; i++) { + cb(value0[i], i); + } + } +} + +function objectRowsCollectDimensions(data) { + var firstIndex = 0; + var obj; + while (firstIndex < data.length && !(obj = data[firstIndex++])) {} // jshint ignore: line + if (obj) { + var dimensions = []; + each$1(obj, function (value, key) { + dimensions.push(key); + }); + return dimensions; + } +} + +// ??? TODO merge to completedimensions, where also has +// default encode making logic. And the default rule +// should depends on series? consider 'map'. +function makeDefaultEncode( + seriesModel, datasetModel, data, sourceFormat, seriesLayoutBy, completeResult +) { + var coordSysDefine = getCoordSysDefineBySeries(seriesModel); + var encode = {}; + // var encodeTooltip = []; + // var encodeLabel = []; + var encodeItemName = []; + var encodeSeriesName = []; + var seriesType = seriesModel.subType; + + // ??? TODO refactor: provide by series itself. + // Consider the case: 'map' series is based on geo coordSys, + // 'graph', 'heatmap' can be based on cartesian. But can not + // give default rule simply here. + var nSeriesMap = createHashMap(['pie', 'map', 'funnel']); + var cSeriesMap = createHashMap([ + 'line', 'bar', 'pictorialBar', 'scatter', 'effectScatter', 'candlestick', 'boxplot' + ]); + + // Usually in this case series will use the first data + // dimension as the "value" dimension, or other default + // processes respectively. + if (coordSysDefine && cSeriesMap.get(seriesType) != null) { + var ecModel = seriesModel.ecModel; + var datasetMap = inner$3(ecModel).datasetMap; + var key = datasetModel.uid + '_' + seriesLayoutBy; + var datasetRecord = datasetMap.get(key) + || datasetMap.set(key, {categoryWayDim: 1, valueWayDim: 0}); + + // TODO + // Auto detect first time axis and do arrangement. + each$1(coordSysDefine.coordSysDims, function (coordDim) { + // In value way. + if (coordSysDefine.firstCategoryDimIndex == null) { + var dataDim = datasetRecord.valueWayDim++; + encode[coordDim] = dataDim; + + // ??? TODO give a better default series name rule? + // especially when encode x y specified. + // consider: when mutiple series share one dimension + // category axis, series name should better use + // the other dimsion name. On the other hand, use + // both dimensions name. + + encodeSeriesName.push(dataDim); + // encodeTooltip.push(dataDim); + // encodeLabel.push(dataDim); + } + // In category way, category axis. + else if (coordSysDefine.categoryAxisMap.get(coordDim)) { + encode[coordDim] = 0; + encodeItemName.push(0); + } + // In category way, non-category axis. + else { + var dataDim = datasetRecord.categoryWayDim++; + encode[coordDim] = dataDim; + // encodeTooltip.push(dataDim); + // encodeLabel.push(dataDim); + encodeSeriesName.push(dataDim); + } + }); + } + // Do not make a complex rule! Hard to code maintain and not necessary. + // ??? TODO refactor: provide by series itself. + // [{name: ..., value: ...}, ...] like: + else if (nSeriesMap.get(seriesType) != null) { + // Find the first not ordinal. (5 is an experience value) + var firstNotOrdinal; + for (var i = 0; i < 5 && firstNotOrdinal == null; i++) { + if (!doGuessOrdinal( + data, sourceFormat, seriesLayoutBy, + completeResult.dimensionsDefine, completeResult.startIndex, i + )) { + firstNotOrdinal = i; + } + } + if (firstNotOrdinal != null) { + encode.value = firstNotOrdinal; + var nameDimIndex = completeResult.potentialNameDimIndex + || Math.max(firstNotOrdinal - 1, 0); + // By default, label use itemName in charts. + // So we dont set encodeLabel here. + encodeSeriesName.push(nameDimIndex); + encodeItemName.push(nameDimIndex); + // encodeTooltip.push(firstNotOrdinal); + } + } + + // encodeTooltip.length && (encode.tooltip = encodeTooltip); + // encodeLabel.length && (encode.label = encodeLabel); + encodeItemName.length && (encode.itemName = encodeItemName); + encodeSeriesName.length && (encode.seriesName = encodeSeriesName); + + return encode; +} + +/** + * If return null/undefined, indicate that should not use datasetModel. + */ +function getDatasetModel(seriesModel) { + var option = seriesModel.option; + // Caution: consider the scenario: + // A dataset is declared and a series is not expected to use the dataset, + // and at the beginning `setOption({series: { noData })` (just prepare other + // option but no data), then `setOption({series: {data: [...]}); In this case, + // the user should set an empty array to avoid that dataset is used by default. + var thisData = option.data; + if (!thisData) { + return seriesModel.ecModel.getComponent('dataset', option.datasetIndex || 0); + } +} + +/** + * The rule should not be complex, otherwise user might not + * be able to known where the data is wrong. + * The code is ugly, but how to make it neat? + * + * @param {module:echars/data/Source} source + * @param {number} dimIndex + * @return {boolean} Whether ordinal. + */ +function guessOrdinal(source, dimIndex) { + return doGuessOrdinal( + source.data, + source.sourceFormat, + source.seriesLayoutBy, + source.dimensionsDefine, + source.startIndex, + dimIndex + ); +} + +// dimIndex may be overflow source data. +function doGuessOrdinal( + data, sourceFormat, seriesLayoutBy, dimensionsDefine, startIndex, dimIndex +) { + var result; + // Experience value. + var maxLoop = 5; + + if (isTypedArray(data)) { + return false; + } + + // When sourceType is 'objectRows' or 'keyedColumns', dimensionsDefine + // always exists in source. + var dimName; + if (dimensionsDefine) { + dimName = dimensionsDefine[dimIndex]; + dimName = isObject$1(dimName) ? dimName.name : dimName; + } + + if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) { + if (seriesLayoutBy === SERIES_LAYOUT_BY_ROW) { + var sample = data[dimIndex]; + for (var i = 0; i < (sample || []).length && i < maxLoop; i++) { + if ((result = detectValue(sample[startIndex + i])) != null) { + return result; + } + } + } + else { + for (var i = 0; i < data.length && i < maxLoop; i++) { + var row = data[startIndex + i]; + if (row && (result = detectValue(row[dimIndex])) != null) { + return result; + } + } + } + } + else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) { + if (!dimName) { + return; + } + for (var i = 0; i < data.length && i < maxLoop; i++) { + var item = data[i]; + if (item && (result = detectValue(item[dimName])) != null) { + return result; + } + } + } + else if (sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) { + if (!dimName) { + return; + } + var sample = data[dimName]; + if (!sample || isTypedArray(sample)) { + return false; + } + for (var i = 0; i < sample.length && i < maxLoop; i++) { + if ((result = detectValue(sample[i])) != null) { + return result; + } + } + } + else if (sourceFormat === SOURCE_FORMAT_ORIGINAL) { + for (var i = 0; i < data.length && i < maxLoop; i++) { + var item = data[i]; + var val = getDataItemValue(item); + if (!isArray(val)) { + return false; + } + if ((result = detectValue(val[dimIndex])) != null) { + return result; + } + } + } + + function detectValue(val) { + // Consider usage convenience, '1', '2' will be treated as "number". + // `isFinit('')` get `true`. + if (val != null && isFinite(val) && val !== '') { + return false; + } + else if (isString(val) && val !== '-') { + return true; + } + } + + return false; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * ECharts global model + * + * @module {echarts/model/Global} + */ + + +/** + * Caution: If the mechanism should be changed some day, these cases + * should be considered: + * + * (1) In `merge option` mode, if using the same option to call `setOption` + * many times, the result should be the same (try our best to ensure that). + * (2) In `merge option` mode, if a component has no id/name specified, it + * will be merged by index, and the result sequence of the components is + * consistent to the original sequence. + * (3) `reset` feature (in toolbox). Find detailed info in comments about + * `mergeOption` in module:echarts/model/OptionManager. + */ + +var OPTION_INNER_KEY = '\0_ec_inner'; + +/** + * @alias module:echarts/model/Global + * + * @param {Object} option + * @param {module:echarts/model/Model} parentModel + * @param {Object} theme + */ +var GlobalModel = Model.extend({ + + init: function (option, parentModel, theme, optionManager) { + theme = theme || {}; + + this.option = null; // Mark as not initialized. + + /** + * @type {module:echarts/model/Model} + * @private + */ + this._theme = new Model(theme); + + /** + * @type {module:echarts/model/OptionManager} + */ + this._optionManager = optionManager; + }, + + setOption: function (option, optionPreprocessorFuncs) { + assert$1( + !(OPTION_INNER_KEY in option), + 'please use chart.getOption()' + ); + + this._optionManager.setOption(option, optionPreprocessorFuncs); + + this.resetOption(null); + }, + + /** + * @param {string} type null/undefined: reset all. + * 'recreate': force recreate all. + * 'timeline': only reset timeline option + * 'media': only reset media query option + * @return {boolean} Whether option changed. + */ + resetOption: function (type) { + var optionChanged = false; + var optionManager = this._optionManager; + + if (!type || type === 'recreate') { + var baseOption = optionManager.mountOption(type === 'recreate'); + + if (!this.option || type === 'recreate') { + initBase.call(this, baseOption); + } + else { + this.restoreData(); + this.mergeOption(baseOption); + } + optionChanged = true; + } + + if (type === 'timeline' || type === 'media') { + this.restoreData(); + } + + if (!type || type === 'recreate' || type === 'timeline') { + var timelineOption = optionManager.getTimelineOption(this); + timelineOption && (this.mergeOption(timelineOption), optionChanged = true); + } + + if (!type || type === 'recreate' || type === 'media') { + var mediaOptions = optionManager.getMediaOption(this, this._api); + if (mediaOptions.length) { + each$1(mediaOptions, function (mediaOption) { + this.mergeOption(mediaOption, optionChanged = true); + }, this); + } + } + + return optionChanged; + }, + + /** + * @protected + */ + mergeOption: function (newOption) { + var option = this.option; + var componentsMap = this._componentsMap; + var newCptTypes = []; + + resetSourceDefaulter(this); + + // If no component class, merge directly. + // For example: color, animaiton options, etc. + each$1(newOption, function (componentOption, mainType) { + if (componentOption == null) { + return; + } + + if (!ComponentModel.hasClass(mainType)) { + // globalSettingTask.dirty(); + option[mainType] = option[mainType] == null + ? clone(componentOption) + : merge(option[mainType], componentOption, true); + } + else if (mainType) { + newCptTypes.push(mainType); + } + }); + + ComponentModel.topologicalTravel( + newCptTypes, ComponentModel.getAllClassMainTypes(), visitComponent, this + ); + + function visitComponent(mainType, dependencies) { + + var newCptOptionList = normalizeToArray(newOption[mainType]); + + var mapResult = mappingToExists( + componentsMap.get(mainType), newCptOptionList + ); + + makeIdAndName(mapResult); + + // Set mainType and complete subType. + each$1(mapResult, function (item, index) { + var opt = item.option; + if (isObject$1(opt)) { + item.keyInfo.mainType = mainType; + item.keyInfo.subType = determineSubType(mainType, opt, item.exist); + } + }); + + var dependentModels = getComponentsByTypes( + componentsMap, dependencies + ); + + option[mainType] = []; + componentsMap.set(mainType, []); + + each$1(mapResult, function (resultItem, index) { + var componentModel = resultItem.exist; + var newCptOption = resultItem.option; + + assert$1( + isObject$1(newCptOption) || componentModel, + 'Empty component definition' + ); + + // Consider where is no new option and should be merged using {}, + // see removeEdgeAndAdd in topologicalTravel and + // ComponentModel.getAllClassMainTypes. + if (!newCptOption) { + componentModel.mergeOption({}, this); + componentModel.optionUpdated({}, false); + } + else { + var ComponentModelClass = ComponentModel.getClass( + mainType, resultItem.keyInfo.subType, true + ); + + if (componentModel && componentModel instanceof ComponentModelClass) { + componentModel.name = resultItem.keyInfo.name; + // componentModel.settingTask && componentModel.settingTask.dirty(); + componentModel.mergeOption(newCptOption, this); + componentModel.optionUpdated(newCptOption, false); + } + else { + // PENDING Global as parent ? + var extraOpt = extend( + { + dependentModels: dependentModels, + componentIndex: index + }, + resultItem.keyInfo + ); + componentModel = new ComponentModelClass( + newCptOption, this, this, extraOpt + ); + extend(componentModel, extraOpt); + componentModel.init(newCptOption, this, this, extraOpt); + + // Call optionUpdated after init. + // newCptOption has been used as componentModel.option + // and may be merged with theme and default, so pass null + // to avoid confusion. + componentModel.optionUpdated(null, true); + } + } + + componentsMap.get(mainType)[index] = componentModel; + option[mainType][index] = componentModel.option; + }, this); + + // Backup series for filtering. + if (mainType === 'series') { + createSeriesIndices(this, componentsMap.get('series')); + } + } + + this._seriesIndicesMap = createHashMap( + this._seriesIndices = this._seriesIndices || [] + ); + }, + + /** + * Get option for output (cloned option and inner info removed) + * @public + * @return {Object} + */ + getOption: function () { + var option = clone(this.option); + + each$1(option, function (opts, mainType) { + if (ComponentModel.hasClass(mainType)) { + var opts = normalizeToArray(opts); + for (var i = opts.length - 1; i >= 0; i--) { + // Remove options with inner id. + if (isIdInner(opts[i])) { + opts.splice(i, 1); + } + } + option[mainType] = opts; + } + }); + + delete option[OPTION_INNER_KEY]; + + return option; + }, + + /** + * @return {module:echarts/model/Model} + */ + getTheme: function () { + return this._theme; + }, + + /** + * @param {string} mainType + * @param {number} [idx=0] + * @return {module:echarts/model/Component} + */ + getComponent: function (mainType, idx) { + var list = this._componentsMap.get(mainType); + if (list) { + return list[idx || 0]; + } + }, + + /** + * If none of index and id and name used, return all components with mainType. + * @param {Object} condition + * @param {string} condition.mainType + * @param {string} [condition.subType] If ignore, only query by mainType + * @param {number|Array.<number>} [condition.index] Either input index or id or name. + * @param {string|Array.<string>} [condition.id] Either input index or id or name. + * @param {string|Array.<string>} [condition.name] Either input index or id or name. + * @return {Array.<module:echarts/model/Component>} + */ + queryComponents: function (condition) { + var mainType = condition.mainType; + if (!mainType) { + return []; + } + + var index = condition.index; + var id = condition.id; + var name = condition.name; + + var cpts = this._componentsMap.get(mainType); + + if (!cpts || !cpts.length) { + return []; + } + + var result; + + if (index != null) { + if (!isArray(index)) { + index = [index]; + } + result = filter(map(index, function (idx) { + return cpts[idx]; + }), function (val) { + return !!val; + }); + } + else if (id != null) { + var isIdArray = isArray(id); + result = filter(cpts, function (cpt) { + return (isIdArray && indexOf(id, cpt.id) >= 0) + || (!isIdArray && cpt.id === id); + }); + } + else if (name != null) { + var isNameArray = isArray(name); + result = filter(cpts, function (cpt) { + return (isNameArray && indexOf(name, cpt.name) >= 0) + || (!isNameArray && cpt.name === name); + }); + } + else { + // Return all components with mainType + result = cpts.slice(); + } + + return filterBySubType(result, condition); + }, + + /** + * The interface is different from queryComponents, + * which is convenient for inner usage. + * + * @usage + * var result = findComponents( + * {mainType: 'dataZoom', query: {dataZoomId: 'abc'}} + * ); + * var result = findComponents( + * {mainType: 'series', subType: 'pie', query: {seriesName: 'uio'}} + * ); + * var result = findComponents( + * {mainType: 'series'}, + * function (model, index) {...} + * ); + * // result like [component0, componnet1, ...] + * + * @param {Object} condition + * @param {string} condition.mainType Mandatory. + * @param {string} [condition.subType] Optional. + * @param {Object} [condition.query] like {xxxIndex, xxxId, xxxName}, + * where xxx is mainType. + * If query attribute is null/undefined or has no index/id/name, + * do not filtering by query conditions, which is convenient for + * no-payload situations or when target of action is global. + * @param {Function} [condition.filter] parameter: component, return boolean. + * @return {Array.<module:echarts/model/Component>} + */ + findComponents: function (condition) { + var query = condition.query; + var mainType = condition.mainType; + + var queryCond = getQueryCond(query); + var result = queryCond + ? this.queryComponents(queryCond) + : this._componentsMap.get(mainType); + + return doFilter(filterBySubType(result, condition)); + + function getQueryCond(q) { + var indexAttr = mainType + 'Index'; + var idAttr = mainType + 'Id'; + var nameAttr = mainType + 'Name'; + return q && ( + q[indexAttr] != null + || q[idAttr] != null + || q[nameAttr] != null + ) + ? { + mainType: mainType, + // subType will be filtered finally. + index: q[indexAttr], + id: q[idAttr], + name: q[nameAttr] + } + : null; + } + + function doFilter(res) { + return condition.filter + ? filter(res, condition.filter) + : res; + } + }, + + /** + * @usage + * eachComponent('legend', function (legendModel, index) { + * ... + * }); + * eachComponent(function (componentType, model, index) { + * // componentType does not include subType + * // (componentType is 'xxx' but not 'xxx.aa') + * }); + * eachComponent( + * {mainType: 'dataZoom', query: {dataZoomId: 'abc'}}, + * function (model, index) {...} + * ); + * eachComponent( + * {mainType: 'series', subType: 'pie', query: {seriesName: 'uio'}}, + * function (model, index) {...} + * ); + * + * @param {string|Object=} mainType When mainType is object, the definition + * is the same as the method 'findComponents'. + * @param {Function} cb + * @param {*} context + */ + eachComponent: function (mainType, cb, context) { + var componentsMap = this._componentsMap; + + if (typeof mainType === 'function') { + context = cb; + cb = mainType; + componentsMap.each(function (components, componentType) { + each$1(components, function (component, index) { + cb.call(context, componentType, component, index); + }); + }); + } + else if (isString(mainType)) { + each$1(componentsMap.get(mainType), cb, context); + } + else if (isObject$1(mainType)) { + var queryResult = this.findComponents(mainType); + each$1(queryResult, cb, context); + } + }, + + /** + * @param {string} name + * @return {Array.<module:echarts/model/Series>} + */ + getSeriesByName: function (name) { + var series = this._componentsMap.get('series'); + return filter(series, function (oneSeries) { + return oneSeries.name === name; + }); + }, + + /** + * @param {number} seriesIndex + * @return {module:echarts/model/Series} + */ + getSeriesByIndex: function (seriesIndex) { + return this._componentsMap.get('series')[seriesIndex]; + }, + + /** + * Get series list before filtered by type. + * FIXME: rename to getRawSeriesByType? + * + * @param {string} subType + * @return {Array.<module:echarts/model/Series>} + */ + getSeriesByType: function (subType) { + var series = this._componentsMap.get('series'); + return filter(series, function (oneSeries) { + return oneSeries.subType === subType; + }); + }, + + /** + * @return {Array.<module:echarts/model/Series>} + */ + getSeries: function () { + return this._componentsMap.get('series').slice(); + }, + + /** + * @return {number} + */ + getSeriesCount: function () { + return this._componentsMap.get('series').length; + }, + + /** + * After filtering, series may be different + * frome raw series. + * + * @param {Function} cb + * @param {*} context + */ + eachSeries: function (cb, context) { + assertSeriesInitialized(this); + each$1(this._seriesIndices, function (rawSeriesIndex) { + var series = this._componentsMap.get('series')[rawSeriesIndex]; + cb.call(context, series, rawSeriesIndex); + }, this); + }, + + /** + * Iterate raw series before filtered. + * + * @param {Function} cb + * @param {*} context + */ + eachRawSeries: function (cb, context) { + each$1(this._componentsMap.get('series'), cb, context); + }, + + /** + * After filtering, series may be different. + * frome raw series. + * + * @parma {string} subType + * @param {Function} cb + * @param {*} context + */ + eachSeriesByType: function (subType, cb, context) { + assertSeriesInitialized(this); + each$1(this._seriesIndices, function (rawSeriesIndex) { + var series = this._componentsMap.get('series')[rawSeriesIndex]; + if (series.subType === subType) { + cb.call(context, series, rawSeriesIndex); + } + }, this); + }, + + /** + * Iterate raw series before filtered of given type. + * + * @parma {string} subType + * @param {Function} cb + * @param {*} context + */ + eachRawSeriesByType: function (subType, cb, context) { + return each$1(this.getSeriesByType(subType), cb, context); + }, + + /** + * @param {module:echarts/model/Series} seriesModel + */ + isSeriesFiltered: function (seriesModel) { + assertSeriesInitialized(this); + return this._seriesIndicesMap.get(seriesModel.componentIndex) == null; + }, + + /** + * @return {Array.<number>} + */ + getCurrentSeriesIndices: function () { + return (this._seriesIndices || []).slice(); + }, + + /** + * @param {Function} cb + * @param {*} context + */ + filterSeries: function (cb, context) { + assertSeriesInitialized(this); + var filteredSeries = filter( + this._componentsMap.get('series'), cb, context + ); + createSeriesIndices(this, filteredSeries); + }, + + restoreData: function (payload) { + var componentsMap = this._componentsMap; + + createSeriesIndices(this, componentsMap.get('series')); + + var componentTypes = []; + componentsMap.each(function (components, componentType) { + componentTypes.push(componentType); + }); + + ComponentModel.topologicalTravel( + componentTypes, + ComponentModel.getAllClassMainTypes(), + function (componentType, dependencies) { + each$1(componentsMap.get(componentType), function (component) { + (componentType !== 'series' || !isNotTargetSeries(component, payload)) + && component.restoreData(); + }); + } + ); + } + +}); + +function isNotTargetSeries(seriesModel, payload) { + if (payload) { + var index = payload.seiresIndex; + var id = payload.seriesId; + var name = payload.seriesName; + return (index != null && seriesModel.componentIndex !== index) + || (id != null && seriesModel.id !== id) + || (name != null && seriesModel.name !== name); + } +} + +/** + * @inner + */ +function mergeTheme(option, theme) { + // PENDING + // NOT use `colorLayer` in theme if option has `color` + var notMergeColorLayer = option.color && !option.colorLayer; + + each$1(theme, function (themeItem, name) { + if (name === 'colorLayer' && notMergeColorLayer) { + return; + } + // 如果有 component model 则把具体的 merge 逻辑交给该 model 处理 + if (!ComponentModel.hasClass(name)) { + if (typeof themeItem === 'object') { + option[name] = !option[name] + ? clone(themeItem) + : merge(option[name], themeItem, false); + } + else { + if (option[name] == null) { + option[name] = themeItem; + } + } + } + }); +} + +function initBase(baseOption) { + baseOption = baseOption; + + // Using OPTION_INNER_KEY to mark that this option can not be used outside, + // i.e. `chart.setOption(chart.getModel().option);` is forbiden. + this.option = {}; + this.option[OPTION_INNER_KEY] = 1; + + /** + * Init with series: [], in case of calling findSeries method + * before series initialized. + * @type {Object.<string, Array.<module:echarts/model/Model>>} + * @private + */ + this._componentsMap = createHashMap({series: []}); + + /** + * Mapping between filtered series list and raw series list. + * key: filtered series indices, value: raw series indices. + * @type {Array.<nubmer>} + * @private + */ + this._seriesIndices; + + this._seriesIndicesMap; + + mergeTheme(baseOption, this._theme.option); + + // TODO Needs clone when merging to the unexisted property + merge(baseOption, globalDefault, false); + + this.mergeOption(baseOption); +} + +/** + * @inner + * @param {Array.<string>|string} types model types + * @return {Object} key: {string} type, value: {Array.<Object>} models + */ +function getComponentsByTypes(componentsMap, types) { + if (!isArray(types)) { + types = types ? [types] : []; + } + + var ret = {}; + each$1(types, function (type) { + ret[type] = (componentsMap.get(type) || []).slice(); + }); + + return ret; +} + +/** + * @inner + */ +function determineSubType(mainType, newCptOption, existComponent) { + var subType = newCptOption.type + ? newCptOption.type + : existComponent + ? existComponent.subType + // Use determineSubType only when there is no existComponent. + : ComponentModel.determineSubType(mainType, newCptOption); + + // tooltip, markline, markpoint may always has no subType + return subType; +} + +/** + * @inner + */ +function createSeriesIndices(ecModel, seriesModels) { + ecModel._seriesIndicesMap = createHashMap( + ecModel._seriesIndices = map(seriesModels, function (series) { + return series.componentIndex; + }) || [] + ); +} + +/** + * @inner + */ +function filterBySubType(components, condition) { + // Using hasOwnProperty for restrict. Consider + // subType is undefined in user payload. + return condition.hasOwnProperty('subType') + ? filter(components, function (cpt) { + return cpt.subType === condition.subType; + }) + : components; +} + +/** + * @inner + */ +function assertSeriesInitialized(ecModel) { + // Components that use _seriesIndices should depends on series component, + // which make sure that their initialization is after series. + if (__DEV__) { + if (!ecModel._seriesIndices) { + throw new Error('Option should contains series.'); + } + } +} + +mixin(GlobalModel, colorPaletteMixin); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var echartsAPIList = [ + 'getDom', 'getZr', 'getWidth', 'getHeight', 'getDevicePixelRatio', 'dispatchAction', 'isDisposed', + 'on', 'off', 'getDataURL', 'getConnectedDataURL', 'getModel', 'getOption', + 'getViewOfComponentModel', 'getViewOfSeriesModel' +]; +// And `getCoordinateSystems` and `getComponentByElement` will be injected in echarts.js + +function ExtensionAPI(chartInstance) { + each$1(echartsAPIList, function (name) { + this[name] = bind(chartInstance[name], chartInstance); + }, this); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var coordinateSystemCreators = {}; + +function CoordinateSystemManager() { + + this._coordinateSystems = []; +} + +CoordinateSystemManager.prototype = { + + constructor: CoordinateSystemManager, + + create: function (ecModel, api) { + var coordinateSystems = []; + each$1(coordinateSystemCreators, function (creater, type) { + var list = creater.create(ecModel, api); + coordinateSystems = coordinateSystems.concat(list || []); + }); + + this._coordinateSystems = coordinateSystems; + }, + + update: function (ecModel, api) { + each$1(this._coordinateSystems, function (coordSys) { + coordSys.update && coordSys.update(ecModel, api); + }); + }, + + getCoordinateSystems: function () { + return this._coordinateSystems.slice(); + } +}; + +CoordinateSystemManager.register = function (type, coordinateSystemCreator) { + coordinateSystemCreators[type] = coordinateSystemCreator; +}; + +CoordinateSystemManager.get = function (type) { + return coordinateSystemCreators[type]; +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * ECharts option manager + * + * @module {echarts/model/OptionManager} + */ + + +var each$4 = each$1; +var clone$3 = clone; +var map$1 = map; +var merge$1 = merge; + +var QUERY_REG = /^(min|max)?(.+)$/; + +/** + * TERM EXPLANATIONS: + * + * [option]: + * + * An object that contains definitions of components. For example: + * var option = { + * title: {...}, + * legend: {...}, + * visualMap: {...}, + * series: [ + * {data: [...]}, + * {data: [...]}, + * ... + * ] + * }; + * + * [rawOption]: + * + * An object input to echarts.setOption. 'rawOption' may be an + * 'option', or may be an object contains multi-options. For example: + * var option = { + * baseOption: { + * title: {...}, + * legend: {...}, + * series: [ + * {data: [...]}, + * {data: [...]}, + * ... + * ] + * }, + * timeline: {...}, + * options: [ + * {title: {...}, series: {data: [...]}}, + * {title: {...}, series: {data: [...]}}, + * ... + * ], + * media: [ + * { + * query: {maxWidth: 320}, + * option: {series: {x: 20}, visualMap: {show: false}} + * }, + * { + * query: {minWidth: 320, maxWidth: 720}, + * option: {series: {x: 500}, visualMap: {show: true}} + * }, + * { + * option: {series: {x: 1200}, visualMap: {show: true}} + * } + * ] + * }; + * + * @alias module:echarts/model/OptionManager + * @param {module:echarts/ExtensionAPI} api + */ +function OptionManager(api) { + + /** + * @private + * @type {module:echarts/ExtensionAPI} + */ + this._api = api; + + /** + * @private + * @type {Array.<number>} + */ + this._timelineOptions = []; + + /** + * @private + * @type {Array.<Object>} + */ + this._mediaList = []; + + /** + * @private + * @type {Object} + */ + this._mediaDefault; + + /** + * -1, means default. + * empty means no media. + * @private + * @type {Array.<number>} + */ + this._currentMediaIndices = []; + + /** + * @private + * @type {Object} + */ + this._optionBackup; + + /** + * @private + * @type {Object} + */ + this._newBaseOption; +} + +// timeline.notMerge is not supported in ec3. Firstly there is rearly +// case that notMerge is needed. Secondly supporting 'notMerge' requires +// rawOption cloned and backuped when timeline changed, which does no +// good to performance. What's more, that both timeline and setOption +// method supply 'notMerge' brings complex and some problems. +// Consider this case: +// (step1) chart.setOption({timeline: {notMerge: false}, ...}, false); +// (step2) chart.setOption({timeline: {notMerge: true}, ...}, false); + +OptionManager.prototype = { + + constructor: OptionManager, + + /** + * @public + * @param {Object} rawOption Raw option. + * @param {module:echarts/model/Global} ecModel + * @param {Array.<Function>} optionPreprocessorFuncs + * @return {Object} Init option + */ + setOption: function (rawOption, optionPreprocessorFuncs) { + if (rawOption) { + // That set dat primitive is dangerous if user reuse the data when setOption again. + each$1(normalizeToArray(rawOption.series), function (series) { + series && series.data && isTypedArray(series.data) && setAsPrimitive(series.data); + }); + } + + // Caution: some series modify option data, if do not clone, + // it should ensure that the repeat modify correctly + // (create a new object when modify itself). + rawOption = clone$3(rawOption, true); + + // FIXME + // 如果 timeline options 或者 media 中设置了某个属性,而baseOption中没有设置,则进行警告。 + + var oldOptionBackup = this._optionBackup; + var newParsedOption = parseRawOption.call( + this, rawOption, optionPreprocessorFuncs, !oldOptionBackup + ); + this._newBaseOption = newParsedOption.baseOption; + + // For setOption at second time (using merge mode); + if (oldOptionBackup) { + // Only baseOption can be merged. + mergeOption(oldOptionBackup.baseOption, newParsedOption.baseOption); + + // For simplicity, timeline options and media options do not support merge, + // that is, if you `setOption` twice and both has timeline options, the latter + // timeline opitons will not be merged to the formers, but just substitude them. + if (newParsedOption.timelineOptions.length) { + oldOptionBackup.timelineOptions = newParsedOption.timelineOptions; + } + if (newParsedOption.mediaList.length) { + oldOptionBackup.mediaList = newParsedOption.mediaList; + } + if (newParsedOption.mediaDefault) { + oldOptionBackup.mediaDefault = newParsedOption.mediaDefault; + } + } + else { + this._optionBackup = newParsedOption; + } + }, + + /** + * @param {boolean} isRecreate + * @return {Object} + */ + mountOption: function (isRecreate) { + var optionBackup = this._optionBackup; + + // TODO + // 如果没有reset功能则不clone。 + + this._timelineOptions = map$1(optionBackup.timelineOptions, clone$3); + this._mediaList = map$1(optionBackup.mediaList, clone$3); + this._mediaDefault = clone$3(optionBackup.mediaDefault); + this._currentMediaIndices = []; + + return clone$3(isRecreate + // this._optionBackup.baseOption, which is created at the first `setOption` + // called, and is merged into every new option by inner method `mergeOption` + // each time `setOption` called, can be only used in `isRecreate`, because + // its reliability is under suspicion. In other cases option merge is + // performed by `model.mergeOption`. + ? optionBackup.baseOption : this._newBaseOption + ); + }, + + /** + * @param {module:echarts/model/Global} ecModel + * @return {Object} + */ + getTimelineOption: function (ecModel) { + var option; + var timelineOptions = this._timelineOptions; + + if (timelineOptions.length) { + // getTimelineOption can only be called after ecModel inited, + // so we can get currentIndex from timelineModel. + var timelineModel = ecModel.getComponent('timeline'); + if (timelineModel) { + option = clone$3( + timelineOptions[timelineModel.getCurrentIndex()], + true + ); + } + } + + return option; + }, + + /** + * @param {module:echarts/model/Global} ecModel + * @return {Array.<Object>} + */ + getMediaOption: function (ecModel) { + var ecWidth = this._api.getWidth(); + var ecHeight = this._api.getHeight(); + var mediaList = this._mediaList; + var mediaDefault = this._mediaDefault; + var indices = []; + var result = []; + + // No media defined. + if (!mediaList.length && !mediaDefault) { + return result; + } + + // Multi media may be applied, the latter defined media has higher priority. + for (var i = 0, len = mediaList.length; i < len; i++) { + if (applyMediaQuery(mediaList[i].query, ecWidth, ecHeight)) { + indices.push(i); + } + } + + // FIXME + // 是否mediaDefault应该强制用户设置,否则可能修改不能回归。 + if (!indices.length && mediaDefault) { + indices = [-1]; + } + + if (indices.length && !indicesEquals(indices, this._currentMediaIndices)) { + result = map$1(indices, function (index) { + return clone$3( + index === -1 ? mediaDefault.option : mediaList[index].option + ); + }); + } + // Otherwise return nothing. + + this._currentMediaIndices = indices; + + return result; + } +}; + +function parseRawOption(rawOption, optionPreprocessorFuncs, isNew) { + var timelineOptions = []; + var mediaList = []; + var mediaDefault; + var baseOption; + + // Compatible with ec2. + var timelineOpt = rawOption.timeline; + + if (rawOption.baseOption) { + baseOption = rawOption.baseOption; + } + + // For timeline + if (timelineOpt || rawOption.options) { + baseOption = baseOption || {}; + timelineOptions = (rawOption.options || []).slice(); + } + + // For media query + if (rawOption.media) { + baseOption = baseOption || {}; + var media = rawOption.media; + each$4(media, function (singleMedia) { + if (singleMedia && singleMedia.option) { + if (singleMedia.query) { + mediaList.push(singleMedia); + } + else if (!mediaDefault) { + // Use the first media default. + mediaDefault = singleMedia; + } + } + }); + } + + // For normal option + if (!baseOption) { + baseOption = rawOption; + } + + // Set timelineOpt to baseOption in ec3, + // which is convenient for merge option. + if (!baseOption.timeline) { + baseOption.timeline = timelineOpt; + } + + // Preprocess. + each$4([baseOption].concat(timelineOptions) + .concat(map(mediaList, function (media) { + return media.option; + })), + function (option) { + each$4(optionPreprocessorFuncs, function (preProcess) { + preProcess(option, isNew); + }); + } + ); + + return { + baseOption: baseOption, + timelineOptions: timelineOptions, + mediaDefault: mediaDefault, + mediaList: mediaList + }; +} + +/** + * @see <http://www.w3.org/TR/css3-mediaqueries/#media1> + * Support: width, height, aspectRatio + * Can use max or min as prefix. + */ +function applyMediaQuery(query, ecWidth, ecHeight) { + var realMap = { + width: ecWidth, + height: ecHeight, + aspectratio: ecWidth / ecHeight // lowser case for convenientce. + }; + + var applicatable = true; + + each$1(query, function (value, attr) { + var matched = attr.match(QUERY_REG); + + if (!matched || !matched[1] || !matched[2]) { + return; + } + + var operator = matched[1]; + var realAttr = matched[2].toLowerCase(); + + if (!compare(realMap[realAttr], value, operator)) { + applicatable = false; + } + }); + + return applicatable; +} + +function compare(real, expect, operator) { + if (operator === 'min') { + return real >= expect; + } + else if (operator === 'max') { + return real <= expect; + } + else { // Equals + return real === expect; + } +} + +function indicesEquals(indices1, indices2) { + // indices is always order by asc and has only finite number. + return indices1.join(',') === indices2.join(','); +} + +/** + * Consider case: + * `chart.setOption(opt1);` + * Then user do some interaction like dataZoom, dataView changing. + * `chart.setOption(opt2);` + * Then user press 'reset button' in toolbox. + * + * After doing that all of the interaction effects should be reset, the + * chart should be the same as the result of invoke + * `chart.setOption(opt1); chart.setOption(opt2);`. + * + * Although it is not able ensure that + * `chart.setOption(opt1); chart.setOption(opt2);` is equivalents to + * `chart.setOption(merge(opt1, opt2));` exactly, + * this might be the only simple way to implement that feature. + * + * MEMO: We've considered some other approaches: + * 1. Each model handle its self restoration but not uniform treatment. + * (Too complex in logic and error-prone) + * 2. Use a shadow ecModel. (Performace expensive) + */ +function mergeOption(oldOption, newOption) { + newOption = newOption || {}; + + each$4(newOption, function (newCptOpt, mainType) { + if (newCptOpt == null) { + return; + } + + var oldCptOpt = oldOption[mainType]; + + if (!ComponentModel.hasClass(mainType)) { + oldOption[mainType] = merge$1(oldCptOpt, newCptOpt, true); + } + else { + newCptOpt = normalizeToArray(newCptOpt); + oldCptOpt = normalizeToArray(oldCptOpt); + + var mapResult = mappingToExists(oldCptOpt, newCptOpt); + + oldOption[mainType] = map$1(mapResult, function (item) { + return (item.option && item.exist) + ? merge$1(item.exist, item.option, true) + : (item.exist || item.option); + }); + } + }); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var each$5 = each$1; +var isObject$3 = isObject$1; + +var POSSIBLE_STYLES = [ + 'areaStyle', 'lineStyle', 'nodeStyle', 'linkStyle', + 'chordStyle', 'label', 'labelLine' +]; + +function compatEC2ItemStyle(opt) { + var itemStyleOpt = opt && opt.itemStyle; + if (!itemStyleOpt) { + return; + } + for (var i = 0, len = POSSIBLE_STYLES.length; i < len; i++) { + var styleName = POSSIBLE_STYLES[i]; + var normalItemStyleOpt = itemStyleOpt.normal; + var emphasisItemStyleOpt = itemStyleOpt.emphasis; + if (normalItemStyleOpt && normalItemStyleOpt[styleName]) { + opt[styleName] = opt[styleName] || {}; + if (!opt[styleName].normal) { + opt[styleName].normal = normalItemStyleOpt[styleName]; + } + else { + merge(opt[styleName].normal, normalItemStyleOpt[styleName]); + } + normalItemStyleOpt[styleName] = null; + } + if (emphasisItemStyleOpt && emphasisItemStyleOpt[styleName]) { + opt[styleName] = opt[styleName] || {}; + if (!opt[styleName].emphasis) { + opt[styleName].emphasis = emphasisItemStyleOpt[styleName]; + } + else { + merge(opt[styleName].emphasis, emphasisItemStyleOpt[styleName]); + } + emphasisItemStyleOpt[styleName] = null; + } + } +} + +function convertNormalEmphasis(opt, optType, useExtend) { + if (opt && opt[optType] && (opt[optType].normal || opt[optType].emphasis)) { + var normalOpt = opt[optType].normal; + var emphasisOpt = opt[optType].emphasis; + + if (normalOpt) { + // Timeline controlStyle has other properties besides normal and emphasis + if (useExtend) { + opt[optType].normal = opt[optType].emphasis = null; + defaults(opt[optType], normalOpt); + } + else { + opt[optType] = normalOpt; + } + } + if (emphasisOpt) { + opt.emphasis = opt.emphasis || {}; + opt.emphasis[optType] = emphasisOpt; + } + } +} +function removeEC3NormalStatus(opt) { + convertNormalEmphasis(opt, 'itemStyle'); + convertNormalEmphasis(opt, 'lineStyle'); + convertNormalEmphasis(opt, 'areaStyle'); + convertNormalEmphasis(opt, 'label'); + convertNormalEmphasis(opt, 'labelLine'); + // treemap + convertNormalEmphasis(opt, 'upperLabel'); + // graph + convertNormalEmphasis(opt, 'edgeLabel'); +} + +function compatTextStyle(opt, propName) { + // Check whether is not object (string\null\undefined ...) + var labelOptSingle = isObject$3(opt) && opt[propName]; + var textStyle = isObject$3(labelOptSingle) && labelOptSingle.textStyle; + if (textStyle) { + for (var i = 0, len = TEXT_STYLE_OPTIONS.length; i < len; i++) { + var propName = TEXT_STYLE_OPTIONS[i]; + if (textStyle.hasOwnProperty(propName)) { + labelOptSingle[propName] = textStyle[propName]; + } + } + } +} + +function compatEC3CommonStyles(opt) { + if (opt) { + removeEC3NormalStatus(opt); + compatTextStyle(opt, 'label'); + opt.emphasis && compatTextStyle(opt.emphasis, 'label'); + } +} + +function processSeries(seriesOpt) { + if (!isObject$3(seriesOpt)) { + return; + } + + compatEC2ItemStyle(seriesOpt); + removeEC3NormalStatus(seriesOpt); + + compatTextStyle(seriesOpt, 'label'); + // treemap + compatTextStyle(seriesOpt, 'upperLabel'); + // graph + compatTextStyle(seriesOpt, 'edgeLabel'); + if (seriesOpt.emphasis) { + compatTextStyle(seriesOpt.emphasis, 'label'); + // treemap + compatTextStyle(seriesOpt.emphasis, 'upperLabel'); + // graph + compatTextStyle(seriesOpt.emphasis, 'edgeLabel'); + } + + var markPoint = seriesOpt.markPoint; + if (markPoint) { + compatEC2ItemStyle(markPoint); + compatEC3CommonStyles(markPoint); + } + + var markLine = seriesOpt.markLine; + if (markLine) { + compatEC2ItemStyle(markLine); + compatEC3CommonStyles(markLine); + } + + var markArea = seriesOpt.markArea; + if (markArea) { + compatEC3CommonStyles(markArea); + } + + var data = seriesOpt.data; + + // Break with ec3: if `setOption` again, there may be no `type` in option, + // then the backward compat based on option type will not be performed. + + if (seriesOpt.type === 'graph') { + data = data || seriesOpt.nodes; + var edgeData = seriesOpt.links || seriesOpt.edges; + if (edgeData && !isTypedArray(edgeData)) { + for (var i = 0; i < edgeData.length; i++) { + compatEC3CommonStyles(edgeData[i]); + } + } + each$1(seriesOpt.categories, function (opt) { + removeEC3NormalStatus(opt); + }); + } + + if (data && !isTypedArray(data)) { + for (var i = 0; i < data.length; i++) { + compatEC3CommonStyles(data[i]); + } + } + + // mark point data + var markPoint = seriesOpt.markPoint; + if (markPoint && markPoint.data) { + var mpData = markPoint.data; + for (var i = 0; i < mpData.length; i++) { + compatEC3CommonStyles(mpData[i]); + } + } + // mark line data + var markLine = seriesOpt.markLine; + if (markLine && markLine.data) { + var mlData = markLine.data; + for (var i = 0; i < mlData.length; i++) { + if (isArray(mlData[i])) { + compatEC3CommonStyles(mlData[i][0]); + compatEC3CommonStyles(mlData[i][1]); + } + else { + compatEC3CommonStyles(mlData[i]); + } + } + } + + // Series + if (seriesOpt.type === 'gauge') { + compatTextStyle(seriesOpt, 'axisLabel'); + compatTextStyle(seriesOpt, 'title'); + compatTextStyle(seriesOpt, 'detail'); + } + else if (seriesOpt.type === 'treemap') { + convertNormalEmphasis(seriesOpt.breadcrumb, 'itemStyle'); + each$1(seriesOpt.levels, function (opt) { + removeEC3NormalStatus(opt); + }); + } + else if (seriesOpt.type === 'tree') { + removeEC3NormalStatus(seriesOpt.leaves); + } + // sunburst starts from ec4, so it does not need to compat levels. +} + +function toArr(o) { + return isArray(o) ? o : o ? [o] : []; +} + +function toObj(o) { + return (isArray(o) ? o[0] : o) || {}; +} + +var compatStyle = function (option, isTheme) { + each$5(toArr(option.series), function (seriesOpt) { + isObject$3(seriesOpt) && processSeries(seriesOpt); + }); + + var axes = ['xAxis', 'yAxis', 'radiusAxis', 'angleAxis', 'singleAxis', 'parallelAxis', 'radar']; + isTheme && axes.push('valueAxis', 'categoryAxis', 'logAxis', 'timeAxis'); + + each$5( + axes, + function (axisName) { + each$5(toArr(option[axisName]), function (axisOpt) { + if (axisOpt) { + compatTextStyle(axisOpt, 'axisLabel'); + compatTextStyle(axisOpt.axisPointer, 'label'); + } + }); + } + ); + + each$5(toArr(option.parallel), function (parallelOpt) { + var parallelAxisDefault = parallelOpt && parallelOpt.parallelAxisDefault; + compatTextStyle(parallelAxisDefault, 'axisLabel'); + compatTextStyle(parallelAxisDefault && parallelAxisDefault.axisPointer, 'label'); + }); + + each$5(toArr(option.calendar), function (calendarOpt) { + convertNormalEmphasis(calendarOpt, 'itemStyle'); + compatTextStyle(calendarOpt, 'dayLabel'); + compatTextStyle(calendarOpt, 'monthLabel'); + compatTextStyle(calendarOpt, 'yearLabel'); + }); + + // radar.name.textStyle + each$5(toArr(option.radar), function (radarOpt) { + compatTextStyle(radarOpt, 'name'); + }); + + each$5(toArr(option.geo), function (geoOpt) { + if (isObject$3(geoOpt)) { + compatEC3CommonStyles(geoOpt); + each$5(toArr(geoOpt.regions), function (regionObj) { + compatEC3CommonStyles(regionObj); + }); + } + }); + + each$5(toArr(option.timeline), function (timelineOpt) { + compatEC3CommonStyles(timelineOpt); + convertNormalEmphasis(timelineOpt, 'label'); + convertNormalEmphasis(timelineOpt, 'itemStyle'); + convertNormalEmphasis(timelineOpt, 'controlStyle', true); + + var data = timelineOpt.data; + isArray(data) && each$1(data, function (item) { + if (isObject$1(item)) { + convertNormalEmphasis(item, 'label'); + convertNormalEmphasis(item, 'itemStyle'); + } + }); + }); + + each$5(toArr(option.toolbox), function (toolboxOpt) { + convertNormalEmphasis(toolboxOpt, 'iconStyle'); + each$5(toolboxOpt.feature, function (featureOpt) { + convertNormalEmphasis(featureOpt, 'iconStyle'); + }); + }); + + compatTextStyle(toObj(option.axisPointer), 'label'); + compatTextStyle(toObj(option.tooltip).axisPointer, 'label'); +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// Compatitable with 2.0 + +function get(opt, path) { + path = path.split(','); + var obj = opt; + for (var i = 0; i < path.length; i++) { + obj = obj && obj[path[i]]; + if (obj == null) { + break; + } + } + return obj; +} + +function set$1(opt, path, val, overwrite) { + path = path.split(','); + var obj = opt; + var key; + for (var i = 0; i < path.length - 1; i++) { + key = path[i]; + if (obj[key] == null) { + obj[key] = {}; + } + obj = obj[key]; + } + if (overwrite || obj[path[i]] == null) { + obj[path[i]] = val; + } +} + +function compatLayoutProperties(option) { + each$1(LAYOUT_PROPERTIES, function (prop) { + if (prop[0] in option && !(prop[1] in option)) { + option[prop[1]] = option[prop[0]]; + } + }); +} + +var LAYOUT_PROPERTIES = [ + ['x', 'left'], ['y', 'top'], ['x2', 'right'], ['y2', 'bottom'] +]; + +var COMPATITABLE_COMPONENTS = [ + 'grid', 'geo', 'parallel', 'legend', 'toolbox', 'title', 'visualMap', 'dataZoom', 'timeline' +]; + +var backwardCompat = function (option, isTheme) { + compatStyle(option, isTheme); + + // Make sure series array for model initialization. + option.series = normalizeToArray(option.series); + + each$1(option.series, function (seriesOpt) { + if (!isObject$1(seriesOpt)) { + return; + } + + var seriesType = seriesOpt.type; + + if (seriesType === 'pie' || seriesType === 'gauge') { + if (seriesOpt.clockWise != null) { + seriesOpt.clockwise = seriesOpt.clockWise; + } + } + if (seriesType === 'gauge') { + var pointerColor = get(seriesOpt, 'pointer.color'); + pointerColor != null + && set$1(seriesOpt, 'itemStyle.normal.color', pointerColor); + } + + compatLayoutProperties(seriesOpt); + }); + + // dataRange has changed to visualMap + if (option.dataRange) { + option.visualMap = option.dataRange; + } + + each$1(COMPATITABLE_COMPONENTS, function (componentName) { + var options = option[componentName]; + if (options) { + if (!isArray(options)) { + options = [options]; + } + each$1(options, function (option) { + compatLayoutProperties(option); + }); + } + }); +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// (1) [Caution]: the logic is correct based on the premises: +// data processing stage is blocked in stream. +// See <module:echarts/stream/Scheduler#performDataProcessorTasks> +// (2) Only register once when import repeatly. +// Should be executed before after series filtered and before stack calculation. +var dataStack = function (ecModel) { + var stackInfoMap = createHashMap(); + ecModel.eachSeries(function (seriesModel) { + var stack = seriesModel.get('stack'); + // Compatibal: when `stack` is set as '', do not stack. + if (stack) { + var stackInfoList = stackInfoMap.get(stack) || stackInfoMap.set(stack, []); + var data = seriesModel.getData(); + + var stackInfo = { + // Used for calculate axis extent automatically. + stackResultDimension: data.getCalculationInfo('stackResultDimension'), + stackedOverDimension: data.getCalculationInfo('stackedOverDimension'), + stackedDimension: data.getCalculationInfo('stackedDimension'), + stackedByDimension: data.getCalculationInfo('stackedByDimension'), + isStackedByIndex: data.getCalculationInfo('isStackedByIndex'), + data: data, + seriesModel: seriesModel + }; + + // If stacked on axis that do not support data stack. + if (!stackInfo.stackedDimension + || !(stackInfo.isStackedByIndex || stackInfo.stackedByDimension) + ) { + return; + } + + stackInfoList.length && data.setCalculationInfo( + 'stackedOnSeries', stackInfoList[stackInfoList.length - 1].seriesModel + ); + + stackInfoList.push(stackInfo); + } + }); + + stackInfoMap.each(calculateStack); +}; + +function calculateStack(stackInfoList) { + each$1(stackInfoList, function (targetStackInfo, idxInStack) { + var resultVal = []; + var resultNaN = [NaN, NaN]; + var dims = [targetStackInfo.stackResultDimension, targetStackInfo.stackedOverDimension]; + var targetData = targetStackInfo.data; + var isStackedByIndex = targetStackInfo.isStackedByIndex; + + // Should not write on raw data, because stack series model list changes + // depending on legend selection. + var newData = targetData.map(dims, function (v0, v1, dataIndex) { + var sum = targetData.get(targetStackInfo.stackedDimension, dataIndex); + + // Consider `connectNulls` of line area, if value is NaN, stackedOver + // should also be NaN, to draw a appropriate belt area. + if (isNaN(sum)) { + return resultNaN; + } + + var byValue; + var stackedDataRawIndex; + + if (isStackedByIndex) { + stackedDataRawIndex = targetData.getRawIndex(dataIndex); + } + else { + byValue = targetData.get(targetStackInfo.stackedByDimension, dataIndex); + } + + // If stackOver is NaN, chart view will render point on value start. + var stackedOver = NaN; + + for (var j = idxInStack - 1; j >= 0; j--) { + var stackInfo = stackInfoList[j]; + + // Has been optimized by inverted indices on `stackedByDimension`. + if (!isStackedByIndex) { + stackedDataRawIndex = stackInfo.data.rawIndexOf(stackInfo.stackedByDimension, byValue); + } + + if (stackedDataRawIndex >= 0) { + var val = stackInfo.data.getByRawIndex(stackInfo.stackResultDimension, stackedDataRawIndex); + + // Considering positive stack, negative stack and empty data + if ((sum >= 0 && val > 0) // Positive stack + || (sum <= 0 && val < 0) // Negative stack + ) { + sum += val; + stackedOver = val; + break; + } + } + } + + resultVal[0] = sum; + resultVal[1] = stackedOver; + + return resultVal; + }); + + targetData.hostModel.setData(newData); + // Update for consequent calculation + targetStackInfo.data = newData; + }); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// TODO +// ??? refactor? check the outer usage of data provider. +// merge with defaultDimValueGetter? + +/** + * If normal array used, mutable chunk size is supported. + * If typed array used, chunk size must be fixed. + */ +function DefaultDataProvider(source, dimSize) { + if (!Source.isInstance(source)) { + source = Source.seriesDataToSource(source); + } + this._source = source; + + var data = this._data = source.data; + var sourceFormat = source.sourceFormat; + + // Typed array. TODO IE10+? + if (sourceFormat === SOURCE_FORMAT_TYPED_ARRAY) { + if (__DEV__) { + if (dimSize == null) { + throw new Error('Typed array data must specify dimension size'); + } + } + this._offset = 0; + this._dimSize = dimSize; + this._data = data; + } + + var methods = providerMethods[ + sourceFormat === SOURCE_FORMAT_ARRAY_ROWS + ? sourceFormat + '_' + source.seriesLayoutBy + : sourceFormat + ]; + + if (__DEV__) { + assert$1(methods, 'Invalide sourceFormat: ' + sourceFormat); + } + + extend(this, methods); +} + +var providerProto = DefaultDataProvider.prototype; +// If data is pure without style configuration +providerProto.pure = false; +// If data is persistent and will not be released after use. +providerProto.persistent = true; + +// ???! FIXME legacy data provider do not has method getSource +providerProto.getSource = function () { + return this._source; +}; + +var providerMethods = { + + 'arrayRows_column': { + pure: true, + count: function () { + return Math.max(0, this._data.length - this._source.startIndex); + }, + getItem: function (idx) { + return this._data[idx + this._source.startIndex]; + }, + appendData: appendDataSimply + }, + + 'arrayRows_row': { + pure: true, + count: function () { + var row = this._data[0]; + return row ? Math.max(0, row.length - this._source.startIndex) : 0; + }, + getItem: function (idx) { + idx += this._source.startIndex; + var item = []; + var data = this._data; + for (var i = 0; i < data.length; i++) { + var row = data[i]; + item.push(row ? row[idx] : null); + } + return item; + }, + appendData: function () { + throw new Error('Do not support appendData when set seriesLayoutBy: "row".'); + } + }, + + 'objectRows': { + pure: true, + count: countSimply, + getItem: getItemSimply, + appendData: appendDataSimply + }, + + 'keyedColumns': { + pure: true, + count: function () { + var dimName = this._source.dimensionsDefine[0].name; + var col = this._data[dimName]; + return col ? col.length : 0; + }, + getItem: function (idx) { + var item = []; + var dims = this._source.dimensionsDefine; + for (var i = 0; i < dims.length; i++) { + var col = this._data[dims[i].name]; + item.push(col ? col[idx] : null); + } + return item; + }, + appendData: function (newData) { + var data = this._data; + each$1(newData, function (newCol, key) { + var oldCol = data[key] || (data[key] = []); + for (var i = 0; i < (newCol || []).length; i++) { + oldCol.push(newCol[i]); + } + }); + } + }, + + 'original': { + count: countSimply, + getItem: getItemSimply, + appendData: appendDataSimply + }, + + 'typedArray': { + persistent: false, + pure: true, + count: function () { + return this._data ? (this._data.length / this._dimSize) : 0; + }, + getItem: function (idx, out) { + idx = idx - this._offset; + out = out || []; + var offset = this._dimSize * idx; + for (var i = 0; i < this._dimSize; i++) { + out[i] = this._data[offset + i]; + } + return out; + }, + appendData: function (newData) { + if (__DEV__) { + assert$1( + isTypedArray(newData), + 'Added data must be TypedArray if data in initialization is TypedArray' + ); + } + + this._data = newData; + }, + + // Clean self if data is already used. + clean: function () { + // PENDING + this._offset += this.count(); + this._data = null; + } + } +}; + +function countSimply() { + return this._data.length; +} +function getItemSimply(idx) { + return this._data[idx]; +} +function appendDataSimply(newData) { + for (var i = 0; i < newData.length; i++) { + this._data.push(newData[i]); + } +} + + + +var rawValueGetters = { + + arrayRows: getRawValueSimply, + + objectRows: function (dataItem, dataIndex, dimIndex, dimName) { + return dimIndex != null ? dataItem[dimName] : dataItem; + }, + + keyedColumns: getRawValueSimply, + + original: function (dataItem, dataIndex, dimIndex, dimName) { + // FIXME + // In some case (markpoint in geo (geo-map.html)), dataItem + // is {coord: [...]} + var value = getDataItemValue(dataItem); + return (dimIndex == null || !(value instanceof Array)) + ? value + : value[dimIndex]; + }, + + typedArray: getRawValueSimply +}; + +function getRawValueSimply(dataItem, dataIndex, dimIndex, dimName) { + return dimIndex != null ? dataItem[dimIndex] : dataItem; +} + + +var defaultDimValueGetters = { + + arrayRows: getDimValueSimply, + + objectRows: function (dataItem, dimName, dataIndex, dimIndex) { + return converDataValue(dataItem[dimName], this._dimensionInfos[dimName]); + }, + + keyedColumns: getDimValueSimply, + + original: function (dataItem, dimName, dataIndex, dimIndex) { + // Performance sensitive, do not use modelUtil.getDataItemValue. + // If dataItem is an plain object with no value field, the var `value` + // will be assigned with the object, but it will be tread correctly + // in the `convertDataValue`. + var value = dataItem && (dataItem.value == null ? dataItem : dataItem.value); + + // If any dataItem is like { value: 10 } + if (!this._rawData.pure && isDataItemOption(dataItem)) { + this.hasItemOption = true; + } + return converDataValue( + (value instanceof Array) + ? value[dimIndex] + // If value is a single number or something else not array. + : value, + this._dimensionInfos[dimName] + ); + }, + + typedArray: function (dataItem, dimName, dataIndex, dimIndex) { + return dataItem[dimIndex]; + } + +}; + +function getDimValueSimply(dataItem, dimName, dataIndex, dimIndex) { + return converDataValue(dataItem[dimIndex], this._dimensionInfos[dimName]); +} + +/** + * This helper method convert value in data. + * @param {string|number|Date} value + * @param {Object|string} [dimInfo] If string (like 'x'), dimType defaults 'number'. + * If "dimInfo.ordinalParseAndSave", ordinal value can be parsed. + */ +function converDataValue(value, dimInfo) { + // Performance sensitive. + var dimType = dimInfo && dimInfo.type; + if (dimType === 'ordinal') { + // If given value is a category string + var ordinalMeta = dimInfo && dimInfo.ordinalMeta; + return ordinalMeta + ? ordinalMeta.parseAndCollect(value) + : value; + } + + if (dimType === 'time' + // spead up when using timestamp + && typeof value !== 'number' + && value != null + && value !== '-' + ) { + value = +parseDate(value); + } + + // dimType defaults 'number'. + // If dimType is not ordinal and value is null or undefined or NaN or '-', + // parse to NaN. + return (value == null || value === '') + ? NaN + // If string (like '-'), using '+' parse to NaN + // If object, also parse to NaN + : +value; +} + +// ??? FIXME can these logic be more neat: getRawValue, getRawDataItem, +// Consider persistent. +// Caution: why use raw value to display on label or tooltip? +// A reason is to avoid format. For example time value we do not know +// how to format is expected. More over, if stack is used, calculated +// value may be 0.91000000001, which have brings trouble to display. +// TODO: consider how to treat null/undefined/NaN when display? +/** + * @param {module:echarts/data/List} data + * @param {number} dataIndex + * @param {string|number} [dim] dimName or dimIndex + * @return {Array.<number>|string|number} can be null/undefined. + */ +function retrieveRawValue(data, dataIndex, dim) { + if (!data) { + return; + } + + // Consider data may be not persistent. + var dataItem = data.getRawDataItem(dataIndex); + + if (dataItem == null) { + return; + } + + var sourceFormat = data.getProvider().getSource().sourceFormat; + var dimName; + var dimIndex; + + var dimInfo = data.getDimensionInfo(dim); + if (dimInfo) { + dimName = dimInfo.name; + dimIndex = dimInfo.index; + } + + return rawValueGetters[sourceFormat](dataItem, dataIndex, dimIndex, dimName); +} + +/** + * Compatible with some cases (in pie, map) like: + * data: [{name: 'xx', value: 5, selected: true}, ...] + * where only sourceFormat is 'original' and 'objectRows' supported. + * + * ??? TODO + * Supported detail options in data item when using 'arrayRows'. + * + * @param {module:echarts/data/List} data + * @param {number} dataIndex + * @param {string} attr like 'selected' + */ +function retrieveRawAttr(data, dataIndex, attr) { + if (!data) { + return; + } + + var sourceFormat = data.getProvider().getSource().sourceFormat; + + if (sourceFormat !== SOURCE_FORMAT_ORIGINAL + && sourceFormat !== SOURCE_FORMAT_OBJECT_ROWS + ) { + return; + } + + var dataItem = data.getRawDataItem(dataIndex); + if (sourceFormat === SOURCE_FORMAT_ORIGINAL && !isObject$1(dataItem)) { + dataItem = null; + } + if (dataItem) { + return dataItem[attr]; + } +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var DIMENSION_LABEL_REG = /\{@(.+?)\}/g; + +// PENDING A little ugly +var dataFormatMixin = { + /** + * Get params for formatter + * @param {number} dataIndex + * @param {string} [dataType] + * @return {Object} + */ + getDataParams: function (dataIndex, dataType) { + var data = this.getData(dataType); + var rawValue = this.getRawValue(dataIndex, dataType); + var rawDataIndex = data.getRawIndex(dataIndex); + var name = data.getName(dataIndex); + var itemOpt = data.getRawDataItem(dataIndex); + var color = data.getItemVisual(dataIndex, 'color'); + + return { + componentType: this.mainType, + componentSubType: this.subType, + seriesType: this.mainType === 'series' ? this.subType : null, + seriesIndex: this.seriesIndex, + seriesId: this.id, + seriesName: this.name, + name: name, + dataIndex: rawDataIndex, + data: itemOpt, + dataType: dataType, + value: rawValue, + color: color, + marker: getTooltipMarker(color), + + // Param name list for mapping `a`, `b`, `c`, `d`, `e` + $vars: ['seriesName', 'name', 'value'] + }; + }, + + /** + * Format label + * @param {number} dataIndex + * @param {string} [status='normal'] 'normal' or 'emphasis' + * @param {string} [dataType] + * @param {number} [dimIndex] + * @param {string} [labelProp='label'] + * @return {string} If not formatter, return null/undefined + */ + getFormattedLabel: function (dataIndex, status, dataType, dimIndex, labelProp) { + status = status || 'normal'; + var data = this.getData(dataType); + var itemModel = data.getItemModel(dataIndex); + + var params = this.getDataParams(dataIndex, dataType); + if (dimIndex != null && (params.value instanceof Array)) { + params.value = params.value[dimIndex]; + } + + var formatter = itemModel.get( + status === 'normal' + ? [labelProp || 'label', 'formatter'] + : [status, labelProp || 'label', 'formatter'] + ); + + if (typeof formatter === 'function') { + params.status = status; + return formatter(params); + } + else if (typeof formatter === 'string') { + var str = formatTpl(formatter, params); + + // Support 'aaa{@[3]}bbb{@product}ccc'. + // Do not support '}' in dim name util have to. + return str.replace(DIMENSION_LABEL_REG, function (origin, dim) { + var len = dim.length; + if (dim.charAt(0) === '[' && dim.charAt(len - 1) === ']') { + dim = +dim.slice(1, len - 1); // Also: '[]' => 0 + } + return retrieveRawValue(data, dataIndex, dim); + }); + } + }, + + /** + * Get raw value in option + * @param {number} idx + * @param {string} [dataType] + * @return {Array|number|string} + */ + getRawValue: function (idx, dataType) { + return retrieveRawValue(this.getData(dataType), idx); + }, + + /** + * Should be implemented. + * @param {number} dataIndex + * @param {boolean} [multipleSeries=false] + * @param {number} [dataType] + * @return {string} tooltip string + */ + formatTooltip: function () { + // Empty function + } +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @param {Object} define + * @return See the return of `createTask`. + */ +function createTask(define) { + return new Task(define); +} + +/** + * @constructor + * @param {Object} define + * @param {Function} define.reset Custom reset + * @param {Function} [define.plan] Returns 'reset' indicate reset immediately. + * @param {Function} [define.count] count is used to determin data task. + * @param {Function} [define.onDirty] count is used to determin data task. + */ +function Task(define) { + define = define || {}; + + this._reset = define.reset; + this._plan = define.plan; + this._count = define.count; + this._onDirty = define.onDirty; + + this._dirty = true; + + // Context must be specified implicitly, to + // avoid miss update context when model changed. + this.context; +} + +var taskProto = Task.prototype; + +/** + * @param {Object} performArgs + * @param {number} [performArgs.step] Specified step. + * @param {number} [performArgs.skip] Skip customer perform call. + * @param {number} [performArgs.modBy] Sampling window size. + * @param {number} [performArgs.modDataCount] Sampling count. + */ +taskProto.perform = function (performArgs) { + var upTask = this._upstream; + var skip = performArgs && performArgs.skip; + + // TODO some refactor. + // Pull data. Must pull data each time, because context.data + // may be updated by Series.setData. + if (this._dirty && upTask) { + var context = this.context; + context.data = context.outputData = upTask.context.outputData; + } + + if (this.__pipeline) { + this.__pipeline.currentTask = this; + } + + var planResult; + if (this._plan && !skip) { + planResult = this._plan(this.context); + } + + // Support sharding by mod, which changes the render sequence and makes the rendered graphic + // elements uniformed distributed when progress, especially when moving or zooming. + var lastModBy = normalizeModBy(this._modBy); + var lastModDataCount = this._modDataCount || 0; + var modBy = normalizeModBy(performArgs && performArgs.modBy); + var modDataCount = performArgs && performArgs.modDataCount || 0; + if (lastModBy !== modBy || lastModDataCount !== modDataCount) { + planResult = 'reset'; + } + + function normalizeModBy(val) { + !(val >= 1) && (val = 1); // jshint ignore:line + return val; + } + + var forceFirstProgress; + if (this._dirty || planResult === 'reset') { + this._dirty = false; + forceFirstProgress = reset(this, skip); + } + + this._modBy = modBy; + this._modDataCount = modDataCount; + + var step = performArgs && performArgs.step; + + if (upTask) { + + if (__DEV__) { + assert$1(upTask._outputDueEnd != null); + } + this._dueEnd = upTask._outputDueEnd; + } + // DataTask or overallTask + else { + if (__DEV__) { + assert$1(!this._progress || this._count); + } + this._dueEnd = this._count ? this._count(this.context) : Infinity; + } + + // Note: Stubs, that its host overall task let it has progress, has progress. + // If no progress, pass index from upstream to downstream each time plan called. + if (this._progress) { + var start = this._dueIndex; + var end = Math.min( + step != null ? this._dueIndex + step : Infinity, + this._dueEnd + ); + + if (!skip && (forceFirstProgress || start < end)) { + var progress = this._progress; + if (isArray(progress)) { + for (var i = 0; i < progress.length; i++) { + doProgress(this, progress[i], start, end, modBy, modDataCount); + } + } + else { + doProgress(this, progress, start, end, modBy, modDataCount); + } + } + + this._dueIndex = end; + // If no `outputDueEnd`, assume that output data and + // input data is the same, so use `dueIndex` as `outputDueEnd`. + var outputDueEnd = this._settedOutputEnd != null + ? this._settedOutputEnd : end; + + if (__DEV__) { + // ??? Can not rollback. + assert$1(outputDueEnd >= this._outputDueEnd); + } + + this._outputDueEnd = outputDueEnd; + } + else { + // (1) Some overall task has no progress. + // (2) Stubs, that its host overall task do not let it has progress, has no progress. + // This should always be performed so it can be passed to downstream. + this._dueIndex = this._outputDueEnd = this._settedOutputEnd != null + ? this._settedOutputEnd : this._dueEnd; + } + + return this.unfinished(); +}; + +var iterator = (function () { + + var end; + var current; + var modBy; + var modDataCount; + var winCount; + + var it = { + reset: function (s, e, sStep, sCount) { + current = s; + end = e; + + modBy = sStep; + modDataCount = sCount; + winCount = Math.ceil(modDataCount / modBy); + + it.next = (modBy > 1 && modDataCount > 0) ? modNext : sequentialNext; + } + }; + + return it; + + function sequentialNext() { + return current < end ? current++ : null; + } + + function modNext() { + var dataIndex = (current % winCount) * modBy + Math.ceil(current / winCount); + var result = current >= end + ? null + : dataIndex < modDataCount + ? dataIndex + // If modDataCount is smaller than data.count() (consider `appendData` case), + // Use normal linear rendering mode. + : current; + current++; + return result; + } +})(); + +taskProto.dirty = function () { + this._dirty = true; + this._onDirty && this._onDirty(this.context); +}; + +function doProgress(taskIns, progress, start, end, modBy, modDataCount) { + iterator.reset(start, end, modBy, modDataCount); + taskIns._callingProgress = progress; + taskIns._callingProgress({ + start: start, end: end, count: end - start, next: iterator.next + }, taskIns.context); +} + +function reset(taskIns, skip) { + taskIns._dueIndex = taskIns._outputDueEnd = taskIns._dueEnd = 0; + taskIns._settedOutputEnd = null; + + var progress; + var forceFirstProgress; + + if (!skip && taskIns._reset) { + progress = taskIns._reset(taskIns.context); + if (progress && progress.progress) { + forceFirstProgress = progress.forceFirstProgress; + progress = progress.progress; + } + // To simplify no progress checking, array must has item. + if (isArray(progress) && !progress.length) { + progress = null; + } + } + + taskIns._progress = progress; + taskIns._modBy = taskIns._modDataCount = null; + + var downstream = taskIns._downstream; + downstream && downstream.dirty(); + + return forceFirstProgress; +} + +/** + * @return {boolean} + */ +taskProto.unfinished = function () { + return this._progress && this._dueIndex < this._dueEnd; +}; + +/** + * @param {Object} downTask The downstream task. + * @return {Object} The downstream task. + */ +taskProto.pipe = function (downTask) { + if (__DEV__) { + assert$1(downTask && !downTask._disposed && downTask !== this); + } + + // If already downstream, do not dirty downTask. + if (this._downstream !== downTask || this._dirty) { + this._downstream = downTask; + downTask._upstream = this; + downTask.dirty(); + } +}; + +taskProto.dispose = function () { + if (this._disposed) { + return; + } + + this._upstream && (this._upstream._downstream = null); + this._downstream && (this._downstream._upstream = null); + + this._dirty = false; + this._disposed = true; +}; + +taskProto.getUpstream = function () { + return this._upstream; +}; + +taskProto.getDownstream = function () { + return this._downstream; +}; + +taskProto.setOutputEnd = function (end) { + // This only happend in dataTask, dataZoom, map, currently. + // where dataZoom do not set end each time, but only set + // when reset. So we should record the setted end, in case + // that the stub of dataZoom perform again and earse the + // setted end by upstream. + this._outputDueEnd = this._settedOutputEnd = end; +}; + + +/////////////////////////////////////////////////////////// +// For stream debug (Should be commented out after used!) +// Usage: printTask(this, 'begin'); +// Usage: printTask(this, null, {someExtraProp}); +// function printTask(task, prefix, extra) { +// window.ecTaskUID == null && (window.ecTaskUID = 0); +// task.uidDebug == null && (task.uidDebug = `task_${window.ecTaskUID++}`); +// task.agent && task.agent.uidDebug == null && (task.agent.uidDebug = `task_${window.ecTaskUID++}`); +// var props = []; +// if (task.__pipeline) { +// var val = `${task.__idxInPipeline}/${task.__pipeline.tail.__idxInPipeline} ${task.agent ? '(stub)' : ''}`; +// props.push({text: 'idx', value: val}); +// } else { +// var stubCount = 0; +// task.agentStubMap.each(() => stubCount++); +// props.push({text: 'idx', value: `overall (stubs: ${stubCount})`}); +// } +// props.push({text: 'uid', value: task.uidDebug}); +// if (task.__pipeline) { +// props.push({text: 'pid', value: task.__pipeline.id}); +// task.agent && props.push( +// {text: 'stubFor', value: task.agent.uidDebug} +// ); +// } +// props.push( +// {text: 'dirty', value: task._dirty}, +// {text: 'dueIndex', value: task._dueIndex}, +// {text: 'dueEnd', value: task._dueEnd}, +// {text: 'outputDueEnd', value: task._outputDueEnd} +// ); +// if (extra) { +// Object.keys(extra).forEach(key => { +// props.push({text: key, value: extra[key]}); +// }); +// } +// var args = ['color: blue']; +// var msg = `%c[${prefix || 'T'}] %c` + props.map(item => ( +// args.push('color: black', 'color: red'), +// `${item.text}: %c${item.value}` +// )).join('%c, '); +// console.log.apply(console, [msg].concat(args)); +// // console.log(this); +// } + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var inner$4 = makeInner(); + +var SeriesModel = ComponentModel.extend({ + + type: 'series.__base__', + + /** + * @readOnly + */ + seriesIndex: 0, + + // coodinateSystem will be injected in the echarts/CoordinateSystem + coordinateSystem: null, + + /** + * @type {Object} + * @protected + */ + defaultOption: null, + + /** + * Data provided for legend + * @type {Function} + */ + // PENDING + legendDataProvider: null, + + /** + * Access path of color for visual + */ + visualColorAccessPath: 'itemStyle.color', + + /** + * Support merge layout params. + * Only support 'box' now (left/right/top/bottom/width/height). + * @type {string|Object} Object can be {ignoreSize: true} + * @readOnly + */ + layoutMode: null, + + init: function (option, parentModel, ecModel, extraOpt) { + + /** + * @type {number} + * @readOnly + */ + this.seriesIndex = this.componentIndex; + + this.dataTask = createTask({ + count: dataTaskCount, + reset: dataTaskReset + }); + this.dataTask.context = {model: this}; + + this.mergeDefaultAndTheme(option, ecModel); + + prepareSource(this); + + + var data = this.getInitialData(option, ecModel); + wrapData(data, this); + this.dataTask.context.data = data; + + if (__DEV__) { + assert$1(data, 'getInitialData returned invalid data.'); + } + + /** + * @type {module:echarts/data/List|module:echarts/data/Tree|module:echarts/data/Graph} + * @private + */ + inner$4(this).dataBeforeProcessed = data; + + // If we reverse the order (make data firstly, and then make + // dataBeforeProcessed by cloneShallow), cloneShallow will + // cause data.graph.data !== data when using + // module:echarts/data/Graph or module:echarts/data/Tree. + // See module:echarts/data/helper/linkList + + // Theoretically, it is unreasonable to call `seriesModel.getData()` in the model + // init or merge stage, because the data can be restored. So we do not `restoreData` + // and `setData` here, which forbids calling `seriesModel.getData()` in this stage. + // Call `seriesModel.getRawData()` instead. + // this.restoreData(); + + autoSeriesName(this); + }, + + /** + * Util for merge default and theme to option + * @param {Object} option + * @param {module:echarts/model/Global} ecModel + */ + mergeDefaultAndTheme: function (option, ecModel) { + var layoutMode = this.layoutMode; + var inputPositionParams = layoutMode + ? getLayoutParams(option) : {}; + + // Backward compat: using subType on theme. + // But if name duplicate between series subType + // (for example: parallel) add component mainType, + // add suffix 'Series'. + var themeSubType = this.subType; + if (ComponentModel.hasClass(themeSubType)) { + themeSubType += 'Series'; + } + merge( + option, + ecModel.getTheme().get(this.subType) + ); + merge(option, this.getDefaultOption()); + + // Default label emphasis `show` + defaultEmphasis(option, 'label', ['show']); + + this.fillDataTextStyle(option.data); + + if (layoutMode) { + mergeLayoutParam(option, inputPositionParams, layoutMode); + } + }, + + mergeOption: function (newSeriesOption, ecModel) { + // this.settingTask.dirty(); + + newSeriesOption = merge(this.option, newSeriesOption, true); + this.fillDataTextStyle(newSeriesOption.data); + + var layoutMode = this.layoutMode; + if (layoutMode) { + mergeLayoutParam(this.option, newSeriesOption, layoutMode); + } + + prepareSource(this); + + var data = this.getInitialData(newSeriesOption, ecModel); + wrapData(data, this); + this.dataTask.dirty(); + this.dataTask.context.data = data; + + inner$4(this).dataBeforeProcessed = data; + + autoSeriesName(this); + }, + + fillDataTextStyle: function (data) { + // Default data label emphasis `show` + // FIXME Tree structure data ? + // FIXME Performance ? + if (data && !isTypedArray(data)) { + var props = ['show']; + for (var i = 0; i < data.length; i++) { + if (data[i] && data[i].label) { + defaultEmphasis(data[i], 'label', props); + } + } + } + }, + + /** + * Init a data structure from data related option in series + * Must be overwritten + */ + getInitialData: function () {}, + + /** + * Append data to list + * @param {Object} params + * @param {Array|TypedArray} params.data + */ + appendData: function (params) { + // FIXME ??? + // (1) If data from dataset, forbidden append. + // (2) support append data of dataset. + var data = this.getRawData(); + data.appendData(params.data); + }, + + /** + * Consider some method like `filter`, `map` need make new data, + * We should make sure that `seriesModel.getData()` get correct + * data in the stream procedure. So we fetch data from upstream + * each time `task.perform` called. + * @param {string} [dataType] + * @return {module:echarts/data/List} + */ + getData: function (dataType) { + var task = getCurrentTask(this); + if (task) { + var data = task.context.data; + return dataType == null ? data : data.getLinkedData(dataType); + } + else { + // When series is not alive (that may happen when click toolbox + // restore or setOption with not merge mode), series data may + // be still need to judge animation or something when graphic + // elements want to know whether fade out. + return inner$4(this).data; + } + }, + + /** + * @param {module:echarts/data/List} data + */ + setData: function (data) { + var task = getCurrentTask(this); + if (task) { + var context = task.context; + // Consider case: filter, data sample. + if (context.data !== data && task.modifyOutputEnd) { + task.setOutputEnd(data.count()); + } + context.outputData = data; + // Caution: setData should update context.data, + // Because getData may be called multiply in a + // single stage and expect to get the data just + // set. (For example, AxisProxy, x y both call + // getData and setDate sequentially). + // So the context.data should be fetched from + // upstream each time when a stage starts to be + // performed. + if (task !== this.dataTask) { + context.data = data; + } + } + inner$4(this).data = data; + }, + + /** + * @see {module:echarts/data/helper/sourceHelper#getSource} + * @return {module:echarts/data/Source} source + */ + getSource: function () { + return getSource(this); + }, + + /** + * Get data before processed + * @return {module:echarts/data/List} + */ + getRawData: function () { + return inner$4(this).dataBeforeProcessed; + }, + + /** + * Get base axis if has coordinate system and has axis. + * By default use coordSys.getBaseAxis(); + * Can be overrided for some chart. + * @return {type} description + */ + getBaseAxis: function () { + var coordSys = this.coordinateSystem; + return coordSys && coordSys.getBaseAxis && coordSys.getBaseAxis(); + }, + + // FIXME + /** + * Default tooltip formatter + * + * @param {number} dataIndex + * @param {boolean} [multipleSeries=false] + * @param {number} [dataType] + */ + formatTooltip: function (dataIndex, multipleSeries, dataType) { + + function formatArrayValue(value) { + // ??? TODO refactor these logic. + // check: category-no-encode-has-axis-data in dataset.html + var vertially = reduce(value, function (vertially, val, idx) { + var dimItem = data.getDimensionInfo(idx); + return vertially |= dimItem && dimItem.tooltip !== false && dimItem.displayName != null; + }, 0); + + var result = []; + + tooltipDims.length + ? each$1(tooltipDims, function (dim) { + setEachItem(retrieveRawValue(data, dataIndex, dim), dim); + }) + // By default, all dims is used on tooltip. + : each$1(value, setEachItem); + + function setEachItem(val, dim) { + var dimInfo = data.getDimensionInfo(dim); + // If `dimInfo.tooltip` is not set, show tooltip. + if (!dimInfo || dimInfo.otherDims.tooltip === false) { + return; + } + var dimType = dimInfo.type; + var dimHead = getTooltipMarker({color: color, type: 'subItem'}); + var valStr = (vertially + ? dimHead + encodeHTML(dimInfo.displayName || '-') + ': ' + : '' + ) + // FIXME should not format time for raw data? + + encodeHTML(dimType === 'ordinal' + ? val + '' + : dimType === 'time' + ? (multipleSeries ? '' : formatTime('yyyy/MM/dd hh:mm:ss', val)) + : addCommas(val) + ); + valStr && result.push(valStr); + } + + return (vertially ? '<br/>' : '') + result.join(vertially ? '<br/>' : ', '); + } + + function formatSingleValue(val) { + return encodeHTML(addCommas(val)); + } + + var data = this.getData(); + var tooltipDims = data.mapDimension('defaultedTooltip', true); + var tooltipDimLen = tooltipDims.length; + var value = this.getRawValue(dataIndex); + var isValueArr = isArray(value); + + var color = data.getItemVisual(dataIndex, 'color'); + if (isObject$1(color) && color.colorStops) { + color = (color.colorStops[0] || {}).color; + } + color = color || 'transparent'; + + // Complicated rule for pretty tooltip. + var formattedValue = (tooltipDimLen > 1 || (isValueArr && !tooltipDimLen)) + ? formatArrayValue(value) + : tooltipDimLen + ? formatSingleValue(retrieveRawValue(data, dataIndex, tooltipDims[0])) + : formatSingleValue(isValueArr ? value[0] : value); + + var colorEl = getTooltipMarker(color); + + var name = data.getName(dataIndex); + + var seriesName = this.name; + if (!isNameSpecified(this)) { + seriesName = ''; + } + seriesName = seriesName + ? encodeHTML(seriesName) + (!multipleSeries ? '<br/>' : ': ') + : ''; + + return !multipleSeries + ? seriesName + colorEl + + (name + ? encodeHTML(name) + ': ' + formattedValue + : formattedValue + ) + : colorEl + seriesName + formattedValue; + }, + + /** + * @return {boolean} + */ + isAnimationEnabled: function () { + if (env$1.node) { + return false; + } + + var animationEnabled = this.getShallow('animation'); + if (animationEnabled) { + if (this.getData().count() > this.getShallow('animationThreshold')) { + animationEnabled = false; + } + } + return animationEnabled; + }, + + restoreData: function () { + this.dataTask.dirty(); + }, + + getColorFromPalette: function (name, scope, requestColorNum) { + var ecModel = this.ecModel; + // PENDING + var color = colorPaletteMixin.getColorFromPalette.call(this, name, scope, requestColorNum); + if (!color) { + color = ecModel.getColorFromPalette(name, scope, requestColorNum); + } + return color; + }, + + /** + * Use `data.mapDimension(coordDim, true)` instead. + * @deprecated + */ + coordDimToDataDim: function (coordDim) { + return this.getRawData().mapDimension(coordDim, true); + }, + + /** + * Get progressive rendering count each step + * @return {number} + */ + getProgressive: function () { + return this.get('progressive'); + }, + + /** + * Get progressive rendering count each step + * @return {number} + */ + getProgressiveThreshold: function () { + return this.get('progressiveThreshold'); + }, + + /** + * Get data indices for show tooltip content. See tooltip. + * @abstract + * @param {Array.<string>|string} dim + * @param {Array.<number>} value + * @param {module:echarts/coord/single/SingleAxis} baseAxis + * @return {Object} {dataIndices, nestestValue}. + */ + getAxisTooltipData: null, + + /** + * See tooltip. + * @abstract + * @param {number} dataIndex + * @return {Array.<number>} Point of tooltip. null/undefined can be returned. + */ + getTooltipPosition: null, + + /** + * @see {module:echarts/stream/Scheduler} + */ + pipeTask: null, + + /** + * Convinient for override in extended class. + * @protected + * @type {Function} + */ + preventIncremental: null, + + /** + * @public + * @readOnly + * @type {Object} + */ + pipelineContext: null + +}); + + +mixin(SeriesModel, dataFormatMixin); +mixin(SeriesModel, colorPaletteMixin); + +/** + * MUST be called after `prepareSource` called + * Here we need to make auto series, especially for auto legend. But we + * do not modify series.name in option to avoid side effects. + */ +function autoSeriesName(seriesModel) { + // User specified name has higher priority, otherwise it may cause + // series can not be queried unexpectedly. + var name = seriesModel.name; + if (!isNameSpecified(seriesModel)) { + seriesModel.name = getSeriesAutoName(seriesModel) || name; + } +} + +function getSeriesAutoName(seriesModel) { + var data = seriesModel.getRawData(); + var dataDims = data.mapDimension('seriesName', true); + var nameArr = []; + each$1(dataDims, function (dataDim) { + var dimInfo = data.getDimensionInfo(dataDim); + dimInfo.displayName && nameArr.push(dimInfo.displayName); + }); + return nameArr.join(' '); +} + +function dataTaskCount(context) { + return context.model.getRawData().count(); +} + +function dataTaskReset(context) { + var seriesModel = context.model; + seriesModel.setData(seriesModel.getRawData().cloneShallow()); + return dataTaskProgress; +} + +function dataTaskProgress(param, context) { + // Avoid repead cloneShallow when data just created in reset. + if (param.end > context.outputData.count()) { + context.model.getRawData().cloneShallow(context.outputData); + } +} + +// TODO refactor +function wrapData(data, seriesModel) { + each$1(data.CHANGABLE_METHODS, function (methodName) { + data.wrapMethod(methodName, curry(onDataSelfChange, seriesModel)); + }); +} + +function onDataSelfChange(seriesModel) { + var task = getCurrentTask(seriesModel); + if (task) { + // Consider case: filter, selectRange + task.setOutputEnd(this.count()); + } +} + +function getCurrentTask(seriesModel) { + var scheduler = (seriesModel.ecModel || {}).scheduler; + var pipeline = scheduler && scheduler.getPipeline(seriesModel.uid); + + if (pipeline) { + // When pipline finished, the currrentTask keep the last + // task (renderTask). + var task = pipeline.currentTask; + if (task) { + var agentStubMap = task.agentStubMap; + if (agentStubMap) { + task = agentStubMap.get(seriesModel.uid); + } + } + return task; + } +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var Component = function () { + /** + * @type {module:zrender/container/Group} + * @readOnly + */ + this.group = new Group(); + + /** + * @type {string} + * @readOnly + */ + this.uid = getUID('viewComponent'); +}; + +Component.prototype = { + + constructor: Component, + + init: function (ecModel, api) {}, + + render: function (componentModel, ecModel, api, payload) {}, + + dispose: function () {} + +}; + +var componentProto = Component.prototype; +componentProto.updateView + = componentProto.updateLayout + = componentProto.updateVisual + = function (seriesModel, ecModel, api, payload) { + // Do nothing; + }; +// Enable Component.extend. +enableClassExtend(Component); + +// Enable capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on. +enableClassManagement(Component, {registerWhenExtend: true}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @return {string} If large mode changed, return string 'reset'; + */ +var createRenderPlanner = function () { + var inner = makeInner(); + + return function (seriesModel) { + var fields = inner(seriesModel); + var pipelineContext = seriesModel.pipelineContext; + + var originalLarge = fields.large; + var originalProgressive = fields.progressiveRender; + + var large = fields.large = pipelineContext.large; + var progressive = fields.progressiveRender = pipelineContext.progressiveRender; + + return !!((originalLarge ^ large) || (originalProgressive ^ progressive)) && 'reset'; + }; +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var inner$5 = makeInner(); +var renderPlanner = createRenderPlanner(); + +function Chart() { + + /** + * @type {module:zrender/container/Group} + * @readOnly + */ + this.group = new Group(); + + /** + * @type {string} + * @readOnly + */ + this.uid = getUID('viewChart'); + + this.renderTask = createTask({ + plan: renderTaskPlan, + reset: renderTaskReset + }); + this.renderTask.context = {view: this}; +} + +Chart.prototype = { + + type: 'chart', + + /** + * Init the chart. + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + */ + init: function (ecModel, api) {}, + + /** + * Render the chart. + * @param {module:echarts/model/Series} seriesModel + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + * @param {Object} payload + */ + render: function (seriesModel, ecModel, api, payload) {}, + + /** + * Highlight series or specified data item. + * @param {module:echarts/model/Series} seriesModel + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + * @param {Object} payload + */ + highlight: function (seriesModel, ecModel, api, payload) { + toggleHighlight(seriesModel.getData(), payload, 'emphasis'); + }, + + /** + * Downplay series or specified data item. + * @param {module:echarts/model/Series} seriesModel + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + * @param {Object} payload + */ + downplay: function (seriesModel, ecModel, api, payload) { + toggleHighlight(seriesModel.getData(), payload, 'normal'); + }, + + /** + * Remove self. + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + */ + remove: function (ecModel, api) { + this.group.removeAll(); + }, + + /** + * Dispose self. + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + */ + dispose: function () {}, + + /** + * Rendering preparation in progressive mode. + * @param {module:echarts/model/Series} seriesModel + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + * @param {Object} payload + */ + incrementalPrepareRender: null, + + /** + * Render in progressive mode. + * @param {module:echarts/model/Series} seriesModel + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + * @param {Object} payload + */ + incrementalRender: null, + + /** + * Update transform directly. + * @param {module:echarts/model/Series} seriesModel + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + * @param {Object} payload + * @return {Object} {update: true} + */ + updateTransform: null + + /** + * The view contains the given point. + * @interface + * @param {Array.<number>} point + * @return {boolean} + */ + // containPoint: function () {} + +}; + +var chartProto = Chart.prototype; +chartProto.updateView + = chartProto.updateLayout + = chartProto.updateVisual + = function (seriesModel, ecModel, api, payload) { + this.render(seriesModel, ecModel, api, payload); + }; + +/** + * Set state of single element + * @param {module:zrender/Element} el + * @param {string} state + */ +function elSetState(el, state) { + if (el) { + el.trigger(state); + if (el.type === 'group') { + for (var i = 0; i < el.childCount(); i++) { + elSetState(el.childAt(i), state); + } + } + } +} +/** + * @param {module:echarts/data/List} data + * @param {Object} payload + * @param {string} state 'normal'|'emphasis' + */ +function toggleHighlight(data, payload, state) { + var dataIndex = queryDataIndex(data, payload); + + if (dataIndex != null) { + each$1(normalizeToArray(dataIndex), function (dataIdx) { + elSetState(data.getItemGraphicEl(dataIdx), state); + }); + } + else { + data.eachItemGraphicEl(function (el) { + elSetState(el, state); + }); + } +} + +// Enable Chart.extend. +enableClassExtend(Chart, ['dispose']); + +// Add capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on. +enableClassManagement(Chart, {registerWhenExtend: true}); + +Chart.markUpdateMethod = function (payload, methodName) { + inner$5(payload).updateMethod = methodName; +}; + +function renderTaskPlan(context) { + return renderPlanner(context.model); +} + +function renderTaskReset(context) { + var seriesModel = context.model; + var ecModel = context.ecModel; + var api = context.api; + var payload = context.payload; + // ???! remove updateView updateVisual + var progressiveRender = seriesModel.pipelineContext.progressiveRender; + var view = context.view; + + var updateMethod = payload && inner$5(payload).updateMethod; + var methodName = progressiveRender + ? 'incrementalPrepareRender' + : (updateMethod && view[updateMethod]) + ? updateMethod + // `appendData` is also supported when data amount + // is less than progressive threshold. + : 'render'; + + if (methodName !== 'render') { + view[methodName](seriesModel, ecModel, api, payload); + } + + return progressMethodMap[methodName]; +} + +var progressMethodMap = { + incrementalPrepareRender: { + progress: function (params, context) { + context.view.incrementalRender( + params, context.model, context.ecModel, context.api, context.payload + ); + } + }, + render: { + // Put view.render in `progress` to support appendData. But in this case + // view.render should not be called in reset, otherwise it will be called + // twise. Use `forceFirstProgress` to make sure that view.render is called + // in any cases. + forceFirstProgress: true, + progress: function (params, context) { + context.view.render( + context.model, context.ecModel, context.api, context.payload + ); + } + } +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +var ORIGIN_METHOD = '\0__throttleOriginMethod'; +var RATE = '\0__throttleRate'; +var THROTTLE_TYPE = '\0__throttleType'; + +/** + * @public + * @param {(Function)} fn + * @param {number} [delay=0] Unit: ms. + * @param {boolean} [debounce=false] + * true: If call interval less than `delay`, only the last call works. + * false: If call interval less than `delay, call works on fixed rate. + * @return {(Function)} throttled fn. + */ +function throttle(fn, delay, debounce) { + + var currCall; + var lastCall = 0; + var lastExec = 0; + var timer = null; + var diff; + var scope; + var args; + var debounceNextCall; + + delay = delay || 0; + + function exec() { + lastExec = (new Date()).getTime(); + timer = null; + fn.apply(scope, args || []); + } + + var cb = function () { + currCall = (new Date()).getTime(); + scope = this; + args = arguments; + var thisDelay = debounceNextCall || delay; + var thisDebounce = debounceNextCall || debounce; + debounceNextCall = null; + diff = currCall - (thisDebounce ? lastCall : lastExec) - thisDelay; + + clearTimeout(timer); + + // Here we should make sure that: the `exec` SHOULD NOT be called later + // than a new call of `cb`, that is, preserving the command order. Consider + // calculating "scale rate" when roaming as an example. When a call of `cb` + // happens, either the `exec` is called dierectly, or the call is delayed. + // But the delayed call should never be later than next call of `cb`. Under + // this assurance, we can simply update view state each time `dispatchAction` + // triggered by user roaming, but not need to add extra code to avoid the + // state being "rolled-back". + if (thisDebounce) { + timer = setTimeout(exec, thisDelay); + } + else { + if (diff >= 0) { + exec(); + } + else { + timer = setTimeout(exec, -diff); + } + } + + lastCall = currCall; + }; + + /** + * Clear throttle. + * @public + */ + cb.clear = function () { + if (timer) { + clearTimeout(timer); + timer = null; + } + }; + + /** + * Enable debounce once. + */ + cb.debounceNextCall = function (debounceDelay) { + debounceNextCall = debounceDelay; + }; + + return cb; +} + +/** + * Create throttle method or update throttle rate. + * + * @example + * ComponentView.prototype.render = function () { + * ... + * throttle.createOrUpdate( + * this, + * '_dispatchAction', + * this.model.get('throttle'), + * 'fixRate' + * ); + * }; + * ComponentView.prototype.remove = function () { + * throttle.clear(this, '_dispatchAction'); + * }; + * ComponentView.prototype.dispose = function () { + * throttle.clear(this, '_dispatchAction'); + * }; + * + * @public + * @param {Object} obj + * @param {string} fnAttr + * @param {number} [rate] + * @param {string} [throttleType='fixRate'] 'fixRate' or 'debounce' + * @return {Function} throttled function. + */ +function createOrUpdate(obj, fnAttr, rate, throttleType) { + var fn = obj[fnAttr]; + + if (!fn) { + return; + } + + var originFn = fn[ORIGIN_METHOD] || fn; + var lastThrottleType = fn[THROTTLE_TYPE]; + var lastRate = fn[RATE]; + + if (lastRate !== rate || lastThrottleType !== throttleType) { + if (rate == null || !throttleType) { + return (obj[fnAttr] = originFn); + } + + fn = obj[fnAttr] = throttle( + originFn, rate, throttleType === 'debounce' + ); + fn[ORIGIN_METHOD] = originFn; + fn[THROTTLE_TYPE] = throttleType; + fn[RATE] = rate; + } + + return fn; +} + +/** + * Clear throttle. Example see throttle.createOrUpdate. + * + * @public + * @param {Object} obj + * @param {string} fnAttr + */ +function clear(obj, fnAttr) { + var fn = obj[fnAttr]; + if (fn && fn[ORIGIN_METHOD]) { + obj[fnAttr] = fn[ORIGIN_METHOD]; + } +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var seriesColor = { + createOnAllSeries: true, + performRawSeries: true, + reset: function (seriesModel, ecModel) { + var data = seriesModel.getData(); + var colorAccessPath = (seriesModel.visualColorAccessPath || 'itemStyle.color').split('.'); + var color = seriesModel.get(colorAccessPath) // Set in itemStyle + || seriesModel.getColorFromPalette( + // TODO series count changed. + seriesModel.name, null, ecModel.getSeriesCount() + ); // Default color + + // FIXME Set color function or use the platte color + data.setVisual('color', color); + + // Only visible series has each data be visual encoded + if (!ecModel.isSeriesFiltered(seriesModel)) { + if (typeof color === 'function' && !(color instanceof Gradient)) { + data.each(function (idx) { + data.setItemVisual( + idx, 'color', color(seriesModel.getDataParams(idx)) + ); + }); + } + + // itemStyle in each data item + var dataEach = function (data, idx) { + var itemModel = data.getItemModel(idx); + var color = itemModel.get(colorAccessPath, true); + if (color != null) { + data.setItemVisual(idx, 'color', color); + } + }; + + return { dataEach: data.hasItemOption ? dataEach : null }; + } + } +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +var lang = { + toolbox: { + brush: { + title: { + rect: '矩形选择', + polygon: '圈选', + lineX: '横向选择', + lineY: '纵向选择', + keep: '保持选择', + clear: '清除选择' + } + }, + dataView: { + title: '数据视图', + lang: ['数据视图', '关闭', '刷新'] + }, + dataZoom: { + title: { + zoom: '区域缩放', + back: '区域缩放还原' + } + }, + magicType: { + title: { + line: '切换为折线图', + bar: '切换为柱状图', + stack: '切换为堆叠', + tiled: '切换为平铺' + } + }, + restore: { + title: '还原' + }, + saveAsImage: { + title: '保存为图片', + lang: ['右键另存为图片'] + } + }, + series: { + typeNames: { + pie: '饼图', + bar: '柱状图', + line: '折线图', + scatter: '散点图', + effectScatter: '涟漪散点图', + radar: '雷达图', + tree: '树图', + treemap: '矩形树图', + boxplot: '箱型图', + candlestick: 'K线图', + k: 'K线图', + heatmap: '热力图', + map: '地图', + parallel: '平行坐标图', + lines: '线图', + graph: '关系图', + sankey: '桑基图', + funnel: '漏斗图', + gauge: '仪表盘图', + pictorialBar: '象形柱图', + themeRiver: '主题河流图', + sunburst: '旭日图' + } + }, + aria: { + general: { + withTitle: '这是一个关于“{title}”的图表。', + withoutTitle: '这是一个图表,' + }, + series: { + single: { + prefix: '', + withName: '图表类型是{seriesType},表示{seriesName}。', + withoutName: '图表类型是{seriesType}。' + }, + multiple: { + prefix: '它由{seriesCount}个图表系列组成。', + withName: '第{seriesId}个系列是一个表示{seriesName}的{seriesType},', + withoutName: '第{seriesId}个系列是一个{seriesType},', + separator: { + middle: ';', + end: '。' + } + } + }, + data: { + allData: '其数据是——', + partialData: '其中,前{displayCnt}项是——', + withName: '{name}的数据是{value}', + withoutName: '{value}', + separator: { + middle: ',', + end: '' + } + } + } +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var aria = function (dom, ecModel) { + var ariaModel = ecModel.getModel('aria'); + if (!ariaModel.get('show')) { + return; + } + else if (ariaModel.get('description')) { + dom.setAttribute('aria-label', ariaModel.get('description')); + return; + } + + var seriesCnt = 0; + ecModel.eachSeries(function (seriesModel, idx) { + ++seriesCnt; + }, this); + + var maxDataCnt = ariaModel.get('data.maxCount') || 10; + var maxSeriesCnt = ariaModel.get('series.maxCount') || 10; + var displaySeriesCnt = Math.min(seriesCnt, maxSeriesCnt); + + var ariaLabel; + if (seriesCnt < 1) { + // No series, no aria label + return; + } + else { + var title = getTitle(); + if (title) { + ariaLabel = replace(getConfig('general.withTitle'), { + title: title + }); + } + else { + ariaLabel = getConfig('general.withoutTitle'); + } + + var seriesLabels = []; + var prefix = seriesCnt > 1 + ? 'series.multiple.prefix' + : 'series.single.prefix'; + ariaLabel += replace(getConfig(prefix), { seriesCount: seriesCnt }); + + ecModel.eachSeries(function (seriesModel, idx) { + if (idx < displaySeriesCnt) { + var seriesLabel; + + var seriesName = seriesModel.get('name'); + var seriesTpl = 'series.' + + (seriesCnt > 1 ? 'multiple' : 'single') + '.'; + seriesLabel = getConfig(seriesName + ? seriesTpl + 'withName' + : seriesTpl + 'withoutName'); + + seriesLabel = replace(seriesLabel, { + seriesId: seriesModel.seriesIndex, + seriesName: seriesModel.get('name'), + seriesType: getSeriesTypeName(seriesModel.subType) + }); + + var data = seriesModel.getData(); + window.data = data; + if (data.count() > maxDataCnt) { + // Show part of data + seriesLabel += replace(getConfig('data.partialData'), { + displayCnt: maxDataCnt + }); + } + else { + seriesLabel += getConfig('data.allData'); + } + + var dataLabels = []; + for (var i = 0; i < data.count(); i++) { + if (i < maxDataCnt) { + var name = data.getName(i); + var value = retrieveRawValue(data, i); + dataLabels.push( + replace( + name + ? getConfig('data.withName') + : getConfig('data.withoutName'), + { + name: name, + value: value + } + ) + ); + } + } + seriesLabel += dataLabels + .join(getConfig('data.separator.middle')) + + getConfig('data.separator.end'); + + seriesLabels.push(seriesLabel); + } + }); + + ariaLabel += seriesLabels + .join(getConfig('series.multiple.separator.middle')) + + getConfig('series.multiple.separator.end'); + + dom.setAttribute('aria-label', ariaLabel); + } + + function replace(str, keyValues) { + if (typeof str !== 'string') { + return str; + } + + var result = str; + each$1(keyValues, function (value, key) { + result = result.replace( + new RegExp('\\{\\s*' + key + '\\s*\\}', 'g'), + value + ); + }); + return result; + } + + function getConfig(path) { + var userConfig = ariaModel.get(path); + if (userConfig == null) { + var pathArr = path.split('.'); + var result = lang.aria; + for (var i = 0; i < pathArr.length; ++i) { + result = result[pathArr[i]]; + } + return result; + } + else { + return userConfig; + } + } + + function getTitle() { + var title = ecModel.getModel('title').option; + if (title && title.length) { + title = title[0]; + } + return title && title.text; + } + + function getSeriesTypeName(type) { + return lang.series.typeNames[type] || '自定义图'; + } +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var PI$1 = Math.PI; + +/** + * @param {module:echarts/ExtensionAPI} api + * @param {Object} [opts] + * @param {string} [opts.text] + * @param {string} [opts.color] + * @param {string} [opts.textColor] + * @return {module:zrender/Element} + */ +var loadingDefault = function (api, opts) { + opts = opts || {}; + defaults(opts, { + text: 'loading', + color: '#c23531', + textColor: '#000', + maskColor: 'rgba(255, 255, 255, 0.8)', + zlevel: 0 + }); + var mask = new Rect({ + style: { + fill: opts.maskColor + }, + zlevel: opts.zlevel, + z: 10000 + }); + var arc = new Arc({ + shape: { + startAngle: -PI$1 / 2, + endAngle: -PI$1 / 2 + 0.1, + r: 10 + }, + style: { + stroke: opts.color, + lineCap: 'round', + lineWidth: 5 + }, + zlevel: opts.zlevel, + z: 10001 + }); + var labelRect = new Rect({ + style: { + fill: 'none', + text: opts.text, + textPosition: 'right', + textDistance: 10, + textFill: opts.textColor + }, + zlevel: opts.zlevel, + z: 10001 + }); + + arc.animateShape(true) + .when(1000, { + endAngle: PI$1 * 3 / 2 + }) + .start('circularInOut'); + arc.animateShape(true) + .when(1000, { + startAngle: PI$1 * 3 / 2 + }) + .delay(300) + .start('circularInOut'); + + var group = new Group(); + group.add(arc); + group.add(labelRect); + group.add(mask); + // Inject resize + group.resize = function () { + var cx = api.getWidth() / 2; + var cy = api.getHeight() / 2; + arc.setShape({ + cx: cx, + cy: cy + }); + var r = arc.shape.r; + labelRect.setShape({ + x: cx - r, + y: cy - r, + width: r * 2, + height: r * 2 + }); + + mask.setShape({ + x: 0, + y: 0, + width: api.getWidth(), + height: api.getHeight() + }); + }; + group.resize(); + return group; +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @module echarts/stream/Scheduler + */ + +/** + * @constructor + */ +function Scheduler(ecInstance, api, dataProcessorHandlers, visualHandlers) { + this.ecInstance = ecInstance; + this.api = api; + this.unfinished; + + // Fix current processors in case that in some rear cases that + // processors might be registered after echarts instance created. + // Register processors incrementally for a echarts instance is + // not supported by this stream architecture. + var dataProcessorHandlers = this._dataProcessorHandlers = dataProcessorHandlers.slice(); + var visualHandlers = this._visualHandlers = visualHandlers.slice(); + this._allHandlers = dataProcessorHandlers.concat(visualHandlers); + + /** + * @private + * @type { + * [handlerUID: string]: { + * seriesTaskMap?: { + * [seriesUID: string]: Task + * }, + * overallTask?: Task + * } + * } + */ + this._stageTaskMap = createHashMap(); +} + +var proto = Scheduler.prototype; + +/** + * @param {module:echarts/model/Global} ecModel + * @param {Object} payload + */ +proto.restoreData = function (ecModel, payload) { + // TODO: Only restroe needed series and components, but not all components. + // Currently `restoreData` of all of the series and component will be called. + // But some independent components like `title`, `legend`, `graphic`, `toolbox`, + // `tooltip`, `axisPointer`, etc, do not need series refresh when `setOption`, + // and some components like coordinate system, axes, dataZoom, visualMap only + // need their target series refresh. + // (1) If we are implementing this feature some day, we should consider these cases: + // if a data processor depends on a component (e.g., dataZoomProcessor depends + // on the settings of `dataZoom`), it should be re-performed if the component + // is modified by `setOption`. + // (2) If a processor depends on sevral series, speicified by its `getTargetSeries`, + // it should be re-performed when the result array of `getTargetSeries` changed. + // We use `dependencies` to cover these issues. + // (3) How to update target series when coordinate system related components modified. + + // TODO: simply the dirty mechanism? Check whether only the case here can set tasks dirty, + // and this case all of the tasks will be set as dirty. + + ecModel.restoreData(payload); + + // Theoretically an overall task not only depends on each of its target series, but also + // depends on all of the series. + // The overall task is not in pipeline, and `ecModel.restoreData` only set pipeline tasks + // dirty. If `getTargetSeries` of an overall task returns nothing, we should also ensure + // that the overall task is set as dirty and to be performed, otherwise it probably cause + // state chaos. So we have to set dirty of all of the overall tasks manually, otherwise it + // probably cause state chaos (consider `dataZoomProcessor`). + this._stageTaskMap.each(function (taskRecord) { + var overallTask = taskRecord.overallTask; + overallTask && overallTask.dirty(); + }); +}; + +// If seriesModel provided, incremental threshold is check by series data. +proto.getPerformArgs = function (task, isBlock) { + // For overall task + if (!task.__pipeline) { + return; + } + + var pipeline = this._pipelineMap.get(task.__pipeline.id); + var pCtx = pipeline.context; + var incremental = !isBlock + && pipeline.progressiveEnabled + && (!pCtx || pCtx.progressiveRender) + && task.__idxInPipeline > pipeline.blockIndex; + + var step = incremental ? pipeline.step : null; + var modDataCount = pCtx && pCtx.modDataCount; + var modBy = modDataCount != null ? Math.ceil(modDataCount / step): null; + + return {step: step, modBy: modBy, modDataCount: modDataCount}; +}; + +proto.getPipeline = function (pipelineId) { + return this._pipelineMap.get(pipelineId); +}; + +/** + * Current, progressive rendering starts from visual and layout. + * Always detect render mode in the same stage, avoiding that incorrect + * detection caused by data filtering. + * Caution: + * `updateStreamModes` use `seriesModel.getData()`. + */ +proto.updateStreamModes = function (seriesModel, view) { + var pipeline = this._pipelineMap.get(seriesModel.uid); + var data = seriesModel.getData(); + var dataLen = data.count(); + + // `progressiveRender` means that can render progressively in each + // animation frame. Note that some types of series do not provide + // `view.incrementalPrepareRender` but support `chart.appendData`. We + // use the term `incremental` but not `progressive` to describe the + // case that `chart.appendData`. + var progressiveRender = pipeline.progressiveEnabled + && view.incrementalPrepareRender + && dataLen >= pipeline.threshold; + + var large = seriesModel.get('large') && dataLen >= seriesModel.get('largeThreshold'); + + // TODO: modDataCount should not updated if `appendData`, otherwise cause whole repaint. + // see `test/candlestick-large3.html` + var modDataCount = seriesModel.get('progressiveChunkMode') === 'mod' ? dataLen : null; + + seriesModel.pipelineContext = pipeline.context = { + progressiveRender: progressiveRender, + modDataCount: modDataCount, + large: large + }; +}; + +proto.restorePipelines = function (ecModel) { + var scheduler = this; + var pipelineMap = scheduler._pipelineMap = createHashMap(); + + ecModel.eachSeries(function (seriesModel) { + var progressive = seriesModel.getProgressive(); + var pipelineId = seriesModel.uid; + + pipelineMap.set(pipelineId, { + id: pipelineId, + head: null, + tail: null, + threshold: seriesModel.getProgressiveThreshold(), + progressiveEnabled: progressive + && !(seriesModel.preventIncremental && seriesModel.preventIncremental()), + blockIndex: -1, + step: Math.round(progressive || 700), + count: 0 + }); + + pipe(scheduler, seriesModel, seriesModel.dataTask); + }); +}; + +proto.prepareStageTasks = function () { + var stageTaskMap = this._stageTaskMap; + var ecModel = this.ecInstance.getModel(); + var api = this.api; + + each$1(this._allHandlers, function (handler) { + var record = stageTaskMap.get(handler.uid) || stageTaskMap.set(handler.uid, []); + + handler.reset && createSeriesStageTask(this, handler, record, ecModel, api); + handler.overallReset && createOverallStageTask(this, handler, record, ecModel, api); + }, this); +}; + +proto.prepareView = function (view, model, ecModel, api) { + var renderTask = view.renderTask; + var context = renderTask.context; + + context.model = model; + context.ecModel = ecModel; + context.api = api; + + renderTask.__block = !view.incrementalPrepareRender; + + pipe(this, model, renderTask); +}; + + +proto.performDataProcessorTasks = function (ecModel, payload) { + // If we do not use `block` here, it should be considered when to update modes. + performStageTasks(this, this._dataProcessorHandlers, ecModel, payload, {block: true}); +}; + +// opt +// opt.visualType: 'visual' or 'layout' +// opt.setDirty +proto.performVisualTasks = function (ecModel, payload, opt) { + performStageTasks(this, this._visualHandlers, ecModel, payload, opt); +}; + +function performStageTasks(scheduler, stageHandlers, ecModel, payload, opt) { + opt = opt || {}; + var unfinished; + + each$1(stageHandlers, function (stageHandler, idx) { + if (opt.visualType && opt.visualType !== stageHandler.visualType) { + return; + } + + var stageHandlerRecord = scheduler._stageTaskMap.get(stageHandler.uid); + var seriesTaskMap = stageHandlerRecord.seriesTaskMap; + var overallTask = stageHandlerRecord.overallTask; + + if (overallTask) { + var overallNeedDirty; + var agentStubMap = overallTask.agentStubMap; + agentStubMap.each(function (stub) { + if (needSetDirty(opt, stub)) { + stub.dirty(); + overallNeedDirty = true; + } + }); + overallNeedDirty && overallTask.dirty(); + updatePayload(overallTask, payload); + var performArgs = scheduler.getPerformArgs(overallTask, opt.block); + // Execute stubs firstly, which may set the overall task dirty, + // then execute the overall task. And stub will call seriesModel.setData, + // which ensures that in the overallTask seriesModel.getData() will not + // return incorrect data. + agentStubMap.each(function (stub) { + stub.perform(performArgs); + }); + unfinished |= overallTask.perform(performArgs); + } + else if (seriesTaskMap) { + seriesTaskMap.each(function (task, pipelineId) { + if (needSetDirty(opt, task)) { + task.dirty(); + } + var performArgs = scheduler.getPerformArgs(task, opt.block); + performArgs.skip = !stageHandler.performRawSeries + && ecModel.isSeriesFiltered(task.context.model); + updatePayload(task, payload); + unfinished |= task.perform(performArgs); + }); + } + }); + + function needSetDirty(opt, task) { + return opt.setDirty && (!opt.dirtyMap || opt.dirtyMap.get(task.__pipeline.id)); + } + + scheduler.unfinished |= unfinished; +} + +proto.performSeriesTasks = function (ecModel) { + var unfinished; + + ecModel.eachSeries(function (seriesModel) { + // Progress to the end for dataInit and dataRestore. + unfinished |= seriesModel.dataTask.perform(); + }); + + this.unfinished |= unfinished; +}; + +proto.plan = function () { + // Travel pipelines, check block. + this._pipelineMap.each(function (pipeline) { + var task = pipeline.tail; + do { + if (task.__block) { + pipeline.blockIndex = task.__idxInPipeline; + break; + } + task = task.getUpstream(); + } + while (task); + }); +}; + +var updatePayload = proto.updatePayload = function (task, payload) { + payload !== 'remain' && (task.context.payload = payload); +}; + +function createSeriesStageTask(scheduler, stageHandler, stageHandlerRecord, ecModel, api) { + var seriesTaskMap = stageHandlerRecord.seriesTaskMap + || (stageHandlerRecord.seriesTaskMap = createHashMap()); + var seriesType = stageHandler.seriesType; + var getTargetSeries = stageHandler.getTargetSeries; + + // If a stageHandler should cover all series, `createOnAllSeries` should be declared mandatorily, + // to avoid some typo or abuse. Otherwise if an extension do not specify a `seriesType`, + // it works but it may cause other irrelevant charts blocked. + if (stageHandler.createOnAllSeries) { + ecModel.eachRawSeries(create); + } + else if (seriesType) { + ecModel.eachRawSeriesByType(seriesType, create); + } + else if (getTargetSeries) { + getTargetSeries(ecModel, api).each(create); + } + + function create(seriesModel) { + var pipelineId = seriesModel.uid; + + // Init tasks for each seriesModel only once. + // Reuse original task instance. + var task = seriesTaskMap.get(pipelineId) + || seriesTaskMap.set(pipelineId, createTask({ + plan: seriesTaskPlan, + reset: seriesTaskReset, + count: seriesTaskCount + })); + task.context = { + model: seriesModel, + ecModel: ecModel, + api: api, + useClearVisual: stageHandler.isVisual && !stageHandler.isLayout, + plan: stageHandler.plan, + reset: stageHandler.reset, + scheduler: scheduler + }; + pipe(scheduler, seriesModel, task); + } + + // Clear unused series tasks. + var pipelineMap = scheduler._pipelineMap; + seriesTaskMap.each(function (task, pipelineId) { + if (!pipelineMap.get(pipelineId)) { + task.dispose(); + seriesTaskMap.removeKey(pipelineId); + } + }); +} + +function createOverallStageTask(scheduler, stageHandler, stageHandlerRecord, ecModel, api) { + var overallTask = stageHandlerRecord.overallTask = stageHandlerRecord.overallTask + // For overall task, the function only be called on reset stage. + || createTask({reset: overallTaskReset}); + + overallTask.context = { + ecModel: ecModel, + api: api, + overallReset: stageHandler.overallReset, + scheduler: scheduler + }; + + // Reuse orignal stubs. + var agentStubMap = overallTask.agentStubMap = overallTask.agentStubMap || createHashMap(); + + var seriesType = stageHandler.seriesType; + var getTargetSeries = stageHandler.getTargetSeries; + var overallProgress = true; + var modifyOutputEnd = stageHandler.modifyOutputEnd; + + // An overall task with seriesType detected or has `getTargetSeries`, we add + // stub in each pipelines, it will set the overall task dirty when the pipeline + // progress. Moreover, to avoid call the overall task each frame (too frequent), + // we set the pipeline block. + if (seriesType) { + ecModel.eachRawSeriesByType(seriesType, createStub); + } + else if (getTargetSeries) { + getTargetSeries(ecModel, api).each(createStub); + } + // Otherwise, (usually it is legancy case), the overall task will only be + // executed when upstream dirty. Otherwise the progressive rendering of all + // pipelines will be disabled unexpectedly. But it still needs stubs to receive + // dirty info from upsteam. + else { + overallProgress = false; + each$1(ecModel.getSeries(), createStub); + } + + function createStub(seriesModel) { + var pipelineId = seriesModel.uid; + var stub = agentStubMap.get(pipelineId); + if (!stub) { + stub = agentStubMap.set(pipelineId, createTask( + {reset: stubReset, onDirty: stubOnDirty} + )); + // When the result of `getTargetSeries` changed, the overallTask + // should be set as dirty and re-performed. + overallTask.dirty(); + } + stub.context = { + model: seriesModel, + overallProgress: overallProgress, + modifyOutputEnd: modifyOutputEnd + }; + stub.agent = overallTask; + stub.__block = overallProgress; + + pipe(scheduler, seriesModel, stub); + } + + // Clear unused stubs. + var pipelineMap = scheduler._pipelineMap; + agentStubMap.each(function (stub, pipelineId) { + if (!pipelineMap.get(pipelineId)) { + stub.dispose(); + // When the result of `getTargetSeries` changed, the overallTask + // should be set as dirty and re-performed. + overallTask.dirty(); + agentStubMap.removeKey(pipelineId); + } + }); +} + +function overallTaskReset(context) { + context.overallReset( + context.ecModel, context.api, context.payload + ); +} + +function stubReset(context, upstreamContext) { + return context.overallProgress && stubProgress; +} + +function stubProgress() { + this.agent.dirty(); + this.getDownstream().dirty(); +} + +function stubOnDirty() { + this.agent && this.agent.dirty(); +} + +function seriesTaskPlan(context) { + return context.plan && context.plan( + context.model, context.ecModel, context.api, context.payload + ); +} + +function seriesTaskReset(context) { + if (context.useClearVisual) { + context.data.clearAllVisual(); + } + var resetDefines = context.resetDefines = normalizeToArray(context.reset( + context.model, context.ecModel, context.api, context.payload + )); + return resetDefines.length > 1 + ? map(resetDefines, function (v, idx) { + return makeSeriesTaskProgress(idx); + }) + : singleSeriesTaskProgress; +} + +var singleSeriesTaskProgress = makeSeriesTaskProgress(0); + +function makeSeriesTaskProgress(resetDefineIdx) { + return function (params, context) { + var data = context.data; + var resetDefine = context.resetDefines[resetDefineIdx]; + + if (resetDefine && resetDefine.dataEach) { + for (var i = params.start; i < params.end; i++) { + resetDefine.dataEach(data, i); + } + } + else if (resetDefine && resetDefine.progress) { + resetDefine.progress(params, data); + } + }; +} + +function seriesTaskCount(context) { + return context.data.count(); +} + +function pipe(scheduler, seriesModel, task) { + var pipelineId = seriesModel.uid; + var pipeline = scheduler._pipelineMap.get(pipelineId); + !pipeline.head && (pipeline.head = task); + pipeline.tail && pipeline.tail.pipe(task); + pipeline.tail = task; + task.__idxInPipeline = pipeline.count++; + task.__pipeline = pipeline; +} + +Scheduler.wrapStageHandler = function (stageHandler, visualType) { + if (isFunction$1(stageHandler)) { + stageHandler = { + overallReset: stageHandler, + seriesType: detectSeriseType(stageHandler) + }; + } + + stageHandler.uid = getUID('stageHandler'); + visualType && (stageHandler.visualType = visualType); + + return stageHandler; +}; + + + +/** + * Only some legacy stage handlers (usually in echarts extensions) are pure function. + * To ensure that they can work normally, they should work in block mode, that is, + * they should not be started util the previous tasks finished. So they cause the + * progressive rendering disabled. We try to detect the series type, to narrow down + * the block range to only the series type they concern, but not all series. + */ +function detectSeriseType(legacyFunc) { + seriesType = null; + try { + // Assume there is no async when calling `eachSeriesByType`. + legacyFunc(ecModelMock, apiMock); + } + catch (e) { + } + return seriesType; +} + +var ecModelMock = {}; +var apiMock = {}; +var seriesType; + +mockMethods(ecModelMock, GlobalModel); +mockMethods(apiMock, ExtensionAPI); +ecModelMock.eachSeriesByType = ecModelMock.eachRawSeriesByType = function (type) { + seriesType = type; +}; +ecModelMock.eachComponent = function (cond) { + if (cond.mainType === 'series' && cond.subType) { + seriesType = cond.subType; + } +}; + +function mockMethods(target, Clz) { + for (var name in Clz.prototype) { + // Do not use hasOwnProperty + target[name] = noop; + } +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var colorAll = ['#37A2DA', '#32C5E9', '#67E0E3', '#9FE6B8', '#FFDB5C','#ff9f7f', '#fb7293', '#E062AE', '#E690D1', '#e7bcf3', '#9d96f5', '#8378EA', '#96BFFF']; + +var lightTheme = { + + color: colorAll, + + colorLayer: [ + ['#37A2DA', '#ffd85c', '#fd7b5f'], + ['#37A2DA', '#67E0E3', '#FFDB5C', '#ff9f7f', '#E062AE', '#9d96f5'], + ['#37A2DA', '#32C5E9', '#9FE6B8', '#FFDB5C', '#ff9f7f', '#fb7293', '#e7bcf3', '#8378EA', '#96BFFF'], + colorAll + ] +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var contrastColor = '#eee'; +var axisCommon = function () { + return { + axisLine: { + lineStyle: { + color: contrastColor + } + }, + axisTick: { + lineStyle: { + color: contrastColor + } + }, + axisLabel: { + textStyle: { + color: contrastColor + } + }, + splitLine: { + lineStyle: { + type: 'dashed', + color: '#aaa' + } + }, + splitArea: { + areaStyle: { + color: contrastColor + } + } + }; +}; + +var colorPalette = ['#dd6b66','#759aa0','#e69d87','#8dc1a9','#ea7e53','#eedd78','#73a373','#73b9bc','#7289ab', '#91ca8c','#f49f42']; +var theme = { + color: colorPalette, + backgroundColor: '#333', + tooltip: { + axisPointer: { + lineStyle: { + color: contrastColor + }, + crossStyle: { + color: contrastColor + } + } + }, + legend: { + textStyle: { + color: contrastColor + } + }, + textStyle: { + color: contrastColor + }, + title: { + textStyle: { + color: contrastColor + } + }, + toolbox: { + iconStyle: { + normal: { + borderColor: contrastColor + } + } + }, + dataZoom: { + textStyle: { + color: contrastColor + } + }, + visualMap: { + textStyle: { + color: contrastColor + } + }, + timeline: { + lineStyle: { + color: contrastColor + }, + itemStyle: { + normal: { + color: colorPalette[1] + } + }, + label: { + normal: { + textStyle: { + color: contrastColor + } + } + }, + controlStyle: { + normal: { + color: contrastColor, + borderColor: contrastColor + } + } + }, + timeAxis: axisCommon(), + logAxis: axisCommon(), + valueAxis: axisCommon(), + categoryAxis: axisCommon(), + + line: { + symbol: 'circle' + }, + graph: { + color: colorPalette + }, + gauge: { + title: { + textStyle: { + color: contrastColor + } + } + }, + candlestick: { + itemStyle: { + normal: { + color: '#FD1050', + color0: '#0CF49B', + borderColor: '#FD1050', + borderColor0: '#0CF49B' + } + } + } +}; +theme.categoryAxis.splitLine.show = false; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * This module is imported by echarts directly. + * + * Notice: + * Always keep this file exists for backward compatibility. + * Because before 4.1.0, dataset is an optional component, + * some users may import this module manually. + */ + +ComponentModel.extend({ + + type: 'dataset', + + /** + * @protected + */ + defaultOption: { + + // 'row', 'column' + seriesLayoutBy: SERIES_LAYOUT_BY_COLUMN, + + // null/'auto': auto detect header, see "module:echarts/data/helper/sourceHelper" + sourceHeader: null, + + dimensions: null, + + source: null + }, + + optionUpdated: function () { + detectSourceFormat(this); + } + +}); + +Component.extend({ + + type: 'dataset' + +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ +var assert = assert$1; +var each = each$1; +var isFunction = isFunction$1; +var isObject = isObject$1; +var parseClassType = ComponentModel.parseClassType; + +var version = '4.1.0'; + +var dependencies = { + zrender: '4.0.4' +}; + +var TEST_FRAME_REMAIN_TIME = 1; + +var PRIORITY_PROCESSOR_FILTER = 1000; +var PRIORITY_PROCESSOR_STATISTIC = 5000; + +var PRIORITY_VISUAL_LAYOUT = 1000; +var PRIORITY_VISUAL_GLOBAL = 2000; +var PRIORITY_VISUAL_CHART = 3000; +var PRIORITY_VISUAL_COMPONENT = 4000; +// FIXME +// necessary? +var PRIORITY_VISUAL_BRUSH = 5000; + +var PRIORITY = { + PROCESSOR: { + FILTER: PRIORITY_PROCESSOR_FILTER, + STATISTIC: PRIORITY_PROCESSOR_STATISTIC + }, + VISUAL: { + LAYOUT: PRIORITY_VISUAL_LAYOUT, + GLOBAL: PRIORITY_VISUAL_GLOBAL, + CHART: PRIORITY_VISUAL_CHART, + COMPONENT: PRIORITY_VISUAL_COMPONENT, + BRUSH: PRIORITY_VISUAL_BRUSH + } +}; + +// Main process have three entries: `setOption`, `dispatchAction` and `resize`, +// where they must not be invoked nestedly, except the only case: invoke +// dispatchAction with updateMethod "none" in main process. +// This flag is used to carry out this rule. +// All events will be triggered out side main process (i.e. when !this[IN_MAIN_PROCESS]). +var IN_MAIN_PROCESS = '__flagInMainProcess'; +var OPTION_UPDATED = '__optionUpdated'; +var ACTION_REG = /^[a-zA-Z0-9_]+$/; + + +function createRegisterEventWithLowercaseName(method) { + return function (eventName, handler, context) { + // Event name is all lowercase + eventName = eventName && eventName.toLowerCase(); + Eventful.prototype[method].call(this, eventName, handler, context); + }; +} + +/** + * @module echarts~MessageCenter + */ +function MessageCenter() { + Eventful.call(this); +} +MessageCenter.prototype.on = createRegisterEventWithLowercaseName('on'); +MessageCenter.prototype.off = createRegisterEventWithLowercaseName('off'); +MessageCenter.prototype.one = createRegisterEventWithLowercaseName('one'); +mixin(MessageCenter, Eventful); + +/** + * @module echarts~ECharts + */ +function ECharts(dom, theme$$1, opts) { + opts = opts || {}; + + // Get theme by name + if (typeof theme$$1 === 'string') { + theme$$1 = themeStorage[theme$$1]; + } + + /** + * @type {string} + */ + this.id; + + /** + * Group id + * @type {string} + */ + this.group; + + /** + * @type {HTMLElement} + * @private + */ + this._dom = dom; + + var defaultRenderer = 'canvas'; + if (__DEV__) { + defaultRenderer = ( + typeof window === 'undefined' ? global : window + ).__ECHARTS__DEFAULT__RENDERER__ || defaultRenderer; + } + + /** + * @type {module:zrender/ZRender} + * @private + */ + var zr = this._zr = init$1(dom, { + renderer: opts.renderer || defaultRenderer, + devicePixelRatio: opts.devicePixelRatio, + width: opts.width, + height: opts.height + }); + + /** + * Expect 60 pfs. + * @type {Function} + * @private + */ + this._throttledZrFlush = throttle(bind(zr.flush, zr), 17); + + var theme$$1 = clone(theme$$1); + theme$$1 && backwardCompat(theme$$1, true); + /** + * @type {Object} + * @private + */ + this._theme = theme$$1; + + /** + * @type {Array.<module:echarts/view/Chart>} + * @private + */ + this._chartsViews = []; + + /** + * @type {Object.<string, module:echarts/view/Chart>} + * @private + */ + this._chartsMap = {}; + + /** + * @type {Array.<module:echarts/view/Component>} + * @private + */ + this._componentsViews = []; + + /** + * @type {Object.<string, module:echarts/view/Component>} + * @private + */ + this._componentsMap = {}; + + /** + * @type {module:echarts/CoordinateSystem} + * @private + */ + this._coordSysMgr = new CoordinateSystemManager(); + + /** + * @type {module:echarts/ExtensionAPI} + * @private + */ + var api = this._api = createExtensionAPI(this); + + // Sort on demand + function prioritySortFunc(a, b) { + return a.__prio - b.__prio; + } + sort(visualFuncs, prioritySortFunc); + sort(dataProcessorFuncs, prioritySortFunc); + + /** + * @type {module:echarts/stream/Scheduler} + */ + this._scheduler = new Scheduler(this, api, dataProcessorFuncs, visualFuncs); + + Eventful.call(this); + + /** + * @type {module:echarts~MessageCenter} + * @private + */ + this._messageCenter = new MessageCenter(); + + // Init mouse events + this._initEvents(); + + // In case some people write `window.onresize = chart.resize` + this.resize = bind(this.resize, this); + + // Can't dispatch action during rendering procedure + this._pendingActions = []; + + zr.animation.on('frame', this._onframe, this); + + bindRenderedEvent(zr, this); + + // ECharts instance can be used as value. + setAsPrimitive(this); +} + +var echartsProto = ECharts.prototype; + +echartsProto._onframe = function () { + if (this._disposed) { + return; + } + + var scheduler = this._scheduler; + + // Lazy update + if (this[OPTION_UPDATED]) { + var silent = this[OPTION_UPDATED].silent; + + this[IN_MAIN_PROCESS] = true; + + prepare(this); + updateMethods.update.call(this); + + this[IN_MAIN_PROCESS] = false; + + this[OPTION_UPDATED] = false; + + flushPendingActions.call(this, silent); + + triggerUpdatedEvent.call(this, silent); + } + // Avoid do both lazy update and progress in one frame. + else if (scheduler.unfinished) { + // Stream progress. + var remainTime = TEST_FRAME_REMAIN_TIME; + var ecModel = this._model; + var api = this._api; + scheduler.unfinished = false; + do { + var startTime = +new Date(); + + scheduler.performSeriesTasks(ecModel); + + // Currently dataProcessorFuncs do not check threshold. + scheduler.performDataProcessorTasks(ecModel); + + updateStreamModes(this, ecModel); + + // Do not update coordinate system here. Because that coord system update in + // each frame is not a good user experience. So we follow the rule that + // the extent of the coordinate system is determin in the first frame (the + // frame is executed immedietely after task reset. + // this._coordSysMgr.update(ecModel, api); + + // console.log('--- ec frame visual ---', remainTime); + scheduler.performVisualTasks(ecModel); + + renderSeries(this, this._model, api, 'remain'); + + remainTime -= (+new Date() - startTime); + } + while (remainTime > 0 && scheduler.unfinished); + + // Call flush explicitly for trigger finished event. + if (!scheduler.unfinished) { + this._zr.flush(); + } + // Else, zr flushing be ensue within the same frame, + // because zr flushing is after onframe event. + } +}; + +/** + * @return {HTMLElement} + */ +echartsProto.getDom = function () { + return this._dom; +}; + +/** + * @return {module:zrender~ZRender} + */ +echartsProto.getZr = function () { + return this._zr; +}; + +/** + * Usage: + * chart.setOption(option, notMerge, lazyUpdate); + * chart.setOption(option, { + * notMerge: ..., + * lazyUpdate: ..., + * silent: ... + * }); + * + * @param {Object} option + * @param {Object|boolean} [opts] opts or notMerge. + * @param {boolean} [opts.notMerge=false] + * @param {boolean} [opts.lazyUpdate=false] Useful when setOption frequently. + */ +echartsProto.setOption = function (option, notMerge, lazyUpdate) { + if (__DEV__) { + assert(!this[IN_MAIN_PROCESS], '`setOption` should not be called during main process.'); + } + + var silent; + if (isObject(notMerge)) { + lazyUpdate = notMerge.lazyUpdate; + silent = notMerge.silent; + notMerge = notMerge.notMerge; + } + + this[IN_MAIN_PROCESS] = true; + + if (!this._model || notMerge) { + var optionManager = new OptionManager(this._api); + var theme$$1 = this._theme; + var ecModel = this._model = new GlobalModel(null, null, theme$$1, optionManager); + ecModel.scheduler = this._scheduler; + ecModel.init(null, null, theme$$1, optionManager); + } + + this._model.setOption(option, optionPreprocessorFuncs); + + if (lazyUpdate) { + this[OPTION_UPDATED] = {silent: silent}; + this[IN_MAIN_PROCESS] = false; + } + else { + prepare(this); + + updateMethods.update.call(this); + + // Ensure zr refresh sychronously, and then pixel in canvas can be + // fetched after `setOption`. + this._zr.flush(); + + this[OPTION_UPDATED] = false; + this[IN_MAIN_PROCESS] = false; + + flushPendingActions.call(this, silent); + triggerUpdatedEvent.call(this, silent); + } +}; + +/** + * @DEPRECATED + */ +echartsProto.setTheme = function () { + console.log('ECharts#setTheme() is DEPRECATED in ECharts 3.0'); +}; + +/** + * @return {module:echarts/model/Global} + */ +echartsProto.getModel = function () { + return this._model; +}; + +/** + * @return {Object} + */ +echartsProto.getOption = function () { + return this._model && this._model.getOption(); +}; + +/** + * @return {number} + */ +echartsProto.getWidth = function () { + return this._zr.getWidth(); +}; + +/** + * @return {number} + */ +echartsProto.getHeight = function () { + return this._zr.getHeight(); +}; + +/** + * @return {number} + */ +echartsProto.getDevicePixelRatio = function () { + return this._zr.painter.dpr || window.devicePixelRatio || 1; +}; + +/** + * Get canvas which has all thing rendered + * @param {Object} opts + * @param {string} [opts.backgroundColor] + * @return {string} + */ +echartsProto.getRenderedCanvas = function (opts) { + if (!env$1.canvasSupported) { + return; + } + opts = opts || {}; + opts.pixelRatio = opts.pixelRatio || 1; + opts.backgroundColor = opts.backgroundColor + || this._model.get('backgroundColor'); + var zr = this._zr; + // var list = zr.storage.getDisplayList(); + // Stop animations + // Never works before in init animation, so remove it. + // zrUtil.each(list, function (el) { + // el.stopAnimation(true); + // }); + return zr.painter.getRenderedCanvas(opts); +}; + +/** + * Get svg data url + * @return {string} + */ +echartsProto.getSvgDataUrl = function () { + if (!env$1.svgSupported) { + return; + } + + var zr = this._zr; + var list = zr.storage.getDisplayList(); + // Stop animations + each$1(list, function (el) { + el.stopAnimation(true); + }); + + return zr.painter.pathToDataUrl(); +}; + +/** + * @return {string} + * @param {Object} opts + * @param {string} [opts.type='png'] + * @param {string} [opts.pixelRatio=1] + * @param {string} [opts.backgroundColor] + * @param {string} [opts.excludeComponents] + */ +echartsProto.getDataURL = function (opts) { + opts = opts || {}; + var excludeComponents = opts.excludeComponents; + var ecModel = this._model; + var excludesComponentViews = []; + var self = this; + + each(excludeComponents, function (componentType) { + ecModel.eachComponent({ + mainType: componentType + }, function (component) { + var view = self._componentsMap[component.__viewId]; + if (!view.group.ignore) { + excludesComponentViews.push(view); + view.group.ignore = true; + } + }); + }); + + var url = this._zr.painter.getType() === 'svg' + ? this.getSvgDataUrl() + : this.getRenderedCanvas(opts).toDataURL( + 'image/' + (opts && opts.type || 'png') + ); + + each(excludesComponentViews, function (view) { + view.group.ignore = false; + }); + + return url; +}; + + +/** + * @return {string} + * @param {Object} opts + * @param {string} [opts.type='png'] + * @param {string} [opts.pixelRatio=1] + * @param {string} [opts.backgroundColor] + */ +echartsProto.getConnectedDataURL = function (opts) { + if (!env$1.canvasSupported) { + return; + } + var groupId = this.group; + var mathMin = Math.min; + var mathMax = Math.max; + var MAX_NUMBER = Infinity; + if (connectedGroups[groupId]) { + var left = MAX_NUMBER; + var top = MAX_NUMBER; + var right = -MAX_NUMBER; + var bottom = -MAX_NUMBER; + var canvasList = []; + var dpr = (opts && opts.pixelRatio) || 1; + + each$1(instances, function (chart, id) { + if (chart.group === groupId) { + var canvas = chart.getRenderedCanvas( + clone(opts) + ); + var boundingRect = chart.getDom().getBoundingClientRect(); + left = mathMin(boundingRect.left, left); + top = mathMin(boundingRect.top, top); + right = mathMax(boundingRect.right, right); + bottom = mathMax(boundingRect.bottom, bottom); + canvasList.push({ + dom: canvas, + left: boundingRect.left, + top: boundingRect.top + }); + } + }); + + left *= dpr; + top *= dpr; + right *= dpr; + bottom *= dpr; + var width = right - left; + var height = bottom - top; + var targetCanvas = createCanvas(); + targetCanvas.width = width; + targetCanvas.height = height; + var zr = init$1(targetCanvas); + + each(canvasList, function (item) { + var img = new ZImage({ + style: { + x: item.left * dpr - left, + y: item.top * dpr - top, + image: item.dom + } + }); + zr.add(img); + }); + zr.refreshImmediately(); + + return targetCanvas.toDataURL('image/' + (opts && opts.type || 'png')); + } + else { + return this.getDataURL(opts); + } +}; + +/** + * Convert from logical coordinate system to pixel coordinate system. + * See CoordinateSystem#convertToPixel. + * @param {string|Object} finder + * If string, e.g., 'geo', means {geoIndex: 0}. + * If Object, could contain some of these properties below: + * { + * seriesIndex / seriesId / seriesName, + * geoIndex / geoId, geoName, + * bmapIndex / bmapId / bmapName, + * xAxisIndex / xAxisId / xAxisName, + * yAxisIndex / yAxisId / yAxisName, + * gridIndex / gridId / gridName, + * ... (can be extended) + * } + * @param {Array|number} value + * @return {Array|number} result + */ +echartsProto.convertToPixel = curry(doConvertPixel, 'convertToPixel'); + +/** + * Convert from pixel coordinate system to logical coordinate system. + * See CoordinateSystem#convertFromPixel. + * @param {string|Object} finder + * If string, e.g., 'geo', means {geoIndex: 0}. + * If Object, could contain some of these properties below: + * { + * seriesIndex / seriesId / seriesName, + * geoIndex / geoId / geoName, + * bmapIndex / bmapId / bmapName, + * xAxisIndex / xAxisId / xAxisName, + * yAxisIndex / yAxisId / yAxisName + * gridIndex / gridId / gridName, + * ... (can be extended) + * } + * @param {Array|number} value + * @return {Array|number} result + */ +echartsProto.convertFromPixel = curry(doConvertPixel, 'convertFromPixel'); + +function doConvertPixel(methodName, finder, value) { + var ecModel = this._model; + var coordSysList = this._coordSysMgr.getCoordinateSystems(); + var result; + + finder = parseFinder(ecModel, finder); + + for (var i = 0; i < coordSysList.length; i++) { + var coordSys = coordSysList[i]; + if (coordSys[methodName] + && (result = coordSys[methodName](ecModel, finder, value)) != null + ) { + return result; + } + } + + if (__DEV__) { + console.warn( + 'No coordinate system that supports ' + methodName + ' found by the given finder.' + ); + } +} + +/** + * Is the specified coordinate systems or components contain the given pixel point. + * @param {string|Object} finder + * If string, e.g., 'geo', means {geoIndex: 0}. + * If Object, could contain some of these properties below: + * { + * seriesIndex / seriesId / seriesName, + * geoIndex / geoId / geoName, + * bmapIndex / bmapId / bmapName, + * xAxisIndex / xAxisId / xAxisName, + * yAxisIndex / yAxisId / yAxisName, + * gridIndex / gridId / gridName, + * ... (can be extended) + * } + * @param {Array|number} value + * @return {boolean} result + */ +echartsProto.containPixel = function (finder, value) { + var ecModel = this._model; + var result; + + finder = parseFinder(ecModel, finder); + + each$1(finder, function (models, key) { + key.indexOf('Models') >= 0 && each$1(models, function (model) { + var coordSys = model.coordinateSystem; + if (coordSys && coordSys.containPoint) { + result |= !!coordSys.containPoint(value); + } + else if (key === 'seriesModels') { + var view = this._chartsMap[model.__viewId]; + if (view && view.containPoint) { + result |= view.containPoint(value, model); + } + else { + if (__DEV__) { + console.warn(key + ': ' + (view + ? 'The found component do not support containPoint.' + : 'No view mapping to the found component.' + )); + } + } + } + else { + if (__DEV__) { + console.warn(key + ': containPoint is not supported'); + } + } + }, this); + }, this); + + return !!result; +}; + +/** + * Get visual from series or data. + * @param {string|Object} finder + * If string, e.g., 'series', means {seriesIndex: 0}. + * If Object, could contain some of these properties below: + * { + * seriesIndex / seriesId / seriesName, + * dataIndex / dataIndexInside + * } + * If dataIndex is not specified, series visual will be fetched, + * but not data item visual. + * If all of seriesIndex, seriesId, seriesName are not specified, + * visual will be fetched from first series. + * @param {string} visualType 'color', 'symbol', 'symbolSize' + */ +echartsProto.getVisual = function (finder, visualType) { + var ecModel = this._model; + + finder = parseFinder(ecModel, finder, {defaultMainType: 'series'}); + + var seriesModel = finder.seriesModel; + + if (__DEV__) { + if (!seriesModel) { + console.warn('There is no specified seires model'); + } + } + + var data = seriesModel.getData(); + + var dataIndexInside = finder.hasOwnProperty('dataIndexInside') + ? finder.dataIndexInside + : finder.hasOwnProperty('dataIndex') + ? data.indexOfRawIndex(finder.dataIndex) + : null; + + return dataIndexInside != null + ? data.getItemVisual(dataIndexInside, visualType) + : data.getVisual(visualType); +}; + +/** + * Get view of corresponding component model + * @param {module:echarts/model/Component} componentModel + * @return {module:echarts/view/Component} + */ +echartsProto.getViewOfComponentModel = function (componentModel) { + return this._componentsMap[componentModel.__viewId]; +}; + +/** + * Get view of corresponding series model + * @param {module:echarts/model/Series} seriesModel + * @return {module:echarts/view/Chart} + */ +echartsProto.getViewOfSeriesModel = function (seriesModel) { + return this._chartsMap[seriesModel.__viewId]; +}; + +var updateMethods = { + + prepareAndUpdate: function (payload) { + prepare(this); + updateMethods.update.call(this, payload); + }, + + /** + * @param {Object} payload + * @private + */ + update: function (payload) { + // console.profile && console.profile('update'); + + var ecModel = this._model; + var api = this._api; + var zr = this._zr; + var coordSysMgr = this._coordSysMgr; + var scheduler = this._scheduler; + + // update before setOption + if (!ecModel) { + return; + } + + scheduler.restoreData(ecModel, payload); + + scheduler.performSeriesTasks(ecModel); + + // TODO + // Save total ecModel here for undo/redo (after restoring data and before processing data). + // Undo (restoration of total ecModel) can be carried out in 'action' or outside API call. + + // Create new coordinate system each update + // In LineView may save the old coordinate system and use it to get the orignal point + coordSysMgr.create(ecModel, api); + + scheduler.performDataProcessorTasks(ecModel, payload); + + // Current stream render is not supported in data process. So we can update + // stream modes after data processing, where the filtered data is used to + // deteming whether use progressive rendering. + updateStreamModes(this, ecModel); + + // We update stream modes before coordinate system updated, then the modes info + // can be fetched when coord sys updating (consider the barGrid extent fix). But + // the drawback is the full coord info can not be fetched. Fortunately this full + // coord is not requied in stream mode updater currently. + coordSysMgr.update(ecModel, api); + + clearColorPalette(ecModel); + scheduler.performVisualTasks(ecModel, payload); + + render(this, ecModel, api, payload); + + // Set background + var backgroundColor = ecModel.get('backgroundColor') || 'transparent'; + + // In IE8 + if (!env$1.canvasSupported) { + var colorArr = parse(backgroundColor); + backgroundColor = stringify(colorArr, 'rgb'); + if (colorArr[3] === 0) { + backgroundColor = 'transparent'; + } + } + else { + zr.setBackgroundColor(backgroundColor); + } + + performPostUpdateFuncs(ecModel, api); + + // console.profile && console.profileEnd('update'); + }, + + /** + * @param {Object} payload + * @private + */ + updateTransform: function (payload) { + var ecModel = this._model; + var ecIns = this; + var api = this._api; + + // update before setOption + if (!ecModel) { + return; + } + + // ChartView.markUpdateMethod(payload, 'updateTransform'); + + var componentDirtyList = []; + ecModel.eachComponent(function (componentType, componentModel) { + var componentView = ecIns.getViewOfComponentModel(componentModel); + if (componentView && componentView.__alive) { + if (componentView.updateTransform) { + var result = componentView.updateTransform(componentModel, ecModel, api, payload); + result && result.update && componentDirtyList.push(componentView); + } + else { + componentDirtyList.push(componentView); + } + } + }); + + var seriesDirtyMap = createHashMap(); + ecModel.eachSeries(function (seriesModel) { + var chartView = ecIns._chartsMap[seriesModel.__viewId]; + if (chartView.updateTransform) { + var result = chartView.updateTransform(seriesModel, ecModel, api, payload); + result && result.update && seriesDirtyMap.set(seriesModel.uid, 1); + } + else { + seriesDirtyMap.set(seriesModel.uid, 1); + } + }); + + clearColorPalette(ecModel); + // Keep pipe to the exist pipeline because it depends on the render task of the full pipeline. + // this._scheduler.performVisualTasks(ecModel, payload, 'layout', true); + this._scheduler.performVisualTasks( + ecModel, payload, {setDirty: true, dirtyMap: seriesDirtyMap} + ); + + // Currently, not call render of components. Geo render cost a lot. + // renderComponents(ecIns, ecModel, api, payload, componentDirtyList); + renderSeries(ecIns, ecModel, api, payload, seriesDirtyMap); + + performPostUpdateFuncs(ecModel, this._api); + }, + + /** + * @param {Object} payload + * @private + */ + updateView: function (payload) { + var ecModel = this._model; + + // update before setOption + if (!ecModel) { + return; + } + + Chart.markUpdateMethod(payload, 'updateView'); + + clearColorPalette(ecModel); + + // Keep pipe to the exist pipeline because it depends on the render task of the full pipeline. + this._scheduler.performVisualTasks(ecModel, payload, {setDirty: true}); + + render(this, this._model, this._api, payload); + + performPostUpdateFuncs(ecModel, this._api); + }, + + /** + * @param {Object} payload + * @private + */ + updateVisual: function (payload) { + updateMethods.update.call(this, payload); + + // var ecModel = this._model; + + // // update before setOption + // if (!ecModel) { + // return; + // } + + // ChartView.markUpdateMethod(payload, 'updateVisual'); + + // clearColorPalette(ecModel); + + // // Keep pipe to the exist pipeline because it depends on the render task of the full pipeline. + // this._scheduler.performVisualTasks(ecModel, payload, {visualType: 'visual', setDirty: true}); + + // render(this, this._model, this._api, payload); + + // performPostUpdateFuncs(ecModel, this._api); + }, + + /** + * @param {Object} payload + * @private + */ + updateLayout: function (payload) { + updateMethods.update.call(this, payload); + + // var ecModel = this._model; + + // // update before setOption + // if (!ecModel) { + // return; + // } + + // ChartView.markUpdateMethod(payload, 'updateLayout'); + + // // Keep pipe to the exist pipeline because it depends on the render task of the full pipeline. + // // this._scheduler.performVisualTasks(ecModel, payload, 'layout', true); + // this._scheduler.performVisualTasks(ecModel, payload, {setDirty: true}); + + // render(this, this._model, this._api, payload); + + // performPostUpdateFuncs(ecModel, this._api); + } +}; + +function prepare(ecIns) { + var ecModel = ecIns._model; + var scheduler = ecIns._scheduler; + + scheduler.restorePipelines(ecModel); + + scheduler.prepareStageTasks(); + + prepareView(ecIns, 'component', ecModel, scheduler); + + prepareView(ecIns, 'chart', ecModel, scheduler); + + scheduler.plan(); +} + +/** + * @private + */ +function updateDirectly(ecIns, method, payload, mainType, subType) { + var ecModel = ecIns._model; + + // broadcast + if (!mainType) { + // FIXME + // Chart will not be update directly here, except set dirty. + // But there is no such scenario now. + each(ecIns._componentsViews.concat(ecIns._chartsViews), callView); + return; + } + + var query = {}; + query[mainType + 'Id'] = payload[mainType + 'Id']; + query[mainType + 'Index'] = payload[mainType + 'Index']; + query[mainType + 'Name'] = payload[mainType + 'Name']; + + var condition = {mainType: mainType, query: query}; + subType && (condition.subType = subType); // subType may be '' by parseClassType; + + var excludeSeriesId = payload.excludeSeriesId; + if (excludeSeriesId != null) { + excludeSeriesId = createHashMap(normalizeToArray(excludeSeriesId)); + } + + // If dispatchAction before setOption, do nothing. + ecModel && ecModel.eachComponent(condition, function (model) { + if (!excludeSeriesId || excludeSeriesId.get(model.id) == null) { + callView(ecIns[ + mainType === 'series' ? '_chartsMap' : '_componentsMap' + ][model.__viewId]); + } + }, ecIns); + + function callView(view) { + view && view.__alive && view[method] && view[method]( + view.__model, ecModel, ecIns._api, payload + ); + } +} + +/** + * Resize the chart + * @param {Object} opts + * @param {number} [opts.width] Can be 'auto' (the same as null/undefined) + * @param {number} [opts.height] Can be 'auto' (the same as null/undefined) + * @param {boolean} [opts.silent=false] + */ +echartsProto.resize = function (opts) { + if (__DEV__) { + assert(!this[IN_MAIN_PROCESS], '`resize` should not be called during main process.'); + } + + this._zr.resize(opts); + + var ecModel = this._model; + + // Resize loading effect + this._loadingFX && this._loadingFX.resize(); + + if (!ecModel) { + return; + } + + var optionChanged = ecModel.resetOption('media'); + + var silent = opts && opts.silent; + + this[IN_MAIN_PROCESS] = true; + + optionChanged && prepare(this); + updateMethods.update.call(this); + + this[IN_MAIN_PROCESS] = false; + + flushPendingActions.call(this, silent); + + triggerUpdatedEvent.call(this, silent); +}; + +function updateStreamModes(ecIns, ecModel) { + var chartsMap = ecIns._chartsMap; + var scheduler = ecIns._scheduler; + ecModel.eachSeries(function (seriesModel) { + scheduler.updateStreamModes(seriesModel, chartsMap[seriesModel.__viewId]); + }); +} + +/** + * Show loading effect + * @param {string} [name='default'] + * @param {Object} [cfg] + */ +echartsProto.showLoading = function (name, cfg) { + if (isObject(name)) { + cfg = name; + name = ''; + } + name = name || 'default'; + + this.hideLoading(); + if (!loadingEffects[name]) { + if (__DEV__) { + console.warn('Loading effects ' + name + ' not exists.'); + } + return; + } + var el = loadingEffects[name](this._api, cfg); + var zr = this._zr; + this._loadingFX = el; + + zr.add(el); +}; + +/** + * Hide loading effect + */ +echartsProto.hideLoading = function () { + this._loadingFX && this._zr.remove(this._loadingFX); + this._loadingFX = null; +}; + +/** + * @param {Object} eventObj + * @return {Object} + */ +echartsProto.makeActionFromEvent = function (eventObj) { + var payload = extend({}, eventObj); + payload.type = eventActionMap[eventObj.type]; + return payload; +}; + +/** + * @pubilc + * @param {Object} payload + * @param {string} [payload.type] Action type + * @param {Object|boolean} [opt] If pass boolean, means opt.silent + * @param {boolean} [opt.silent=false] Whether trigger events. + * @param {boolean} [opt.flush=undefined] + * true: Flush immediately, and then pixel in canvas can be fetched + * immediately. Caution: it might affect performance. + * false: Not not flush. + * undefined: Auto decide whether perform flush. + */ +echartsProto.dispatchAction = function (payload, opt) { + if (!isObject(opt)) { + opt = {silent: !!opt}; + } + + if (!actions[payload.type]) { + return; + } + + // Avoid dispatch action before setOption. Especially in `connect`. + if (!this._model) { + return; + } + + // May dispatchAction in rendering procedure + if (this[IN_MAIN_PROCESS]) { + this._pendingActions.push(payload); + return; + } + + doDispatchAction.call(this, payload, opt.silent); + + if (opt.flush) { + this._zr.flush(true); + } + else if (opt.flush !== false && env$1.browser.weChat) { + // In WeChat embeded browser, `requestAnimationFrame` and `setInterval` + // hang when sliding page (on touch event), which cause that zr does not + // refresh util user interaction finished, which is not expected. + // But `dispatchAction` may be called too frequently when pan on touch + // screen, which impacts performance if do not throttle them. + this._throttledZrFlush(); + } + + flushPendingActions.call(this, opt.silent); + + triggerUpdatedEvent.call(this, opt.silent); +}; + +function doDispatchAction(payload, silent) { + var payloadType = payload.type; + var escapeConnect = payload.escapeConnect; + var actionWrap = actions[payloadType]; + var actionInfo = actionWrap.actionInfo; + + var cptType = (actionInfo.update || 'update').split(':'); + var updateMethod = cptType.pop(); + cptType = cptType[0] != null && parseClassType(cptType[0]); + + this[IN_MAIN_PROCESS] = true; + + var payloads = [payload]; + var batched = false; + // Batch action + if (payload.batch) { + batched = true; + payloads = map(payload.batch, function (item) { + item = defaults(extend({}, item), payload); + item.batch = null; + return item; + }); + } + + var eventObjBatch = []; + var eventObj; + var isHighDown = payloadType === 'highlight' || payloadType === 'downplay'; + + each(payloads, function (batchItem) { + // Action can specify the event by return it. + eventObj = actionWrap.action(batchItem, this._model, this._api); + // Emit event outside + eventObj = eventObj || extend({}, batchItem); + // Convert type to eventType + eventObj.type = actionInfo.event || eventObj.type; + eventObjBatch.push(eventObj); + + // light update does not perform data process, layout and visual. + if (isHighDown) { + // method, payload, mainType, subType + updateDirectly(this, updateMethod, batchItem, 'series'); + } + else if (cptType) { + updateDirectly(this, updateMethod, batchItem, cptType.main, cptType.sub); + } + }, this); + + if (updateMethod !== 'none' && !isHighDown && !cptType) { + // Still dirty + if (this[OPTION_UPDATED]) { + // FIXME Pass payload ? + prepare(this); + updateMethods.update.call(this, payload); + this[OPTION_UPDATED] = false; + } + else { + updateMethods[updateMethod].call(this, payload); + } + } + + // Follow the rule of action batch + if (batched) { + eventObj = { + type: actionInfo.event || payloadType, + escapeConnect: escapeConnect, + batch: eventObjBatch + }; + } + else { + eventObj = eventObjBatch[0]; + } + + this[IN_MAIN_PROCESS] = false; + + !silent && this._messageCenter.trigger(eventObj.type, eventObj); +} + +function flushPendingActions(silent) { + var pendingActions = this._pendingActions; + while (pendingActions.length) { + var payload = pendingActions.shift(); + doDispatchAction.call(this, payload, silent); + } +} + +function triggerUpdatedEvent(silent) { + !silent && this.trigger('updated'); +} + +/** + * Event `rendered` is triggered when zr + * rendered. It is useful for realtime + * snapshot (reflect animation). + * + * Event `finished` is triggered when: + * (1) zrender rendering finished. + * (2) initial animation finished. + * (3) progressive rendering finished. + * (4) no pending action. + * (5) no delayed setOption needs to be processed. + */ +function bindRenderedEvent(zr, ecIns) { + zr.on('rendered', function () { + + ecIns.trigger('rendered'); + + // The `finished` event should not be triggered repeatly, + // so it should only be triggered when rendering indeed happend + // in zrender. (Consider the case that dipatchAction is keep + // triggering when mouse move). + if ( + // Although zr is dirty if initial animation is not finished + // and this checking is called on frame, we also check + // animation finished for robustness. + zr.animation.isFinished() + && !ecIns[OPTION_UPDATED] + && !ecIns._scheduler.unfinished + && !ecIns._pendingActions.length + ) { + ecIns.trigger('finished'); + } + }); +} + +/** + * @param {Object} params + * @param {number} params.seriesIndex + * @param {Array|TypedArray} params.data + */ +echartsProto.appendData = function (params) { + var seriesIndex = params.seriesIndex; + var ecModel = this.getModel(); + var seriesModel = ecModel.getSeriesByIndex(seriesIndex); + + if (__DEV__) { + assert(params.data && seriesModel); + } + + seriesModel.appendData(params); + + // Note: `appendData` does not support that update extent of coordinate + // system, util some scenario require that. In the expected usage of + // `appendData`, the initial extent of coordinate system should better + // be fixed by axis `min`/`max` setting or initial data, otherwise if + // the extent changed while `appendData`, the location of the painted + // graphic elements have to be changed, which make the usage of + // `appendData` meaningless. + + this._scheduler.unfinished = true; +}; + +/** + * Register event + * @method + */ +echartsProto.on = createRegisterEventWithLowercaseName('on'); +echartsProto.off = createRegisterEventWithLowercaseName('off'); +echartsProto.one = createRegisterEventWithLowercaseName('one'); + +/** + * Prepare view instances of charts and components + * @param {module:echarts/model/Global} ecModel + * @private + */ +function prepareView(ecIns, type, ecModel, scheduler) { + var isComponent = type === 'component'; + var viewList = isComponent ? ecIns._componentsViews : ecIns._chartsViews; + var viewMap = isComponent ? ecIns._componentsMap : ecIns._chartsMap; + var zr = ecIns._zr; + var api = ecIns._api; + + for (var i = 0; i < viewList.length; i++) { + viewList[i].__alive = false; + } + + isComponent + ? ecModel.eachComponent(function (componentType, model) { + componentType !== 'series' && doPrepare(model); + }) + : ecModel.eachSeries(doPrepare); + + function doPrepare(model) { + // Consider: id same and type changed. + var viewId = '_ec_' + model.id + '_' + model.type; + var view = viewMap[viewId]; + if (!view) { + var classType = parseClassType(model.type); + var Clazz = isComponent + ? Component.getClass(classType.main, classType.sub) + : Chart.getClass(classType.sub); + + if (__DEV__) { + assert(Clazz, classType.sub + ' does not exist.'); + } + + view = new Clazz(); + view.init(ecModel, api); + viewMap[viewId] = view; + viewList.push(view); + zr.add(view.group); + } + + model.__viewId = view.__id = viewId; + view.__alive = true; + view.__model = model; + view.group.__ecComponentInfo = { + mainType: model.mainType, + index: model.componentIndex + }; + !isComponent && scheduler.prepareView(view, model, ecModel, api); + } + + for (var i = 0; i < viewList.length;) { + var view = viewList[i]; + if (!view.__alive) { + !isComponent && view.renderTask.dispose(); + zr.remove(view.group); + view.dispose(ecModel, api); + viewList.splice(i, 1); + delete viewMap[view.__id]; + view.__id = view.group.__ecComponentInfo = null; + } + else { + i++; + } + } +} + +// /** +// * Encode visual infomation from data after data processing +// * +// * @param {module:echarts/model/Global} ecModel +// * @param {object} layout +// * @param {boolean} [layoutFilter] `true`: only layout, +// * `false`: only not layout, +// * `null`/`undefined`: all. +// * @param {string} taskBaseTag +// * @private +// */ +// function startVisualEncoding(ecIns, ecModel, api, payload, layoutFilter) { +// each(visualFuncs, function (visual, index) { +// var isLayout = visual.isLayout; +// if (layoutFilter == null +// || (layoutFilter === false && !isLayout) +// || (layoutFilter === true && isLayout) +// ) { +// visual.func(ecModel, api, payload); +// } +// }); +// } + +function clearColorPalette(ecModel) { + ecModel.clearColorPalette(); + ecModel.eachSeries(function (seriesModel) { + seriesModel.clearColorPalette(); + }); +} + +function render(ecIns, ecModel, api, payload) { + + renderComponents(ecIns, ecModel, api, payload); + + each(ecIns._chartsViews, function (chart) { + chart.__alive = false; + }); + + renderSeries(ecIns, ecModel, api, payload); + + // Remove groups of unrendered charts + each(ecIns._chartsViews, function (chart) { + if (!chart.__alive) { + chart.remove(ecModel, api); + } + }); +} + +function renderComponents(ecIns, ecModel, api, payload, dirtyList) { + each(dirtyList || ecIns._componentsViews, function (componentView) { + var componentModel = componentView.__model; + componentView.render(componentModel, ecModel, api, payload); + + updateZ(componentModel, componentView); + }); +} + +/** + * Render each chart and component + * @private + */ +function renderSeries(ecIns, ecModel, api, payload, dirtyMap) { + // Render all charts + var scheduler = ecIns._scheduler; + var unfinished; + ecModel.eachSeries(function (seriesModel) { + var chartView = ecIns._chartsMap[seriesModel.__viewId]; + chartView.__alive = true; + + var renderTask = chartView.renderTask; + scheduler.updatePayload(renderTask, payload); + + if (dirtyMap && dirtyMap.get(seriesModel.uid)) { + renderTask.dirty(); + } + + unfinished |= renderTask.perform(scheduler.getPerformArgs(renderTask)); + + chartView.group.silent = !!seriesModel.get('silent'); + + updateZ(seriesModel, chartView); + + updateBlend(seriesModel, chartView); + }); + scheduler.unfinished |= unfinished; + + // If use hover layer + updateHoverLayerStatus(ecIns._zr, ecModel); + + // Add aria + aria(ecIns._zr.dom, ecModel); +} + +function performPostUpdateFuncs(ecModel, api) { + each(postUpdateFuncs, function (func) { + func(ecModel, api); + }); +} + + +var MOUSE_EVENT_NAMES = [ + 'click', 'dblclick', 'mouseover', 'mouseout', 'mousemove', + 'mousedown', 'mouseup', 'globalout', 'contextmenu' +]; + +/** + * @private + */ +echartsProto._initEvents = function () { + each(MOUSE_EVENT_NAMES, function (eveName) { + this._zr.on(eveName, function (e) { + var ecModel = this.getModel(); + var el = e.target; + var params; + + // no e.target when 'globalout'. + if (eveName === 'globalout') { + params = {}; + } + else if (el && el.dataIndex != null) { + var dataModel = el.dataModel || ecModel.getSeriesByIndex(el.seriesIndex); + params = dataModel && dataModel.getDataParams(el.dataIndex, el.dataType) || {}; + } + // If element has custom eventData of components + else if (el && el.eventData) { + params = extend({}, el.eventData); + } + + if (params) { + params.event = e; + params.type = eveName; + this.trigger(eveName, params); + } + + }, this); + }, this); + + each(eventActionMap, function (actionType, eventType) { + this._messageCenter.on(eventType, function (event) { + this.trigger(eventType, event); + }, this); + }, this); +}; + +/** + * @return {boolean} + */ +echartsProto.isDisposed = function () { + return this._disposed; +}; + +/** + * Clear + */ +echartsProto.clear = function () { + this.setOption({ series: [] }, true); +}; + +/** + * Dispose instance + */ +echartsProto.dispose = function () { + if (this._disposed) { + if (__DEV__) { + console.warn('Instance ' + this.id + ' has been disposed'); + } + return; + } + this._disposed = true; + + setAttribute(this.getDom(), DOM_ATTRIBUTE_KEY, ''); + + var api = this._api; + var ecModel = this._model; + + each(this._componentsViews, function (component) { + component.dispose(ecModel, api); + }); + each(this._chartsViews, function (chart) { + chart.dispose(ecModel, api); + }); + + // Dispose after all views disposed + this._zr.dispose(); + + delete instances[this.id]; +}; + +mixin(ECharts, Eventful); + +function updateHoverLayerStatus(zr, ecModel) { + var storage = zr.storage; + var elCount = 0; + storage.traverse(function (el) { + if (!el.isGroup) { + elCount++; + } + }); + if (elCount > ecModel.get('hoverLayerThreshold') && !env$1.node) { + storage.traverse(function (el) { + if (!el.isGroup) { + // Don't switch back. + el.useHoverLayer = true; + } + }); + } +} + +/** + * Update chart progressive and blend. + * @param {module:echarts/model/Series|module:echarts/model/Component} model + * @param {module:echarts/view/Component|module:echarts/view/Chart} view + */ +function updateBlend(seriesModel, chartView) { + var blendMode = seriesModel.get('blendMode') || null; + if (__DEV__) { + if (!env$1.canvasSupported && blendMode && blendMode !== 'source-over') { + console.warn('Only canvas support blendMode'); + } + } + chartView.group.traverse(function (el) { + // FIXME marker and other components + if (!el.isGroup) { + // Only set if blendMode is changed. In case element is incremental and don't wan't to rerender. + if (el.style.blend !== blendMode) { + el.setStyle('blend', blendMode); + } + } + if (el.eachPendingDisplayable) { + el.eachPendingDisplayable(function (displayable) { + displayable.setStyle('blend', blendMode); + }); + } + }); +} + +/** + * @param {module:echarts/model/Series|module:echarts/model/Component} model + * @param {module:echarts/view/Component|module:echarts/view/Chart} view + */ +function updateZ(model, view) { + var z = model.get('z'); + var zlevel = model.get('zlevel'); + // Set z and zlevel + view.group.traverse(function (el) { + if (el.type !== 'group') { + z != null && (el.z = z); + zlevel != null && (el.zlevel = zlevel); + } + }); +} + +function createExtensionAPI(ecInstance) { + var coordSysMgr = ecInstance._coordSysMgr; + return extend(new ExtensionAPI(ecInstance), { + // Inject methods + getCoordinateSystems: bind( + coordSysMgr.getCoordinateSystems, coordSysMgr + ), + getComponentByElement: function (el) { + while (el) { + var modelInfo = el.__ecComponentInfo; + if (modelInfo != null) { + return ecInstance._model.getComponent(modelInfo.mainType, modelInfo.index); + } + el = el.parent; + } + } + }); +} + +/** + * @type {Object} key: actionType. + * @inner + */ +var actions = {}; + +/** + * Map eventType to actionType + * @type {Object} + */ +var eventActionMap = {}; + +/** + * Data processor functions of each stage + * @type {Array.<Object.<string, Function>>} + * @inner + */ +var dataProcessorFuncs = []; + +/** + * @type {Array.<Function>} + * @inner + */ +var optionPreprocessorFuncs = []; + +/** + * @type {Array.<Function>} + * @inner + */ +var postUpdateFuncs = []; + +/** + * Visual encoding functions of each stage + * @type {Array.<Object.<string, Function>>} + */ +var visualFuncs = []; + +/** + * Theme storage + * @type {Object.<key, Object>} + */ +var themeStorage = {}; +/** + * Loading effects + */ +var loadingEffects = {}; + +var instances = {}; +var connectedGroups = {}; + +var idBase = new Date() - 0; +var groupIdBase = new Date() - 0; +var DOM_ATTRIBUTE_KEY = '_echarts_instance_'; + +var mapDataStores = {}; + +function enableConnect(chart) { + var STATUS_PENDING = 0; + var STATUS_UPDATING = 1; + var STATUS_UPDATED = 2; + var STATUS_KEY = '__connectUpdateStatus'; + + function updateConnectedChartsStatus(charts, status) { + for (var i = 0; i < charts.length; i++) { + var otherChart = charts[i]; + otherChart[STATUS_KEY] = status; + } + } + + each(eventActionMap, function (actionType, eventType) { + chart._messageCenter.on(eventType, function (event) { + if (connectedGroups[chart.group] && chart[STATUS_KEY] !== STATUS_PENDING) { + if (event && event.escapeConnect) { + return; + } + + var action = chart.makeActionFromEvent(event); + var otherCharts = []; + + each(instances, function (otherChart) { + if (otherChart !== chart && otherChart.group === chart.group) { + otherCharts.push(otherChart); + } + }); + + updateConnectedChartsStatus(otherCharts, STATUS_PENDING); + each(otherCharts, function (otherChart) { + if (otherChart[STATUS_KEY] !== STATUS_UPDATING) { + otherChart.dispatchAction(action); + } + }); + updateConnectedChartsStatus(otherCharts, STATUS_UPDATED); + } + }); + }); +} + +/** + * @param {HTMLElement} dom + * @param {Object} [theme] + * @param {Object} opts + * @param {number} [opts.devicePixelRatio] Use window.devicePixelRatio by default + * @param {string} [opts.renderer] Currently only 'canvas' is supported. + * @param {number} [opts.width] Use clientWidth of the input `dom` by default. + * Can be 'auto' (the same as null/undefined) + * @param {number} [opts.height] Use clientHeight of the input `dom` by default. + * Can be 'auto' (the same as null/undefined) + */ +function init(dom, theme$$1, opts) { + if (__DEV__) { + // Check version + if ((version$1.replace('.', '') - 0) < (dependencies.zrender.replace('.', '') - 0)) { + throw new Error( + 'zrender/src ' + version$1 + + ' is too old for ECharts ' + version + + '. Current version need ZRender ' + + dependencies.zrender + '+' + ); + } + + if (!dom) { + throw new Error('Initialize failed: invalid dom.'); + } + } + + var existInstance = getInstanceByDom(dom); + if (existInstance) { + if (__DEV__) { + console.warn('There is a chart instance already initialized on the dom.'); + } + return existInstance; + } + + if (__DEV__) { + if (isDom(dom) + && dom.nodeName.toUpperCase() !== 'CANVAS' + && ( + (!dom.clientWidth && (!opts || opts.width == null)) + || (!dom.clientHeight && (!opts || opts.height == null)) + ) + ) { + console.warn('Can\'t get dom width or height'); + } + } + + var chart = new ECharts(dom, theme$$1, opts); + chart.id = 'ec_' + idBase++; + instances[chart.id] = chart; + + setAttribute(dom, DOM_ATTRIBUTE_KEY, chart.id); + + enableConnect(chart); + + return chart; +} + +/** + * @return {string|Array.<module:echarts~ECharts>} groupId + */ +function connect(groupId) { + // Is array of charts + if (isArray(groupId)) { + var charts = groupId; + groupId = null; + // If any chart has group + each(charts, function (chart) { + if (chart.group != null) { + groupId = chart.group; + } + }); + groupId = groupId || ('g_' + groupIdBase++); + each(charts, function (chart) { + chart.group = groupId; + }); + } + connectedGroups[groupId] = true; + return groupId; +} + +/** + * @DEPRECATED + * @return {string} groupId + */ +function disConnect(groupId) { + connectedGroups[groupId] = false; +} + +/** + * @return {string} groupId + */ +var disconnect = disConnect; + +/** + * Dispose a chart instance + * @param {module:echarts~ECharts|HTMLDomElement|string} chart + */ +function dispose(chart) { + if (typeof chart === 'string') { + chart = instances[chart]; + } + else if (!(chart instanceof ECharts)){ + // Try to treat as dom + chart = getInstanceByDom(chart); + } + if ((chart instanceof ECharts) && !chart.isDisposed()) { + chart.dispose(); + } +} + +/** + * @param {HTMLElement} dom + * @return {echarts~ECharts} + */ +function getInstanceByDom(dom) { + return instances[getAttribute(dom, DOM_ATTRIBUTE_KEY)]; +} + +/** + * @param {string} key + * @return {echarts~ECharts} + */ +function getInstanceById(key) { + return instances[key]; +} + +/** + * Register theme + */ +function registerTheme(name, theme$$1) { + themeStorage[name] = theme$$1; +} + +/** + * Register option preprocessor + * @param {Function} preprocessorFunc + */ +function registerPreprocessor(preprocessorFunc) { + optionPreprocessorFuncs.push(preprocessorFunc); +} + +/** + * @param {number} [priority=1000] + * @param {Object|Function} processor + */ +function registerProcessor(priority, processor) { + normalizeRegister(dataProcessorFuncs, priority, processor, PRIORITY_PROCESSOR_FILTER); +} + +/** + * Register postUpdater + * @param {Function} postUpdateFunc + */ +function registerPostUpdate(postUpdateFunc) { + postUpdateFuncs.push(postUpdateFunc); +} + +/** + * Usage: + * registerAction('someAction', 'someEvent', function () { ... }); + * registerAction('someAction', function () { ... }); + * registerAction( + * {type: 'someAction', event: 'someEvent', update: 'updateView'}, + * function () { ... } + * ); + * + * @param {(string|Object)} actionInfo + * @param {string} actionInfo.type + * @param {string} [actionInfo.event] + * @param {string} [actionInfo.update] + * @param {string} [eventName] + * @param {Function} action + */ +function registerAction(actionInfo, eventName, action) { + if (typeof eventName === 'function') { + action = eventName; + eventName = ''; + } + var actionType = isObject(actionInfo) + ? actionInfo.type + : ([actionInfo, actionInfo = { + event: eventName + }][0]); + + // Event name is all lowercase + actionInfo.event = (actionInfo.event || actionType).toLowerCase(); + eventName = actionInfo.event; + + // Validate action type and event name. + assert(ACTION_REG.test(actionType) && ACTION_REG.test(eventName)); + + if (!actions[actionType]) { + actions[actionType] = {action: action, actionInfo: actionInfo}; + } + eventActionMap[eventName] = actionType; +} + +/** + * @param {string} type + * @param {*} CoordinateSystem + */ +function registerCoordinateSystem(type, CoordinateSystem$$1) { + CoordinateSystemManager.register(type, CoordinateSystem$$1); +} + +/** + * Get dimensions of specified coordinate system. + * @param {string} type + * @return {Array.<string|Object>} + */ +function getCoordinateSystemDimensions(type) { + var coordSysCreator = CoordinateSystemManager.get(type); + if (coordSysCreator) { + return coordSysCreator.getDimensionsInfo + ? coordSysCreator.getDimensionsInfo() + : coordSysCreator.dimensions.slice(); + } +} + +/** + * Layout is a special stage of visual encoding + * Most visual encoding like color are common for different chart + * But each chart has it's own layout algorithm + * + * @param {number} [priority=1000] + * @param {Function} layoutTask + */ +function registerLayout(priority, layoutTask) { + normalizeRegister(visualFuncs, priority, layoutTask, PRIORITY_VISUAL_LAYOUT, 'layout'); +} + +/** + * @param {number} [priority=3000] + * @param {module:echarts/stream/Task} visualTask + */ +function registerVisual(priority, visualTask) { + normalizeRegister(visualFuncs, priority, visualTask, PRIORITY_VISUAL_CHART, 'visual'); +} + +/** + * @param {Object|Function} fn: {seriesType, createOnAllSeries, performRawSeries, reset} + */ +function normalizeRegister(targetList, priority, fn, defaultPriority, visualType) { + if (isFunction(priority) || isObject(priority)) { + fn = priority; + priority = defaultPriority; + } + + if (__DEV__) { + if (isNaN(priority) || priority == null) { + throw new Error('Illegal priority'); + } + // Check duplicate + each(targetList, function (wrap) { + assert(wrap.__raw !== fn); + }); + } + + var stageHandler = Scheduler.wrapStageHandler(fn, visualType); + + stageHandler.__prio = priority; + stageHandler.__raw = fn; + targetList.push(stageHandler); + + return stageHandler; +} + +/** + * @param {string} name + */ +function registerLoading(name, loadingFx) { + loadingEffects[name] = loadingFx; +} + +/** + * @param {Object} opts + * @param {string} [superClass] + */ +function extendComponentModel(opts/*, superClass*/) { + // var Clazz = ComponentModel; + // if (superClass) { + // var classType = parseClassType(superClass); + // Clazz = ComponentModel.getClass(classType.main, classType.sub, true); + // } + return ComponentModel.extend(opts); +} + +/** + * @param {Object} opts + * @param {string} [superClass] + */ +function extendComponentView(opts/*, superClass*/) { + // var Clazz = ComponentView; + // if (superClass) { + // var classType = parseClassType(superClass); + // Clazz = ComponentView.getClass(classType.main, classType.sub, true); + // } + return Component.extend(opts); +} + +/** + * @param {Object} opts + * @param {string} [superClass] + */ +function extendSeriesModel(opts/*, superClass*/) { + // var Clazz = SeriesModel; + // if (superClass) { + // superClass = 'series.' + superClass.replace('series.', ''); + // var classType = parseClassType(superClass); + // Clazz = ComponentModel.getClass(classType.main, classType.sub, true); + // } + return SeriesModel.extend(opts); +} + +/** + * @param {Object} opts + * @param {string} [superClass] + */ +function extendChartView(opts/*, superClass*/) { + // var Clazz = ChartView; + // if (superClass) { + // superClass = superClass.replace('series.', ''); + // var classType = parseClassType(superClass); + // Clazz = ChartView.getClass(classType.main, true); + // } + return Chart.extend(opts); +} + +/** + * ZRender need a canvas context to do measureText. + * But in node environment canvas may be created by node-canvas. + * So we need to specify how to create a canvas instead of using document.createElement('canvas') + * + * Be careful of using it in the browser. + * + * @param {Function} creator + * @example + * var Canvas = require('canvas'); + * var echarts = require('echarts'); + * echarts.setCanvasCreator(function () { + * // Small size is enough. + * return new Canvas(32, 32); + * }); + */ +function setCanvasCreator(creator) { + $override('createCanvas', creator); +} + +/** + * @param {string} mapName + * @param {Object|string} geoJson + * @param {Object} [specialAreas] + * + * @example + * $.get('USA.json', function (geoJson) { + * echarts.registerMap('USA', geoJson); + * // Or + * echarts.registerMap('USA', { + * geoJson: geoJson, + * specialAreas: {} + * }) + * }); + */ +function registerMap(mapName, geoJson, specialAreas) { + if (geoJson.geoJson && !geoJson.features) { + specialAreas = geoJson.specialAreas; + geoJson = geoJson.geoJson; + } + if (typeof geoJson === 'string') { + geoJson = (typeof JSON !== 'undefined' && JSON.parse) + ? JSON.parse(geoJson) : (new Function('return (' + geoJson + ');'))(); + } + mapDataStores[mapName] = { + geoJson: geoJson, + specialAreas: specialAreas + }; +} + +/** + * @param {string} mapName + * @return {Object} + */ +function getMap(mapName) { + return mapDataStores[mapName]; +} + +registerVisual(PRIORITY_VISUAL_GLOBAL, seriesColor); +registerPreprocessor(backwardCompat); +registerProcessor(PRIORITY_PROCESSOR_STATISTIC, dataStack); +registerLoading('default', loadingDefault); + +// Default actions + +registerAction({ + type: 'highlight', + event: 'highlight', + update: 'highlight' +}, noop); + +registerAction({ + type: 'downplay', + event: 'downplay', + update: 'downplay' +}, noop); + +// Default theme +registerTheme('light', lightTheme); +registerTheme('dark', theme); + +// For backward compatibility, where the namespace `dataTool` will +// be mounted on `echarts` is the extension `dataTool` is imported. +var dataTool = {}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +function defaultKeyGetter(item) { + return item; +} + +/** + * @param {Array} oldArr + * @param {Array} newArr + * @param {Function} oldKeyGetter + * @param {Function} newKeyGetter + * @param {Object} [context] Can be visited by this.context in callback. + */ +function DataDiffer(oldArr, newArr, oldKeyGetter, newKeyGetter, context) { + this._old = oldArr; + this._new = newArr; + + this._oldKeyGetter = oldKeyGetter || defaultKeyGetter; + this._newKeyGetter = newKeyGetter || defaultKeyGetter; + + this.context = context; +} + +DataDiffer.prototype = { + + constructor: DataDiffer, + + /** + * Callback function when add a data + */ + add: function (func) { + this._add = func; + return this; + }, + + /** + * Callback function when update a data + */ + update: function (func) { + this._update = func; + return this; + }, + + /** + * Callback function when remove a data + */ + remove: function (func) { + this._remove = func; + return this; + }, + + execute: function () { + var oldArr = this._old; + var newArr = this._new; + + var oldDataIndexMap = {}; + var newDataIndexMap = {}; + var oldDataKeyArr = []; + var newDataKeyArr = []; + var i; + + initIndexMap(oldArr, oldDataIndexMap, oldDataKeyArr, '_oldKeyGetter', this); + initIndexMap(newArr, newDataIndexMap, newDataKeyArr, '_newKeyGetter', this); + + // Travel by inverted order to make sure order consistency + // when duplicate keys exists (consider newDataIndex.pop() below). + // For performance consideration, these code below do not look neat. + for (i = 0; i < oldArr.length; i++) { + var key = oldDataKeyArr[i]; + var idx = newDataIndexMap[key]; + + // idx can never be empty array here. see 'set null' logic below. + if (idx != null) { + // Consider there is duplicate key (for example, use dataItem.name as key). + // We should make sure every item in newArr and oldArr can be visited. + var len = idx.length; + if (len) { + len === 1 && (newDataIndexMap[key] = null); + idx = idx.unshift(); + } + else { + newDataIndexMap[key] = null; + } + this._update && this._update(idx, i); + } + else { + this._remove && this._remove(i); + } + } + + for (var i = 0; i < newDataKeyArr.length; i++) { + var key = newDataKeyArr[i]; + if (newDataIndexMap.hasOwnProperty(key)) { + var idx = newDataIndexMap[key]; + if (idx == null) { + continue; + } + // idx can never be empty array here. see 'set null' logic above. + if (!idx.length) { + this._add && this._add(idx); + } + else { + for (var j = 0, len = idx.length; j < len; j++) { + this._add && this._add(idx[j]); + } + } + } + } + } +}; + +function initIndexMap(arr, map, keyArr, keyGetterName, dataDiffer) { + for (var i = 0; i < arr.length; i++) { + // Add prefix to avoid conflict with Object.prototype. + var key = '_ec_' + dataDiffer[keyGetterName](arr[i], i); + var existence = map[key]; + if (existence == null) { + keyArr.push(key); + map[key] = i; + } + else { + if (!existence.length) { + map[key] = existence = [existence]; + } + existence.push(i); + } + } +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var OTHER_DIMENSIONS = createHashMap([ + 'tooltip', 'label', 'itemName', 'itemId', 'seriesName' +]); + +function summarizeDimensions(data) { + var summary = {}; + var encode = summary.encode = {}; + var notExtraCoordDimMap = createHashMap(); + var defaultedLabel = []; + var defaultedTooltip = []; + + each$1(data.dimensions, function (dimName) { + var dimItem = data.getDimensionInfo(dimName); + + var coordDim = dimItem.coordDim; + if (coordDim) { + if (__DEV__) { + assert$1(OTHER_DIMENSIONS.get(coordDim) == null); + } + var coordDimArr = encode[coordDim]; + if (!encode.hasOwnProperty(coordDim)) { + coordDimArr = encode[coordDim] = []; + } + coordDimArr[dimItem.coordDimIndex] = dimName; + + if (!dimItem.isExtraCoord) { + notExtraCoordDimMap.set(coordDim, 1); + + // Use the last coord dim (and label friendly) as default label, + // because when dataset is used, it is hard to guess which dimension + // can be value dimension. If both show x, y on label is not look good, + // and conventionally y axis is focused more. + if (mayLabelDimType(dimItem.type)) { + defaultedLabel[0] = dimName; + } + } + if (dimItem.defaultTooltip) { + defaultedTooltip.push(dimName); + } + } + + OTHER_DIMENSIONS.each(function (v, otherDim) { + var otherDimArr = encode[otherDim]; + if (!encode.hasOwnProperty(otherDim)) { + otherDimArr = encode[otherDim] = []; + } + + var dimIndex = dimItem.otherDims[otherDim]; + if (dimIndex != null && dimIndex !== false) { + otherDimArr[dimIndex] = dimItem.name; + } + }); + }); + + var dataDimsOnCoord = []; + var encodeFirstDimNotExtra = {}; + + notExtraCoordDimMap.each(function (v, coordDim) { + var dimArr = encode[coordDim]; + // ??? FIXME extra coord should not be set in dataDimsOnCoord. + // But should fix the case that radar axes: simplify the logic + // of `completeDimension`, remove `extraPrefix`. + encodeFirstDimNotExtra[coordDim] = dimArr[0]; + // Not necessary to remove duplicate, because a data + // dim canot on more than one coordDim. + dataDimsOnCoord = dataDimsOnCoord.concat(dimArr); + }); + + summary.dataDimsOnCoord = dataDimsOnCoord; + summary.encodeFirstDimNotExtra = encodeFirstDimNotExtra; + + var encodeLabel = encode.label; + // FIXME `encode.label` is not recommanded, because formatter can not be set + // in this way. Use label.formatter instead. May be remove this approach someday. + if (encodeLabel && encodeLabel.length) { + defaultedLabel = encodeLabel.slice(); + } + + var encodeTooltip = encode.tooltip; + if (encodeTooltip && encodeTooltip.length) { + defaultedTooltip = encodeTooltip.slice(); + } + else if (!defaultedTooltip.length) { + defaultedTooltip = defaultedLabel.slice(); + } + + encode.defaultedLabel = defaultedLabel; + encode.defaultedTooltip = defaultedTooltip; + + return summary; +} + +function getDimensionTypeByAxis(axisType) { + return axisType === 'category' + ? 'ordinal' + : axisType === 'time' + ? 'time' + : 'float'; +} + +function mayLabelDimType(dimType) { + // In most cases, ordinal and time do not suitable for label. + // Ordinal info can be displayed on axis. Time is too long. + return !(dimType === 'ordinal' || dimType === 'time'); +} + +// function findTheLastDimMayLabel(data) { +// // Get last value dim +// var dimensions = data.dimensions.slice(); +// var valueType; +// var valueDim; +// while (dimensions.length && ( +// valueDim = dimensions.pop(), +// valueType = data.getDimensionInfo(valueDim).type, +// valueType === 'ordinal' || valueType === 'time' +// )) {} // jshint ignore:line +// return valueDim; +// } + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * List for data storage + * @module echarts/data/List + */ + +var isObject$4 = isObject$1; + +var UNDEFINED = 'undefined'; + +// Use prefix to avoid index to be the same as otherIdList[idx], +// which will cause weird udpate animation. +var ID_PREFIX = 'e\0\0'; + +var dataCtors = { + 'float': typeof Float64Array === UNDEFINED + ? Array : Float64Array, + 'int': typeof Int32Array === UNDEFINED + ? Array : Int32Array, + // Ordinal data type can be string or int + 'ordinal': Array, + 'number': Array, + 'time': Array +}; + +// Caution: MUST not use `new CtorUint32Array(arr, 0, len)`, because the Ctor of array is +// different from the Ctor of typed array. +var CtorUint32Array = typeof Uint32Array === UNDEFINED ? Array : Uint32Array; +var CtorUint16Array = typeof Uint16Array === UNDEFINED ? Array : Uint16Array; + +function getIndicesCtor(list) { + // The possible max value in this._indicies is always this._rawCount despite of filtering. + return list._rawCount > 65535 ? CtorUint32Array : CtorUint16Array; +} + +function cloneChunk(originalChunk) { + var Ctor = originalChunk.constructor; + // Only shallow clone is enough when Array. + return Ctor === Array ? originalChunk.slice() : new Ctor(originalChunk); +} + +var TRANSFERABLE_PROPERTIES = [ + 'hasItemOption', '_nameList', '_idList', '_invertedIndicesMap', + '_rawData', '_chunkSize', '_chunkCount', '_dimValueGetter', + '_count', '_rawCount', '_nameDimIdx', '_idDimIdx' +]; +var CLONE_PROPERTIES = [ + '_extent', '_approximateExtent', '_rawExtent' +]; + +function transferProperties(target, source) { + each$1(TRANSFERABLE_PROPERTIES.concat(source.__wrappedMethods || []), function (propName) { + if (source.hasOwnProperty(propName)) { + target[propName] = source[propName]; + } + }); + + target.__wrappedMethods = source.__wrappedMethods; + + each$1(CLONE_PROPERTIES, function (propName) { + target[propName] = clone(source[propName]); + }); + + target._calculationInfo = extend(source._calculationInfo); +} + + + + + +/** + * @constructor + * @alias module:echarts/data/List + * + * @param {Array.<string|Object>} dimensions + * For example, ['someDimName', {name: 'someDimName', type: 'someDimType'}, ...]. + * Dimensions should be concrete names like x, y, z, lng, lat, angle, radius + * Spetial fields: { + * ordinalMeta: <module:echarts/data/OrdinalMeta> + * createInvertedIndices: <boolean> + * } + * @param {module:echarts/model/Model} hostModel + */ +var List = function (dimensions, hostModel) { + + dimensions = dimensions || ['x', 'y']; + + var dimensionInfos = {}; + var dimensionNames = []; + var invertedIndicesMap = {}; + + for (var i = 0; i < dimensions.length; i++) { + // Use the original dimensions[i], where other flag props may exists. + var dimensionInfo = dimensions[i]; + + if (isString(dimensionInfo)) { + dimensionInfo = {name: dimensionInfo}; + } + + var dimensionName = dimensionInfo.name; + dimensionInfo.type = dimensionInfo.type || 'float'; + if (!dimensionInfo.coordDim) { + dimensionInfo.coordDim = dimensionName; + dimensionInfo.coordDimIndex = 0; + } + + dimensionInfo.otherDims = dimensionInfo.otherDims || {}; + dimensionNames.push(dimensionName); + dimensionInfos[dimensionName] = dimensionInfo; + + dimensionInfo.index = i; + + if (dimensionInfo.createInvertedIndices) { + invertedIndicesMap[dimensionName] = []; + } + } + + /** + * @readOnly + * @type {Array.<string>} + */ + this.dimensions = dimensionNames; + + /** + * Infomation of each data dimension, like data type. + * @type {Object} + */ + this._dimensionInfos = dimensionInfos; + + /** + * @type {module:echarts/model/Model} + */ + this.hostModel = hostModel; + + /** + * @type {module:echarts/model/Model} + */ + this.dataType; + + /** + * Indices stores the indices of data subset after filtered. + * This data subset will be used in chart. + * @type {Array.<number>} + * @readOnly + */ + this._indices = null; + + this._count = 0; + this._rawCount = 0; + + /** + * Data storage + * @type {Object.<key, Array.<TypedArray|Array>>} + * @private + */ + this._storage = {}; + + /** + * @type {Array.<string>} + */ + this._nameList = []; + /** + * @type {Array.<string>} + */ + this._idList = []; + + /** + * Models of data option is stored sparse for optimizing memory cost + * @type {Array.<module:echarts/model/Model>} + * @private + */ + this._optionModels = []; + + /** + * Global visual properties after visual coding + * @type {Object} + * @private + */ + this._visual = {}; + + /** + * Globel layout properties. + * @type {Object} + * @private + */ + this._layout = {}; + + /** + * Item visual properties after visual coding + * @type {Array.<Object>} + * @private + */ + this._itemVisuals = []; + + /** + * Key: visual type, Value: boolean + * @type {Object} + * @readOnly + */ + this.hasItemVisual = {}; + + /** + * Item layout properties after layout + * @type {Array.<Object>} + * @private + */ + this._itemLayouts = []; + + /** + * Graphic elemnents + * @type {Array.<module:zrender/Element>} + * @private + */ + this._graphicEls = []; + + /** + * Max size of each chunk. + * @type {number} + * @private + */ + this._chunkSize = 1e5; + + /** + * @type {number} + * @private + */ + this._chunkCount = 0; + + /** + * @type {Array.<Array|Object>} + * @private + */ + this._rawData; + + /** + * Raw extent will not be cloned, but only transfered. + * It will not be calculated util needed. + * key: dim, + * value: {end: number, extent: Array.<number>} + * @type {Object} + * @private + */ + this._rawExtent = {}; + + /** + * @type {Object} + * @private + */ + this._extent = {}; + + /** + * key: dim + * value: extent + * @type {Object} + * @private + */ + this._approximateExtent = {}; + + /** + * Cache summary info for fast visit. See "dimensionHelper". + * @type {Object} + * @private + */ + this._dimensionsSummary = summarizeDimensions(this); + + /** + * @type {Object.<Array|TypedArray>} + * @private + */ + this._invertedIndicesMap = invertedIndicesMap; + + /** + * @type {Object} + * @private + */ + this._calculationInfo = {}; +}; + +var listProto = List.prototype; + +listProto.type = 'list'; + +/** + * If each data item has it's own option + * @type {boolean} + */ +listProto.hasItemOption = true; + +/** + * Get dimension name + * @param {string|number} dim + * Dimension can be concrete names like x, y, z, lng, lat, angle, radius + * Or a ordinal number. For example getDimensionInfo(0) will return 'x' or 'lng' or 'radius' + * @return {string} Concrete dim name. + */ +listProto.getDimension = function (dim) { + if (!isNaN(dim)) { + dim = this.dimensions[dim] || dim; + } + return dim; +}; + +/** + * Get type and calculation info of particular dimension + * @param {string|number} dim + * Dimension can be concrete names like x, y, z, lng, lat, angle, radius + * Or a ordinal number. For example getDimensionInfo(0) will return 'x' or 'lng' or 'radius' + */ +listProto.getDimensionInfo = function (dim) { + // Do not clone, because there may be categories in dimInfo. + return this._dimensionInfos[this.getDimension(dim)]; +}; + +/** + * @return {Array.<string>} concrete dimension name list on coord. + */ +listProto.getDimensionsOnCoord = function () { + return this._dimensionsSummary.dataDimsOnCoord.slice(); +}; + +/** + * @param {string} coordDim + * @param {number} [idx] A coordDim may map to more than one data dim. + * If idx is `true`, return a array of all mapped dims. + * If idx is not specified, return the first dim not extra. + * @return {string|Array.<string>} concrete data dim. + * If idx is number, and not found, return null/undefined. + * If idx is `true`, and not found, return empty array (always return array). + */ +listProto.mapDimension = function (coordDim, idx) { + var dimensionsSummary = this._dimensionsSummary; + + if (idx == null) { + return dimensionsSummary.encodeFirstDimNotExtra[coordDim]; + } + + var dims = dimensionsSummary.encode[coordDim]; + return idx === true + // always return array if idx is `true` + ? (dims || []).slice() + : (dims && dims[idx]); +}; + +/** + * Initialize from data + * @param {Array.<Object|number|Array>} data source or data or data provider. + * @param {Array.<string>} [nameLIst] The name of a datum is used on data diff and + * defualt label/tooltip. + * A name can be specified in encode.itemName, + * or dataItem.name (only for series option data), + * or provided in nameList from outside. + * @param {Function} [dimValueGetter] (dataItem, dimName, dataIndex, dimIndex) => number + */ +listProto.initData = function (data, nameList, dimValueGetter) { + + var notProvider = Source.isInstance(data) || isArrayLike(data); + if (notProvider) { + data = new DefaultDataProvider(data, this.dimensions.length); + } + + if (__DEV__) { + if (!notProvider && (typeof data.getItem != 'function' || typeof data.count != 'function')) { + throw new Error('Inavlid data provider.'); + } + } + + this._rawData = data; + + // Clear + this._storage = {}; + this._indices = null; + + this._nameList = nameList || []; + + this._idList = []; + + this._nameRepeatCount = {}; + + if (!dimValueGetter) { + this.hasItemOption = false; + } + + /** + * @readOnly + */ + this.defaultDimValueGetter = defaultDimValueGetters[ + this._rawData.getSource().sourceFormat + ]; + + // Default dim value getter + this._dimValueGetter = dimValueGetter = dimValueGetter + || this.defaultDimValueGetter; + + // Reset raw extent. + this._rawExtent = {}; + + this._initDataFromProvider(0, data.count()); + + // If data has no item option. + if (data.pure) { + this.hasItemOption = false; + } +}; + +listProto.getProvider = function () { + return this._rawData; +}; + +listProto.appendData = function (data) { + if (__DEV__) { + assert$1(!this._indices, 'appendData can only be called on raw data.'); + } + + var rawData = this._rawData; + var start = this.count(); + rawData.appendData(data); + var end = rawData.count(); + if (!rawData.persistent) { + end += start; + } + this._initDataFromProvider(start, end); +}; + +listProto._initDataFromProvider = function (start, end) { + // Optimize. + if (start >= end) { + return; + } + + var chunkSize = this._chunkSize; + var rawData = this._rawData; + var storage = this._storage; + var dimensions = this.dimensions; + var dimLen = dimensions.length; + var dimensionInfoMap = this._dimensionInfos; + var nameList = this._nameList; + var idList = this._idList; + var rawExtent = this._rawExtent; + var nameRepeatCount = this._nameRepeatCount = {}; + var nameDimIdx; + + var chunkCount = this._chunkCount; + var lastChunkIndex = chunkCount - 1; + for (var i = 0; i < dimLen; i++) { + var dim = dimensions[i]; + if (!rawExtent[dim]) { + rawExtent[dim] = getInitialExtent(); + } + + var dimInfo = dimensionInfoMap[dim]; + if (dimInfo.otherDims.itemName === 0) { + nameDimIdx = this._nameDimIdx = i; + } + if (dimInfo.otherDims.itemId === 0) { + this._idDimIdx = i; + } + var DataCtor = dataCtors[dimInfo.type]; + + if (!storage[dim]) { + storage[dim] = []; + } + var resizeChunkArray = storage[dim][lastChunkIndex]; + if (resizeChunkArray && resizeChunkArray.length < chunkSize) { + var newStore = new DataCtor(Math.min(end - lastChunkIndex * chunkSize, chunkSize)); + // The cost of the copy is probably inconsiderable + // within the initial chunkSize. + for (var j = 0; j < resizeChunkArray.length; j++) { + newStore[j] = resizeChunkArray[j]; + } + storage[dim][lastChunkIndex] = newStore; + } + + // Create new chunks. + for (var k = chunkCount * chunkSize; k < end; k += chunkSize) { + storage[dim].push(new DataCtor(Math.min(end - k, chunkSize))); + } + this._chunkCount = storage[dim].length; + } + + var dataItem = new Array(dimLen); + for (var idx = start; idx < end; idx++) { + // NOTICE: Try not to write things into dataItem + dataItem = rawData.getItem(idx, dataItem); + // Each data item is value + // [1, 2] + // 2 + // Bar chart, line chart which uses category axis + // only gives the 'y' value. 'x' value is the indices of category + // Use a tempValue to normalize the value to be a (x, y) value + var chunkIndex = Math.floor(idx / chunkSize); + var chunkOffset = idx % chunkSize; + + // Store the data by dimensions + for (var k = 0; k < dimLen; k++) { + var dim = dimensions[k]; + var dimStorage = storage[dim][chunkIndex]; + // PENDING NULL is empty or zero + var val = this._dimValueGetter(dataItem, dim, idx, k); + dimStorage[chunkOffset] = val; + + var dimRawExtent = rawExtent[dim]; + if (val < dimRawExtent[0]) { + dimRawExtent[0] = val; + } + if (val > dimRawExtent[1]) { + dimRawExtent[1] = val; + } + } + + // ??? FIXME not check by pure but sourceFormat? + // TODO refactor these logic. + if (!rawData.pure) { + var name = nameList[idx]; + + if (dataItem && name == null) { + // If dataItem is {name: ...}, it has highest priority. + // That is appropriate for many common cases. + if (dataItem.name != null) { + // There is no other place to persistent dataItem.name, + // so save it to nameList. + nameList[idx] = name = dataItem.name; + } + else if (nameDimIdx != null) { + var nameDim = dimensions[nameDimIdx]; + var nameDimChunk = storage[nameDim][chunkIndex]; + if (nameDimChunk) { + name = nameDimChunk[chunkOffset]; + var ordinalMeta = dimensionInfoMap[nameDim].ordinalMeta; + if (ordinalMeta && ordinalMeta.categories.length) { + name = ordinalMeta.categories[name]; + } + } + } + } + + // Try using the id in option + // id or name is used on dynamical data, mapping old and new items. + var id = dataItem == null ? null : dataItem.id; + + if (id == null && name != null) { + // Use name as id and add counter to avoid same name + nameRepeatCount[name] = nameRepeatCount[name] || 0; + id = name; + if (nameRepeatCount[name] > 0) { + id += '__ec__' + nameRepeatCount[name]; + } + nameRepeatCount[name]++; + } + id != null && (idList[idx] = id); + } + } + + if (!rawData.persistent && rawData.clean) { + // Clean unused data if data source is typed array. + rawData.clean(); + } + + this._rawCount = this._count = end; + + // Reset data extent + this._extent = {}; + + prepareInvertedIndex(this); +}; + +function prepareInvertedIndex(list) { + var invertedIndicesMap = list._invertedIndicesMap; + each$1(invertedIndicesMap, function (invertedIndices, dim) { + var dimInfo = list._dimensionInfos[dim]; + + // Currently, only dimensions that has ordinalMeta can create inverted indices. + var ordinalMeta = dimInfo.ordinalMeta; + if (ordinalMeta) { + invertedIndices = invertedIndicesMap[dim] = new CtorUint32Array( + ordinalMeta.categories.length + ); + // The default value of TypedArray is 0. To avoid miss + // mapping to 0, we should set it as NaN. + for (var i = 0; i < invertedIndices.length; i++) { + invertedIndices[i] = NaN; + } + for (var i = 0; i < list._count; i++) { + // Only support the case that all values are distinct. + invertedIndices[list.get(dim, i)] = i; + } + } + }); +} + +function getRawValueFromStore(list, dimIndex, rawIndex) { + var val; + if (dimIndex != null) { + var chunkSize = list._chunkSize; + var chunkIndex = Math.floor(rawIndex / chunkSize); + var chunkOffset = rawIndex % chunkSize; + var dim = list.dimensions[dimIndex]; + var chunk = list._storage[dim][chunkIndex]; + if (chunk) { + val = chunk[chunkOffset]; + var ordinalMeta = list._dimensionInfos[dim].ordinalMeta; + if (ordinalMeta && ordinalMeta.categories.length) { + val = ordinalMeta.categories[val]; + } + } + } + return val; +} + +/** + * @return {number} + */ +listProto.count = function () { + return this._count; +}; + +listProto.getIndices = function () { + var newIndices; + + var indices = this._indices; + if (indices) { + var Ctor = indices.constructor; + var thisCount = this._count; + // `new Array(a, b, c)` is different from `new Uint32Array(a, b, c)`. + if (Ctor === Array) { + newIndices = new Ctor(thisCount); + for (var i = 0; i < thisCount; i++) { + newIndices[i] = indices[i]; + } + } + else { + newIndices = new Ctor(indices.buffer, 0, thisCount); + } + } + else { + var Ctor = getIndicesCtor(this); + var newIndices = new Ctor(this.count()); + for (var i = 0; i < newIndices.length; i++) { + newIndices[i] = i; + } + } + + return newIndices; +}; + +/** + * Get value. Return NaN if idx is out of range. + * @param {string} dim Dim must be concrete name. + * @param {number} idx + * @param {boolean} stack + * @return {number} + */ +listProto.get = function (dim, idx /*, stack */) { + if (!(idx >= 0 && idx < this._count)) { + return NaN; + } + var storage = this._storage; + if (!storage[dim]) { + // TODO Warn ? + return NaN; + } + + idx = this.getRawIndex(idx); + + var chunkIndex = Math.floor(idx / this._chunkSize); + var chunkOffset = idx % this._chunkSize; + + var chunkStore = storage[dim][chunkIndex]; + var value = chunkStore[chunkOffset]; + // FIXME ordinal data type is not stackable + // if (stack) { + // var dimensionInfo = this._dimensionInfos[dim]; + // if (dimensionInfo && dimensionInfo.stackable) { + // var stackedOn = this.stackedOn; + // while (stackedOn) { + // // Get no stacked data of stacked on + // var stackedValue = stackedOn.get(dim, idx); + // // Considering positive stack, negative stack and empty data + // if ((value >= 0 && stackedValue > 0) // Positive stack + // || (value <= 0 && stackedValue < 0) // Negative stack + // ) { + // value += stackedValue; + // } + // stackedOn = stackedOn.stackedOn; + // } + // } + // } + + return value; +}; + +/** + * @param {string} dim concrete dim + * @param {number} rawIndex + * @return {number|string} + */ +listProto.getByRawIndex = function (dim, rawIdx) { + if (!(rawIdx >= 0 && rawIdx < this._rawCount)) { + return NaN; + } + var dimStore = this._storage[dim]; + if (!dimStore) { + // TODO Warn ? + return NaN; + } + + var chunkIndex = Math.floor(rawIdx / this._chunkSize); + var chunkOffset = rawIdx % this._chunkSize; + var chunkStore = dimStore[chunkIndex]; + return chunkStore[chunkOffset]; +}; + +/** + * FIXME Use `get` on chrome maybe slow(in filterSelf and selectRange). + * Hack a much simpler _getFast + * @private + */ +listProto._getFast = function (dim, rawIdx) { + var chunkIndex = Math.floor(rawIdx / this._chunkSize); + var chunkOffset = rawIdx % this._chunkSize; + var chunkStore = this._storage[dim][chunkIndex]; + return chunkStore[chunkOffset]; +}; + +/** + * Get value for multi dimensions. + * @param {Array.<string>} [dimensions] If ignored, using all dimensions. + * @param {number} idx + * @return {number} + */ +listProto.getValues = function (dimensions, idx /*, stack */) { + var values = []; + + if (!isArray(dimensions)) { + // stack = idx; + idx = dimensions; + dimensions = this.dimensions; + } + + for (var i = 0, len = dimensions.length; i < len; i++) { + values.push(this.get(dimensions[i], idx /*, stack */)); + } + + return values; +}; + +/** + * If value is NaN. Inlcuding '-' + * Only check the coord dimensions. + * @param {string} dim + * @param {number} idx + * @return {number} + */ +listProto.hasValue = function (idx) { + var dataDimsOnCoord = this._dimensionsSummary.dataDimsOnCoord; + var dimensionInfos = this._dimensionInfos; + for (var i = 0, len = dataDimsOnCoord.length; i < len; i++) { + if ( + // Ordinal type can be string or number + dimensionInfos[dataDimsOnCoord[i]].type !== 'ordinal' + // FIXME check ordinal when using index? + && isNaN(this.get(dataDimsOnCoord[i], idx)) + ) { + return false; + } + } + return true; +}; + +/** + * Get extent of data in one dimension + * @param {string} dim + * @param {boolean} stack + */ +listProto.getDataExtent = function (dim /*, stack */) { + // Make sure use concrete dim as cache name. + dim = this.getDimension(dim); + var dimData = this._storage[dim]; + var initialExtent = getInitialExtent(); + + // stack = !!((stack || false) && this.getCalculationInfo(dim)); + + if (!dimData) { + return initialExtent; + } + + // Make more strict checkings to ensure hitting cache. + var currEnd = this.count(); + // var cacheName = [dim, !!stack].join('_'); + // var cacheName = dim; + + // Consider the most cases when using data zoom, `getDataExtent` + // happened before filtering. We cache raw extent, which is not + // necessary to be cleared and recalculated when restore data. + var useRaw = !this._indices; // && !stack; + var dimExtent; + + if (useRaw) { + return this._rawExtent[dim].slice(); + } + dimExtent = this._extent[dim]; + if (dimExtent) { + return dimExtent.slice(); + } + dimExtent = initialExtent; + + var min = dimExtent[0]; + var max = dimExtent[1]; + + for (var i = 0; i < currEnd; i++) { + // var value = stack ? this.get(dim, i, true) : this._getFast(dim, this.getRawIndex(i)); + var value = this._getFast(dim, this.getRawIndex(i)); + value < min && (min = value); + value > max && (max = value); + } + + dimExtent = [min, max]; + + this._extent[dim] = dimExtent; + + return dimExtent; +}; + +/** + * Optimize for the scenario that data is filtered by a given extent. + * Consider that if data amount is more than hundreds of thousand, + * extent calculation will cost more than 10ms and the cache will + * be erased because of the filtering. + */ +listProto.getApproximateExtent = function (dim /*, stack */) { + dim = this.getDimension(dim); + return this._approximateExtent[dim] || this.getDataExtent(dim /*, stack */); +}; + +listProto.setApproximateExtent = function (extent, dim /*, stack */) { + dim = this.getDimension(dim); + this._approximateExtent[dim] = extent.slice(); +}; + +/** + * @param {string} key + * @return {*} + */ +listProto.getCalculationInfo = function (key) { + return this._calculationInfo[key]; +}; + +/** + * @param {string|Object} key or k-v object + * @param {*} [value] + */ +listProto.setCalculationInfo = function (key, value) { + isObject$4(key) + ? extend(this._calculationInfo, key) + : (this._calculationInfo[key] = value); +}; + +/** + * Get sum of data in one dimension + * @param {string} dim + */ +listProto.getSum = function (dim /*, stack */) { + var dimData = this._storage[dim]; + var sum = 0; + if (dimData) { + for (var i = 0, len = this.count(); i < len; i++) { + var value = this.get(dim, i /*, stack */); + if (!isNaN(value)) { + sum += value; + } + } + } + return sum; +}; + +/** + * Get median of data in one dimension + * @param {string} dim + */ +listProto.getMedian = function (dim /*, stack */) { + var dimDataArray = []; + // map all data of one dimension + this.each(dim, function (val, idx) { + if (!isNaN(val)) { + dimDataArray.push(val); + } + }); + + // TODO + // Use quick select? + + // immutability & sort + var sortedDimDataArray = [].concat(dimDataArray).sort(function(a, b) { + return a - b; + }); + var len = this.count(); + // calculate median + return len === 0 ? 0 : + len % 2 === 1 ? sortedDimDataArray[(len - 1) / 2] : + (sortedDimDataArray[len / 2] + sortedDimDataArray[len / 2 - 1]) / 2; +}; + +// /** +// * Retreive the index with given value +// * @param {string} dim Concrete dimension. +// * @param {number} value +// * @return {number} +// */ +// Currently incorrect: should return dataIndex but not rawIndex. +// Do not fix it until this method is to be used somewhere. +// FIXME Precision of float value +// listProto.indexOf = function (dim, value) { +// var storage = this._storage; +// var dimData = storage[dim]; +// var chunkSize = this._chunkSize; +// if (dimData) { +// for (var i = 0, len = this.count(); i < len; i++) { +// var chunkIndex = Math.floor(i / chunkSize); +// var chunkOffset = i % chunkSize; +// if (dimData[chunkIndex][chunkOffset] === value) { +// return i; +// } +// } +// } +// return -1; +// }; + +/** + * Only support the dimension which inverted index created. + * Do not support other cases until required. + * @param {string} concrete dim + * @param {number|string} value + * @return {number} rawIndex + */ +listProto.rawIndexOf = function (dim, value) { + var invertedIndices = dim && this._invertedIndicesMap[dim]; + if (__DEV__) { + if (!invertedIndices) { + throw new Error('Do not supported yet'); + } + } + var rawIndex = invertedIndices[value]; + if (rawIndex == null || isNaN(rawIndex)) { + return -1; + } + return rawIndex; +}; + +/** + * Retreive the index with given name + * @param {number} idx + * @param {number} name + * @return {number} + */ +listProto.indexOfName = function (name) { + for (var i = 0, len = this.count(); i < len; i++) { + if (this.getName(i) === name) { + return i; + } + } + + return -1; +}; + +/** + * Retreive the index with given raw data index + * @param {number} idx + * @param {number} name + * @return {number} + */ +listProto.indexOfRawIndex = function (rawIndex) { + if (!this._indices) { + return rawIndex; + } + + if (rawIndex >= this._rawCount || rawIndex < 0) { + return -1; + } + + // Indices are ascending + var indices = this._indices; + + // If rawIndex === dataIndex + var rawDataIndex = indices[rawIndex]; + if (rawDataIndex != null && rawDataIndex < this._count && rawDataIndex === rawIndex) { + return rawIndex; + } + + var left = 0; + var right = this._count - 1; + while (left <= right) { + var mid = (left + right) / 2 | 0; + if (indices[mid] < rawIndex) { + left = mid + 1; + } + else if (indices[mid] > rawIndex) { + right = mid - 1; + } + else { + return mid; + } + } + return -1; +}; + +/** + * Retreive the index of nearest value + * @param {string} dim + * @param {number} value + * @param {number} [maxDistance=Infinity] + * @return {Array.<number>} Considere multiple points has the same value. + */ +listProto.indicesOfNearest = function (dim, value, maxDistance) { + var storage = this._storage; + var dimData = storage[dim]; + var nearestIndices = []; + + if (!dimData) { + return nearestIndices; + } + + if (maxDistance == null) { + maxDistance = Infinity; + } + + var minDist = Number.MAX_VALUE; + var minDiff = -1; + for (var i = 0, len = this.count(); i < len; i++) { + var diff = value - this.get(dim, i /*, stack */); + var dist = Math.abs(diff); + if (diff <= maxDistance && dist <= minDist) { + // For the case of two data are same on xAxis, which has sequence data. + // Show the nearest index + // https://github.com/ecomfe/echarts/issues/2869 + if (dist < minDist || (diff >= 0 && minDiff < 0)) { + minDist = dist; + minDiff = diff; + nearestIndices.length = 0; + } + nearestIndices.push(i); + } + } + return nearestIndices; +}; + +/** + * Get raw data index + * @param {number} idx + * @return {number} + */ +listProto.getRawIndex = getRawIndexWithoutIndices; + +function getRawIndexWithoutIndices(idx) { + return idx; +} + +function getRawIndexWithIndices(idx) { + if (idx < this._count && idx >= 0) { + return this._indices[idx]; + } + return -1; +} + +/** + * Get raw data item + * @param {number} idx + * @return {number} + */ +listProto.getRawDataItem = function (idx) { + if (!this._rawData.persistent) { + var val = []; + for (var i = 0; i < this.dimensions.length; i++) { + var dim = this.dimensions[i]; + val.push(this.get(dim, idx)); + } + return val; + } + else { + return this._rawData.getItem(this.getRawIndex(idx)); + } +}; + +/** + * @param {number} idx + * @param {boolean} [notDefaultIdx=false] + * @return {string} + */ +listProto.getName = function (idx) { + var rawIndex = this.getRawIndex(idx); + return this._nameList[rawIndex] + || getRawValueFromStore(this, this._nameDimIdx, rawIndex) + || ''; +}; + +/** + * @param {number} idx + * @param {boolean} [notDefaultIdx=false] + * @return {string} + */ +listProto.getId = function (idx) { + return getId(this, this.getRawIndex(idx)); +}; + +function getId(list, rawIndex) { + var id = list._idList[rawIndex]; + if (id == null) { + id = getRawValueFromStore(list, list._idDimIdx, rawIndex); + } + if (id == null) { + // FIXME Check the usage in graph, should not use prefix. + id = ID_PREFIX + rawIndex; + } + return id; +} + +function normalizeDimensions(dimensions) { + if (!isArray(dimensions)) { + dimensions = [dimensions]; + } + return dimensions; +} + +function validateDimensions(list, dims) { + for (var i = 0; i < dims.length; i++) { + // stroage may be empty when no data, so use + // dimensionInfos to check. + if (!list._dimensionInfos[dims[i]]) { + console.error('Unkown dimension ' + dims[i]); + } + } +} + +/** + * Data iteration + * @param {string|Array.<string>} + * @param {Function} cb + * @param {*} [context=this] + * + * @example + * list.each('x', function (x, idx) {}); + * list.each(['x', 'y'], function (x, y, idx) {}); + * list.each(function (idx) {}) + */ +listProto.each = function (dims, cb, context, contextCompat) { + 'use strict'; + + if (!this._count) { + return; + } + + if (typeof dims === 'function') { + contextCompat = context; + context = cb; + cb = dims; + dims = []; + } + + // contextCompat just for compat echarts3 + context = context || contextCompat || this; + + dims = map(normalizeDimensions(dims), this.getDimension, this); + + if (__DEV__) { + validateDimensions(this, dims); + } + + var dimSize = dims.length; + + for (var i = 0; i < this.count(); i++) { + // Simple optimization + switch (dimSize) { + case 0: + cb.call(context, i); + break; + case 1: + cb.call(context, this.get(dims[0], i), i); + break; + case 2: + cb.call(context, this.get(dims[0], i), this.get(dims[1], i), i); + break; + default: + var k = 0; + var value = []; + for (; k < dimSize; k++) { + value[k] = this.get(dims[k], i); + } + // Index + value[k] = i; + cb.apply(context, value); + } + } +}; + +/** + * Data filter + * @param {string|Array.<string>} + * @param {Function} cb + * @param {*} [context=this] + */ +listProto.filterSelf = function (dimensions, cb, context, contextCompat) { + 'use strict'; + + if (!this._count) { + return; + } + + if (typeof dimensions === 'function') { + contextCompat = context; + context = cb; + cb = dimensions; + dimensions = []; + } + + // contextCompat just for compat echarts3 + context = context || contextCompat || this; + + dimensions = map( + normalizeDimensions(dimensions), this.getDimension, this + ); + + if (__DEV__) { + validateDimensions(this, dimensions); + } + + + var count = this.count(); + var Ctor = getIndicesCtor(this); + var newIndices = new Ctor(count); + var value = []; + var dimSize = dimensions.length; + + var offset = 0; + var dim0 = dimensions[0]; + + for (var i = 0; i < count; i++) { + var keep; + var rawIdx = this.getRawIndex(i); + // Simple optimization + if (dimSize === 0) { + keep = cb.call(context, i); + } + else if (dimSize === 1) { + var val = this._getFast(dim0, rawIdx); + keep = cb.call(context, val, i); + } + else { + for (var k = 0; k < dimSize; k++) { + value[k] = this._getFast(dim0, rawIdx); + } + value[k] = i; + keep = cb.apply(context, value); + } + if (keep) { + newIndices[offset++] = rawIdx; + } + } + + // Set indices after filtered. + if (offset < count) { + this._indices = newIndices; + } + this._count = offset; + // Reset data extent + this._extent = {}; + + this.getRawIndex = this._indices ? getRawIndexWithIndices : getRawIndexWithoutIndices; + + return this; +}; + +/** + * Select data in range. (For optimization of filter) + * (Manually inline code, support 5 million data filtering in data zoom.) + */ +listProto.selectRange = function (range) { + 'use strict'; + + if (!this._count) { + return; + } + + var dimensions = []; + for (var dim in range) { + if (range.hasOwnProperty(dim)) { + dimensions.push(dim); + } + } + + if (__DEV__) { + validateDimensions(this, dimensions); + } + + var dimSize = dimensions.length; + if (!dimSize) { + return; + } + + var originalCount = this.count(); + var Ctor = getIndicesCtor(this); + var newIndices = new Ctor(originalCount); + + var offset = 0; + var dim0 = dimensions[0]; + + var min = range[dim0][0]; + var max = range[dim0][1]; + + var quickFinished = false; + if (!this._indices) { + // Extreme optimization for common case. About 2x faster in chrome. + var idx = 0; + if (dimSize === 1) { + var dimStorage = this._storage[dimensions[0]]; + for (var k = 0; k < this._chunkCount; k++) { + var chunkStorage = dimStorage[k]; + var len = Math.min(this._count - k * this._chunkSize, this._chunkSize); + for (var i = 0; i < len; i++) { + var val = chunkStorage[i]; + // NaN will not be filtered. Consider the case, in line chart, empty + // value indicates the line should be broken. But for the case like + // scatter plot, a data item with empty value will not be rendered, + // but the axis extent may be effected if some other dim of the data + // item has value. Fortunately it is not a significant negative effect. + if ( + (val >= min && val <= max) || isNaN(val) + ) { + newIndices[offset++] = idx; + } + idx++; + } + } + quickFinished = true; + } + else if (dimSize === 2) { + var dimStorage = this._storage[dim0]; + var dimStorage2 = this._storage[dimensions[1]]; + var min2 = range[dimensions[1]][0]; + var max2 = range[dimensions[1]][1]; + for (var k = 0; k < this._chunkCount; k++) { + var chunkStorage = dimStorage[k]; + var chunkStorage2= dimStorage2[k]; + var len = Math.min(this._count - k * this._chunkSize, this._chunkSize); + for (var i = 0; i < len; i++) { + var val = chunkStorage[i]; + var val2 = chunkStorage2[i]; + // Do not filter NaN, see comment above. + if (( + (val >= min && val <= max) || isNaN(val) + ) + && ( + (val2 >= min2 && val2 <= max2) || isNaN(val2) + ) + ) { + newIndices[offset++] = idx; + } + idx++; + } + } + quickFinished = true; + } + } + if (!quickFinished) { + if (dimSize === 1) { + for (var i = 0; i < originalCount; i++) { + var rawIndex = this.getRawIndex(i); + var val = this._getFast(dim0, rawIndex); + // Do not filter NaN, see comment above. + if ( + (val >= min && val <= max) || isNaN(val) + ) { + newIndices[offset++] = rawIndex; + } + } + } + else { + for (var i = 0; i < originalCount; i++) { + var keep = true; + var rawIndex = this.getRawIndex(i); + for (var k = 0; k < dimSize; k++) { + var dimk = dimensions[k]; + var val = this._getFast(dim, rawIndex); + // Do not filter NaN, see comment above. + if (val < range[dimk][0] || val > range[dimk][1]) { + keep = false; + } + } + if (keep) { + newIndices[offset++] = this.getRawIndex(i); + } + } + } + } + + // Set indices after filtered. + if (offset < originalCount) { + this._indices = newIndices; + } + this._count = offset; + // Reset data extent + this._extent = {}; + + this.getRawIndex = this._indices ? getRawIndexWithIndices : getRawIndexWithoutIndices; + + return this; +}; + +/** + * Data mapping to a plain array + * @param {string|Array.<string>} [dimensions] + * @param {Function} cb + * @param {*} [context=this] + * @return {Array} + */ +listProto.mapArray = function (dimensions, cb, context, contextCompat) { + 'use strict'; + + if (typeof dimensions === 'function') { + contextCompat = context; + context = cb; + cb = dimensions; + dimensions = []; + } + + // contextCompat just for compat echarts3 + context = context || contextCompat || this; + + var result = []; + this.each(dimensions, function () { + result.push(cb && cb.apply(this, arguments)); + }, context); + return result; +}; + +// Data in excludeDimensions is copied, otherwise transfered. +function cloneListForMapAndSample(original, excludeDimensions) { + var allDimensions = original.dimensions; + var list = new List( + map(allDimensions, original.getDimensionInfo, original), + original.hostModel + ); + // FIXME If needs stackedOn, value may already been stacked + transferProperties(list, original); + + var storage = list._storage = {}; + var originalStorage = original._storage; + + // Init storage + for (var i = 0; i < allDimensions.length; i++) { + var dim = allDimensions[i]; + if (originalStorage[dim]) { + // Notice that we do not reset invertedIndicesMap here, becuase + // there is no scenario of mapping or sampling ordinal dimension. + if (indexOf(excludeDimensions, dim) >= 0) { + storage[dim] = cloneDimStore(originalStorage[dim]); + list._rawExtent[dim] = getInitialExtent(); + list._extent[dim] = null; + } + else { + // Direct reference for other dimensions + storage[dim] = originalStorage[dim]; + } + } + } + return list; +} + +function cloneDimStore(originalDimStore) { + var newDimStore = new Array(originalDimStore.length); + for (var j = 0; j < originalDimStore.length; j++) { + newDimStore[j] = cloneChunk(originalDimStore[j]); + } + return newDimStore; +} + +function getInitialExtent() { + return [Infinity, -Infinity]; +} + +/** + * Data mapping to a new List with given dimensions + * @param {string|Array.<string>} dimensions + * @param {Function} cb + * @param {*} [context=this] + * @return {Array} + */ +listProto.map = function (dimensions, cb, context, contextCompat) { + 'use strict'; + + // contextCompat just for compat echarts3 + context = context || contextCompat || this; + + dimensions = map( + normalizeDimensions(dimensions), this.getDimension, this + ); + + if (__DEV__) { + validateDimensions(this, dimensions); + } + + var list = cloneListForMapAndSample(this, dimensions); + + // Following properties are all immutable. + // So we can reference to the same value + list._indices = this._indices; + list.getRawIndex = list._indices ? getRawIndexWithIndices : getRawIndexWithoutIndices; + + var storage = list._storage; + + var tmpRetValue = []; + var chunkSize = this._chunkSize; + var dimSize = dimensions.length; + var dataCount = this.count(); + var values = []; + var rawExtent = list._rawExtent; + + for (var dataIndex = 0; dataIndex < dataCount; dataIndex++) { + for (var dimIndex = 0; dimIndex < dimSize; dimIndex++) { + values[dimIndex] = this.get(dimensions[dimIndex], dataIndex /*, stack */); + } + values[dimSize] = dataIndex; + + var retValue = cb && cb.apply(context, values); + if (retValue != null) { + // a number or string (in oridinal dimension)? + if (typeof retValue !== 'object') { + tmpRetValue[0] = retValue; + retValue = tmpRetValue; + } + + var rawIndex = this.getRawIndex(dataIndex); + var chunkIndex = Math.floor(rawIndex / chunkSize); + var chunkOffset = rawIndex % chunkSize; + + for (var i = 0; i < retValue.length; i++) { + var dim = dimensions[i]; + var val = retValue[i]; + var rawExtentOnDim = rawExtent[dim]; + + var dimStore = storage[dim]; + if (dimStore) { + dimStore[chunkIndex][chunkOffset] = val; + } + + if (val < rawExtentOnDim[0]) { + rawExtentOnDim[0] = val; + } + if (val > rawExtentOnDim[1]) { + rawExtentOnDim[1] = val; + } + } + } + } + + return list; +}; + +/** + * Large data down sampling on given dimension + * @param {string} dimension + * @param {number} rate + * @param {Function} sampleValue + * @param {Function} sampleIndex Sample index for name and id + */ +listProto.downSample = function (dimension, rate, sampleValue, sampleIndex) { + var list = cloneListForMapAndSample(this, [dimension]); + var targetStorage = list._storage; + + var frameValues = []; + var frameSize = Math.floor(1 / rate); + + var dimStore = targetStorage[dimension]; + var len = this.count(); + var chunkSize = this._chunkSize; + var rawExtentOnDim = list._rawExtent[dimension]; + + var newIndices = new (getIndicesCtor(this))(len); + + var offset = 0; + for (var i = 0; i < len; i += frameSize) { + // Last frame + if (frameSize > len - i) { + frameSize = len - i; + frameValues.length = frameSize; + } + for (var k = 0; k < frameSize; k++) { + var dataIdx = this.getRawIndex(i + k); + var originalChunkIndex = Math.floor(dataIdx / chunkSize); + var originalChunkOffset = dataIdx % chunkSize; + frameValues[k] = dimStore[originalChunkIndex][originalChunkOffset]; + } + var value = sampleValue(frameValues); + var sampleFrameIdx = this.getRawIndex( + Math.min(i + sampleIndex(frameValues, value) || 0, len - 1) + ); + var sampleChunkIndex = Math.floor(sampleFrameIdx / chunkSize); + var sampleChunkOffset = sampleFrameIdx % chunkSize; + // Only write value on the filtered data + dimStore[sampleChunkIndex][sampleChunkOffset] = value; + + if (value < rawExtentOnDim[0]) { + rawExtentOnDim[0] = value; + } + if (value > rawExtentOnDim[1]) { + rawExtentOnDim[1] = value; + } + + newIndices[offset++] = sampleFrameIdx; + } + + list._count = offset; + list._indices = newIndices; + + list.getRawIndex = getRawIndexWithIndices; + + return list; +}; + +/** + * Get model of one data item. + * + * @param {number} idx + */ +// FIXME Model proxy ? +listProto.getItemModel = function (idx) { + var hostModel = this.hostModel; + return new Model(this.getRawDataItem(idx), hostModel, hostModel && hostModel.ecModel); +}; + +/** + * Create a data differ + * @param {module:echarts/data/List} otherList + * @return {module:echarts/data/DataDiffer} + */ +listProto.diff = function (otherList) { + var thisList = this; + + return new DataDiffer( + otherList ? otherList.getIndices() : [], + this.getIndices(), + function (idx) { + return getId(otherList, idx); + }, + function (idx) { + return getId(thisList, idx); + } + ); +}; +/** + * Get visual property. + * @param {string} key + */ +listProto.getVisual = function (key) { + var visual = this._visual; + return visual && visual[key]; +}; + +/** + * Set visual property + * @param {string|Object} key + * @param {*} [value] + * + * @example + * setVisual('color', color); + * setVisual({ + * 'color': color + * }); + */ +listProto.setVisual = function (key, val) { + if (isObject$4(key)) { + for (var name in key) { + if (key.hasOwnProperty(name)) { + this.setVisual(name, key[name]); + } + } + return; + } + this._visual = this._visual || {}; + this._visual[key] = val; +}; + +/** + * Set layout property. + * @param {string|Object} key + * @param {*} [val] + */ +listProto.setLayout = function (key, val) { + if (isObject$4(key)) { + for (var name in key) { + if (key.hasOwnProperty(name)) { + this.setLayout(name, key[name]); + } + } + return; + } + this._layout[key] = val; +}; + +/** + * Get layout property. + * @param {string} key. + * @return {*} + */ +listProto.getLayout = function (key) { + return this._layout[key]; +}; + +/** + * Get layout of single data item + * @param {number} idx + */ +listProto.getItemLayout = function (idx) { + return this._itemLayouts[idx]; +}; + +/** + * Set layout of single data item + * @param {number} idx + * @param {Object} layout + * @param {boolean=} [merge=false] + */ +listProto.setItemLayout = function (idx, layout, merge$$1) { + this._itemLayouts[idx] = merge$$1 + ? extend(this._itemLayouts[idx] || {}, layout) + : layout; +}; + +/** + * Clear all layout of single data item + */ +listProto.clearItemLayouts = function () { + this._itemLayouts.length = 0; +}; + +/** + * Get visual property of single data item + * @param {number} idx + * @param {string} key + * @param {boolean} [ignoreParent=false] + */ +listProto.getItemVisual = function (idx, key, ignoreParent) { + var itemVisual = this._itemVisuals[idx]; + var val = itemVisual && itemVisual[key]; + if (val == null && !ignoreParent) { + // Use global visual property + return this.getVisual(key); + } + return val; +}; + +/** + * Set visual property of single data item + * + * @param {number} idx + * @param {string|Object} key + * @param {*} [value] + * + * @example + * setItemVisual(0, 'color', color); + * setItemVisual(0, { + * 'color': color + * }); + */ +listProto.setItemVisual = function (idx, key, value) { + var itemVisual = this._itemVisuals[idx] || {}; + var hasItemVisual = this.hasItemVisual; + this._itemVisuals[idx] = itemVisual; + + if (isObject$4(key)) { + for (var name in key) { + if (key.hasOwnProperty(name)) { + itemVisual[name] = key[name]; + hasItemVisual[name] = true; + } + } + return; + } + itemVisual[key] = value; + hasItemVisual[key] = true; +}; + +/** + * Clear itemVisuals and list visual. + */ +listProto.clearAllVisual = function () { + this._visual = {}; + this._itemVisuals = []; + this.hasItemVisual = {}; +}; + +var setItemDataAndSeriesIndex = function (child) { + child.seriesIndex = this.seriesIndex; + child.dataIndex = this.dataIndex; + child.dataType = this.dataType; +}; +/** + * Set graphic element relative to data. It can be set as null + * @param {number} idx + * @param {module:zrender/Element} [el] + */ +listProto.setItemGraphicEl = function (idx, el) { + var hostModel = this.hostModel; + + if (el) { + // Add data index and series index for indexing the data by element + // Useful in tooltip + el.dataIndex = idx; + el.dataType = this.dataType; + el.seriesIndex = hostModel && hostModel.seriesIndex; + if (el.type === 'group') { + el.traverse(setItemDataAndSeriesIndex, el); + } + } + + this._graphicEls[idx] = el; +}; + +/** + * @param {number} idx + * @return {module:zrender/Element} + */ +listProto.getItemGraphicEl = function (idx) { + return this._graphicEls[idx]; +}; + +/** + * @param {Function} cb + * @param {*} context + */ +listProto.eachItemGraphicEl = function (cb, context) { + each$1(this._graphicEls, function (el, idx) { + if (el) { + cb && cb.call(context, el, idx); + } + }); +}; + +/** + * Shallow clone a new list except visual and layout properties, and graph elements. + * New list only change the indices. + */ +listProto.cloneShallow = function (list) { + if (!list) { + var dimensionInfoList = map(this.dimensions, this.getDimensionInfo, this); + list = new List(dimensionInfoList, this.hostModel); + } + + // FIXME + list._storage = this._storage; + + transferProperties(list, this); + + // Clone will not change the data extent and indices + if (this._indices) { + var Ctor = this._indices.constructor; + list._indices = new Ctor(this._indices); + } + else { + list._indices = null; + } + list.getRawIndex = list._indices ? getRawIndexWithIndices : getRawIndexWithoutIndices; + + return list; +}; + +/** + * Wrap some method to add more feature + * @param {string} methodName + * @param {Function} injectFunction + */ +listProto.wrapMethod = function (methodName, injectFunction) { + var originalMethod = this[methodName]; + if (typeof originalMethod !== 'function') { + return; + } + this.__wrappedMethods = this.__wrappedMethods || []; + this.__wrappedMethods.push(methodName); + this[methodName] = function () { + var res = originalMethod.apply(this, arguments); + return injectFunction.apply(this, [res].concat(slice(arguments))); + }; +}; + +// Methods that create a new list based on this list should be listed here. +// Notice that those method should `RETURN` the new list. +listProto.TRANSFERABLE_METHODS = ['cloneShallow', 'downSample', 'map']; +// Methods that change indices of this list should be listed here. +listProto.CHANGABLE_METHODS = ['filterSelf', 'selectRange']; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @deprecated + * Use `echarts/data/helper/createDimensions` instead. + */ + +/** + * @see {module:echarts/test/ut/spec/data/completeDimensions} + * + * Complete the dimensions array, by user defined `dimension` and `encode`, + * and guessing from the data structure. + * If no 'value' dimension specified, the first no-named dimension will be + * named as 'value'. + * + * @param {Array.<string>} sysDims Necessary dimensions, like ['x', 'y'], which + * provides not only dim template, but also default order. + * properties: 'name', 'type', 'displayName'. + * `name` of each item provides default coord name. + * [{dimsDef: [string|Object, ...]}, ...] dimsDef of sysDim item provides default dim name, and + * provide dims count that the sysDim required. + * [{ordinalMeta}] can be specified. + * @param {module:echarts/data/Source|Array|Object} source or data (for compatibal with pervious) + * @param {Object} [opt] + * @param {Array.<Object|string>} [opt.dimsDef] option.series.dimensions User defined dimensions + * For example: ['asdf', {name, type}, ...]. + * @param {Object|HashMap} [opt.encodeDef] option.series.encode {x: 2, y: [3, 1], tooltip: [1, 2], label: 3} + * @param {string} [opt.generateCoord] Generate coord dim with the given name. + * If not specified, extra dim names will be: + * 'value', 'value0', 'value1', ... + * @param {number} [opt.generateCoordCount] By default, the generated dim name is `generateCoord`. + * If `generateCoordCount` specified, the generated dim names will be: + * `generateCoord` + 0, `generateCoord` + 1, ... + * can be Infinity, indicate that use all of the remain columns. + * @param {number} [opt.dimCount] If not specified, guess by the first data item. + * @param {number} [opt.encodeDefaulter] If not specified, auto find the next available data dim. + * @return {Array.<Object>} [{ + * name: string mandatory, + * displayName: string, the origin name in dimsDef, see source helper. + * If displayName given, the tooltip will displayed vertically. + * coordDim: string mandatory, + * coordDimIndex: number mandatory, + * type: string optional, + * otherDims: { never null/undefined + * tooltip: number optional, + * label: number optional, + * itemName: number optional, + * seriesName: number optional, + * }, + * isExtraCoord: boolean true if coord is generated + * (not specified in encode and not series specified) + * other props ... + * }] + */ +function completeDimensions(sysDims, source, opt) { + if (!Source.isInstance(source)) { + source = Source.seriesDataToSource(source); + } + + opt = opt || {}; + sysDims = (sysDims || []).slice(); + var dimsDef = (opt.dimsDef || []).slice(); + var encodeDef = createHashMap(opt.encodeDef); + var dataDimNameMap = createHashMap(); + var coordDimNameMap = createHashMap(); + // var valueCandidate; + var result = []; + + var dimCount = getDimCount(source, sysDims, dimsDef, opt.dimCount); + + // Apply user defined dims (`name` and `type`) and init result. + for (var i = 0; i < dimCount; i++) { + var dimDefItem = dimsDef[i] = extend( + {}, isObject$1(dimsDef[i]) ? dimsDef[i] : {name: dimsDef[i]} + ); + var userDimName = dimDefItem.name; + var resultItem = result[i] = {otherDims: {}}; + // Name will be applied later for avoiding duplication. + if (userDimName != null && dataDimNameMap.get(userDimName) == null) { + // Only if `series.dimensions` is defined in option + // displayName, will be set, and dimension will be diplayed vertically in + // tooltip by default. + resultItem.name = resultItem.displayName = userDimName; + dataDimNameMap.set(userDimName, i); + } + dimDefItem.type != null && (resultItem.type = dimDefItem.type); + dimDefItem.displayName != null && (resultItem.displayName = dimDefItem.displayName); + } + + // Set `coordDim` and `coordDimIndex` by `encodeDef` and normalize `encodeDef`. + encodeDef.each(function (dataDims, coordDim) { + dataDims = normalizeToArray(dataDims).slice(); + var validDataDims = encodeDef.set(coordDim, []); + each$1(dataDims, function (resultDimIdx, idx) { + // The input resultDimIdx can be dim name or index. + isString(resultDimIdx) && (resultDimIdx = dataDimNameMap.get(resultDimIdx)); + if (resultDimIdx != null && resultDimIdx < dimCount) { + validDataDims[idx] = resultDimIdx; + applyDim(result[resultDimIdx], coordDim, idx); + } + }); + }); + + // Apply templetes and default order from `sysDims`. + var availDimIdx = 0; + each$1(sysDims, function (sysDimItem, sysDimIndex) { + var coordDim; + var sysDimItem; + var sysDimItemDimsDef; + var sysDimItemOtherDims; + if (isString(sysDimItem)) { + coordDim = sysDimItem; + sysDimItem = {}; + } + else { + coordDim = sysDimItem.name; + var ordinalMeta = sysDimItem.ordinalMeta; + sysDimItem.ordinalMeta = null; + sysDimItem = clone(sysDimItem); + sysDimItem.ordinalMeta = ordinalMeta; + // `coordDimIndex` should not be set directly. + sysDimItemDimsDef = sysDimItem.dimsDef; + sysDimItemOtherDims = sysDimItem.otherDims; + sysDimItem.name = sysDimItem.coordDim = sysDimItem.coordDimIndex + = sysDimItem.dimsDef = sysDimItem.otherDims = null; + } + + var dataDims = normalizeToArray(encodeDef.get(coordDim)); + // dimensions provides default dim sequences. + if (!dataDims.length) { + for (var i = 0; i < (sysDimItemDimsDef && sysDimItemDimsDef.length || 1); i++) { + while (availDimIdx < result.length && result[availDimIdx].coordDim != null) { + availDimIdx++; + } + availDimIdx < result.length && dataDims.push(availDimIdx++); + } + } + + // Apply templates. + each$1(dataDims, function (resultDimIdx, coordDimIndex) { + var resultItem = result[resultDimIdx]; + applyDim(defaults(resultItem, sysDimItem), coordDim, coordDimIndex); + if (resultItem.name == null && sysDimItemDimsDef) { + var sysDimItemDimsDefItem = sysDimItemDimsDef[coordDimIndex]; + !isObject$1(sysDimItemDimsDefItem) && (sysDimItemDimsDefItem = {name: sysDimItemDimsDefItem}); + resultItem.name = resultItem.displayName = sysDimItemDimsDefItem.name; + resultItem.defaultTooltip = sysDimItemDimsDefItem.defaultTooltip; + } + // FIXME refactor, currently only used in case: {otherDims: {tooltip: false}} + sysDimItemOtherDims && defaults(resultItem.otherDims, sysDimItemOtherDims); + }); + }); + + function applyDim(resultItem, coordDim, coordDimIndex) { + if (OTHER_DIMENSIONS.get(coordDim) != null) { + resultItem.otherDims[coordDim] = coordDimIndex; + } + else { + resultItem.coordDim = coordDim; + resultItem.coordDimIndex = coordDimIndex; + coordDimNameMap.set(coordDim, true); + } + } + + // Make sure the first extra dim is 'value'. + var generateCoord = opt.generateCoord; + var generateCoordCount = opt.generateCoordCount; + var fromZero = generateCoordCount != null; + generateCoordCount = generateCoord ? (generateCoordCount || 1) : 0; + var extra = generateCoord || 'value'; + + // Set dim `name` and other `coordDim` and other props. + for (var resultDimIdx = 0; resultDimIdx < dimCount; resultDimIdx++) { + var resultItem = result[resultDimIdx] = result[resultDimIdx] || {}; + var coordDim = resultItem.coordDim; + + if (coordDim == null) { + resultItem.coordDim = genName( + extra, coordDimNameMap, fromZero + ); + resultItem.coordDimIndex = 0; + if (!generateCoord || generateCoordCount <= 0) { + resultItem.isExtraCoord = true; + } + generateCoordCount--; + } + + resultItem.name == null && (resultItem.name = genName( + resultItem.coordDim, + dataDimNameMap + )); + + if (resultItem.type == null && guessOrdinal(source, resultDimIdx, resultItem.name)) { + resultItem.type = 'ordinal'; + } + } + + return result; +} + +// ??? TODO +// Originally detect dimCount by data[0]. Should we +// optimize it to only by sysDims and dimensions and encode. +// So only necessary dims will be initialized. +// But +// (1) custom series should be considered. where other dims +// may be visited. +// (2) sometimes user need to calcualte bubble size or use visualMap +// on other dimensions besides coordSys needed. +// So, dims that is not used by system, should be shared in storage? +function getDimCount(source, sysDims, dimsDef, optDimCount) { + // Note that the result dimCount should not small than columns count + // of data, otherwise `dataDimNameMap` checking will be incorrect. + var dimCount = Math.max( + source.dimensionsDetectCount || 1, + sysDims.length, + dimsDef.length, + optDimCount || 0 + ); + each$1(sysDims, function (sysDimItem) { + var sysDimItemDimsDef = sysDimItem.dimsDef; + sysDimItemDimsDef && (dimCount = Math.max(dimCount, sysDimItemDimsDef.length)); + }); + return dimCount; +} + +function genName(name, map$$1, fromZero) { + if (fromZero || map$$1.get(name) != null) { + var i = 0; + while (map$$1.get(name + i) != null) { + i++; + } + name += i; + } + map$$1.set(name, true); + return name; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Substitute `completeDimensions`. + * `completeDimensions` is to be deprecated. + */ +/** + * @param {module:echarts/data/Source|module:echarts/data/List} source or data. + * @param {Object|Array} [opt] + * @param {Array.<string|Object>} [opt.coordDimensions=[]] + * @param {number} [opt.dimensionsCount] + * @param {string} [opt.generateCoord] + * @param {string} [opt.generateCoordCount] + * @param {Array.<string|Object>} [opt.dimensionsDefine=source.dimensionsDefine] Overwrite source define. + * @param {Object|HashMap} [opt.encodeDefine=source.encodeDefine] Overwrite source define. + * @return {Array.<Object>} dimensionsInfo + */ +var createDimensions = function (source, opt) { + opt = opt || {}; + return completeDimensions(opt.coordDimensions || [], source, { + dimsDef: opt.dimensionsDefine || source.dimensionsDefine, + encodeDef: opt.encodeDefine || source.encodeDefine, + dimCount: opt.dimensionsCount, + generateCoord: opt.generateCoord, + generateCoordCount: opt.generateCoordCount + }); +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Note that it is too complicated to support 3d stack by value + * (have to create two-dimension inverted index), so in 3d case + * we just support that stacked by index. + * + * @param {module:echarts/model/Series} seriesModel + * @param {Array.<string|Object>} dimensionInfoList The same as the input of <module:echarts/data/List>. + * The input dimensionInfoList will be modified. + * @param {Object} [opt] + * @param {boolean} [opt.stackedCoordDimension=''] Specify a coord dimension if needed. + * @param {boolean} [opt.byIndex=false] + * @return {Object} calculationInfo + * { + * stackedDimension: string + * stackedByDimension: string + * isStackedByIndex: boolean + * stackedOverDimension: string + * stackResultDimension: string + * } + */ +function enableDataStack(seriesModel, dimensionInfoList, opt) { + opt = opt || {}; + var byIndex = opt.byIndex; + var stackedCoordDimension = opt.stackedCoordDimension; + + // Compatibal: when `stack` is set as '', do not stack. + var mayStack = !!(seriesModel && seriesModel.get('stack')); + var stackedByDimInfo; + var stackedDimInfo; + var stackResultDimension; + var stackedOverDimension; + + each$1(dimensionInfoList, function (dimensionInfo, index) { + if (isString(dimensionInfo)) { + dimensionInfoList[index] = dimensionInfo = {name: dimensionInfo}; + } + + if (mayStack && !dimensionInfo.isExtraCoord) { + // Find the first ordinal dimension as the stackedByDimInfo. + if (!byIndex && !stackedByDimInfo && dimensionInfo.ordinalMeta) { + stackedByDimInfo = dimensionInfo; + } + // Find the first stackable dimension as the stackedDimInfo. + if (!stackedDimInfo + && dimensionInfo.type !== 'ordinal' + && dimensionInfo.type !== 'time' + && (!stackedCoordDimension || stackedCoordDimension === dimensionInfo.coordDim) + ) { + stackedDimInfo = dimensionInfo; + } + } + }); + + if (stackedDimInfo && !byIndex && !stackedByDimInfo) { + // Compatible with previous design, value axis (time axis) only stack by index. + // It may make sense if the user provides elaborately constructed data. + byIndex = true; + } + + // Add stack dimension, they can be both calculated by coordinate system in `unionExtent`. + // That put stack logic in List is for using conveniently in echarts extensions, but it + // might not be a good way. + if (stackedDimInfo) { + // Use a weird name that not duplicated with other names. + stackResultDimension = '__\0ecstackresult'; + stackedOverDimension = '__\0ecstackedover'; + + // Create inverted index to fast query index by value. + if (stackedByDimInfo) { + stackedByDimInfo.createInvertedIndices = true; + } + + var stackedDimCoordDim = stackedDimInfo.coordDim; + var stackedDimType = stackedDimInfo.type; + var stackedDimCoordIndex = 0; + + each$1(dimensionInfoList, function (dimensionInfo) { + if (dimensionInfo.coordDim === stackedDimCoordDim) { + stackedDimCoordIndex++; + } + }); + + dimensionInfoList.push({ + name: stackResultDimension, + coordDim: stackedDimCoordDim, + coordDimIndex: stackedDimCoordIndex, + type: stackedDimType, + isExtraCoord: true, + isCalculationCoord: true + }); + + stackedDimCoordIndex++; + + dimensionInfoList.push({ + name: stackedOverDimension, + // This dimension contains stack base (generally, 0), so do not set it as + // `stackedDimCoordDim` to avoid extent calculation, consider log scale. + coordDim: stackedOverDimension, + coordDimIndex: stackedDimCoordIndex, + type: stackedDimType, + isExtraCoord: true, + isCalculationCoord: true + }); + } + + return { + stackedDimension: stackedDimInfo && stackedDimInfo.name, + stackedByDimension: stackedByDimInfo && stackedByDimInfo.name, + isStackedByIndex: byIndex, + stackedOverDimension: stackedOverDimension, + stackResultDimension: stackResultDimension + }; +} + +/** + * @param {module:echarts/data/List} data + * @param {string} stackedDim + */ +function isDimensionStacked(data, stackedDim /*, stackedByDim*/) { + // Each single series only maps to one pair of axis. So we do not need to + // check stackByDim, whatever stacked by a dimension or stacked by index. + return !!stackedDim && stackedDim === data.getCalculationInfo('stackedDimension'); + // && ( + // stackedByDim != null + // ? stackedByDim === data.getCalculationInfo('stackedByDimension') + // : data.getCalculationInfo('isStackedByIndex') + // ); +} + +/** + * @param {module:echarts/data/List} data + * @param {string} targetDim + * @param {string} [stackedByDim] If not input this parameter, check whether + * stacked by index. + * @return {string} dimension + */ +function getStackedDimension(data, targetDim) { + return isDimensionStacked(data, targetDim) + ? data.getCalculationInfo('stackResultDimension') + : targetDim; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @param {module:echarts/data/Source|Array} source Or raw data. + * @param {module:echarts/model/Series} seriesModel + * @param {Object} [opt] + * @param {string} [opt.generateCoord] + */ +function createListFromArray(source, seriesModel, opt) { + opt = opt || {}; + + if (!Source.isInstance(source)) { + source = Source.seriesDataToSource(source); + } + + var coordSysName = seriesModel.get('coordinateSystem'); + var registeredCoordSys = CoordinateSystemManager.get(coordSysName); + + var coordSysDefine = getCoordSysDefineBySeries(seriesModel); + + var coordSysDimDefs; + + if (coordSysDefine) { + coordSysDimDefs = map(coordSysDefine.coordSysDims, function (dim) { + var dimInfo = {name: dim}; + var axisModel = coordSysDefine.axisMap.get(dim); + if (axisModel) { + var axisType = axisModel.get('type'); + dimInfo.type = getDimensionTypeByAxis(axisType); + // dimInfo.stackable = isStackable(axisType); + } + return dimInfo; + }); + } + + if (!coordSysDimDefs) { + // Get dimensions from registered coordinate system + coordSysDimDefs = (registeredCoordSys && ( + registeredCoordSys.getDimensionsInfo + ? registeredCoordSys.getDimensionsInfo() + : registeredCoordSys.dimensions.slice() + )) || ['x', 'y']; + } + + var dimInfoList = createDimensions(source, { + coordDimensions: coordSysDimDefs, + generateCoord: opt.generateCoord + }); + + var firstCategoryDimIndex; + var hasNameEncode; + coordSysDefine && each$1(dimInfoList, function (dimInfo, dimIndex) { + var coordDim = dimInfo.coordDim; + var categoryAxisModel = coordSysDefine.categoryAxisMap.get(coordDim); + if (categoryAxisModel) { + if (firstCategoryDimIndex == null) { + firstCategoryDimIndex = dimIndex; + } + dimInfo.ordinalMeta = categoryAxisModel.getOrdinalMeta(); + } + if (dimInfo.otherDims.itemName != null) { + hasNameEncode = true; + } + }); + if (!hasNameEncode && firstCategoryDimIndex != null) { + dimInfoList[firstCategoryDimIndex].otherDims.itemName = 0; + } + + var stackCalculationInfo = enableDataStack(seriesModel, dimInfoList); + + var list = new List(dimInfoList, seriesModel); + + list.setCalculationInfo(stackCalculationInfo); + + var dimValueGetter = (firstCategoryDimIndex != null && isNeedCompleteOrdinalData(source)) + ? function (itemOpt, dimName, dataIndex, dimIndex) { + // Use dataIndex as ordinal value in categoryAxis + return dimIndex === firstCategoryDimIndex + ? dataIndex + : this.defaultDimValueGetter(itemOpt, dimName, dataIndex, dimIndex); + } + : null; + + list.hasItemOption = false; + list.initData(source, null, dimValueGetter); + + return list; +} + +function isNeedCompleteOrdinalData(source) { + if (source.sourceFormat === SOURCE_FORMAT_ORIGINAL) { + var sampleItem = firstDataNotNull(source.data || []); + return sampleItem != null + && !isArray(getDataItemValue(sampleItem)); + } +} + +function firstDataNotNull(data) { + var i = 0; + while (i < data.length && data[i] == null) { + i++; + } + return data[i]; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * // Scale class management + * @module echarts/scale/Scale + */ + +/** + * @param {Object} [setting] + */ +function Scale(setting) { + this._setting = setting || {}; + + /** + * Extent + * @type {Array.<number>} + * @protected + */ + this._extent = [Infinity, -Infinity]; + + /** + * Step is calculated in adjustExtent + * @type {Array.<number>} + * @protected + */ + this._interval = 0; + + this.init && this.init.apply(this, arguments); +} + +/** + * Parse input val to valid inner number. + * @param {*} val + * @return {number} + */ +Scale.prototype.parse = function (val) { + // Notice: This would be a trap here, If the implementation + // of this method depends on extent, and this method is used + // before extent set (like in dataZoom), it would be wrong. + // Nevertheless, parse does not depend on extent generally. + return val; +}; + +Scale.prototype.getSetting = function (name) { + return this._setting[name]; +}; + +Scale.prototype.contain = function (val) { + var extent = this._extent; + return val >= extent[0] && val <= extent[1]; +}; + +/** + * Normalize value to linear [0, 1], return 0.5 if extent span is 0 + * @param {number} val + * @return {number} + */ +Scale.prototype.normalize = function (val) { + var extent = this._extent; + if (extent[1] === extent[0]) { + return 0.5; + } + return (val - extent[0]) / (extent[1] - extent[0]); +}; + +/** + * Scale normalized value + * @param {number} val + * @return {number} + */ +Scale.prototype.scale = function (val) { + var extent = this._extent; + return val * (extent[1] - extent[0]) + extent[0]; +}; + +/** + * Set extent from data + * @param {Array.<number>} other + */ +Scale.prototype.unionExtent = function (other) { + var extent = this._extent; + other[0] < extent[0] && (extent[0] = other[0]); + other[1] > extent[1] && (extent[1] = other[1]); + // not setExtent because in log axis it may transformed to power + // this.setExtent(extent[0], extent[1]); +}; + +/** + * Set extent from data + * @param {module:echarts/data/List} data + * @param {string} dim + */ +Scale.prototype.unionExtentFromData = function (data, dim) { + this.unionExtent(data.getApproximateExtent(dim)); +}; + +/** + * Get extent + * @return {Array.<number>} + */ +Scale.prototype.getExtent = function () { + return this._extent.slice(); +}; + +/** + * Set extent + * @param {number} start + * @param {number} end + */ +Scale.prototype.setExtent = function (start, end) { + var thisExtent = this._extent; + if (!isNaN(start)) { + thisExtent[0] = start; + } + if (!isNaN(end)) { + thisExtent[1] = end; + } +}; + +/** + * When axis extent depends on data and no data exists, + * axis ticks should not be drawn, which is named 'blank'. + */ +Scale.prototype.isBlank = function () { + return this._isBlank; +}, + +/** + * When axis extent depends on data and no data exists, + * axis ticks should not be drawn, which is named 'blank'. + */ +Scale.prototype.setBlank = function (isBlank) { + this._isBlank = isBlank; +}; + +/** + * @abstract + * @param {*} tick + * @return {string} label of the tick. + */ +Scale.prototype.getLabel = null; + + +enableClassExtend(Scale); +enableClassManagement(Scale, { + registerWhenExtend: true +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @constructor + * @param {Object} [opt] + * @param {Object} [opt.categories=[]] + * @param {Object} [opt.needCollect=false] + * @param {Object} [opt.deduplication=false] + */ +function OrdinalMeta(opt) { + + /** + * @readOnly + * @type {Array.<string>} + */ + this.categories = opt.categories || []; + + /** + * @private + * @type {boolean} + */ + this._needCollect = opt.needCollect; + + /** + * @private + * @type {boolean} + */ + this._deduplication = opt.deduplication; + + /** + * @private + * @type {boolean} + */ + this._map; +} + +/** + * @param {module:echarts/model/Model} axisModel + * @return {module:echarts/data/OrdinalMeta} + */ +OrdinalMeta.createByAxisModel = function (axisModel) { + var option = axisModel.option; + var data = option.data; + var categories = data && map(data, getName); + + return new OrdinalMeta({ + categories: categories, + needCollect: !categories, + // deduplication is default in axis. + deduplication: option.dedplication !== false + }); +}; + +var proto$1 = OrdinalMeta.prototype; + +/** + * @param {string} category + * @return {number} ordinal + */ +proto$1.getOrdinal = function (category) { + return getOrCreateMap(this).get(category); +}; + +/** + * @param {*} category + * @return {number} The ordinal. If not found, return NaN. + */ +proto$1.parseAndCollect = function (category) { + var index; + var needCollect = this._needCollect; + + // The value of category dim can be the index of the given category set. + // This feature is only supported when !needCollect, because we should + // consider a common case: a value is 2017, which is a number but is + // expected to be tread as a category. This case usually happen in dataset, + // where it happent to be no need of the index feature. + if (typeof category !== 'string' && !needCollect) { + return category; + } + + // Optimize for the scenario: + // category is ['2012-01-01', '2012-01-02', ...], where the input + // data has been ensured not duplicate and is large data. + // Notice, if a dataset dimension provide categroies, usually echarts + // should remove duplication except user tell echarts dont do that + // (set axis.deduplication = false), because echarts do not know whether + // the values in the category dimension has duplication (consider the + // parallel-aqi example) + if (needCollect && !this._deduplication) { + index = this.categories.length; + this.categories[index] = category; + return index; + } + + var map$$1 = getOrCreateMap(this); + index = map$$1.get(category); + + if (index == null) { + if (needCollect) { + index = this.categories.length; + this.categories[index] = category; + map$$1.set(category, index); + } + else { + index = NaN; + } + } + + return index; +}; + +// Consider big data, do not create map until needed. +function getOrCreateMap(ordinalMeta) { + return ordinalMeta._map || ( + ordinalMeta._map = createHashMap(ordinalMeta.categories) + ); +} + +function getName(obj) { + if (isObject$1(obj) && obj.value != null) { + return obj.value; + } + else { + return obj + ''; + } +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Linear continuous scale + * @module echarts/coord/scale/Ordinal + * + * http://en.wikipedia.org/wiki/Level_of_measurement + */ + +// FIXME only one data + +var scaleProto = Scale.prototype; + +var OrdinalScale = Scale.extend({ + + type: 'ordinal', + + /** + * @param {module:echarts/data/OrdianlMeta|Array.<string>} ordinalMeta + */ + init: function (ordinalMeta, extent) { + // Caution: Should not use instanceof, consider ec-extensions using + // import approach to get OrdinalMeta class. + if (!ordinalMeta || isArray(ordinalMeta)) { + ordinalMeta = new OrdinalMeta({categories: ordinalMeta}); + } + this._ordinalMeta = ordinalMeta; + this._extent = extent || [0, ordinalMeta.categories.length - 1]; + }, + + parse: function (val) { + return typeof val === 'string' + ? this._ordinalMeta.getOrdinal(val) + // val might be float. + : Math.round(val); + }, + + contain: function (rank) { + rank = this.parse(rank); + return scaleProto.contain.call(this, rank) + && this._ordinalMeta.categories[rank] != null; + }, + + /** + * Normalize given rank or name to linear [0, 1] + * @param {number|string} [val] + * @return {number} + */ + normalize: function (val) { + return scaleProto.normalize.call(this, this.parse(val)); + }, + + scale: function (val) { + return Math.round(scaleProto.scale.call(this, val)); + }, + + /** + * @return {Array} + */ + getTicks: function () { + var ticks = []; + var extent = this._extent; + var rank = extent[0]; + + while (rank <= extent[1]) { + ticks.push(rank); + rank++; + } + + return ticks; + }, + + /** + * Get item on rank n + * @param {number} n + * @return {string} + */ + getLabel: function (n) { + if (!this.isBlank()) { + // Note that if no data, ordinalMeta.categories is an empty array. + return this._ordinalMeta.categories[n]; + } + }, + + /** + * @return {number} + */ + count: function () { + return this._extent[1] - this._extent[0] + 1; + }, + + /** + * @override + */ + unionExtentFromData: function (data, dim) { + this.unionExtent(data.getApproximateExtent(dim)); + }, + + getOrdinalMeta: function () { + return this._ordinalMeta; + }, + + niceTicks: noop, + niceExtent: noop +}); + +/** + * @return {module:echarts/scale/Time} + */ +OrdinalScale.create = function () { + return new OrdinalScale(); +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * For testable. + */ + +var roundNumber$1 = round$1; + +/** + * @param {Array.<number>} extent Both extent[0] and extent[1] should be valid number. + * Should be extent[0] < extent[1]. + * @param {number} splitNumber splitNumber should be >= 1. + * @param {number} [minInterval] + * @param {number} [maxInterval] + * @return {Object} {interval, intervalPrecision, niceTickExtent} + */ +function intervalScaleNiceTicks(extent, splitNumber, minInterval, maxInterval) { + var result = {}; + var span = extent[1] - extent[0]; + + var interval = result.interval = nice(span / splitNumber, true); + if (minInterval != null && interval < minInterval) { + interval = result.interval = minInterval; + } + if (maxInterval != null && interval > maxInterval) { + interval = result.interval = maxInterval; + } + // Tow more digital for tick. + var precision = result.intervalPrecision = getIntervalPrecision(interval); + // Niced extent inside original extent + var niceTickExtent = result.niceTickExtent = [ + roundNumber$1(Math.ceil(extent[0] / interval) * interval, precision), + roundNumber$1(Math.floor(extent[1] / interval) * interval, precision) + ]; + + fixExtent(niceTickExtent, extent); + + return result; +} + +/** + * @param {number} interval + * @return {number} interval precision + */ +function getIntervalPrecision(interval) { + // Tow more digital for tick. + return getPrecisionSafe(interval) + 2; +} + +function clamp(niceTickExtent, idx, extent) { + niceTickExtent[idx] = Math.max(Math.min(niceTickExtent[idx], extent[1]), extent[0]); +} + +// In some cases (e.g., splitNumber is 1), niceTickExtent may be out of extent. +function fixExtent(niceTickExtent, extent) { + !isFinite(niceTickExtent[0]) && (niceTickExtent[0] = extent[0]); + !isFinite(niceTickExtent[1]) && (niceTickExtent[1] = extent[1]); + clamp(niceTickExtent, 0, extent); + clamp(niceTickExtent, 1, extent); + if (niceTickExtent[0] > niceTickExtent[1]) { + niceTickExtent[0] = niceTickExtent[1]; + } +} + +function intervalScaleGetTicks(interval, extent, niceTickExtent, intervalPrecision) { + var ticks = []; + + // If interval is 0, return []; + if (!interval) { + return ticks; + } + + // Consider this case: using dataZoom toolbox, zoom and zoom. + var safeLimit = 10000; + + if (extent[0] < niceTickExtent[0]) { + ticks.push(extent[0]); + } + var tick = niceTickExtent[0]; + + while (tick <= niceTickExtent[1]) { + ticks.push(tick); + // Avoid rounding error + tick = roundNumber$1(tick + interval, intervalPrecision); + if (tick === ticks[ticks.length - 1]) { + // Consider out of safe float point, e.g., + // -3711126.9907707 + 2e-10 === -3711126.9907707 + break; + } + if (ticks.length > safeLimit) { + return []; + } + } + // Consider this case: the last item of ticks is smaller + // than niceTickExtent[1] and niceTickExtent[1] === extent[1]. + if (extent[1] > (ticks.length ? ticks[ticks.length - 1] : niceTickExtent[1])) { + ticks.push(extent[1]); + } + + return ticks; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Interval scale + * @module echarts/scale/Interval + */ + + +var roundNumber = round$1; + +/** + * @alias module:echarts/coord/scale/Interval + * @constructor + */ +var IntervalScale = Scale.extend({ + + type: 'interval', + + _interval: 0, + + _intervalPrecision: 2, + + setExtent: function (start, end) { + var thisExtent = this._extent; + //start,end may be a Number like '25',so... + if (!isNaN(start)) { + thisExtent[0] = parseFloat(start); + } + if (!isNaN(end)) { + thisExtent[1] = parseFloat(end); + } + }, + + unionExtent: function (other) { + var extent = this._extent; + other[0] < extent[0] && (extent[0] = other[0]); + other[1] > extent[1] && (extent[1] = other[1]); + + // unionExtent may called by it's sub classes + IntervalScale.prototype.setExtent.call(this, extent[0], extent[1]); + }, + /** + * Get interval + */ + getInterval: function () { + return this._interval; + }, + + /** + * Set interval + */ + setInterval: function (interval) { + this._interval = interval; + // Dropped auto calculated niceExtent and use user setted extent + // We assume user wan't to set both interval, min, max to get a better result + this._niceExtent = this._extent.slice(); + + this._intervalPrecision = getIntervalPrecision(interval); + }, + + /** + * @return {Array.<number>} + */ + getTicks: function () { + return intervalScaleGetTicks( + this._interval, this._extent, this._niceExtent, this._intervalPrecision + ); + }, + + /** + * @param {number} data + * @param {Object} [opt] + * @param {number|string} [opt.precision] If 'auto', use nice presision. + * @param {boolean} [opt.pad] returns 1.50 but not 1.5 if precision is 2. + * @return {string} + */ + getLabel: function (data, opt) { + if (data == null) { + return ''; + } + + var precision = opt && opt.precision; + + if (precision == null) { + precision = getPrecisionSafe(data) || 0; + } + else if (precision === 'auto') { + // Should be more precise then tick. + precision = this._intervalPrecision; + } + + // (1) If `precision` is set, 12.005 should be display as '12.00500'. + // (2) Use roundNumber (toFixed) to avoid scientific notation like '3.5e-7'. + data = roundNumber(data, precision, true); + + return addCommas(data); + }, + + /** + * Update interval and extent of intervals for nice ticks + * + * @param {number} [splitNumber = 5] Desired number of ticks + * @param {number} [minInterval] + * @param {number} [maxInterval] + */ + niceTicks: function (splitNumber, minInterval, maxInterval) { + splitNumber = splitNumber || 5; + var extent = this._extent; + var span = extent[1] - extent[0]; + if (!isFinite(span)) { + return; + } + // User may set axis min 0 and data are all negative + // FIXME If it needs to reverse ? + if (span < 0) { + span = -span; + extent.reverse(); + } + + var result = intervalScaleNiceTicks( + extent, splitNumber, minInterval, maxInterval + ); + + this._intervalPrecision = result.intervalPrecision; + this._interval = result.interval; + this._niceExtent = result.niceTickExtent; + }, + + /** + * Nice extent. + * @param {Object} opt + * @param {number} [opt.splitNumber = 5] Given approx tick number + * @param {boolean} [opt.fixMin=false] + * @param {boolean} [opt.fixMax=false] + * @param {boolean} [opt.minInterval] + * @param {boolean} [opt.maxInterval] + */ + niceExtent: function (opt) { + var extent = this._extent; + // If extent start and end are same, expand them + if (extent[0] === extent[1]) { + if (extent[0] !== 0) { + // Expand extent + var expandSize = extent[0]; + // In the fowllowing case + // Axis has been fixed max 100 + // Plus data are all 100 and axis extent are [100, 100]. + // Extend to the both side will cause expanded max is larger than fixed max. + // So only expand to the smaller side. + if (!opt.fixMax) { + extent[1] += expandSize / 2; + extent[0] -= expandSize / 2; + } + else { + extent[0] -= expandSize / 2; + } + } + else { + extent[1] = 1; + } + } + var span = extent[1] - extent[0]; + // If there are no data and extent are [Infinity, -Infinity] + if (!isFinite(span)) { + extent[0] = 0; + extent[1] = 1; + } + + this.niceTicks(opt.splitNumber, opt.minInterval, opt.maxInterval); + + // var extent = this._extent; + var interval = this._interval; + + if (!opt.fixMin) { + extent[0] = roundNumber(Math.floor(extent[0] / interval) * interval); + } + if (!opt.fixMax) { + extent[1] = roundNumber(Math.ceil(extent[1] / interval) * interval); + } + } +}); + +/** + * @return {module:echarts/scale/Time} + */ +IntervalScale.create = function () { + return new IntervalScale(); +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var STACK_PREFIX = '__ec_stack_'; +var LARGE_BAR_MIN_WIDTH = 0.5; + +var LargeArr = typeof Float32Array !== 'undefined' ? Float32Array : Array; + +function getSeriesStackId(seriesModel) { + return seriesModel.get('stack') || STACK_PREFIX + seriesModel.seriesIndex; +} + +function getAxisKey(axis) { + return axis.dim + axis.index; +} + +/** + * @param {Object} opt + * @param {module:echarts/coord/Axis} opt.axis Only support category axis currently. + * @param {number} opt.count Positive interger. + * @param {number} [opt.barWidth] + * @param {number} [opt.barMaxWidth] + * @param {number} [opt.barGap] + * @param {number} [opt.barCategoryGap] + * @return {Object} {width, offset, offsetCenter} If axis.type is not 'category', return undefined. + */ +function getLayoutOnAxis(opt) { + var params = []; + var baseAxis = opt.axis; + var axisKey = 'axis0'; + + if (baseAxis.type !== 'category') { + return; + } + var bandWidth = baseAxis.getBandWidth(); + + for (var i = 0; i < opt.count || 0; i++) { + params.push(defaults({ + bandWidth: bandWidth, + axisKey: axisKey, + stackId: STACK_PREFIX + i + }, opt)); + } + var widthAndOffsets = doCalBarWidthAndOffset(params); + + var result = []; + for (var i = 0; i < opt.count; i++) { + var item = widthAndOffsets[axisKey][STACK_PREFIX + i]; + item.offsetCenter = item.offset + item.width / 2; + result.push(item); + } + + return result; +} + +function prepareLayoutBarSeries(seriesType, ecModel) { + var seriesModels = []; + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + // Check series coordinate, do layout for cartesian2d only + if (isOnCartesian(seriesModel) && !isInLargeMode(seriesModel)) { + seriesModels.push(seriesModel); + } + }); + return seriesModels; +} + +function makeColumnLayout(barSeries) { + var seriesInfoList = []; + each$1(barSeries, function (seriesModel) { + var data = seriesModel.getData(); + var cartesian = seriesModel.coordinateSystem; + var baseAxis = cartesian.getBaseAxis(); + var axisExtent = baseAxis.getExtent(); + var bandWidth = baseAxis.type === 'category' + ? baseAxis.getBandWidth() + : (Math.abs(axisExtent[1] - axisExtent[0]) / data.count()); + + var barWidth = parsePercent$1( + seriesModel.get('barWidth'), bandWidth + ); + var barMaxWidth = parsePercent$1( + seriesModel.get('barMaxWidth'), bandWidth + ); + var barGap = seriesModel.get('barGap'); + var barCategoryGap = seriesModel.get('barCategoryGap'); + + seriesInfoList.push({ + bandWidth: bandWidth, + barWidth: barWidth, + barMaxWidth: barMaxWidth, + barGap: barGap, + barCategoryGap: barCategoryGap, + axisKey: getAxisKey(baseAxis), + stackId: getSeriesStackId(seriesModel) + }); + }); + + return doCalBarWidthAndOffset(seriesInfoList); +} + +function doCalBarWidthAndOffset(seriesInfoList) { + // Columns info on each category axis. Key is cartesian name + var columnsMap = {}; + + each$1(seriesInfoList, function (seriesInfo, idx) { + var axisKey = seriesInfo.axisKey; + var bandWidth = seriesInfo.bandWidth; + var columnsOnAxis = columnsMap[axisKey] || { + bandWidth: bandWidth, + remainedWidth: bandWidth, + autoWidthCount: 0, + categoryGap: '20%', + gap: '30%', + stacks: {} + }; + var stacks = columnsOnAxis.stacks; + columnsMap[axisKey] = columnsOnAxis; + + var stackId = seriesInfo.stackId; + + if (!stacks[stackId]) { + columnsOnAxis.autoWidthCount++; + } + stacks[stackId] = stacks[stackId] || { + width: 0, + maxWidth: 0 + }; + + // Caution: In a single coordinate system, these barGrid attributes + // will be shared by series. Consider that they have default values, + // only the attributes set on the last series will work. + // Do not change this fact unless there will be a break change. + + // TODO + var barWidth = seriesInfo.barWidth; + if (barWidth && !stacks[stackId].width) { + // See #6312, do not restrict width. + stacks[stackId].width = barWidth; + barWidth = Math.min(columnsOnAxis.remainedWidth, barWidth); + columnsOnAxis.remainedWidth -= barWidth; + } + + var barMaxWidth = seriesInfo.barMaxWidth; + barMaxWidth && (stacks[stackId].maxWidth = barMaxWidth); + var barGap = seriesInfo.barGap; + (barGap != null) && (columnsOnAxis.gap = barGap); + var barCategoryGap = seriesInfo.barCategoryGap; + (barCategoryGap != null) && (columnsOnAxis.categoryGap = barCategoryGap); + }); + + var result = {}; + + each$1(columnsMap, function (columnsOnAxis, coordSysName) { + + result[coordSysName] = {}; + + var stacks = columnsOnAxis.stacks; + var bandWidth = columnsOnAxis.bandWidth; + var categoryGap = parsePercent$1(columnsOnAxis.categoryGap, bandWidth); + var barGapPercent = parsePercent$1(columnsOnAxis.gap, 1); + + var remainedWidth = columnsOnAxis.remainedWidth; + var autoWidthCount = columnsOnAxis.autoWidthCount; + var autoWidth = (remainedWidth - categoryGap) + / (autoWidthCount + (autoWidthCount - 1) * barGapPercent); + autoWidth = Math.max(autoWidth, 0); + + // Find if any auto calculated bar exceeded maxBarWidth + each$1(stacks, function (column, stack) { + var maxWidth = column.maxWidth; + if (maxWidth && maxWidth < autoWidth) { + maxWidth = Math.min(maxWidth, remainedWidth); + if (column.width) { + maxWidth = Math.min(maxWidth, column.width); + } + remainedWidth -= maxWidth; + column.width = maxWidth; + autoWidthCount--; + } + }); + + // Recalculate width again + autoWidth = (remainedWidth - categoryGap) + / (autoWidthCount + (autoWidthCount - 1) * barGapPercent); + autoWidth = Math.max(autoWidth, 0); + + var widthSum = 0; + var lastColumn; + each$1(stacks, function (column, idx) { + if (!column.width) { + column.width = autoWidth; + } + lastColumn = column; + widthSum += column.width * (1 + barGapPercent); + }); + if (lastColumn) { + widthSum -= lastColumn.width * barGapPercent; + } + + var offset = -widthSum / 2; + each$1(stacks, function (column, stackId) { + result[coordSysName][stackId] = result[coordSysName][stackId] || { + offset: offset, + width: column.width + }; + + offset += column.width * (1 + barGapPercent); + }); + }); + + return result; +} + +/** + * @param {Object} barWidthAndOffset The result of makeColumnLayout + * @param {module:echarts/coord/Axis} axis + * @param {module:echarts/model/Series} [seriesModel] If not provided, return all. + * @return {Object} {stackId: {offset, width}} or {offset, width} if seriesModel provided. + */ +function retrieveColumnLayout(barWidthAndOffset, axis, seriesModel) { + if (barWidthAndOffset && axis) { + var result = barWidthAndOffset[getAxisKey(axis)]; + if (result != null && seriesModel != null) { + result = result[getSeriesStackId(seriesModel)]; + } + return result; + } +} + +/** + * @param {string} seriesType + * @param {module:echarts/model/Global} ecModel + */ +function layout(seriesType, ecModel) { + + var seriesModels = prepareLayoutBarSeries(seriesType, ecModel); + var barWidthAndOffset = makeColumnLayout(seriesModels); + + var lastStackCoords = {}; + each$1(seriesModels, function (seriesModel) { + + var data = seriesModel.getData(); + var cartesian = seriesModel.coordinateSystem; + var baseAxis = cartesian.getBaseAxis(); + + var stackId = getSeriesStackId(seriesModel); + var columnLayoutInfo = barWidthAndOffset[getAxisKey(baseAxis)][stackId]; + var columnOffset = columnLayoutInfo.offset; + var columnWidth = columnLayoutInfo.width; + var valueAxis = cartesian.getOtherAxis(baseAxis); + + var barMinHeight = seriesModel.get('barMinHeight') || 0; + + lastStackCoords[stackId] = lastStackCoords[stackId] || []; + data.setLayout({ + offset: columnOffset, + size: columnWidth + }); + + var valueDim = data.mapDimension(valueAxis.dim); + var baseDim = data.mapDimension(baseAxis.dim); + var stacked = isDimensionStacked(data, valueDim /*, baseDim*/); + var isValueAxisH = valueAxis.isHorizontal(); + + var valueAxisStart = getValueAxisStart(baseAxis, valueAxis, stacked); + + for (var idx = 0, len = data.count(); idx < len; idx++) { + var value = data.get(valueDim, idx); + var baseValue = data.get(baseDim, idx); + + if (isNaN(value)) { + continue; + } + + var sign = value >= 0 ? 'p' : 'n'; + var baseCoord = valueAxisStart; + + // Because of the barMinHeight, we can not use the value in + // stackResultDimension directly. + if (stacked) { + // Only ordinal axis can be stacked. + if (!lastStackCoords[stackId][baseValue]) { + lastStackCoords[stackId][baseValue] = { + p: valueAxisStart, // Positive stack + n: valueAxisStart // Negative stack + }; + } + // Should also consider #4243 + baseCoord = lastStackCoords[stackId][baseValue][sign]; + } + + var x; + var y; + var width; + var height; + + if (isValueAxisH) { + var coord = cartesian.dataToPoint([value, baseValue]); + x = baseCoord; + y = coord[1] + columnOffset; + width = coord[0] - valueAxisStart; + height = columnWidth; + + if (Math.abs(width) < barMinHeight) { + width = (width < 0 ? -1 : 1) * barMinHeight; + } + stacked && (lastStackCoords[stackId][baseValue][sign] += width); + } + else { + var coord = cartesian.dataToPoint([baseValue, value]); + x = coord[0] + columnOffset; + y = baseCoord; + width = columnWidth; + height = coord[1] - valueAxisStart; + + if (Math.abs(height) < barMinHeight) { + // Include zero to has a positive bar + height = (height <= 0 ? -1 : 1) * barMinHeight; + } + stacked && (lastStackCoords[stackId][baseValue][sign] += height); + } + + data.setItemLayout(idx, { + x: x, + y: y, + width: width, + height: height + }); + } + + }, this); +} + +// TODO: Do not support stack in large mode yet. +var largeLayout = { + + seriesType: 'bar', + + plan: createRenderPlanner(), + + reset: function (seriesModel) { + if (!isOnCartesian(seriesModel) || !isInLargeMode(seriesModel)) { + return; + } + + var data = seriesModel.getData(); + var cartesian = seriesModel.coordinateSystem; + var baseAxis = cartesian.getBaseAxis(); + var valueAxis = cartesian.getOtherAxis(baseAxis); + var valueDim = data.mapDimension(valueAxis.dim); + var baseDim = data.mapDimension(baseAxis.dim); + var valueAxisHorizontal = valueAxis.isHorizontal(); + var valueDimIdx = valueAxisHorizontal ? 0 : 1; + + var barWidth = retrieveColumnLayout( + makeColumnLayout([seriesModel]), baseAxis, seriesModel + ).width; + if (!(barWidth > LARGE_BAR_MIN_WIDTH)) { // jshint ignore:line + barWidth = LARGE_BAR_MIN_WIDTH; + } + + return {progress: progress}; + + function progress(params, data) { + var largePoints = new LargeArr(params.count * 2); + var dataIndex; + var coord = []; + var valuePair = []; + var offset = 0; + + while ((dataIndex = params.next()) != null) { + valuePair[valueDimIdx] = data.get(valueDim, dataIndex); + valuePair[1 - valueDimIdx] = data.get(baseDim, dataIndex); + + coord = cartesian.dataToPoint(valuePair, null, coord); + largePoints[offset++] = coord[0]; + largePoints[offset++] = coord[1]; + } + + data.setLayout({ + largePoints: largePoints, + barWidth: barWidth, + valueAxisStart: getValueAxisStart(baseAxis, valueAxis, false), + valueAxisHorizontal: valueAxisHorizontal + }); + } + } +}; + +function isOnCartesian(seriesModel) { + return seriesModel.coordinateSystem && seriesModel.coordinateSystem.type === 'cartesian2d'; +} + +function isInLargeMode(seriesModel) { + return seriesModel.pipelineContext && seriesModel.pipelineContext.large; +} + +function getValueAxisStart(baseAxis, valueAxis, stacked) { + return ( + indexOf(baseAxis.getAxesOnZeroOf(), valueAxis) >= 0 + || stacked + ) + ? valueAxis.toGlobalCoord(valueAxis.dataToCoord(0)) + : valueAxis.getGlobalExtent()[0]; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/* +* The `scaleLevels` references to d3.js. The use of the source +* code of this file is also subject to the terms and consitions +* of its license (BSD-3Clause, see <echarts/src/licenses/LICENSE-d3>). +*/ + +// [About UTC and local time zone]: +// In most cases, `number.parseDate` will treat input data string as local time +// (except time zone is specified in time string). And `format.formateTime` returns +// local time by default. option.useUTC is false by default. This design have +// concidered these common case: +// (1) Time that is persistent in server is in UTC, but it is needed to be diplayed +// in local time by default. +// (2) By default, the input data string (e.g., '2011-01-02') should be displayed +// as its original time, without any time difference. + +var intervalScaleProto = IntervalScale.prototype; + +var mathCeil = Math.ceil; +var mathFloor = Math.floor; +var ONE_SECOND = 1000; +var ONE_MINUTE = ONE_SECOND * 60; +var ONE_HOUR = ONE_MINUTE * 60; +var ONE_DAY = ONE_HOUR * 24; + +// FIXME 公用? +var bisect = function (a, x, lo, hi) { + while (lo < hi) { + var mid = lo + hi >>> 1; + if (a[mid][1] < x) { + lo = mid + 1; + } + else { + hi = mid; + } + } + return lo; +}; + +/** + * @alias module:echarts/coord/scale/Time + * @constructor + */ +var TimeScale = IntervalScale.extend({ + type: 'time', + + /** + * @override + */ + getLabel: function (val) { + var stepLvl = this._stepLvl; + + var date = new Date(val); + + return formatTime(stepLvl[0], date, this.getSetting('useUTC')); + }, + + /** + * @override + */ + niceExtent: function (opt) { + var extent = this._extent; + // If extent start and end are same, expand them + if (extent[0] === extent[1]) { + // Expand extent + extent[0] -= ONE_DAY; + extent[1] += ONE_DAY; + } + // If there are no data and extent are [Infinity, -Infinity] + if (extent[1] === -Infinity && extent[0] === Infinity) { + var d = new Date(); + extent[1] = +new Date(d.getFullYear(), d.getMonth(), d.getDate()); + extent[0] = extent[1] - ONE_DAY; + } + + this.niceTicks(opt.splitNumber, opt.minInterval, opt.maxInterval); + + // var extent = this._extent; + var interval = this._interval; + + if (!opt.fixMin) { + extent[0] = round$1(mathFloor(extent[0] / interval) * interval); + } + if (!opt.fixMax) { + extent[1] = round$1(mathCeil(extent[1] / interval) * interval); + } + }, + + /** + * @override + */ + niceTicks: function (approxTickNum, minInterval, maxInterval) { + approxTickNum = approxTickNum || 10; + + var extent = this._extent; + var span = extent[1] - extent[0]; + var approxInterval = span / approxTickNum; + + if (minInterval != null && approxInterval < minInterval) { + approxInterval = minInterval; + } + if (maxInterval != null && approxInterval > maxInterval) { + approxInterval = maxInterval; + } + + var scaleLevelsLen = scaleLevels.length; + var idx = bisect(scaleLevels, approxInterval, 0, scaleLevelsLen); + + var level = scaleLevels[Math.min(idx, scaleLevelsLen - 1)]; + var interval = level[1]; + // Same with interval scale if span is much larger than 1 year + if (level[0] === 'year') { + var yearSpan = span / interval; + + // From "Nice Numbers for Graph Labels" of Graphic Gems + // var niceYearSpan = numberUtil.nice(yearSpan, false); + var yearStep = nice(yearSpan / approxTickNum, true); + + interval *= yearStep; + } + + var timezoneOffset = this.getSetting('useUTC') + ? 0 : (new Date(+extent[0] || +extent[1])).getTimezoneOffset() * 60 * 1000; + var niceExtent = [ + Math.round(mathCeil((extent[0] - timezoneOffset) / interval) * interval + timezoneOffset), + Math.round(mathFloor((extent[1] - timezoneOffset) / interval) * interval + timezoneOffset) + ]; + + fixExtent(niceExtent, extent); + + this._stepLvl = level; + // Interval will be used in getTicks + this._interval = interval; + this._niceExtent = niceExtent; + }, + + parse: function (val) { + // val might be float. + return +parseDate(val); + } +}); + +each$1(['contain', 'normalize'], function (methodName) { + TimeScale.prototype[methodName] = function (val) { + return intervalScaleProto[methodName].call(this, this.parse(val)); + }; +}); + +// Steps from d3, see the license statement at the top of this file. +var scaleLevels = [ + // Format interval + ['hh:mm:ss', ONE_SECOND], // 1s + ['hh:mm:ss', ONE_SECOND * 5], // 5s + ['hh:mm:ss', ONE_SECOND * 10], // 10s + ['hh:mm:ss', ONE_SECOND * 15], // 15s + ['hh:mm:ss', ONE_SECOND * 30], // 30s + ['hh:mm\nMM-dd', ONE_MINUTE], // 1m + ['hh:mm\nMM-dd', ONE_MINUTE * 5], // 5m + ['hh:mm\nMM-dd', ONE_MINUTE * 10], // 10m + ['hh:mm\nMM-dd', ONE_MINUTE * 15], // 15m + ['hh:mm\nMM-dd', ONE_MINUTE * 30], // 30m + ['hh:mm\nMM-dd', ONE_HOUR], // 1h + ['hh:mm\nMM-dd', ONE_HOUR * 2], // 2h + ['hh:mm\nMM-dd', ONE_HOUR * 6], // 6h + ['hh:mm\nMM-dd', ONE_HOUR * 12], // 12h + ['MM-dd\nyyyy', ONE_DAY], // 1d + ['MM-dd\nyyyy', ONE_DAY * 2], // 2d + ['MM-dd\nyyyy', ONE_DAY * 3], // 3d + ['MM-dd\nyyyy', ONE_DAY * 4], // 4d + ['MM-dd\nyyyy', ONE_DAY * 5], // 5d + ['MM-dd\nyyyy', ONE_DAY * 6], // 6d + ['week', ONE_DAY * 7], // 7d + ['MM-dd\nyyyy', ONE_DAY * 10], // 10d + ['week', ONE_DAY * 14], // 2w + ['week', ONE_DAY * 21], // 3w + ['month', ONE_DAY * 31], // 1M + ['week', ONE_DAY * 42], // 6w + ['month', ONE_DAY * 62], // 2M + ['week', ONE_DAY * 42], // 10w + ['quarter', ONE_DAY * 380 / 4], // 3M + ['month', ONE_DAY * 31 * 4], // 4M + ['month', ONE_DAY * 31 * 5], // 5M + ['half-year', ONE_DAY * 380 / 2], // 6M + ['month', ONE_DAY * 31 * 8], // 8M + ['month', ONE_DAY * 31 * 10], // 10M + ['year', ONE_DAY * 380] // 1Y +]; + +/** + * @param {module:echarts/model/Model} + * @return {module:echarts/scale/Time} + */ +TimeScale.create = function (model) { + return new TimeScale({useUTC: model.ecModel.get('useUTC')}); +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Log scale + * @module echarts/scale/Log + */ + +// Use some method of IntervalScale +var scaleProto$1 = Scale.prototype; +var intervalScaleProto$1 = IntervalScale.prototype; + +var getPrecisionSafe$1 = getPrecisionSafe; +var roundingErrorFix = round$1; + +var mathFloor$1 = Math.floor; +var mathCeil$1 = Math.ceil; +var mathPow$1 = Math.pow; + +var mathLog = Math.log; + +var LogScale = Scale.extend({ + + type: 'log', + + base: 10, + + $constructor: function () { + Scale.apply(this, arguments); + this._originalScale = new IntervalScale(); + }, + + /** + * @return {Array.<number>} + */ + getTicks: function () { + var originalScale = this._originalScale; + var extent = this._extent; + var originalExtent = originalScale.getExtent(); + + return map(intervalScaleProto$1.getTicks.call(this), function (val) { + var powVal = round$1(mathPow$1(this.base, val)); + + // Fix #4158 + powVal = (val === extent[0] && originalScale.__fixMin) + ? fixRoundingError(powVal, originalExtent[0]) + : powVal; + powVal = (val === extent[1] && originalScale.__fixMax) + ? fixRoundingError(powVal, originalExtent[1]) + : powVal; + + return powVal; + }, this); + }, + + /** + * @param {number} val + * @return {string} + */ + getLabel: intervalScaleProto$1.getLabel, + + /** + * @param {number} val + * @return {number} + */ + scale: function (val) { + val = scaleProto$1.scale.call(this, val); + return mathPow$1(this.base, val); + }, + + /** + * @param {number} start + * @param {number} end + */ + setExtent: function (start, end) { + var base = this.base; + start = mathLog(start) / mathLog(base); + end = mathLog(end) / mathLog(base); + intervalScaleProto$1.setExtent.call(this, start, end); + }, + + /** + * @return {number} end + */ + getExtent: function () { + var base = this.base; + var extent = scaleProto$1.getExtent.call(this); + extent[0] = mathPow$1(base, extent[0]); + extent[1] = mathPow$1(base, extent[1]); + + // Fix #4158 + var originalScale = this._originalScale; + var originalExtent = originalScale.getExtent(); + originalScale.__fixMin && (extent[0] = fixRoundingError(extent[0], originalExtent[0])); + originalScale.__fixMax && (extent[1] = fixRoundingError(extent[1], originalExtent[1])); + + return extent; + }, + + /** + * @param {Array.<number>} extent + */ + unionExtent: function (extent) { + this._originalScale.unionExtent(extent); + + var base = this.base; + extent[0] = mathLog(extent[0]) / mathLog(base); + extent[1] = mathLog(extent[1]) / mathLog(base); + scaleProto$1.unionExtent.call(this, extent); + }, + + /** + * @override + */ + unionExtentFromData: function (data, dim) { + // TODO + // filter value that <= 0 + this.unionExtent(data.getApproximateExtent(dim)); + }, + + /** + * Update interval and extent of intervals for nice ticks + * @param {number} [approxTickNum = 10] Given approx tick number + */ + niceTicks: function (approxTickNum) { + approxTickNum = approxTickNum || 10; + var extent = this._extent; + var span = extent[1] - extent[0]; + if (span === Infinity || span <= 0) { + return; + } + + var interval = quantity(span); + var err = approxTickNum / span * interval; + + // Filter ticks to get closer to the desired count. + if (err <= 0.5) { + interval *= 10; + } + + // Interval should be integer + while (!isNaN(interval) && Math.abs(interval) < 1 && Math.abs(interval) > 0) { + interval *= 10; + } + + var niceExtent = [ + round$1(mathCeil$1(extent[0] / interval) * interval), + round$1(mathFloor$1(extent[1] / interval) * interval) + ]; + + this._interval = interval; + this._niceExtent = niceExtent; + }, + + /** + * Nice extent. + * @override + */ + niceExtent: function (opt) { + intervalScaleProto$1.niceExtent.call(this, opt); + + var originalScale = this._originalScale; + originalScale.__fixMin = opt.fixMin; + originalScale.__fixMax = opt.fixMax; + } + +}); + +each$1(['contain', 'normalize'], function (methodName) { + LogScale.prototype[methodName] = function (val) { + val = mathLog(val) / mathLog(this.base); + return scaleProto$1[methodName].call(this, val); + }; +}); + +LogScale.create = function () { + return new LogScale(); +}; + +function fixRoundingError(val, originalVal) { + return roundingErrorFix(val, getPrecisionSafe$1(originalVal)); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Get axis scale extent before niced. + * Item of returned array can only be number (including Infinity and NaN). + */ +function getScaleExtent(scale, model) { + var scaleType = scale.type; + + var min = model.getMin(); + var max = model.getMax(); + var fixMin = min != null; + var fixMax = max != null; + var originalExtent = scale.getExtent(); + + var axisDataLen; + var boundaryGap; + var span; + if (scaleType === 'ordinal') { + axisDataLen = model.getCategories().length; + } + else { + boundaryGap = model.get('boundaryGap'); + if (!isArray(boundaryGap)) { + boundaryGap = [boundaryGap || 0, boundaryGap || 0]; + } + if (typeof boundaryGap[0] === 'boolean') { + if (__DEV__) { + console.warn('Boolean type for boundaryGap is only ' + + 'allowed for ordinal axis. Please use string in ' + + 'percentage instead, e.g., "20%". Currently, ' + + 'boundaryGap is set to be 0.'); + } + boundaryGap = [0, 0]; + } + boundaryGap[0] = parsePercent$1(boundaryGap[0], 1); + boundaryGap[1] = parsePercent$1(boundaryGap[1], 1); + span = (originalExtent[1] - originalExtent[0]) + || Math.abs(originalExtent[0]); + } + + // Notice: When min/max is not set (that is, when there are null/undefined, + // which is the most common case), these cases should be ensured: + // (1) For 'ordinal', show all axis.data. + // (2) For others: + // + `boundaryGap` is applied (if min/max set, boundaryGap is + // disabled). + // + If `needCrossZero`, min/max should be zero, otherwise, min/max should + // be the result that originalExtent enlarged by boundaryGap. + // (3) If no data, it should be ensured that `scale.setBlank` is set. + + // FIXME + // (1) When min/max is 'dataMin' or 'dataMax', should boundaryGap be able to used? + // (2) When `needCrossZero` and all data is positive/negative, should it be ensured + // that the results processed by boundaryGap are positive/negative? + + if (min == null) { + min = scaleType === 'ordinal' + ? (axisDataLen ? 0 : NaN) + : originalExtent[0] - boundaryGap[0] * span; + } + if (max == null) { + max = scaleType === 'ordinal' + ? (axisDataLen ? axisDataLen - 1 : NaN) + : originalExtent[1] + boundaryGap[1] * span; + } + + if (min === 'dataMin') { + min = originalExtent[0]; + } + else if (typeof min === 'function') { + min = min({ + min: originalExtent[0], + max: originalExtent[1] + }); + } + + if (max === 'dataMax') { + max = originalExtent[1]; + } + else if (typeof max === 'function') { + max = max({ + min: originalExtent[0], + max: originalExtent[1] + }); + } + + (min == null || !isFinite(min)) && (min = NaN); + (max == null || !isFinite(max)) && (max = NaN); + + scale.setBlank( + eqNaN(min) + || eqNaN(max) + || (scaleType === 'ordinal' && !scale.getOrdinalMeta().categories.length) + ); + + // Evaluate if axis needs cross zero + if (model.getNeedCrossZero()) { + // Axis is over zero and min is not set + if (min > 0 && max > 0 && !fixMin) { + min = 0; + } + // Axis is under zero and max is not set + if (min < 0 && max < 0 && !fixMax) { + max = 0; + } + } + + // If bars are placed on a base axis of type time or interval account for axis boundary overflow and current axis + // is base axis + // FIXME + // (1) Consider support value axis, where below zero and axis `onZero` should be handled properly. + // (2) Refactor the logic with `barGrid`. Is it not need to `makeBarWidthAndOffsetInfo` twice with different extent? + // Should not depend on series type `bar`? + // (3) Fix that might overlap when using dataZoom. + // (4) Consider other chart types using `barGrid`? + // See #6728, #4862, `test/bar-overflow-time-plot.html` + var ecModel = model.ecModel; + if (ecModel && (scaleType === 'time' /*|| scaleType === 'interval' */)) { + var barSeriesModels = prepareLayoutBarSeries('bar', ecModel); + var isBaseAxisAndHasBarSeries; + + each$1(barSeriesModels, function (seriesModel) { + isBaseAxisAndHasBarSeries |= seriesModel.getBaseAxis() === model.axis; + }); + + if (isBaseAxisAndHasBarSeries) { + // Calculate placement of bars on axis + var barWidthAndOffset = makeColumnLayout(barSeriesModels); + + // Adjust axis min and max to account for overflow + var adjustedScale = adjustScaleForOverflow(min, max, model, barWidthAndOffset); + min = adjustedScale.min; + max = adjustedScale.max; + } + } + + return [min, max]; +} + +function adjustScaleForOverflow(min, max, model, barWidthAndOffset) { + + // Get Axis Length + var axisExtent = model.axis.getExtent(); + var axisLength = axisExtent[1] - axisExtent[0]; + + // Get bars on current base axis and calculate min and max overflow + var barsOnCurrentAxis = retrieveColumnLayout(barWidthAndOffset, model.axis); + if (barsOnCurrentAxis === undefined) { + return {min: min, max: max}; + } + + var minOverflow = Infinity; + each$1(barsOnCurrentAxis, function (item) { + minOverflow = Math.min(item.offset, minOverflow); + }); + var maxOverflow = -Infinity; + each$1(barsOnCurrentAxis, function (item) { + maxOverflow = Math.max(item.offset + item.width, maxOverflow); + }); + minOverflow = Math.abs(minOverflow); + maxOverflow = Math.abs(maxOverflow); + var totalOverFlow = minOverflow + maxOverflow; + + // Calulate required buffer based on old range and overflow + var oldRange = max - min; + var oldRangePercentOfNew = (1 - (minOverflow + maxOverflow) / axisLength); + var overflowBuffer = ((oldRange / oldRangePercentOfNew) - oldRange); + + max += overflowBuffer * (maxOverflow / totalOverFlow); + min -= overflowBuffer * (minOverflow / totalOverFlow); + + return {min: min, max: max}; +} + +function niceScaleExtent(scale, model) { + var extent = getScaleExtent(scale, model); + var fixMin = model.getMin() != null; + var fixMax = model.getMax() != null; + var splitNumber = model.get('splitNumber'); + + if (scale.type === 'log') { + scale.base = model.get('logBase'); + } + + var scaleType = scale.type; + scale.setExtent(extent[0], extent[1]); + scale.niceExtent({ + splitNumber: splitNumber, + fixMin: fixMin, + fixMax: fixMax, + minInterval: (scaleType === 'interval' || scaleType === 'time') + ? model.get('minInterval') : null, + maxInterval: (scaleType === 'interval' || scaleType === 'time') + ? model.get('maxInterval') : null + }); + + // If some one specified the min, max. And the default calculated interval + // is not good enough. He can specify the interval. It is often appeared + // in angle axis with angle 0 - 360. Interval calculated in interval scale is hard + // to be 60. + // FIXME + var interval = model.get('interval'); + if (interval != null) { + scale.setInterval && scale.setInterval(interval); + } +} + +/** + * @param {module:echarts/model/Model} model + * @param {string} [axisType] Default retrieve from model.type + * @return {module:echarts/scale/*} + */ +function createScaleByModel(model, axisType) { + axisType = axisType || model.get('type'); + if (axisType) { + switch (axisType) { + // Buildin scale + case 'category': + return new OrdinalScale( + model.getOrdinalMeta + ? model.getOrdinalMeta() + : model.getCategories(), + [Infinity, -Infinity] + ); + case 'value': + return new IntervalScale(); + // Extended scale, like time and log + default: + return (Scale.getClass(axisType) || IntervalScale).create(model); + } + } +} + +/** + * Check if the axis corss 0 + */ +function ifAxisCrossZero(axis) { + var dataExtent = axis.scale.getExtent(); + var min = dataExtent[0]; + var max = dataExtent[1]; + return !((min > 0 && max > 0) || (min < 0 && max < 0)); +} + +/** + * @param {module:echarts/coord/Axis} axis + * @return {Function} Label formatter function. + * param: {number} tickValue, + * param: {number} idx, the index in all ticks. + * If category axis, this param is not requied. + * return: {string} label string. + */ +function makeLabelFormatter(axis) { + var labelFormatter = axis.getLabelModel().get('formatter'); + var categoryTickStart = axis.type === 'category' ? axis.scale.getExtent()[0] : null; + + if (typeof labelFormatter === 'string') { + labelFormatter = (function (tpl) { + return function (val) { + return tpl.replace('{value}', val != null ? val : ''); + }; + })(labelFormatter); + // Consider empty array + return labelFormatter; + } + else if (typeof labelFormatter === 'function') { + return function (tickValue, idx) { + // The original intention of `idx` is "the index of the tick in all ticks". + // But the previous implementation of category axis do not consider the + // `axisLabel.interval`, which cause that, for example, the `interval` is + // `1`, then the ticks "name5", "name7", "name9" are displayed, where the + // corresponding `idx` are `0`, `2`, `4`, but not `0`, `1`, `2`. So we keep + // the definition here for back compatibility. + if (categoryTickStart != null) { + idx = tickValue - categoryTickStart; + } + return labelFormatter(getAxisRawValue(axis, tickValue), idx); + }; + } + else { + return function (tick) { + return axis.scale.getLabel(tick); + }; + } +} + +function getAxisRawValue(axis, value) { + // In category axis with data zoom, tick is not the original + // index of axis.data. So tick should not be exposed to user + // in category axis. + return axis.type === 'category' ? axis.scale.getLabel(value) : value; +} + +/** + * @param {module:echarts/coord/Axis} axis + * @return {module:zrender/core/BoundingRect} Be null/undefined if no labels. + */ +function estimateLabelUnionRect(axis) { + var axisModel = axis.model; + var scale = axis.scale; + + if (!axisModel.get('axisLabel.show') || scale.isBlank()) { + return; + } + + var isCategory = axis.type === 'category'; + + var realNumberScaleTicks; + var tickCount; + var categoryScaleExtent = scale.getExtent(); + + // Optimize for large category data, avoid call `getTicks()`. + if (isCategory) { + tickCount = scale.count(); + } + else { + realNumberScaleTicks = scale.getTicks(); + tickCount = realNumberScaleTicks.length; + } + + var axisLabelModel = axis.getLabelModel(); + var labelFormatter = makeLabelFormatter(axis); + + var rect; + var step = 1; + // Simple optimization for large amount of labels + if (tickCount > 40) { + step = Math.ceil(tickCount / 40); + } + for (var i = 0; i < tickCount; i += step) { + var tickValue = realNumberScaleTicks ? realNumberScaleTicks[i] : categoryScaleExtent[0] + i; + var label = labelFormatter(tickValue); + var unrotatedSingleRect = axisLabelModel.getTextRect(label); + var singleRect = rotateTextRect(unrotatedSingleRect, axisLabelModel.get('rotate') || 0); + + rect ? rect.union(singleRect) : (rect = singleRect); + } + + return rect; +} + +function rotateTextRect(textRect, rotate) { + var rotateRadians = rotate * Math.PI / 180; + var boundingBox = textRect.plain(); + var beforeWidth = boundingBox.width; + var beforeHeight = boundingBox.height; + var afterWidth = beforeWidth * Math.cos(rotateRadians) + beforeHeight * Math.sin(rotateRadians); + var afterHeight = beforeWidth * Math.sin(rotateRadians) + beforeHeight * Math.cos(rotateRadians); + var rotatedRect = new BoundingRect(boundingBox.x, boundingBox.y, afterWidth, afterHeight); + + return rotatedRect; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var axisModelCommonMixin = { + + /** + * @param {boolean} origin + * @return {number|string} min value or 'dataMin' or null/undefined (means auto) or NaN + */ + getMin: function (origin) { + var option = this.option; + var min = (!origin && option.rangeStart != null) + ? option.rangeStart : option.min; + + if (this.axis + && min != null + && min !== 'dataMin' + && typeof min !== 'function' + && !eqNaN(min) + ) { + min = this.axis.scale.parse(min); + } + return min; + }, + + /** + * @param {boolean} origin + * @return {number|string} max value or 'dataMax' or null/undefined (means auto) or NaN + */ + getMax: function (origin) { + var option = this.option; + var max = (!origin && option.rangeEnd != null) + ? option.rangeEnd : option.max; + + if (this.axis + && max != null + && max !== 'dataMax' + && typeof max !== 'function' + && !eqNaN(max) + ) { + max = this.axis.scale.parse(max); + } + return max; + }, + + /** + * @return {boolean} + */ + getNeedCrossZero: function () { + var option = this.option; + return (option.rangeStart != null || option.rangeEnd != null) + ? false : !option.scale; + }, + + /** + * Should be implemented by each axis model if necessary. + * @return {module:echarts/model/Component} coordinate system model + */ + getCoordSysModel: noop, + + /** + * @param {number} rangeStart Can only be finite number or null/undefined or NaN. + * @param {number} rangeEnd Can only be finite number or null/undefined or NaN. + */ + setRange: function (rangeStart, rangeEnd) { + this.option.rangeStart = rangeStart; + this.option.rangeEnd = rangeEnd; + }, + + /** + * Reset range + */ + resetRange: function () { + // rangeStart and rangeEnd is readonly. + this.option.rangeStart = this.option.rangeEnd = null; + } +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// Symbol factory + +/** + * Triangle shape + * @inner + */ +var Triangle = extendShape({ + type: 'triangle', + shape: { + cx: 0, + cy: 0, + width: 0, + height: 0 + }, + buildPath: function (path, shape) { + var cx = shape.cx; + var cy = shape.cy; + var width = shape.width / 2; + var height = shape.height / 2; + path.moveTo(cx, cy - height); + path.lineTo(cx + width, cy + height); + path.lineTo(cx - width, cy + height); + path.closePath(); + } +}); + +/** + * Diamond shape + * @inner + */ +var Diamond = extendShape({ + type: 'diamond', + shape: { + cx: 0, + cy: 0, + width: 0, + height: 0 + }, + buildPath: function (path, shape) { + var cx = shape.cx; + var cy = shape.cy; + var width = shape.width / 2; + var height = shape.height / 2; + path.moveTo(cx, cy - height); + path.lineTo(cx + width, cy); + path.lineTo(cx, cy + height); + path.lineTo(cx - width, cy); + path.closePath(); + } +}); + +/** + * Pin shape + * @inner + */ +var Pin = extendShape({ + type: 'pin', + shape: { + // x, y on the cusp + x: 0, + y: 0, + width: 0, + height: 0 + }, + + buildPath: function (path, shape) { + var x = shape.x; + var y = shape.y; + var w = shape.width / 5 * 3; + // Height must be larger than width + var h = Math.max(w, shape.height); + var r = w / 2; + + // Dist on y with tangent point and circle center + var dy = r * r / (h - r); + var cy = y - h + r + dy; + var angle = Math.asin(dy / r); + // Dist on x with tangent point and circle center + var dx = Math.cos(angle) * r; + + var tanX = Math.sin(angle); + var tanY = Math.cos(angle); + + var cpLen = r * 0.6; + var cpLen2 = r * 0.7; + + path.moveTo(x - dx, cy + dy); + + path.arc( + x, cy, r, + Math.PI - angle, + Math.PI * 2 + angle + ); + path.bezierCurveTo( + x + dx - tanX * cpLen, cy + dy + tanY * cpLen, + x, y - cpLen2, + x, y + ); + path.bezierCurveTo( + x, y - cpLen2, + x - dx + tanX * cpLen, cy + dy + tanY * cpLen, + x - dx, cy + dy + ); + path.closePath(); + } +}); + +/** + * Arrow shape + * @inner + */ +var Arrow = extendShape({ + + type: 'arrow', + + shape: { + x: 0, + y: 0, + width: 0, + height: 0 + }, + + buildPath: function (ctx, shape) { + var height = shape.height; + var width = shape.width; + var x = shape.x; + var y = shape.y; + var dx = width / 3 * 2; + ctx.moveTo(x, y); + ctx.lineTo(x + dx, y + height); + ctx.lineTo(x, y + height / 4 * 3); + ctx.lineTo(x - dx, y + height); + ctx.lineTo(x, y); + ctx.closePath(); + } +}); + +/** + * Map of path contructors + * @type {Object.<string, module:zrender/graphic/Path>} + */ +var symbolCtors = { + + line: Line, + + rect: Rect, + + roundRect: Rect, + + square: Rect, + + circle: Circle, + + diamond: Diamond, + + pin: Pin, + + arrow: Arrow, + + triangle: Triangle +}; + +var symbolShapeMakers = { + + line: function (x, y, w, h, shape) { + // FIXME + shape.x1 = x; + shape.y1 = y + h / 2; + shape.x2 = x + w; + shape.y2 = y + h / 2; + }, + + rect: function (x, y, w, h, shape) { + shape.x = x; + shape.y = y; + shape.width = w; + shape.height = h; + }, + + roundRect: function (x, y, w, h, shape) { + shape.x = x; + shape.y = y; + shape.width = w; + shape.height = h; + shape.r = Math.min(w, h) / 4; + }, + + square: function (x, y, w, h, shape) { + var size = Math.min(w, h); + shape.x = x; + shape.y = y; + shape.width = size; + shape.height = size; + }, + + circle: function (x, y, w, h, shape) { + // Put circle in the center of square + shape.cx = x + w / 2; + shape.cy = y + h / 2; + shape.r = Math.min(w, h) / 2; + }, + + diamond: function (x, y, w, h, shape) { + shape.cx = x + w / 2; + shape.cy = y + h / 2; + shape.width = w; + shape.height = h; + }, + + pin: function (x, y, w, h, shape) { + shape.x = x + w / 2; + shape.y = y + h / 2; + shape.width = w; + shape.height = h; + }, + + arrow: function (x, y, w, h, shape) { + shape.x = x + w / 2; + shape.y = y + h / 2; + shape.width = w; + shape.height = h; + }, + + triangle: function (x, y, w, h, shape) { + shape.cx = x + w / 2; + shape.cy = y + h / 2; + shape.width = w; + shape.height = h; + } +}; + +var symbolBuildProxies = {}; +each$1(symbolCtors, function (Ctor, name) { + symbolBuildProxies[name] = new Ctor(); +}); + +var SymbolClz = extendShape({ + + type: 'symbol', + + shape: { + symbolType: '', + x: 0, + y: 0, + width: 0, + height: 0 + }, + + beforeBrush: function () { + var style = this.style; + var shape = this.shape; + // FIXME + if (shape.symbolType === 'pin' && style.textPosition === 'inside') { + style.textPosition = ['50%', '40%']; + style.textAlign = 'center'; + style.textVerticalAlign = 'middle'; + } + }, + + buildPath: function (ctx, shape, inBundle) { + var symbolType = shape.symbolType; + var proxySymbol = symbolBuildProxies[symbolType]; + if (shape.symbolType !== 'none') { + if (!proxySymbol) { + // Default rect + symbolType = 'rect'; + proxySymbol = symbolBuildProxies[symbolType]; + } + symbolShapeMakers[symbolType]( + shape.x, shape.y, shape.width, shape.height, proxySymbol.shape + ); + proxySymbol.buildPath(ctx, proxySymbol.shape, inBundle); + } + } +}); + +// Provide setColor helper method to avoid determine if set the fill or stroke outside +function symbolPathSetColor(color, innerColor) { + if (this.type !== 'image') { + var symbolStyle = this.style; + var symbolShape = this.shape; + if (symbolShape && symbolShape.symbolType === 'line') { + symbolStyle.stroke = color; + } + else if (this.__isEmptyBrush) { + symbolStyle.stroke = color; + symbolStyle.fill = innerColor || '#fff'; + } + else { + // FIXME 判断图形默认是填充还是描边,使用 onlyStroke ? + symbolStyle.fill && (symbolStyle.fill = color); + symbolStyle.stroke && (symbolStyle.stroke = color); + } + this.dirty(false); + } +} + +/** + * Create a symbol element with given symbol configuration: shape, x, y, width, height, color + * @param {string} symbolType + * @param {number} x + * @param {number} y + * @param {number} w + * @param {number} h + * @param {string} color + * @param {boolean} [keepAspect=false] whether to keep the ratio of w/h, + * for path and image only. + */ +function createSymbol(symbolType, x, y, w, h, color, keepAspect) { + // TODO Support image object, DynamicImage. + + var isEmpty = symbolType.indexOf('empty') === 0; + if (isEmpty) { + symbolType = symbolType.substr(5, 1).toLowerCase() + symbolType.substr(6); + } + var symbolPath; + + if (symbolType.indexOf('image://') === 0) { + symbolPath = makeImage( + symbolType.slice(8), + new BoundingRect(x, y, w, h), + keepAspect ? 'center' : 'cover' + ); + } + else if (symbolType.indexOf('path://') === 0) { + symbolPath = makePath( + symbolType.slice(7), + {}, + new BoundingRect(x, y, w, h), + keepAspect ? 'center' : 'cover' + ); + } + else { + symbolPath = new SymbolClz({ + shape: { + symbolType: symbolType, + x: x, + y: y, + width: w, + height: h + } + }); + } + + symbolPath.__isEmptyBrush = isEmpty; + + symbolPath.setColor = symbolPathSetColor; + + symbolPath.setColor(color); + + return symbolPath; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// import createGraphFromNodeEdge from './chart/helper/createGraphFromNodeEdge'; +/** + * Create a muti dimension List structure from seriesModel. + * @param {module:echarts/model/Model} seriesModel + * @return {module:echarts/data/List} list + */ +function createList(seriesModel) { + return createListFromArray(seriesModel.getSource(), seriesModel); +} + +var dataStack$1 = { + isDimensionStacked: isDimensionStacked, + enableDataStack: enableDataStack, + getStackedDimension: getStackedDimension +}; + +/** + * Create scale + * @param {Array.<number>} dataExtent + * @param {Object|module:echarts/Model} option + */ +function createScale(dataExtent, option) { + var axisModel = option; + if (!Model.isInstance(option)) { + axisModel = new Model(option); + mixin(axisModel, axisModelCommonMixin); + } + + var scale = createScaleByModel(axisModel); + scale.setExtent(dataExtent[0], dataExtent[1]); + + niceScaleExtent(scale, axisModel); + return scale; +} + +/** + * Mixin common methods to axis model, + * + * Inlcude methods + * `getFormattedLabels() => Array.<string>` + * `getCategories() => Array.<string>` + * `getMin(origin: boolean) => number` + * `getMax(origin: boolean) => number` + * `getNeedCrossZero() => boolean` + * `setRange(start: number, end: number)` + * `resetRange()` + */ +function mixinAxisModelCommonMethods(Model$$1) { + mixin(Model$$1, axisModelCommonMixin); +} + +var helper = (Object.freeze || Object)({ + createList: createList, + getLayoutRect: getLayoutRect, + dataStack: dataStack$1, + createScale: createScale, + mixinAxisModelCommonMethods: mixinAxisModelCommonMethods, + completeDimensions: completeDimensions, + createDimensions: createDimensions, + createSymbol: createSymbol +}); + +var EPSILON$3 = 1e-8; + +function isAroundEqual$1(a, b) { + return Math.abs(a - b) < EPSILON$3; +} + +function contain$1(points, x, y) { + var w = 0; + var p = points[0]; + + if (!p) { + return false; + } + + for (var i = 1; i < points.length; i++) { + var p2 = points[i]; + w += windingLine(p[0], p[1], p2[0], p2[1], x, y); + p = p2; + } + + // Close polygon + var p0 = points[0]; + if (!isAroundEqual$1(p[0], p0[0]) || !isAroundEqual$1(p[1], p0[1])) { + w += windingLine(p[0], p[1], p0[0], p0[1], x, y); + } + + return w !== 0; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @module echarts/coord/geo/Region + */ + +/** + * @param {string} name + * @param {Array} geometries + * @param {Array.<number>} cp + */ +function Region(name, geometries, cp) { + + /** + * @type {string} + * @readOnly + */ + this.name = name; + + /** + * @type {Array.<Array>} + * @readOnly + */ + this.geometries = geometries; + + if (!cp) { + var rect = this.getBoundingRect(); + cp = [ + rect.x + rect.width / 2, + rect.y + rect.height / 2 + ]; + } + else { + cp = [cp[0], cp[1]]; + } + /** + * @type {Array.<number>} + */ + this.center = cp; +} + +Region.prototype = { + + constructor: Region, + + properties: null, + + /** + * @return {module:zrender/core/BoundingRect} + */ + getBoundingRect: function () { + var rect = this._rect; + if (rect) { + return rect; + } + + var MAX_NUMBER = Number.MAX_VALUE; + var min$$1 = [MAX_NUMBER, MAX_NUMBER]; + var max$$1 = [-MAX_NUMBER, -MAX_NUMBER]; + var min2 = []; + var max2 = []; + var geometries = this.geometries; + for (var i = 0; i < geometries.length; i++) { + // Only support polygon + if (geometries[i].type !== 'polygon') { + continue; + } + // Doesn't consider hole + var exterior = geometries[i].exterior; + fromPoints(exterior, min2, max2); + min(min$$1, min$$1, min2); + max(max$$1, max$$1, max2); + } + // No data + if (i === 0) { + min$$1[0] = min$$1[1] = max$$1[0] = max$$1[1] = 0; + } + + return (this._rect = new BoundingRect( + min$$1[0], min$$1[1], max$$1[0] - min$$1[0], max$$1[1] - min$$1[1] + )); + }, + + /** + * @param {<Array.<number>} coord + * @return {boolean} + */ + contain: function (coord) { + var rect = this.getBoundingRect(); + var geometries = this.geometries; + if (!rect.contain(coord[0], coord[1])) { + return false; + } + loopGeo: for (var i = 0, len$$1 = geometries.length; i < len$$1; i++) { + // Only support polygon. + if (geometries[i].type !== 'polygon') { + continue; + } + var exterior = geometries[i].exterior; + var interiors = geometries[i].interiors; + if (contain$1(exterior, coord[0], coord[1])) { + // Not in the region if point is in the hole. + for (var k = 0; k < (interiors ? interiors.length : 0); k++) { + if (contain$1(interiors[k])) { + continue loopGeo; + } + } + return true; + } + } + return false; + }, + + transformTo: function (x, y, width, height) { + var rect = this.getBoundingRect(); + var aspect = rect.width / rect.height; + if (!width) { + width = aspect * height; + } + else if (!height) { + height = width / aspect ; + } + var target = new BoundingRect(x, y, width, height); + var transform = rect.calculateTransform(target); + var geometries = this.geometries; + for (var i = 0; i < geometries.length; i++) { + // Only support polygon. + if (geometries[i].type !== 'polygon') { + continue; + } + var exterior = geometries[i].exterior; + var interiors = geometries[i].interiors; + for (var p = 0; p < exterior.length; p++) { + applyTransform(exterior[p], exterior[p], transform); + } + for (var h = 0; h < (interiors ? interiors.length : 0); h++) { + for (var p = 0; p < interiors[h].length; p++) { + applyTransform(interiors[h][p], interiors[h][p], transform); + } + } + } + rect = this._rect; + rect.copy(target); + // Update center + this.center = [ + rect.x + rect.width / 2, + rect.y + rect.height / 2 + ]; + } +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Parse and decode geo json + * @module echarts/coord/geo/parseGeoJson + */ + +function decode(json) { + if (!json.UTF8Encoding) { + return json; + } + var encodeScale = json.UTF8Scale; + if (encodeScale == null) { + encodeScale = 1024; + } + + var features = json.features; + + for (var f = 0; f < features.length; f++) { + var feature = features[f]; + var geometry = feature.geometry; + var coordinates = geometry.coordinates; + var encodeOffsets = geometry.encodeOffsets; + + for (var c = 0; c < coordinates.length; c++) { + var coordinate = coordinates[c]; + + if (geometry.type === 'Polygon') { + coordinates[c] = decodePolygon( + coordinate, + encodeOffsets[c], + encodeScale + ); + } + else if (geometry.type === 'MultiPolygon') { + for (var c2 = 0; c2 < coordinate.length; c2++) { + var polygon = coordinate[c2]; + coordinate[c2] = decodePolygon( + polygon, + encodeOffsets[c][c2], + encodeScale + ); + } + } + } + } + // Has been decoded + json.UTF8Encoding = false; + return json; +} + +function decodePolygon(coordinate, encodeOffsets, encodeScale) { + var result = []; + var prevX = encodeOffsets[0]; + var prevY = encodeOffsets[1]; + + for (var i = 0; i < coordinate.length; i += 2) { + var x = coordinate.charCodeAt(i) - 64; + var y = coordinate.charCodeAt(i + 1) - 64; + // ZigZag decoding + x = (x >> 1) ^ (-(x & 1)); + y = (y >> 1) ^ (-(y & 1)); + // Delta deocding + x += prevX; + y += prevY; + + prevX = x; + prevY = y; + // Dequantize + result.push([x / encodeScale, y / encodeScale]); + } + + return result; +} + +/** + * @alias module:echarts/coord/geo/parseGeoJson + * @param {Object} geoJson + * @return {module:zrender/container/Group} + */ +var parseGeoJson$1 = function (geoJson) { + + decode(geoJson); + + return map(filter(geoJson.features, function (featureObj) { + // Output of mapshaper may have geometry null + return featureObj.geometry + && featureObj.properties + && featureObj.geometry.coordinates.length > 0; + }), function (featureObj) { + var properties = featureObj.properties; + var geo = featureObj.geometry; + + var coordinates = geo.coordinates; + + var geometries = []; + if (geo.type === 'Polygon') { + geometries.push({ + type: 'polygon', + // According to the GeoJSON specification. + // First must be exterior, and the rest are all interior(holes). + exterior: coordinates[0], + interiors: coordinates.slice(1) + }); + } + if (geo.type === 'MultiPolygon') { + each$1(coordinates, function (item) { + if (item[0]) { + geometries.push({ + type: 'polygon', + exterior: item[0], + interiors: item.slice(1) + }); + } + }); + } + + var region = new Region( + properties.name, + geometries, + properties.cp + ); + region.properties = properties; + return region; + }); +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var inner$6 = makeInner(); + +/** + * @param {module:echats/coord/Axis} axis + * @return {Object} { + * labels: [{ + * formattedLabel: string, + * rawLabel: string, + * tickValue: number + * }, ...], + * labelCategoryInterval: number + * } + */ +function createAxisLabels(axis) { + // Only ordinal scale support tick interval + return axis.type === 'category' + ? makeCategoryLabels(axis) + : makeRealNumberLabels(axis); +} + +/** + * @param {module:echats/coord/Axis} axis + * @param {module:echarts/model/Model} tickModel For example, can be axisTick, splitLine, splitArea. + * @return {Object} { + * ticks: Array.<number> + * tickCategoryInterval: number + * } + */ +function createAxisTicks(axis, tickModel) { + // Only ordinal scale support tick interval + return axis.type === 'category' + ? makeCategoryTicks(axis, tickModel) + : {ticks: axis.scale.getTicks()}; +} + +function makeCategoryLabels(axis) { + var labelModel = axis.getLabelModel(); + var result = makeCategoryLabelsActually(axis, labelModel); + + return (!labelModel.get('show') || axis.scale.isBlank()) + ? {labels: [], labelCategoryInterval: result.labelCategoryInterval} + : result; +} + +function makeCategoryLabelsActually(axis, labelModel) { + var labelsCache = getListCache(axis, 'labels'); + var optionLabelInterval = getOptionCategoryInterval(labelModel); + var result = listCacheGet(labelsCache, optionLabelInterval); + + if (result) { + return result; + } + + var labels; + var numericLabelInterval; + + if (isFunction$1(optionLabelInterval)) { + labels = makeLabelsByCustomizedCategoryInterval(axis, optionLabelInterval); + } + else { + numericLabelInterval = optionLabelInterval === 'auto' + ? makeAutoCategoryInterval(axis) : optionLabelInterval; + labels = makeLabelsByNumericCategoryInterval(axis, numericLabelInterval); + } + + // Cache to avoid calling interval function repeatly. + return listCacheSet(labelsCache, optionLabelInterval, { + labels: labels, labelCategoryInterval: numericLabelInterval + }); +} + +function makeCategoryTicks(axis, tickModel) { + var ticksCache = getListCache(axis, 'ticks'); + var optionTickInterval = getOptionCategoryInterval(tickModel); + var result = listCacheGet(ticksCache, optionTickInterval); + + if (result) { + return result; + } + + var ticks; + var tickCategoryInterval; + + // Optimize for the case that large category data and no label displayed, + // we should not return all ticks. + if (!tickModel.get('show') || axis.scale.isBlank()) { + ticks = []; + } + + if (isFunction$1(optionTickInterval)) { + ticks = makeLabelsByCustomizedCategoryInterval(axis, optionTickInterval, true); + } + // Always use label interval by default despite label show. Consider this + // scenario, Use multiple grid with the xAxis sync, and only one xAxis shows + // labels. `splitLine` and `axisTick` should be consistent in this case. + else if (optionTickInterval === 'auto') { + var labelsResult = makeCategoryLabelsActually(axis, axis.getLabelModel()); + tickCategoryInterval = labelsResult.labelCategoryInterval; + ticks = map(labelsResult.labels, function (labelItem) { + return labelItem.tickValue; + }); + } + else { + tickCategoryInterval = optionTickInterval; + ticks = makeLabelsByNumericCategoryInterval(axis, tickCategoryInterval, true); + } + + // Cache to avoid calling interval function repeatly. + return listCacheSet(ticksCache, optionTickInterval, { + ticks: ticks, tickCategoryInterval: tickCategoryInterval + }); +} + +function makeRealNumberLabels(axis) { + var ticks = axis.scale.getTicks(); + var labelFormatter = makeLabelFormatter(axis); + return { + labels: map(ticks, function (tickValue, idx) { + return { + formattedLabel: labelFormatter(tickValue, idx), + rawLabel: axis.scale.getLabel(tickValue), + tickValue: tickValue + }; + }) + }; +} + +// Large category data calculation is performence sensitive, and ticks and label +// probably be fetched by multiple times. So we cache the result. +// axis is created each time during a ec process, so we do not need to clear cache. +function getListCache(axis, prop) { + // Because key can be funciton, and cache size always be small, we use array cache. + return inner$6(axis)[prop] || (inner$6(axis)[prop] = []); +} + +function listCacheGet(cache, key) { + for (var i = 0; i < cache.length; i++) { + if (cache[i].key === key) { + return cache[i].value; + } + } +} + +function listCacheSet(cache, key, value) { + cache.push({key: key, value: value}); + return value; +} + +function makeAutoCategoryInterval(axis) { + var result = inner$6(axis).autoInterval; + return result != null + ? result + : (inner$6(axis).autoInterval = axis.calculateCategoryInterval()); +} + +/** + * Calculate interval for category axis ticks and labels. + * To get precise result, at least one of `getRotate` and `isHorizontal` + * should be implemented in axis. + */ +function calculateCategoryInterval(axis) { + var params = fetchAutoCategoryIntervalCalculationParams(axis); + var labelFormatter = makeLabelFormatter(axis); + var rotation = (params.axisRotate - params.labelRotate) / 180 * Math.PI; + + var ordinalScale = axis.scale; + var ordinalExtent = ordinalScale.getExtent(); + // Providing this method is for optimization: + // avoid generating a long array by `getTicks` + // in large category data case. + var tickCount = ordinalScale.count(); + + if (ordinalExtent[1] - ordinalExtent[0] < 1) { + return 0; + } + + var step = 1; + // Simple optimization. Empirical value: tick count should less than 40. + if (tickCount > 40) { + step = Math.max(1, Math.floor(tickCount / 40)); + } + var tickValue = ordinalExtent[0]; + var unitSpan = axis.dataToCoord(tickValue + 1) - axis.dataToCoord(tickValue); + var unitW = Math.abs(unitSpan * Math.cos(rotation)); + var unitH = Math.abs(unitSpan * Math.sin(rotation)); + + var maxW = 0; + var maxH = 0; + + // Caution: Performance sensitive for large category data. + // Consider dataZoom, we should make appropriate step to avoid O(n) loop. + for (; tickValue <= ordinalExtent[1]; tickValue += step) { + var width = 0; + var height = 0; + + // Polar is also calculated in assumptive linear layout here. + // Not precise, do not consider align and vertical align + // and each distance from axis line yet. + var rect = getBoundingRect( + labelFormatter(tickValue), params.font, 'center', 'top' + ); + // Magic number + width = rect.width * 1.3; + height = rect.height * 1.3; + + // Min size, void long loop. + maxW = Math.max(maxW, width, 7); + maxH = Math.max(maxH, height, 7); + } + + var dw = maxW / unitW; + var dh = maxH / unitH; + // 0/0 is NaN, 1/0 is Infinity. + isNaN(dw) && (dw = Infinity); + isNaN(dh) && (dh = Infinity); + var interval = Math.max(0, Math.floor(Math.min(dw, dh))); + + var cache = inner$6(axis.model); + var lastAutoInterval = cache.lastAutoInterval; + var lastTickCount = cache.lastTickCount; + + // Use cache to keep interval stable while moving zoom window, + // otherwise the calculated interval might jitter when the zoom + // window size is close to the interval-changing size. + if (lastAutoInterval != null + && lastTickCount != null + && Math.abs(lastAutoInterval - interval) <= 1 + && Math.abs(lastTickCount - tickCount) <= 1 + // Always choose the bigger one, otherwise the critical + // point is not the same when zooming in or zooming out. + && lastAutoInterval > interval + ) { + interval = lastAutoInterval; + } + // Only update cache if cache not used, otherwise the + // changing of interval is too insensitive. + else { + cache.lastTickCount = tickCount; + cache.lastAutoInterval = interval; + } + + return interval; +} + +function fetchAutoCategoryIntervalCalculationParams(axis) { + var labelModel = axis.getLabelModel(); + return { + axisRotate: axis.getRotate + ? axis.getRotate() + : (axis.isHorizontal && !axis.isHorizontal()) + ? 90 + : 0, + labelRotate: labelModel.get('rotate') || 0, + font: labelModel.getFont() + }; +} + +function makeLabelsByNumericCategoryInterval(axis, categoryInterval, onlyTick) { + var labelFormatter = makeLabelFormatter(axis); + var ordinalScale = axis.scale; + var ordinalExtent = ordinalScale.getExtent(); + var labelModel = axis.getLabelModel(); + var result = []; + + // TODO: axisType: ordinalTime, pick the tick from each month/day/year/... + + var step = Math.max((categoryInterval || 0) + 1, 1); + var startTick = ordinalExtent[0]; + var tickCount = ordinalScale.count(); + + // Calculate start tick based on zero if possible to keep label consistent + // while zooming and moving while interval > 0. Otherwise the selection + // of displayable ticks and symbols probably keep changing. + // 3 is empirical value. + if (startTick !== 0 && step > 1 && tickCount / step > 2) { + startTick = Math.round(Math.ceil(startTick / step) * step); + } + + // (1) Only add min max label here but leave overlap checking + // to render stage, which also ensure the returned list + // suitable for splitLine and splitArea rendering. + // (2) Scales except category always contain min max label so + // do not need to perform this process. + var showMinMax = { + min: labelModel.get('showMinLabel'), + max: labelModel.get('showMaxLabel') + }; + + if (showMinMax.min && startTick !== ordinalExtent[0]) { + addItem(ordinalExtent[0]); + } + + // Optimize: avoid generating large array by `ordinalScale.getTicks()`. + var tickValue = startTick; + for (; tickValue <= ordinalExtent[1]; tickValue += step) { + addItem(tickValue); + } + + if (showMinMax.max && tickValue !== ordinalExtent[1]) { + addItem(ordinalExtent[1]); + } + + function addItem(tVal) { + result.push(onlyTick + ? tVal + : { + formattedLabel: labelFormatter(tVal), + rawLabel: ordinalScale.getLabel(tVal), + tickValue: tVal + } + ); + } + + return result; +} + +// When interval is function, the result `false` means ignore the tick. +// It is time consuming for large category data. +function makeLabelsByCustomizedCategoryInterval(axis, categoryInterval, onlyTick) { + var ordinalScale = axis.scale; + var labelFormatter = makeLabelFormatter(axis); + var result = []; + + each$1(ordinalScale.getTicks(), function (tickValue) { + var rawLabel = ordinalScale.getLabel(tickValue); + if (categoryInterval(tickValue, rawLabel)) { + result.push(onlyTick + ? tickValue + : { + formattedLabel: labelFormatter(tickValue), + rawLabel: rawLabel, + tickValue: tickValue + } + ); + } + }); + + return result; +} + +// Can be null|'auto'|number|function +function getOptionCategoryInterval(model) { + var interval = model.get('interval'); + return interval == null ? 'auto' : interval; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var NORMALIZED_EXTENT = [0, 1]; + +/** + * Base class of Axis. + * @constructor + */ +var Axis = function (dim, scale, extent) { + + /** + * Axis dimension. Such as 'x', 'y', 'z', 'angle', 'radius'. + * @type {string} + */ + this.dim = dim; + + /** + * Axis scale + * @type {module:echarts/coord/scale/*} + */ + this.scale = scale; + + /** + * @type {Array.<number>} + * @private + */ + this._extent = extent || [0, 0]; + + /** + * @type {boolean} + */ + this.inverse = false; + + /** + * Usually true when axis has a ordinal scale + * @type {boolean} + */ + this.onBand = false; +}; + +Axis.prototype = { + + constructor: Axis, + + /** + * If axis extent contain given coord + * @param {number} coord + * @return {boolean} + */ + contain: function (coord) { + var extent = this._extent; + var min = Math.min(extent[0], extent[1]); + var max = Math.max(extent[0], extent[1]); + return coord >= min && coord <= max; + }, + + /** + * If axis extent contain given data + * @param {number} data + * @return {boolean} + */ + containData: function (data) { + return this.contain(this.dataToCoord(data)); + }, + + /** + * Get coord extent. + * @return {Array.<number>} + */ + getExtent: function () { + return this._extent.slice(); + }, + + /** + * Get precision used for formatting + * @param {Array.<number>} [dataExtent] + * @return {number} + */ + getPixelPrecision: function (dataExtent) { + return getPixelPrecision( + dataExtent || this.scale.getExtent(), + this._extent + ); + }, + + /** + * Set coord extent + * @param {number} start + * @param {number} end + */ + setExtent: function (start, end) { + var extent = this._extent; + extent[0] = start; + extent[1] = end; + }, + + /** + * Convert data to coord. Data is the rank if it has an ordinal scale + * @param {number} data + * @param {boolean} clamp + * @return {number} + */ + dataToCoord: function (data, clamp) { + var extent = this._extent; + var scale = this.scale; + data = scale.normalize(data); + + if (this.onBand && scale.type === 'ordinal') { + extent = extent.slice(); + fixExtentWithBands(extent, scale.count()); + } + + return linearMap(data, NORMALIZED_EXTENT, extent, clamp); + }, + + /** + * Convert coord to data. Data is the rank if it has an ordinal scale + * @param {number} coord + * @param {boolean} clamp + * @return {number} + */ + coordToData: function (coord, clamp) { + var extent = this._extent; + var scale = this.scale; + + if (this.onBand && scale.type === 'ordinal') { + extent = extent.slice(); + fixExtentWithBands(extent, scale.count()); + } + + var t = linearMap(coord, extent, NORMALIZED_EXTENT, clamp); + + return this.scale.scale(t); + }, + + /** + * Convert pixel point to data in axis + * @param {Array.<number>} point + * @param {boolean} clamp + * @return {number} data + */ + pointToData: function (point, clamp) { + // Should be implemented in derived class if necessary. + }, + + /** + * Different from `zrUtil.map(axis.getTicks(), axis.dataToCoord, axis)`, + * `axis.getTicksCoords` considers `onBand`, which is used by + * `boundaryGap:true` of category axis and splitLine and splitArea. + * @param {Object} [opt] + * @param {number} [opt.tickModel=axis.model.getModel('axisTick')] + * @param {boolean} [opt.clamp] If `true`, the first and the last + * tick must be at the axis end points. Otherwise, clip ticks + * that outside the axis extent. + * @return {Array.<Object>} [{ + * coord: ..., + * tickValue: ... + * }, ...] + */ + getTicksCoords: function (opt) { + opt = opt || {}; + + var tickModel = opt.tickModel || this.getTickModel(); + + var result = createAxisTicks(this, tickModel); + var ticks = result.ticks; + + var ticksCoords = map(ticks, function (tickValue) { + return { + coord: this.dataToCoord(tickValue), + tickValue: tickValue + }; + }, this); + + var alignWithLabel = tickModel.get('alignWithLabel'); + fixOnBandTicksCoords( + this, ticksCoords, result.tickCategoryInterval, alignWithLabel, opt.clamp + ); + + return ticksCoords; + }, + + /** + * @return {Array.<Object>} [{ + * formattedLabel: string, + * rawLabel: axis.scale.getLabel(tickValue) + * tickValue: number + * }, ...] + */ + getViewLabels: function () { + return createAxisLabels(this).labels; + }, + + /** + * @return {module:echarts/coord/model/Model} + */ + getLabelModel: function () { + return this.model.getModel('axisLabel'); + }, + + /** + * Notice here we only get the default tick model. For splitLine + * or splitArea, we should pass the splitLineModel or splitAreaModel + * manually when calling `getTicksCoords`. + * In GL, this method may be overrided to: + * `axisModel.getModel('axisTick', grid3DModel.getModel('axisTick'));` + * @return {module:echarts/coord/model/Model} + */ + getTickModel: function () { + return this.model.getModel('axisTick'); + }, + + /** + * Get width of band + * @return {number} + */ + getBandWidth: function () { + var axisExtent = this._extent; + var dataExtent = this.scale.getExtent(); + + var len = dataExtent[1] - dataExtent[0] + (this.onBand ? 1 : 0); + // Fix #2728, avoid NaN when only one data. + len === 0 && (len = 1); + + var size = Math.abs(axisExtent[1] - axisExtent[0]); + + return Math.abs(size) / len; + }, + + /** + * @abstract + * @return {boolean} Is horizontal + */ + isHorizontal: null, + + /** + * @abstract + * @return {number} Get axis rotate, by degree. + */ + getRotate: null, + + /** + * Only be called in category axis. + * Can be overrided, consider other axes like in 3D. + * @return {number} Auto interval for cateogry axis tick and label + */ + calculateCategoryInterval: function () { + return calculateCategoryInterval(this); + } + +}; + +function fixExtentWithBands(extent, nTick) { + var size = extent[1] - extent[0]; + var len = nTick; + var margin = size / len / 2; + extent[0] += margin; + extent[1] -= margin; +} + +// If axis has labels [1, 2, 3, 4]. Bands on the axis are +// |---1---|---2---|---3---|---4---|. +// So the displayed ticks and splitLine/splitArea should between +// each data item, otherwise cause misleading (e.g., split tow bars +// of a single data item when there are two bar series). +// Also consider if tickCategoryInterval > 0 and onBand, ticks and +// splitLine/spliteArea should layout appropriately corresponding +// to displayed labels. (So we should not use `getBandWidth` in this +// case). +function fixOnBandTicksCoords(axis, ticksCoords, tickCategoryInterval, alignWithLabel, clamp) { + var ticksLen = ticksCoords.length; + + if (!axis.onBand || alignWithLabel || !ticksLen) { + return; + } + + var axisExtent = axis.getExtent(); + var last; + if (ticksLen === 1) { + ticksCoords[0].coord = axisExtent[0]; + last = ticksCoords[1] = {coord: axisExtent[0]}; + } + else { + var shift = (ticksCoords[1].coord - ticksCoords[0].coord); + each$1(ticksCoords, function (ticksItem) { + ticksItem.coord -= shift / 2; + var tickCategoryInterval = tickCategoryInterval || 0; + // Avoid split a single data item when odd interval. + if (tickCategoryInterval % 2 > 0) { + ticksItem.coord -= shift / ((tickCategoryInterval + 1) * 2); + } + }); + last = {coord: ticksCoords[ticksLen - 1].coord + shift}; + ticksCoords.push(last); + } + + var inverse = axisExtent[0] > axisExtent[1]; + + if (littleThan(ticksCoords[0].coord, axisExtent[0])) { + clamp ? (ticksCoords[0].coord = axisExtent[0]) : ticksCoords.shift(); + } + if (clamp && littleThan(axisExtent[0], ticksCoords[0].coord)) { + ticksCoords.unshift({coord: axisExtent[0]}); + } + if (littleThan(axisExtent[1], last.coord)) { + clamp ? (last.coord = axisExtent[1]) : ticksCoords.pop(); + } + if (clamp && littleThan(last.coord, axisExtent[1])) { + ticksCoords.push({coord: axisExtent[1]}); + } + + function littleThan(a, b) { + return inverse ? a > b : a < b; + } +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Do not mount those modules on 'src/echarts' for better tree shaking. + */ + +var parseGeoJson = parseGeoJson$1; + +var ecUtil = {}; +each$1([ + 'map', 'each', 'filter', 'indexOf', 'inherits', 'reduce', 'filter', + 'bind', 'curry', 'isArray', 'isString', 'isObject', 'isFunction', + 'extend', 'defaults', 'clone', 'merge' + ], + function (name) { + ecUtil[name] = zrUtil[name]; + } +); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +SeriesModel.extend({ + + type: 'series.line', + + dependencies: ['grid', 'polar'], + + getInitialData: function (option, ecModel) { + if (__DEV__) { + var coordSys = option.coordinateSystem; + if (coordSys !== 'polar' && coordSys !== 'cartesian2d') { + throw new Error('Line not support coordinateSystem besides cartesian and polar'); + } + } + return createListFromArray(this.getSource(), this); + }, + + defaultOption: { + zlevel: 0, + z: 2, + coordinateSystem: 'cartesian2d', + legendHoverLink: true, + + hoverAnimation: true, + // stack: null + // xAxisIndex: 0, + // yAxisIndex: 0, + + // polarIndex: 0, + + // If clip the overflow value + clipOverflow: true, + // cursor: null, + + label: { + position: 'top' + }, + // itemStyle: { + // }, + + lineStyle: { + width: 2, + type: 'solid' + }, + // areaStyle: { + // origin of areaStyle. Valid values: + // `'auto'/null/undefined`: from axisLine to data + // `'start'`: from min to data + // `'end'`: from data to max + // origin: 'auto' + // }, + // false, 'start', 'end', 'middle' + step: false, + + // Disabled if step is true + smooth: false, + smoothMonotone: null, + symbol: 'emptyCircle', + symbolSize: 4, + symbolRotate: null, + + showSymbol: true, + // `false`: follow the label interval strategy. + // `true`: show all symbols. + // `'auto'`: If possible, show all symbols, otherwise + // follow the label interval strategy. + showAllSymbol: 'auto', + + // Whether to connect break point. + connectNulls: false, + + // Sampling for large data. Can be: 'average', 'max', 'min', 'sum'. + sampling: 'none', + + animationEasing: 'linear', + + // Disable progressive + progressive: 0, + hoverLayerThreshold: Infinity + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @param {module:echarts/data/List} data + * @param {number} dataIndex + * @return {string} label string. Not null/undefined + */ +function getDefaultLabel(data, dataIndex) { + var labelDims = data.mapDimension('defaultedLabel', true); + var len = labelDims.length; + + // Simple optimization (in lots of cases, label dims length is 1) + if (len === 1) { + return retrieveRawValue(data, dataIndex, labelDims[0]); + } + else if (len) { + var vals = []; + for (var i = 0; i < labelDims.length; i++) { + var val = retrieveRawValue(data, dataIndex, labelDims[i]); + vals.push(val); + } + return vals.join(' '); + } +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @module echarts/chart/helper/Symbol + */ + +/** + * @constructor + * @alias {module:echarts/chart/helper/Symbol} + * @param {module:echarts/data/List} data + * @param {number} idx + * @extends {module:zrender/graphic/Group} + */ +function SymbolClz$1(data, idx, seriesScope) { + Group.call(this); + this.updateData(data, idx, seriesScope); +} + +var symbolProto = SymbolClz$1.prototype; + +/** + * @public + * @static + * @param {module:echarts/data/List} data + * @param {number} dataIndex + * @return {Array.<number>} [width, height] + */ +var getSymbolSize = SymbolClz$1.getSymbolSize = function (data, idx) { + var symbolSize = data.getItemVisual(idx, 'symbolSize'); + return symbolSize instanceof Array + ? symbolSize.slice() + : [+symbolSize, +symbolSize]; +}; + +function getScale(symbolSize) { + return [symbolSize[0] / 2, symbolSize[1] / 2]; +} + +function driftSymbol(dx, dy) { + this.parent.drift(dx, dy); +} + +symbolProto._createSymbol = function ( + symbolType, + data, + idx, + symbolSize, + keepAspect +) { + // Remove paths created before + this.removeAll(); + + var color = data.getItemVisual(idx, 'color'); + + // var symbolPath = createSymbol( + // symbolType, -0.5, -0.5, 1, 1, color + // ); + // If width/height are set too small (e.g., set to 1) on ios10 + // and macOS Sierra, a circle stroke become a rect, no matter what + // the scale is set. So we set width/height as 2. See #4150. + var symbolPath = createSymbol( + symbolType, -1, -1, 2, 2, color, keepAspect + ); + + symbolPath.attr({ + z2: 100, + culling: true, + scale: getScale(symbolSize) + }); + // Rewrite drift method + symbolPath.drift = driftSymbol; + + this._symbolType = symbolType; + + this.add(symbolPath); +}; + +/** + * Stop animation + * @param {boolean} toLastFrame + */ +symbolProto.stopSymbolAnimation = function (toLastFrame) { + this.childAt(0).stopAnimation(toLastFrame); +}; + +/** + * FIXME: + * Caution: This method breaks the encapsulation of this module, + * but it indeed brings convenience. So do not use the method + * unless you detailedly know all the implements of `Symbol`, + * especially animation. + * + * Get symbol path element. + */ +symbolProto.getSymbolPath = function () { + return this.childAt(0); +}; + +/** + * Get scale(aka, current symbol size). + * Including the change caused by animation + */ +symbolProto.getScale = function () { + return this.childAt(0).scale; +}; + +/** + * Highlight symbol + */ +symbolProto.highlight = function () { + this.childAt(0).trigger('emphasis'); +}; + +/** + * Downplay symbol + */ +symbolProto.downplay = function () { + this.childAt(0).trigger('normal'); +}; + +/** + * @param {number} zlevel + * @param {number} z + */ +symbolProto.setZ = function (zlevel, z) { + var symbolPath = this.childAt(0); + symbolPath.zlevel = zlevel; + symbolPath.z = z; +}; + +symbolProto.setDraggable = function (draggable) { + var symbolPath = this.childAt(0); + symbolPath.draggable = draggable; + symbolPath.cursor = draggable ? 'move' : 'pointer'; +}; + +/** + * Update symbol properties + * @param {module:echarts/data/List} data + * @param {number} idx + * @param {Object} [seriesScope] + * @param {Object} [seriesScope.itemStyle] + * @param {Object} [seriesScope.hoverItemStyle] + * @param {Object} [seriesScope.symbolRotate] + * @param {Object} [seriesScope.symbolOffset] + * @param {module:echarts/model/Model} [seriesScope.labelModel] + * @param {module:echarts/model/Model} [seriesScope.hoverLabelModel] + * @param {boolean} [seriesScope.hoverAnimation] + * @param {Object} [seriesScope.cursorStyle] + * @param {module:echarts/model/Model} [seriesScope.itemModel] + * @param {string} [seriesScope.symbolInnerColor] + * @param {Object} [seriesScope.fadeIn=false] + */ +symbolProto.updateData = function (data, idx, seriesScope) { + this.silent = false; + + var symbolType = data.getItemVisual(idx, 'symbol') || 'circle'; + var seriesModel = data.hostModel; + var symbolSize = getSymbolSize(data, idx); + var isInit = symbolType !== this._symbolType; + + if (isInit) { + var keepAspect = data.getItemVisual(idx, 'symbolKeepAspect'); + this._createSymbol(symbolType, data, idx, symbolSize, keepAspect); + } + else { + var symbolPath = this.childAt(0); + symbolPath.silent = false; + updateProps(symbolPath, { + scale: getScale(symbolSize) + }, seriesModel, idx); + } + + this._updateCommon(data, idx, symbolSize, seriesScope); + + if (isInit) { + var symbolPath = this.childAt(0); + var fadeIn = seriesScope && seriesScope.fadeIn; + + var target = {scale: symbolPath.scale.slice()}; + fadeIn && (target.style = {opacity: symbolPath.style.opacity}); + + symbolPath.scale = [0, 0]; + fadeIn && (symbolPath.style.opacity = 0); + + initProps(symbolPath, target, seriesModel, idx); + } + + this._seriesModel = seriesModel; +}; + +// Update common properties +var normalStyleAccessPath = ['itemStyle']; +var emphasisStyleAccessPath = ['emphasis', 'itemStyle']; +var normalLabelAccessPath = ['label']; +var emphasisLabelAccessPath = ['emphasis', 'label']; + +/** + * @param {module:echarts/data/List} data + * @param {number} idx + * @param {Array.<number>} symbolSize + * @param {Object} [seriesScope] + */ +symbolProto._updateCommon = function (data, idx, symbolSize, seriesScope) { + var symbolPath = this.childAt(0); + var seriesModel = data.hostModel; + var color = data.getItemVisual(idx, 'color'); + + // Reset style + if (symbolPath.type !== 'image') { + symbolPath.useStyle({ + strokeNoScale: true + }); + } + + var itemStyle = seriesScope && seriesScope.itemStyle; + var hoverItemStyle = seriesScope && seriesScope.hoverItemStyle; + var symbolRotate = seriesScope && seriesScope.symbolRotate; + var symbolOffset = seriesScope && seriesScope.symbolOffset; + var labelModel = seriesScope && seriesScope.labelModel; + var hoverLabelModel = seriesScope && seriesScope.hoverLabelModel; + var hoverAnimation = seriesScope && seriesScope.hoverAnimation; + var cursorStyle = seriesScope && seriesScope.cursorStyle; + + if (!seriesScope || data.hasItemOption) { + var itemModel = (seriesScope && seriesScope.itemModel) + ? seriesScope.itemModel : data.getItemModel(idx); + + // Color must be excluded. + // Because symbol provide setColor individually to set fill and stroke + itemStyle = itemModel.getModel(normalStyleAccessPath).getItemStyle(['color']); + hoverItemStyle = itemModel.getModel(emphasisStyleAccessPath).getItemStyle(); + + symbolRotate = itemModel.getShallow('symbolRotate'); + symbolOffset = itemModel.getShallow('symbolOffset'); + + labelModel = itemModel.getModel(normalLabelAccessPath); + hoverLabelModel = itemModel.getModel(emphasisLabelAccessPath); + hoverAnimation = itemModel.getShallow('hoverAnimation'); + cursorStyle = itemModel.getShallow('cursor'); + } + else { + hoverItemStyle = extend({}, hoverItemStyle); + } + + var elStyle = symbolPath.style; + + symbolPath.attr('rotation', (symbolRotate || 0) * Math.PI / 180 || 0); + + if (symbolOffset) { + symbolPath.attr('position', [ + parsePercent$1(symbolOffset[0], symbolSize[0]), + parsePercent$1(symbolOffset[1], symbolSize[1]) + ]); + } + + cursorStyle && symbolPath.attr('cursor', cursorStyle); + + // PENDING setColor before setStyle!!! + symbolPath.setColor(color, seriesScope && seriesScope.symbolInnerColor); + + symbolPath.setStyle(itemStyle); + + var opacity = data.getItemVisual(idx, 'opacity'); + if (opacity != null) { + elStyle.opacity = opacity; + } + + var liftZ = data.getItemVisual(idx, 'liftZ'); + var z2Origin = symbolPath.__z2Origin; + if (liftZ != null) { + if (z2Origin == null) { + symbolPath.__z2Origin = symbolPath.z2; + symbolPath.z2 += liftZ; + } + } + else if (z2Origin != null) { + symbolPath.z2 = z2Origin; + symbolPath.__z2Origin = null; + } + + var useNameLabel = seriesScope && seriesScope.useNameLabel; + + setLabelStyle( + elStyle, hoverItemStyle, labelModel, hoverLabelModel, + { + labelFetcher: seriesModel, + labelDataIndex: idx, + defaultText: getLabelDefaultText, + isRectText: true, + autoColor: color + } + ); + + // Do not execute util needed. + function getLabelDefaultText(idx, opt) { + return useNameLabel ? data.getName(idx) : getDefaultLabel(data, idx); + } + + symbolPath.off('mouseover') + .off('mouseout') + .off('emphasis') + .off('normal'); + + symbolPath.hoverStyle = hoverItemStyle; + + // FIXME + // Do not use symbol.trigger('emphasis'), but use symbol.highlight() instead. + setHoverStyle(symbolPath); + + var scale = getScale(symbolSize); + + if (hoverAnimation && seriesModel.isAnimationEnabled()) { + var onEmphasis = function() { + // Do not support this hover animation util some scenario required. + // Animation can only be supported in hover layer when using `el.incremetal`. + if (this.incremental) { + return; + } + var ratio = scale[1] / scale[0]; + this.animateTo({ + scale: [ + Math.max(scale[0] * 1.1, scale[0] + 3), + Math.max(scale[1] * 1.1, scale[1] + 3 * ratio) + ] + }, 400, 'elasticOut'); + }; + var onNormal = function() { + if (this.incremental) { + return; + } + this.animateTo({ + scale: scale + }, 400, 'elasticOut'); + }; + symbolPath.on('mouseover', onEmphasis) + .on('mouseout', onNormal) + .on('emphasis', onEmphasis) + .on('normal', onNormal); + } +}; + +/** + * @param {Function} cb + * @param {Object} [opt] + * @param {Object} [opt.keepLabel=true] + */ +symbolProto.fadeOut = function (cb, opt) { + var symbolPath = this.childAt(0); + // Avoid mistaken hover when fading out + this.silent = symbolPath.silent = true; + // Not show text when animating + !(opt && opt.keepLabel) && (symbolPath.style.text = null); + + updateProps( + symbolPath, + { + style: {opacity: 0}, + scale: [0, 0] + }, + this._seriesModel, + this.dataIndex, + cb + ); +}; + +inherits(SymbolClz$1, Group); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @module echarts/chart/helper/SymbolDraw + */ + +/** + * @constructor + * @alias module:echarts/chart/helper/SymbolDraw + * @param {module:zrender/graphic/Group} [symbolCtor] + */ +function SymbolDraw(symbolCtor) { + this.group = new Group(); + + this._symbolCtor = symbolCtor || SymbolClz$1; +} + +var symbolDrawProto = SymbolDraw.prototype; + +function symbolNeedsDraw(data, point, idx, opt) { + return point && !isNaN(point[0]) && !isNaN(point[1]) + && !(opt.isIgnore && opt.isIgnore(idx)) + // We do not set clipShape on group, because it will cut part of + // the symbol element shape. We use the same clip shape here as + // the line clip. + && !(opt.clipShape && !opt.clipShape.contain(point[0], point[1])) + && data.getItemVisual(idx, 'symbol') !== 'none'; +} + +/** + * Update symbols draw by new data + * @param {module:echarts/data/List} data + * @param {Object} [opt] Or isIgnore + * @param {Function} [opt.isIgnore] + * @param {Object} [opt.clipShape] + */ +symbolDrawProto.updateData = function (data, opt) { + opt = normalizeUpdateOpt(opt); + + var group = this.group; + var seriesModel = data.hostModel; + var oldData = this._data; + var SymbolCtor = this._symbolCtor; + + var seriesScope = makeSeriesScope(data); + + // There is no oldLineData only when first rendering or switching from + // stream mode to normal mode, where previous elements should be removed. + if (!oldData) { + group.removeAll(); + } + + data.diff(oldData) + .add(function (newIdx) { + var point = data.getItemLayout(newIdx); + if (symbolNeedsDraw(data, point, newIdx, opt)) { + var symbolEl = new SymbolCtor(data, newIdx, seriesScope); + symbolEl.attr('position', point); + data.setItemGraphicEl(newIdx, symbolEl); + group.add(symbolEl); + } + }) + .update(function (newIdx, oldIdx) { + var symbolEl = oldData.getItemGraphicEl(oldIdx); + var point = data.getItemLayout(newIdx); + if (!symbolNeedsDraw(data, point, newIdx, opt)) { + group.remove(symbolEl); + return; + } + if (!symbolEl) { + symbolEl = new SymbolCtor(data, newIdx); + symbolEl.attr('position', point); + } + else { + symbolEl.updateData(data, newIdx, seriesScope); + updateProps(symbolEl, { + position: point + }, seriesModel); + } + + // Add back + group.add(symbolEl); + + data.setItemGraphicEl(newIdx, symbolEl); + }) + .remove(function (oldIdx) { + var el = oldData.getItemGraphicEl(oldIdx); + el && el.fadeOut(function () { + group.remove(el); + }); + }) + .execute(); + + this._data = data; +}; + +symbolDrawProto.isPersistent = function () { + return true; +}; + +symbolDrawProto.updateLayout = function () { + var data = this._data; + if (data) { + // Not use animation + data.eachItemGraphicEl(function (el, idx) { + var point = data.getItemLayout(idx); + el.attr('position', point); + }); + } +}; + +symbolDrawProto.incrementalPrepareUpdate = function (data) { + this._seriesScope = makeSeriesScope(data); + this._data = null; + this.group.removeAll(); +}; + +/** + * Update symbols draw by new data + * @param {module:echarts/data/List} data + * @param {Object} [opt] Or isIgnore + * @param {Function} [opt.isIgnore] + * @param {Object} [opt.clipShape] + */ +symbolDrawProto.incrementalUpdate = function (taskParams, data, opt) { + opt = normalizeUpdateOpt(opt); + + function updateIncrementalAndHover(el) { + if (!el.isGroup) { + el.incremental = el.useHoverLayer = true; + } + } + for (var idx = taskParams.start; idx < taskParams.end; idx++) { + var point = data.getItemLayout(idx); + if (symbolNeedsDraw(data, point, idx, opt)) { + var el = new this._symbolCtor(data, idx, this._seriesScope); + el.traverse(updateIncrementalAndHover); + el.attr('position', point); + this.group.add(el); + data.setItemGraphicEl(idx, el); + } + } +}; + +function normalizeUpdateOpt(opt) { + if (opt != null && !isObject$1(opt)) { + opt = {isIgnore: opt}; + } + return opt || {}; +} + +symbolDrawProto.remove = function (enableAnimation) { + var group = this.group; + var data = this._data; + // Incremental model do not have this._data. + if (data && enableAnimation) { + data.eachItemGraphicEl(function (el) { + el.fadeOut(function () { + group.remove(el); + }); + }); + } + else { + group.removeAll(); + } +}; + +function makeSeriesScope(data) { + var seriesModel = data.hostModel; + return { + itemStyle: seriesModel.getModel('itemStyle').getItemStyle(['color']), + hoverItemStyle: seriesModel.getModel('emphasis.itemStyle').getItemStyle(), + symbolRotate: seriesModel.get('symbolRotate'), + symbolOffset: seriesModel.get('symbolOffset'), + hoverAnimation: seriesModel.get('hoverAnimation'), + labelModel: seriesModel.getModel('label'), + hoverLabelModel: seriesModel.getModel('emphasis.label'), + cursorStyle: seriesModel.get('cursor') + }; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @param {Object} coordSys + * @param {module:echarts/data/List} data + * @param {string} valueOrigin lineSeries.option.areaStyle.origin + */ +function prepareDataCoordInfo(coordSys, data, valueOrigin) { + var baseAxis = coordSys.getBaseAxis(); + var valueAxis = coordSys.getOtherAxis(baseAxis); + var valueStart = getValueStart(valueAxis, valueOrigin); + + var baseAxisDim = baseAxis.dim; + var valueAxisDim = valueAxis.dim; + var valueDim = data.mapDimension(valueAxisDim); + var baseDim = data.mapDimension(baseAxisDim); + var baseDataOffset = valueAxisDim === 'x' || valueAxisDim === 'radius' ? 1 : 0; + + var dims = map(coordSys.dimensions, function (coordDim) { + return data.mapDimension(coordDim); + }); + + var stacked; + var stackResultDim = data.getCalculationInfo('stackResultDimension'); + if (stacked |= isDimensionStacked(data, dims[0] /*, dims[1]*/)) { // jshint ignore:line + dims[0] = stackResultDim; + } + if (stacked |= isDimensionStacked(data, dims[1] /*, dims[0]*/)) { // jshint ignore:line + dims[1] = stackResultDim; + } + + return { + dataDimsForPoint: dims, + valueStart: valueStart, + valueAxisDim: valueAxisDim, + baseAxisDim: baseAxisDim, + stacked: !!stacked, + valueDim: valueDim, + baseDim: baseDim, + baseDataOffset: baseDataOffset, + stackedOverDimension: data.getCalculationInfo('stackedOverDimension') + }; +} + +function getValueStart(valueAxis, valueOrigin) { + var valueStart = 0; + var extent = valueAxis.scale.getExtent(); + + if (valueOrigin === 'start') { + valueStart = extent[0]; + } + else if (valueOrigin === 'end') { + valueStart = extent[1]; + } + // auto + else { + // Both positive + if (extent[0] > 0) { + valueStart = extent[0]; + } + // Both negative + else if (extent[1] < 0) { + valueStart = extent[1]; + } + // If is one positive, and one negative, onZero shall be true + } + + return valueStart; +} + +function getStackedOnPoint(dataCoordInfo, coordSys, data, idx) { + var value = NaN; + if (dataCoordInfo.stacked) { + value = data.get(data.getCalculationInfo('stackedOverDimension'), idx); + } + if (isNaN(value)) { + value = dataCoordInfo.valueStart; + } + + var baseDataOffset = dataCoordInfo.baseDataOffset; + var stackedData = []; + stackedData[baseDataOffset] = data.get(dataCoordInfo.baseDim, idx); + stackedData[1 - baseDataOffset] = value; + + return coordSys.dataToPoint(stackedData); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// var arrayDiff = require('zrender/src/core/arrayDiff'); +// 'zrender/src/core/arrayDiff' has been used before, but it did +// not do well in performance when roam with fixed dataZoom window. + +// function convertToIntId(newIdList, oldIdList) { +// // Generate int id instead of string id. +// // Compare string maybe slow in score function of arrDiff + +// // Assume id in idList are all unique +// var idIndicesMap = {}; +// var idx = 0; +// for (var i = 0; i < newIdList.length; i++) { +// idIndicesMap[newIdList[i]] = idx; +// newIdList[i] = idx++; +// } +// for (var i = 0; i < oldIdList.length; i++) { +// var oldId = oldIdList[i]; +// // Same with newIdList +// if (idIndicesMap[oldId]) { +// oldIdList[i] = idIndicesMap[oldId]; +// } +// else { +// oldIdList[i] = idx++; +// } +// } +// } + +function diffData(oldData, newData) { + var diffResult = []; + + newData.diff(oldData) + .add(function (idx) { + diffResult.push({cmd: '+', idx: idx}); + }) + .update(function (newIdx, oldIdx) { + diffResult.push({cmd: '=', idx: oldIdx, idx1: newIdx}); + }) + .remove(function (idx) { + diffResult.push({cmd: '-', idx: idx}); + }) + .execute(); + + return diffResult; +} + +var lineAnimationDiff = function ( + oldData, newData, + oldStackedOnPoints, newStackedOnPoints, + oldCoordSys, newCoordSys, + oldValueOrigin, newValueOrigin +) { + var diff = diffData(oldData, newData); + + // var newIdList = newData.mapArray(newData.getId); + // var oldIdList = oldData.mapArray(oldData.getId); + + // convertToIntId(newIdList, oldIdList); + + // // FIXME One data ? + // diff = arrayDiff(oldIdList, newIdList); + + var currPoints = []; + var nextPoints = []; + // Points for stacking base line + var currStackedPoints = []; + var nextStackedPoints = []; + + var status = []; + var sortedIndices = []; + var rawIndices = []; + + var newDataOldCoordInfo = prepareDataCoordInfo(oldCoordSys, newData, oldValueOrigin); + var oldDataNewCoordInfo = prepareDataCoordInfo(newCoordSys, oldData, newValueOrigin); + + for (var i = 0; i < diff.length; i++) { + var diffItem = diff[i]; + var pointAdded = true; + + // FIXME, animation is not so perfect when dataZoom window moves fast + // Which is in case remvoing or add more than one data in the tail or head + switch (diffItem.cmd) { + case '=': + var currentPt = oldData.getItemLayout(diffItem.idx); + var nextPt = newData.getItemLayout(diffItem.idx1); + // If previous data is NaN, use next point directly + if (isNaN(currentPt[0]) || isNaN(currentPt[1])) { + currentPt = nextPt.slice(); + } + currPoints.push(currentPt); + nextPoints.push(nextPt); + + currStackedPoints.push(oldStackedOnPoints[diffItem.idx]); + nextStackedPoints.push(newStackedOnPoints[diffItem.idx1]); + + rawIndices.push(newData.getRawIndex(diffItem.idx1)); + break; + case '+': + var idx = diffItem.idx; + currPoints.push( + oldCoordSys.dataToPoint([ + newData.get(newDataOldCoordInfo.dataDimsForPoint[0], idx), + newData.get(newDataOldCoordInfo.dataDimsForPoint[1], idx) + ]) + ); + + nextPoints.push(newData.getItemLayout(idx).slice()); + + currStackedPoints.push( + getStackedOnPoint(newDataOldCoordInfo, oldCoordSys, newData, idx) + ); + nextStackedPoints.push(newStackedOnPoints[idx]); + + rawIndices.push(newData.getRawIndex(idx)); + break; + case '-': + var idx = diffItem.idx; + var rawIndex = oldData.getRawIndex(idx); + // Data is replaced. In the case of dynamic data queue + // FIXME FIXME FIXME + if (rawIndex !== idx) { + currPoints.push(oldData.getItemLayout(idx)); + nextPoints.push(newCoordSys.dataToPoint([ + oldData.get(oldDataNewCoordInfo.dataDimsForPoint[0], idx), + oldData.get(oldDataNewCoordInfo.dataDimsForPoint[1], idx) + ])); + + currStackedPoints.push(oldStackedOnPoints[idx]); + nextStackedPoints.push( + getStackedOnPoint(oldDataNewCoordInfo, newCoordSys, oldData, idx) + ); + + rawIndices.push(rawIndex); + } + else { + pointAdded = false; + } + } + + // Original indices + if (pointAdded) { + status.push(diffItem); + sortedIndices.push(sortedIndices.length); + } + } + + // Diff result may be crossed if all items are changed + // Sort by data index + sortedIndices.sort(function (a, b) { + return rawIndices[a] - rawIndices[b]; + }); + + var sortedCurrPoints = []; + var sortedNextPoints = []; + + var sortedCurrStackedPoints = []; + var sortedNextStackedPoints = []; + + var sortedStatus = []; + for (var i = 0; i < sortedIndices.length; i++) { + var idx = sortedIndices[i]; + sortedCurrPoints[i] = currPoints[idx]; + sortedNextPoints[i] = nextPoints[idx]; + + sortedCurrStackedPoints[i] = currStackedPoints[idx]; + sortedNextStackedPoints[i] = nextStackedPoints[idx]; + + sortedStatus[i] = status[idx]; + } + + return { + current: sortedCurrPoints, + next: sortedNextPoints, + + stackedOnCurrent: sortedCurrStackedPoints, + stackedOnNext: sortedNextStackedPoints, + + status: sortedStatus + }; +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// Poly path support NaN point + +var vec2Min = min; +var vec2Max = max; + +var scaleAndAdd$1 = scaleAndAdd; +var v2Copy = copy; + +// Temporary variable +var v = []; +var cp0 = []; +var cp1 = []; + +function isPointNull(p) { + return isNaN(p[0]) || isNaN(p[1]); +} + +function drawSegment( + ctx, points, start, segLen, allLen, + dir, smoothMin, smoothMax, smooth, smoothMonotone, connectNulls +) { + // if (smoothMonotone == null) { + // if (isMono(points, 'x')) { + // return drawMono(ctx, points, start, segLen, allLen, + // dir, smoothMin, smoothMax, smooth, 'x', connectNulls); + // } + // else if (isMono(points, 'y')) { + // return drawMono(ctx, points, start, segLen, allLen, + // dir, smoothMin, smoothMax, smooth, 'y', connectNulls); + // } + // else { + // return drawNonMono.apply(this, arguments); + // } + // } + // else if (smoothMonotone !== 'none' && isMono(points, smoothMonotone)) { + // return drawMono.apply(this, arguments); + // } + // else { + // return drawNonMono.apply(this, arguments); + // } + if (smoothMonotone === 'none' || !smoothMonotone) { + return drawNonMono.apply(this, arguments); + } + else { + return drawMono.apply(this, arguments); + } +} + +/** + * Check if points is in monotone. + * + * @param {number[][]} points Array of points which is in [x, y] form + * @param {string} smoothMonotone 'x', 'y', or 'none', stating for which + * dimension that is checking. + * If is 'none', `drawNonMono` should be + * called. + * If is undefined, either being monotone + * in 'x' or 'y' will call `drawMono`. + */ +// function isMono(points, smoothMonotone) { +// if (points.length <= 1) { +// return true; +// } + +// var dim = smoothMonotone === 'x' ? 0 : 1; +// var last = points[0][dim]; +// var lastDiff = 0; +// for (var i = 1; i < points.length; ++i) { +// var diff = points[i][dim] - last; +// if (!isNaN(diff) && !isNaN(lastDiff) +// && diff !== 0 && lastDiff !== 0 +// && ((diff >= 0) !== (lastDiff >= 0)) +// ) { +// return false; +// } +// if (!isNaN(diff) && diff !== 0) { +// lastDiff = diff; +// last = points[i][dim]; +// } +// } +// return true; +// } + +/** + * Draw smoothed line in monotone, in which only vertical or horizontal bezier + * control points will be used. This should be used when points are monotone + * either in x or y dimension. + */ +function drawMono( + ctx, points, start, segLen, allLen, + dir, smoothMin, smoothMax, smooth, smoothMonotone, connectNulls +) { + var prevIdx = 0; + var idx = start; + for (var k = 0; k < segLen; k++) { + var p = points[idx]; + if (idx >= allLen || idx < 0) { + break; + } + if (isPointNull(p)) { + if (connectNulls) { + idx += dir; + continue; + } + break; + } + + if (idx === start) { + ctx[dir > 0 ? 'moveTo' : 'lineTo'](p[0], p[1]); + } + else { + if (smooth > 0) { + var prevP = points[prevIdx]; + var dim = smoothMonotone === 'y' ? 1 : 0; + + // Length of control point to p, either in x or y, but not both + var ctrlLen = (p[dim] - prevP[dim]) * smooth; + + v2Copy(cp0, prevP); + cp0[dim] = prevP[dim] + ctrlLen; + + v2Copy(cp1, p); + cp1[dim] = p[dim] - ctrlLen; + + ctx.bezierCurveTo( + cp0[0], cp0[1], + cp1[0], cp1[1], + p[0], p[1] + ); + } + else { + ctx.lineTo(p[0], p[1]); + } + } + + prevIdx = idx; + idx += dir; + } + + return k; +} + +/** + * Draw smoothed line in non-monotone, in may cause undesired curve in extreme + * situations. This should be used when points are non-monotone neither in x or + * y dimension. + */ +function drawNonMono( + ctx, points, start, segLen, allLen, + dir, smoothMin, smoothMax, smooth, smoothMonotone, connectNulls +) { + var prevIdx = 0; + var idx = start; + for (var k = 0; k < segLen; k++) { + var p = points[idx]; + if (idx >= allLen || idx < 0) { + break; + } + if (isPointNull(p)) { + if (connectNulls) { + idx += dir; + continue; + } + break; + } + + if (idx === start) { + ctx[dir > 0 ? 'moveTo' : 'lineTo'](p[0], p[1]); + v2Copy(cp0, p); + } + else { + if (smooth > 0) { + var nextIdx = idx + dir; + var nextP = points[nextIdx]; + if (connectNulls) { + // Find next point not null + while (nextP && isPointNull(points[nextIdx])) { + nextIdx += dir; + nextP = points[nextIdx]; + } + } + + var ratioNextSeg = 0.5; + var prevP = points[prevIdx]; + var nextP = points[nextIdx]; + // Last point + if (!nextP || isPointNull(nextP)) { + v2Copy(cp1, p); + } + else { + // If next data is null in not connect case + if (isPointNull(nextP) && !connectNulls) { + nextP = p; + } + + sub(v, nextP, prevP); + + var lenPrevSeg; + var lenNextSeg; + if (smoothMonotone === 'x' || smoothMonotone === 'y') { + var dim = smoothMonotone === 'x' ? 0 : 1; + lenPrevSeg = Math.abs(p[dim] - prevP[dim]); + lenNextSeg = Math.abs(p[dim] - nextP[dim]); + } + else { + lenPrevSeg = dist(p, prevP); + lenNextSeg = dist(p, nextP); + } + + // Use ratio of seg length + ratioNextSeg = lenNextSeg / (lenNextSeg + lenPrevSeg); + + scaleAndAdd$1(cp1, p, v, -smooth * (1 - ratioNextSeg)); + } + // Smooth constraint + vec2Min(cp0, cp0, smoothMax); + vec2Max(cp0, cp0, smoothMin); + vec2Min(cp1, cp1, smoothMax); + vec2Max(cp1, cp1, smoothMin); + + ctx.bezierCurveTo( + cp0[0], cp0[1], + cp1[0], cp1[1], + p[0], p[1] + ); + // cp0 of next segment + scaleAndAdd$1(cp0, p, v, smooth * ratioNextSeg); + } + else { + ctx.lineTo(p[0], p[1]); + } + } + + prevIdx = idx; + idx += dir; + } + + return k; +} + +function getBoundingBox(points, smoothConstraint) { + var ptMin = [Infinity, Infinity]; + var ptMax = [-Infinity, -Infinity]; + if (smoothConstraint) { + for (var i = 0; i < points.length; i++) { + var pt = points[i]; + if (pt[0] < ptMin[0]) { ptMin[0] = pt[0]; } + if (pt[1] < ptMin[1]) { ptMin[1] = pt[1]; } + if (pt[0] > ptMax[0]) { ptMax[0] = pt[0]; } + if (pt[1] > ptMax[1]) { ptMax[1] = pt[1]; } + } + } + return { + min: smoothConstraint ? ptMin : ptMax, + max: smoothConstraint ? ptMax : ptMin + }; +} + +var Polyline$1 = Path.extend({ + + type: 'ec-polyline', + + shape: { + points: [], + + smooth: 0, + + smoothConstraint: true, + + smoothMonotone: null, + + connectNulls: false + }, + + style: { + fill: null, + + stroke: '#000' + }, + + brush: fixClipWithShadow(Path.prototype.brush), + + buildPath: function (ctx, shape) { + var points = shape.points; + + var i = 0; + var len$$1 = points.length; + + var result = getBoundingBox(points, shape.smoothConstraint); + + if (shape.connectNulls) { + // Must remove first and last null values avoid draw error in polygon + for (; len$$1 > 0; len$$1--) { + if (!isPointNull(points[len$$1 - 1])) { + break; + } + } + for (; i < len$$1; i++) { + if (!isPointNull(points[i])) { + break; + } + } + } + while (i < len$$1) { + i += drawSegment( + ctx, points, i, len$$1, len$$1, + 1, result.min, result.max, shape.smooth, + shape.smoothMonotone, shape.connectNulls + ) + 1; + } + } +}); + +var Polygon$1 = Path.extend({ + + type: 'ec-polygon', + + shape: { + points: [], + + // Offset between stacked base points and points + stackedOnPoints: [], + + smooth: 0, + + stackedOnSmooth: 0, + + smoothConstraint: true, + + smoothMonotone: null, + + connectNulls: false + }, + + brush: fixClipWithShadow(Path.prototype.brush), + + buildPath: function (ctx, shape) { + var points = shape.points; + var stackedOnPoints = shape.stackedOnPoints; + + var i = 0; + var len$$1 = points.length; + var smoothMonotone = shape.smoothMonotone; + var bbox = getBoundingBox(points, shape.smoothConstraint); + var stackedOnBBox = getBoundingBox(stackedOnPoints, shape.smoothConstraint); + + if (shape.connectNulls) { + // Must remove first and last null values avoid draw error in polygon + for (; len$$1 > 0; len$$1--) { + if (!isPointNull(points[len$$1 - 1])) { + break; + } + } + for (; i < len$$1; i++) { + if (!isPointNull(points[i])) { + break; + } + } + } + while (i < len$$1) { + var k = drawSegment( + ctx, points, i, len$$1, len$$1, + 1, bbox.min, bbox.max, shape.smooth, + smoothMonotone, shape.connectNulls + ); + drawSegment( + ctx, stackedOnPoints, i + k - 1, k, len$$1, + -1, stackedOnBBox.min, stackedOnBBox.max, shape.stackedOnSmooth, + smoothMonotone, shape.connectNulls + ); + i += k + 1; + + ctx.closePath(); + } + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// FIXME step not support polar + +function isPointsSame(points1, points2) { + if (points1.length !== points2.length) { + return; + } + for (var i = 0; i < points1.length; i++) { + var p1 = points1[i]; + var p2 = points2[i]; + if (p1[0] !== p2[0] || p1[1] !== p2[1]) { + return; + } + } + return true; +} + +function getSmooth(smooth) { + return typeof (smooth) === 'number' ? smooth : (smooth ? 0.5 : 0); +} + +function getAxisExtentWithGap(axis) { + var extent = axis.getGlobalExtent(); + if (axis.onBand) { + // Remove extra 1px to avoid line miter in clipped edge + var halfBandWidth = axis.getBandWidth() / 2 - 1; + var dir = extent[1] > extent[0] ? 1 : -1; + extent[0] += dir * halfBandWidth; + extent[1] -= dir * halfBandWidth; + } + return extent; +} + +/** + * @param {module:echarts/coord/cartesian/Cartesian2D|module:echarts/coord/polar/Polar} coordSys + * @param {module:echarts/data/List} data + * @param {Object} dataCoordInfo + * @param {Array.<Array.<number>>} points + */ +function getStackedOnPoints(coordSys, data, dataCoordInfo) { + if (!dataCoordInfo.valueDim) { + return []; + } + + var points = []; + for (var idx = 0, len = data.count(); idx < len; idx++) { + points.push(getStackedOnPoint(dataCoordInfo, coordSys, data, idx)); + } + + return points; +} + +function createGridClipShape(cartesian, hasAnimation, forSymbol, seriesModel) { + var xExtent = getAxisExtentWithGap(cartesian.getAxis('x')); + var yExtent = getAxisExtentWithGap(cartesian.getAxis('y')); + var isHorizontal = cartesian.getBaseAxis().isHorizontal(); + + var x = Math.min(xExtent[0], xExtent[1]); + var y = Math.min(yExtent[0], yExtent[1]); + var width = Math.max(xExtent[0], xExtent[1]) - x; + var height = Math.max(yExtent[0], yExtent[1]) - y; + + // Avoid float number rounding error for symbol on the edge of axis extent. + // See #7913 and `test/dataZoom-clip.html`. + if (forSymbol) { + x -= 0.5; + width += 0.5; + y -= 0.5; + height += 0.5; + } + else { + var lineWidth = seriesModel.get('lineStyle.width') || 2; + // Expand clip shape to avoid clipping when line value exceeds axis + var expandSize = seriesModel.get('clipOverflow') ? lineWidth / 2 : Math.max(width, height); + if (isHorizontal) { + y -= expandSize; + height += expandSize * 2; + } + else { + x -= expandSize; + width += expandSize * 2; + } + } + + var clipPath = new Rect({ + shape: { + x: x, + y: y, + width: width, + height: height + } + }); + + if (hasAnimation) { + clipPath.shape[isHorizontal ? 'width' : 'height'] = 0; + initProps(clipPath, { + shape: { + width: width, + height: height + } + }, seriesModel); + } + + return clipPath; +} + +function createPolarClipShape(polar, hasAnimation, forSymbol, seriesModel) { + var angleAxis = polar.getAngleAxis(); + var radiusAxis = polar.getRadiusAxis(); + + var radiusExtent = radiusAxis.getExtent().slice(); + radiusExtent[0] > radiusExtent[1] && radiusExtent.reverse(); + var angleExtent = angleAxis.getExtent(); + + var RADIAN = Math.PI / 180; + + // Avoid float number rounding error for symbol on the edge of axis extent. + if (forSymbol) { + radiusExtent[0] -= 0.5; + radiusExtent[1] += 0.5; + } + + var clipPath = new Sector({ + shape: { + cx: round$1(polar.cx, 1), + cy: round$1(polar.cy, 1), + r0: round$1(radiusExtent[0], 1), + r: round$1(radiusExtent[1], 1), + startAngle: -angleExtent[0] * RADIAN, + endAngle: -angleExtent[1] * RADIAN, + clockwise: angleAxis.inverse + } + }); + + if (hasAnimation) { + clipPath.shape.endAngle = -angleExtent[0] * RADIAN; + initProps(clipPath, { + shape: { + endAngle: -angleExtent[1] * RADIAN + } + }, seriesModel); + } + + return clipPath; +} + +function createClipShape(coordSys, hasAnimation, forSymbol, seriesModel) { + return coordSys.type === 'polar' + ? createPolarClipShape(coordSys, hasAnimation, forSymbol, seriesModel) + : createGridClipShape(coordSys, hasAnimation, forSymbol, seriesModel); +} + +function turnPointsIntoStep(points, coordSys, stepTurnAt) { + var baseAxis = coordSys.getBaseAxis(); + var baseIndex = baseAxis.dim === 'x' || baseAxis.dim === 'radius' ? 0 : 1; + + var stepPoints = []; + for (var i = 0; i < points.length - 1; i++) { + var nextPt = points[i + 1]; + var pt = points[i]; + stepPoints.push(pt); + + var stepPt = []; + switch (stepTurnAt) { + case 'end': + stepPt[baseIndex] = nextPt[baseIndex]; + stepPt[1 - baseIndex] = pt[1 - baseIndex]; + // default is start + stepPoints.push(stepPt); + break; + case 'middle': + // default is start + var middle = (pt[baseIndex] + nextPt[baseIndex]) / 2; + var stepPt2 = []; + stepPt[baseIndex] = stepPt2[baseIndex] = middle; + stepPt[1 - baseIndex] = pt[1 - baseIndex]; + stepPt2[1 - baseIndex] = nextPt[1 - baseIndex]; + stepPoints.push(stepPt); + stepPoints.push(stepPt2); + break; + default: + stepPt[baseIndex] = pt[baseIndex]; + stepPt[1 - baseIndex] = nextPt[1 - baseIndex]; + // default is start + stepPoints.push(stepPt); + } + } + // Last points + points[i] && stepPoints.push(points[i]); + return stepPoints; +} + +function getVisualGradient(data, coordSys) { + var visualMetaList = data.getVisual('visualMeta'); + if (!visualMetaList || !visualMetaList.length || !data.count()) { + // When data.count() is 0, gradient range can not be calculated. + return; + } + + if (coordSys.type !== 'cartesian2d') { + if (__DEV__) { + console.warn('Visual map on line style is only supported on cartesian2d.'); + } + return; + } + + var coordDim; + var visualMeta; + + for (var i = visualMetaList.length - 1; i >= 0; i--) { + var dimIndex = visualMetaList[i].dimension; + var dimName = data.dimensions[dimIndex]; + var dimInfo = data.getDimensionInfo(dimName); + coordDim = dimInfo && dimInfo.coordDim; + // Can only be x or y + if (coordDim === 'x' || coordDim === 'y') { + visualMeta = visualMetaList[i]; + break; + } + } + + if (!visualMeta) { + if (__DEV__) { + console.warn('Visual map on line style only support x or y dimension.'); + } + return; + } + + // If the area to be rendered is bigger than area defined by LinearGradient, + // the canvas spec prescribes that the color of the first stop and the last + // stop should be used. But if two stops are added at offset 0, in effect + // browsers use the color of the second stop to render area outside + // LinearGradient. So we can only infinitesimally extend area defined in + // LinearGradient to render `outerColors`. + + var axis = coordSys.getAxis(coordDim); + + // dataToCoor mapping may not be linear, but must be monotonic. + var colorStops = map(visualMeta.stops, function (stop) { + return { + coord: axis.toGlobalCoord(axis.dataToCoord(stop.value)), + color: stop.color + }; + }); + var stopLen = colorStops.length; + var outerColors = visualMeta.outerColors.slice(); + + if (stopLen && colorStops[0].coord > colorStops[stopLen - 1].coord) { + colorStops.reverse(); + outerColors.reverse(); + } + + var tinyExtent = 10; // Arbitrary value: 10px + var minCoord = colorStops[0].coord - tinyExtent; + var maxCoord = colorStops[stopLen - 1].coord + tinyExtent; + var coordSpan = maxCoord - minCoord; + + if (coordSpan < 1e-3) { + return 'transparent'; + } + + each$1(colorStops, function (stop) { + stop.offset = (stop.coord - minCoord) / coordSpan; + }); + colorStops.push({ + offset: stopLen ? colorStops[stopLen - 1].offset : 0.5, + color: outerColors[1] || 'transparent' + }); + colorStops.unshift({ // notice colorStops.length have been changed. + offset: stopLen ? colorStops[0].offset : 0.5, + color: outerColors[0] || 'transparent' + }); + + // zrUtil.each(colorStops, function (colorStop) { + // // Make sure each offset has rounded px to avoid not sharp edge + // colorStop.offset = (Math.round(colorStop.offset * (end - start) + start) - start) / (end - start); + // }); + + var gradient = new LinearGradient(0, 0, 0, 0, colorStops, true); + gradient[coordDim] = minCoord; + gradient[coordDim + '2'] = maxCoord; + + return gradient; +} + +function getIsIgnoreFunc(seriesModel, data, coordSys) { + var showAllSymbol = seriesModel.get('showAllSymbol'); + var isAuto = showAllSymbol === 'auto'; + + if (showAllSymbol && !isAuto) { + return; + } + + var categoryAxis = coordSys.getAxesByScale('ordinal')[0]; + if (!categoryAxis) { + return; + } + + // Note that category label interval strategy might bring some weird effect + // in some scenario: users may wonder why some of the symbols are not + // displayed. So we show all symbols as possible as we can. + if (isAuto + // Simplify the logic, do not determine label overlap here. + && canShowAllSymbolForCategory(categoryAxis, data) + ) { + return; + } + + // Otherwise follow the label interval strategy on category axis. + var categoryDataDim = data.mapDimension(categoryAxis.dim); + var labelMap = {}; + + each$1(categoryAxis.getViewLabels(), function (labelItem) { + labelMap[labelItem.tickValue] = 1; + }); + + return function (dataIndex) { + return !labelMap.hasOwnProperty(data.get(categoryDataDim, dataIndex)); + }; +} + +function canShowAllSymbolForCategory(categoryAxis, data) { + // In mose cases, line is monotonous on category axis, and the label size + // is close with each other. So we check the symbol size and some of the + // label size alone with the category axis to estimate whether all symbol + // can be shown without overlap. + var axisExtent = categoryAxis.getExtent(); + var availSize = Math.abs(axisExtent[1] - axisExtent[0]) / categoryAxis.scale.count(); + isNaN(availSize) && (availSize = 0); // 0/0 is NaN. + + // Sampling some points, max 5. + var dataLen = data.count(); + var step = Math.max(1, Math.round(dataLen / 5)); + for (var dataIndex = 0; dataIndex < dataLen; dataIndex += step) { + if (SymbolClz$1.getSymbolSize( + data, dataIndex + // Only for cartesian, where `isHorizontal` exists. + )[categoryAxis.isHorizontal() ? 1 : 0] + // Empirical number + * 1.5 > availSize + ) { + return false; + } + } + + return true; +} + +Chart.extend({ + + type: 'line', + + init: function () { + var lineGroup = new Group(); + + var symbolDraw = new SymbolDraw(); + this.group.add(symbolDraw.group); + + this._symbolDraw = symbolDraw; + this._lineGroup = lineGroup; + }, + + render: function (seriesModel, ecModel, api) { + var coordSys = seriesModel.coordinateSystem; + var group = this.group; + var data = seriesModel.getData(); + var lineStyleModel = seriesModel.getModel('lineStyle'); + var areaStyleModel = seriesModel.getModel('areaStyle'); + + var points = data.mapArray(data.getItemLayout); + + var isCoordSysPolar = coordSys.type === 'polar'; + var prevCoordSys = this._coordSys; + + var symbolDraw = this._symbolDraw; + var polyline = this._polyline; + var polygon = this._polygon; + + var lineGroup = this._lineGroup; + + var hasAnimation = seriesModel.get('animation'); + + var isAreaChart = !areaStyleModel.isEmpty(); + + var valueOrigin = areaStyleModel.get('origin'); + var dataCoordInfo = prepareDataCoordInfo(coordSys, data, valueOrigin); + + var stackedOnPoints = getStackedOnPoints(coordSys, data, dataCoordInfo); + + var showSymbol = seriesModel.get('showSymbol'); + + var isIgnoreFunc = showSymbol && !isCoordSysPolar + && getIsIgnoreFunc(seriesModel, data, coordSys); + + // Remove temporary symbols + var oldData = this._data; + oldData && oldData.eachItemGraphicEl(function (el, idx) { + if (el.__temp) { + group.remove(el); + oldData.setItemGraphicEl(idx, null); + } + }); + + // Remove previous created symbols if showSymbol changed to false + if (!showSymbol) { + symbolDraw.remove(); + } + + group.add(lineGroup); + + // FIXME step not support polar + var step = !isCoordSysPolar && seriesModel.get('step'); + // Initialization animation or coordinate system changed + if ( + !(polyline && prevCoordSys.type === coordSys.type && step === this._step) + ) { + showSymbol && symbolDraw.updateData(data, { + isIgnore: isIgnoreFunc, + clipShape: createClipShape(coordSys, false, true, seriesModel) + }); + + if (step) { + // TODO If stacked series is not step + points = turnPointsIntoStep(points, coordSys, step); + stackedOnPoints = turnPointsIntoStep(stackedOnPoints, coordSys, step); + } + + polyline = this._newPolyline(points, coordSys, hasAnimation); + if (isAreaChart) { + polygon = this._newPolygon( + points, stackedOnPoints, + coordSys, hasAnimation + ); + } + lineGroup.setClipPath(createClipShape(coordSys, true, false, seriesModel)); + } + else { + if (isAreaChart && !polygon) { + // If areaStyle is added + polygon = this._newPolygon( + points, stackedOnPoints, + coordSys, hasAnimation + ); + } + else if (polygon && !isAreaChart) { + // If areaStyle is removed + lineGroup.remove(polygon); + polygon = this._polygon = null; + } + + // Update clipPath + lineGroup.setClipPath(createClipShape(coordSys, false, false, seriesModel)); + + // Always update, or it is wrong in the case turning on legend + // because points are not changed + showSymbol && symbolDraw.updateData(data, { + isIgnore: isIgnoreFunc, + clipShape: createClipShape(coordSys, false, true, seriesModel) + }); + + // Stop symbol animation and sync with line points + // FIXME performance? + data.eachItemGraphicEl(function (el) { + el.stopAnimation(true); + }); + + // In the case data zoom triggerred refreshing frequently + // Data may not change if line has a category axis. So it should animate nothing + if (!isPointsSame(this._stackedOnPoints, stackedOnPoints) + || !isPointsSame(this._points, points) + ) { + if (hasAnimation) { + this._updateAnimation( + data, stackedOnPoints, coordSys, api, step, valueOrigin + ); + } + else { + // Not do it in update with animation + if (step) { + // TODO If stacked series is not step + points = turnPointsIntoStep(points, coordSys, step); + stackedOnPoints = turnPointsIntoStep(stackedOnPoints, coordSys, step); + } + + polyline.setShape({ + points: points + }); + polygon && polygon.setShape({ + points: points, + stackedOnPoints: stackedOnPoints + }); + } + } + } + + var visualColor = getVisualGradient(data, coordSys) || data.getVisual('color'); + + polyline.useStyle(defaults( + // Use color in lineStyle first + lineStyleModel.getLineStyle(), + { + fill: 'none', + stroke: visualColor, + lineJoin: 'bevel' + } + )); + + var smooth = seriesModel.get('smooth'); + smooth = getSmooth(seriesModel.get('smooth')); + polyline.setShape({ + smooth: smooth, + smoothMonotone: seriesModel.get('smoothMonotone'), + connectNulls: seriesModel.get('connectNulls') + }); + + if (polygon) { + var stackedOnSeries = data.getCalculationInfo('stackedOnSeries'); + var stackedOnSmooth = 0; + + polygon.useStyle(defaults( + areaStyleModel.getAreaStyle(), + { + fill: visualColor, + opacity: 0.7, + lineJoin: 'bevel' + } + )); + + if (stackedOnSeries) { + stackedOnSmooth = getSmooth(stackedOnSeries.get('smooth')); + } + + polygon.setShape({ + smooth: smooth, + stackedOnSmooth: stackedOnSmooth, + smoothMonotone: seriesModel.get('smoothMonotone'), + connectNulls: seriesModel.get('connectNulls') + }); + } + + this._data = data; + // Save the coordinate system for transition animation when data changed + this._coordSys = coordSys; + this._stackedOnPoints = stackedOnPoints; + this._points = points; + this._step = step; + this._valueOrigin = valueOrigin; + }, + + dispose: function () {}, + + highlight: function (seriesModel, ecModel, api, payload) { + var data = seriesModel.getData(); + var dataIndex = queryDataIndex(data, payload); + + if (!(dataIndex instanceof Array) && dataIndex != null && dataIndex >= 0) { + var symbol = data.getItemGraphicEl(dataIndex); + if (!symbol) { + // Create a temporary symbol if it is not exists + var pt = data.getItemLayout(dataIndex); + if (!pt) { + // Null data + return; + } + symbol = new SymbolClz$1(data, dataIndex); + symbol.position = pt; + symbol.setZ( + seriesModel.get('zlevel'), + seriesModel.get('z') + ); + symbol.ignore = isNaN(pt[0]) || isNaN(pt[1]); + symbol.__temp = true; + data.setItemGraphicEl(dataIndex, symbol); + + // Stop scale animation + symbol.stopSymbolAnimation(true); + + this.group.add(symbol); + } + symbol.highlight(); + } + else { + // Highlight whole series + Chart.prototype.highlight.call( + this, seriesModel, ecModel, api, payload + ); + } + }, + + downplay: function (seriesModel, ecModel, api, payload) { + var data = seriesModel.getData(); + var dataIndex = queryDataIndex(data, payload); + if (dataIndex != null && dataIndex >= 0) { + var symbol = data.getItemGraphicEl(dataIndex); + if (symbol) { + if (symbol.__temp) { + data.setItemGraphicEl(dataIndex, null); + this.group.remove(symbol); + } + else { + symbol.downplay(); + } + } + } + else { + // FIXME + // can not downplay completely. + // Downplay whole series + Chart.prototype.downplay.call( + this, seriesModel, ecModel, api, payload + ); + } + }, + + /** + * @param {module:zrender/container/Group} group + * @param {Array.<Array.<number>>} points + * @private + */ + _newPolyline: function (points) { + var polyline = this._polyline; + // Remove previous created polyline + if (polyline) { + this._lineGroup.remove(polyline); + } + + polyline = new Polyline$1({ + shape: { + points: points + }, + silent: true, + z2: 10 + }); + + this._lineGroup.add(polyline); + + this._polyline = polyline; + + return polyline; + }, + + /** + * @param {module:zrender/container/Group} group + * @param {Array.<Array.<number>>} stackedOnPoints + * @param {Array.<Array.<number>>} points + * @private + */ + _newPolygon: function (points, stackedOnPoints) { + var polygon = this._polygon; + // Remove previous created polygon + if (polygon) { + this._lineGroup.remove(polygon); + } + + polygon = new Polygon$1({ + shape: { + points: points, + stackedOnPoints: stackedOnPoints + }, + silent: true + }); + + this._lineGroup.add(polygon); + + this._polygon = polygon; + return polygon; + }, + + /** + * @private + */ + // FIXME Two value axis + _updateAnimation: function (data, stackedOnPoints, coordSys, api, step, valueOrigin) { + var polyline = this._polyline; + var polygon = this._polygon; + var seriesModel = data.hostModel; + + var diff = lineAnimationDiff( + this._data, data, + this._stackedOnPoints, stackedOnPoints, + this._coordSys, coordSys, + this._valueOrigin, valueOrigin + ); + + var current = diff.current; + var stackedOnCurrent = diff.stackedOnCurrent; + var next = diff.next; + var stackedOnNext = diff.stackedOnNext; + if (step) { + // TODO If stacked series is not step + current = turnPointsIntoStep(diff.current, coordSys, step); + stackedOnCurrent = turnPointsIntoStep(diff.stackedOnCurrent, coordSys, step); + next = turnPointsIntoStep(diff.next, coordSys, step); + stackedOnNext = turnPointsIntoStep(diff.stackedOnNext, coordSys, step); + } + // `diff.current` is subset of `current` (which should be ensured by + // turnPointsIntoStep), so points in `__points` can be updated when + // points in `current` are update during animation. + polyline.shape.__points = diff.current; + polyline.shape.points = current; + + updateProps(polyline, { + shape: { + points: next + } + }, seriesModel); + + if (polygon) { + polygon.setShape({ + points: current, + stackedOnPoints: stackedOnCurrent + }); + updateProps(polygon, { + shape: { + points: next, + stackedOnPoints: stackedOnNext + } + }, seriesModel); + } + + var updatedDataInfo = []; + var diffStatus = diff.status; + + for (var i = 0; i < diffStatus.length; i++) { + var cmd = diffStatus[i].cmd; + if (cmd === '=') { + var el = data.getItemGraphicEl(diffStatus[i].idx1); + if (el) { + updatedDataInfo.push({ + el: el, + ptIdx: i // Index of points + }); + } + } + } + + if (polyline.animators && polyline.animators.length) { + polyline.animators[0].during(function () { + for (var i = 0; i < updatedDataInfo.length; i++) { + var el = updatedDataInfo[i].el; + el.attr('position', polyline.shape.__points[updatedDataInfo[i].ptIdx]); + } + }); + } + }, + + remove: function (ecModel) { + var group = this.group; + var oldData = this._data; + this._lineGroup.removeAll(); + this._symbolDraw.remove(true); + // Remove temporary created elements when highlighting + oldData && oldData.eachItemGraphicEl(function (el, idx) { + if (el.__temp) { + group.remove(el); + oldData.setItemGraphicEl(idx, null); + } + }); + + this._polyline = + this._polygon = + this._coordSys = + this._points = + this._stackedOnPoints = + this._data = null; + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +var visualSymbol = function (seriesType, defaultSymbolType, legendSymbol) { + // Encoding visual for all series include which is filtered for legend drawing + return { + seriesType: seriesType, + + // For legend. + performRawSeries: true, + + reset: function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + + var symbolType = seriesModel.get('symbol') || defaultSymbolType; + var symbolSize = seriesModel.get('symbolSize'); + var keepAspect = seriesModel.get('symbolKeepAspect'); + + data.setVisual({ + legendSymbol: legendSymbol || symbolType, + symbol: symbolType, + symbolSize: symbolSize, + symbolKeepAspect: keepAspect + }); + + // Only visible series has each data be visual encoded + if (ecModel.isSeriesFiltered(seriesModel)) { + return; + } + + var hasCallback = typeof symbolSize === 'function'; + + function dataEach(data, idx) { + if (typeof symbolSize === 'function') { + var rawValue = seriesModel.getRawValue(idx); + // FIXME + var params = seriesModel.getDataParams(idx); + data.setItemVisual(idx, 'symbolSize', symbolSize(rawValue, params)); + } + + if (data.hasItemOption) { + var itemModel = data.getItemModel(idx); + var itemSymbolType = itemModel.getShallow('symbol', true); + var itemSymbolSize = itemModel.getShallow('symbolSize', + true); + var itemSymbolKeepAspect = + itemModel.getShallow('symbolKeepAspect',true); + + // If has item symbol + if (itemSymbolType != null) { + data.setItemVisual(idx, 'symbol', itemSymbolType); + } + if (itemSymbolSize != null) { + // PENDING Transform symbolSize ? + data.setItemVisual(idx, 'symbolSize', itemSymbolSize); + } + if (itemSymbolKeepAspect != null) { + data.setItemVisual(idx, 'symbolKeepAspect', + itemSymbolKeepAspect); + } + } + } + + return { dataEach: (data.hasItemOption || hasCallback) ? dataEach : null }; + } + }; +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var pointsLayout = function (seriesType) { + return { + seriesType: seriesType, + + plan: createRenderPlanner(), + + reset: function (seriesModel) { + var data = seriesModel.getData(); + var coordSys = seriesModel.coordinateSystem; + var pipelineContext = seriesModel.pipelineContext; + var isLargeRender = pipelineContext.large; + + if (!coordSys) { + return; + } + + var dims = map(coordSys.dimensions, function (dim) { + return data.mapDimension(dim); + }).slice(0, 2); + var dimLen = dims.length; + + var stackResultDim = data.getCalculationInfo('stackResultDimension'); + if (isDimensionStacked(data, dims[0] /*, dims[1]*/)) { + dims[0] = stackResultDim; + } + if (isDimensionStacked(data, dims[1] /*, dims[0]*/)) { + dims[1] = stackResultDim; + } + + function progress(params, data) { + var segCount = params.end - params.start; + var points = isLargeRender && new Float32Array(segCount * dimLen); + + for (var i = params.start, offset = 0, tmpIn = [], tmpOut = []; i < params.end; i++) { + var point; + + if (dimLen === 1) { + var x = data.get(dims[0], i); + point = !isNaN(x) && coordSys.dataToPoint(x, null, tmpOut); + } + else { + var x = tmpIn[0] = data.get(dims[0], i); + var y = tmpIn[1] = data.get(dims[1], i); + // Also {Array.<number>}, not undefined to avoid if...else... statement + point = !isNaN(x) && !isNaN(y) && coordSys.dataToPoint(tmpIn, null, tmpOut); + } + + if (isLargeRender) { + points[offset++] = point ? point[0] : NaN; + points[offset++] = point ? point[1] : NaN; + } + else { + data.setItemLayout(i, (point && point.slice()) || [NaN, NaN]); + } + } + + isLargeRender && data.setLayout('symbolPoints', points); + } + + return dimLen && {progress: progress}; + } + }; +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +var samplers = { + average: function (frame) { + var sum = 0; + var count = 0; + for (var i = 0; i < frame.length; i++) { + if (!isNaN(frame[i])) { + sum += frame[i]; + count++; + } + } + // Return NaN if count is 0 + return count === 0 ? NaN : sum / count; + }, + sum: function (frame) { + var sum = 0; + for (var i = 0; i < frame.length; i++) { + // Ignore NaN + sum += frame[i] || 0; + } + return sum; + }, + max: function (frame) { + var max = -Infinity; + for (var i = 0; i < frame.length; i++) { + frame[i] > max && (max = frame[i]); + } + // NaN will cause illegal axis extent. + return isFinite(max) ? max : NaN; + }, + min: function (frame) { + var min = Infinity; + for (var i = 0; i < frame.length; i++) { + frame[i] < min && (min = frame[i]); + } + // NaN will cause illegal axis extent. + return isFinite(min) ? min : NaN; + }, + // TODO + // Median + nearest: function (frame) { + return frame[0]; + } +}; + +var indexSampler = function (frame, value) { + return Math.round(frame.length / 2); +}; + +var dataSample = function (seriesType) { + return { + + seriesType: seriesType, + + modifyOutputEnd: true, + + reset: function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var sampling = seriesModel.get('sampling'); + var coordSys = seriesModel.coordinateSystem; + // Only cartesian2d support down sampling + if (coordSys.type === 'cartesian2d' && sampling) { + var baseAxis = coordSys.getBaseAxis(); + var valueAxis = coordSys.getOtherAxis(baseAxis); + var extent = baseAxis.getExtent(); + // Coordinste system has been resized + var size = extent[1] - extent[0]; + var rate = Math.round(data.count() / size); + if (rate > 1) { + var sampler; + if (typeof sampling === 'string') { + sampler = samplers[sampling]; + } + else if (typeof sampling === 'function') { + sampler = sampling; + } + if (sampler) { + // Only support sample the first dim mapped from value axis. + seriesModel.setData(data.downSample( + data.mapDimension(valueAxis.dim), 1 / rate, sampler, indexSampler + )); + } + } + } + } + }; +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Cartesian coordinate system + * @module echarts/coord/Cartesian + * + */ + +function dimAxisMapper(dim) { + return this._axes[dim]; +} + +/** + * @alias module:echarts/coord/Cartesian + * @constructor + */ +var Cartesian = function (name) { + this._axes = {}; + + this._dimList = []; + + /** + * @type {string} + */ + this.name = name || ''; +}; + +Cartesian.prototype = { + + constructor: Cartesian, + + type: 'cartesian', + + /** + * Get axis + * @param {number|string} dim + * @return {module:echarts/coord/Cartesian~Axis} + */ + getAxis: function (dim) { + return this._axes[dim]; + }, + + /** + * Get axes list + * @return {Array.<module:echarts/coord/Cartesian~Axis>} + */ + getAxes: function () { + return map(this._dimList, dimAxisMapper, this); + }, + + /** + * Get axes list by given scale type + */ + getAxesByScale: function (scaleType) { + scaleType = scaleType.toLowerCase(); + return filter( + this.getAxes(), + function (axis) { + return axis.scale.type === scaleType; + } + ); + }, + + /** + * Add axis + * @param {module:echarts/coord/Cartesian.Axis} + */ + addAxis: function (axis) { + var dim = axis.dim; + + this._axes[dim] = axis; + + this._dimList.push(dim); + }, + + /** + * Convert data to coord in nd space + * @param {Array.<number>|Object.<string, number>} val + * @return {Array.<number>|Object.<string, number>} + */ + dataToCoord: function (val) { + return this._dataCoordConvert(val, 'dataToCoord'); + }, + + /** + * Convert coord in nd space to data + * @param {Array.<number>|Object.<string, number>} val + * @return {Array.<number>|Object.<string, number>} + */ + coordToData: function (val) { + return this._dataCoordConvert(val, 'coordToData'); + }, + + _dataCoordConvert: function (input, method) { + var dimList = this._dimList; + + var output = input instanceof Array ? [] : {}; + + for (var i = 0; i < dimList.length; i++) { + var dim = dimList[i]; + var axis = this._axes[dim]; + + output[dim] = axis[method](input[dim]); + } + + return output; + } +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +function Cartesian2D(name) { + + Cartesian.call(this, name); +} + +Cartesian2D.prototype = { + + constructor: Cartesian2D, + + type: 'cartesian2d', + + /** + * @type {Array.<string>} + * @readOnly + */ + dimensions: ['x', 'y'], + + /** + * Base axis will be used on stacking. + * + * @return {module:echarts/coord/cartesian/Axis2D} + */ + getBaseAxis: function () { + return this.getAxesByScale('ordinal')[0] + || this.getAxesByScale('time')[0] + || this.getAxis('x'); + }, + + /** + * If contain point + * @param {Array.<number>} point + * @return {boolean} + */ + containPoint: function (point) { + var axisX = this.getAxis('x'); + var axisY = this.getAxis('y'); + return axisX.contain(axisX.toLocalCoord(point[0])) + && axisY.contain(axisY.toLocalCoord(point[1])); + }, + + /** + * If contain data + * @param {Array.<number>} data + * @return {boolean} + */ + containData: function (data) { + return this.getAxis('x').containData(data[0]) + && this.getAxis('y').containData(data[1]); + }, + + /** + * @param {Array.<number>} data + * @param {Array.<number>} out + * @return {Array.<number>} + */ + dataToPoint: function (data, reserved, out) { + var xAxis = this.getAxis('x'); + var yAxis = this.getAxis('y'); + out = out || []; + out[0] = xAxis.toGlobalCoord(xAxis.dataToCoord(data[0])); + out[1] = yAxis.toGlobalCoord(yAxis.dataToCoord(data[1])); + return out; + }, + + /** + * @param {Array.<number>} data + * @param {Array.<number>} out + * @return {Array.<number>} + */ + clampData: function (data, out) { + var xScale = this.getAxis('x').scale; + var yScale = this.getAxis('y').scale; + var xAxisExtent = xScale.getExtent(); + var yAxisExtent = yScale.getExtent(); + var x = xScale.parse(data[0]); + var y = yScale.parse(data[1]); + out = out || []; + out[0] = Math.min( + Math.max(Math.min(xAxisExtent[0], xAxisExtent[1]), x), + Math.max(xAxisExtent[0], xAxisExtent[1]) + ); + out[1] = Math.min( + Math.max(Math.min(yAxisExtent[0], yAxisExtent[1]), y), + Math.max(yAxisExtent[0], yAxisExtent[1]) + ); + + return out; + }, + + /** + * @param {Array.<number>} point + * @param {Array.<number>} out + * @return {Array.<number>} + */ + pointToData: function (point, out) { + var xAxis = this.getAxis('x'); + var yAxis = this.getAxis('y'); + out = out || []; + out[0] = xAxis.coordToData(xAxis.toLocalCoord(point[0])); + out[1] = yAxis.coordToData(yAxis.toLocalCoord(point[1])); + return out; + }, + + /** + * Get other axis + * @param {module:echarts/coord/cartesian/Axis2D} axis + */ + getOtherAxis: function (axis) { + return this.getAxis(axis.dim === 'x' ? 'y' : 'x'); + } + +}; + +inherits(Cartesian2D, Cartesian); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Extend axis 2d + * @constructor module:echarts/coord/cartesian/Axis2D + * @extends {module:echarts/coord/cartesian/Axis} + * @param {string} dim + * @param {*} scale + * @param {Array.<number>} coordExtent + * @param {string} axisType + * @param {string} position + */ +var Axis2D = function (dim, scale, coordExtent, axisType, position) { + Axis.call(this, dim, scale, coordExtent); + /** + * Axis type + * - 'category' + * - 'value' + * - 'time' + * - 'log' + * @type {string} + */ + this.type = axisType || 'value'; + + /** + * Axis position + * - 'top' + * - 'bottom' + * - 'left' + * - 'right' + */ + this.position = position || 'bottom'; +}; + +Axis2D.prototype = { + + constructor: Axis2D, + + /** + * Index of axis, can be used as key + */ + index: 0, + + /** + * Implemented in <module:echarts/coord/cartesian/Grid>. + * @return {Array.<module:echarts/coord/cartesian/Axis2D>} + * If not on zero of other axis, return null/undefined. + * If no axes, return an empty array. + */ + getAxesOnZeroOf: null, + + /** + * Axis model + * @param {module:echarts/coord/cartesian/AxisModel} + */ + model: null, + + isHorizontal: function () { + var position = this.position; + return position === 'top' || position === 'bottom'; + }, + + /** + * Each item cooresponds to this.getExtent(), which + * means globalExtent[0] may greater than globalExtent[1], + * unless `asc` is input. + * + * @param {boolean} [asc] + * @return {Array.<number>} + */ + getGlobalExtent: function (asc) { + var ret = this.getExtent(); + ret[0] = this.toGlobalCoord(ret[0]); + ret[1] = this.toGlobalCoord(ret[1]); + asc && ret[0] > ret[1] && ret.reverse(); + return ret; + }, + + getOtherAxis: function () { + this.grid.getOtherAxis(); + }, + + /** + * @override + */ + pointToData: function (point, clamp) { + return this.coordToData(this.toLocalCoord(point[this.dim === 'x' ? 0 : 1]), clamp); + }, + + /** + * Transform global coord to local coord, + * i.e. var localCoord = axis.toLocalCoord(80); + * designate by module:echarts/coord/cartesian/Grid. + * @type {Function} + */ + toLocalCoord: null, + + /** + * Transform global coord to local coord, + * i.e. var globalCoord = axis.toLocalCoord(40); + * designate by module:echarts/coord/cartesian/Grid. + * @type {Function} + */ + toGlobalCoord: null + +}; + +inherits(Axis2D, Axis); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var defaultOption = { + show: true, + zlevel: 0, + z: 0, + // Inverse the axis. + inverse: false, + + // Axis name displayed. + name: '', + // 'start' | 'middle' | 'end' + nameLocation: 'end', + // By degree. By defualt auto rotate by nameLocation. + nameRotate: null, + nameTruncate: { + maxWidth: null, + ellipsis: '...', + placeholder: '.' + }, + // Use global text style by default. + nameTextStyle: {}, + // The gap between axisName and axisLine. + nameGap: 15, + + // Default `false` to support tooltip. + silent: false, + // Default `false` to avoid legacy user event listener fail. + triggerEvent: false, + + tooltip: { + show: false + }, + + axisPointer: {}, + + axisLine: { + show: true, + onZero: true, + onZeroAxisIndex: null, + lineStyle: { + color: '#333', + width: 1, + type: 'solid' + }, + // The arrow at both ends the the axis. + symbol: ['none', 'none'], + symbolSize: [10, 15] + }, + axisTick: { + show: true, + // Whether axisTick is inside the grid or outside the grid. + inside: false, + // The length of axisTick. + length: 5, + lineStyle: { + width: 1 + } + }, + axisLabel: { + show: true, + // Whether axisLabel is inside the grid or outside the grid. + inside: false, + rotate: 0, + // true | false | null/undefined (auto) + showMinLabel: null, + // true | false | null/undefined (auto) + showMaxLabel: null, + margin: 8, + // formatter: null, + fontSize: 12 + }, + splitLine: { + show: true, + lineStyle: { + color: ['#ccc'], + width: 1, + type: 'solid' + } + }, + splitArea: { + show: false, + areaStyle: { + color: ['rgba(250,250,250,0.3)','rgba(200,200,200,0.3)'] + } + } +}; + +var axisDefault = {}; + +axisDefault.categoryAxis = merge({ + // The gap at both ends of the axis. For categoryAxis, boolean. + boundaryGap: true, + // Set false to faster category collection. + // Only usefull in the case like: category is + // ['2012-01-01', '2012-01-02', ...], where the input + // data has been ensured not duplicate and is large data. + // null means "auto": + // if axis.data provided, do not deduplication, + // else do deduplication. + deduplication: null, + // splitArea: { + // show: false + // }, + splitLine: { + show: false + }, + axisTick: { + // If tick is align with label when boundaryGap is true + alignWithLabel: false, + interval: 'auto' + }, + axisLabel: { + interval: 'auto' + } +}, defaultOption); + +axisDefault.valueAxis = merge({ + // The gap at both ends of the axis. For value axis, [GAP, GAP], where + // `GAP` can be an absolute pixel number (like `35`), or percent (like `'30%'`) + boundaryGap: [0, 0], + + // TODO + // min/max: [30, datamin, 60] or [20, datamin] or [datamin, 60] + + // Min value of the axis. can be: + // + a number + // + 'dataMin': use the min value in data. + // + null/undefined: auto decide min value (consider pretty look and boundaryGap). + // min: null, + + // Max value of the axis. can be: + // + a number + // + 'dataMax': use the max value in data. + // + null/undefined: auto decide max value (consider pretty look and boundaryGap). + // max: null, + + // Readonly prop, specifies start value of the range when using data zoom. + // rangeStart: null + + // Readonly prop, specifies end value of the range when using data zoom. + // rangeEnd: null + + // Optional value can be: + // + `false`: always include value 0. + // + `true`: the extent do not consider value 0. + // scale: false, + + // AxisTick and axisLabel and splitLine are caculated based on splitNumber. + splitNumber: 5 + + // Interval specifies the span of the ticks is mandatorily. + // interval: null + + // Specify min interval when auto calculate tick interval. + // minInterval: null + + // Specify max interval when auto calculate tick interval. + // maxInterval: null + +}, defaultOption); + +axisDefault.timeAxis = defaults({ + scale: true, + min: 'dataMin', + max: 'dataMax' +}, axisDefault.valueAxis); + +axisDefault.logAxis = defaults({ + scale: true, + logBase: 10 +}, axisDefault.valueAxis); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// FIXME axisType is fixed ? +var AXIS_TYPES = ['value', 'category', 'time', 'log']; + +/** + * Generate sub axis model class + * @param {string} axisName 'x' 'y' 'radius' 'angle' 'parallel' + * @param {module:echarts/model/Component} BaseAxisModelClass + * @param {Function} axisTypeDefaulter + * @param {Object} [extraDefaultOption] + */ +var axisModelCreator = function (axisName, BaseAxisModelClass, axisTypeDefaulter, extraDefaultOption) { + + each$1(AXIS_TYPES, function (axisType) { + + BaseAxisModelClass.extend({ + + /** + * @readOnly + */ + type: axisName + 'Axis.' + axisType, + + mergeDefaultAndTheme: function (option, ecModel) { + var layoutMode = this.layoutMode; + var inputPositionParams = layoutMode + ? getLayoutParams(option) : {}; + + var themeModel = ecModel.getTheme(); + merge(option, themeModel.get(axisType + 'Axis')); + merge(option, this.getDefaultOption()); + + option.type = axisTypeDefaulter(axisName, option); + + if (layoutMode) { + mergeLayoutParam(option, inputPositionParams, layoutMode); + } + }, + + /** + * @override + */ + optionUpdated: function () { + var thisOption = this.option; + if (thisOption.type === 'category') { + this.__ordinalMeta = OrdinalMeta.createByAxisModel(this); + } + }, + + /** + * Should not be called before all of 'getInitailData' finished. + * Because categories are collected during initializing data. + */ + getCategories: function (rawData) { + var option = this.option; + // FIXME + // warning if called before all of 'getInitailData' finished. + if (option.type === 'category') { + if (rawData) { + return option.data; + } + return this.__ordinalMeta.categories; + } + }, + + getOrdinalMeta: function () { + return this.__ordinalMeta; + }, + + defaultOption: mergeAll( + [ + {}, + axisDefault[axisType + 'Axis'], + extraDefaultOption + ], + true + ) + }); + }); + + ComponentModel.registerSubTypeDefaulter( + axisName + 'Axis', + curry(axisTypeDefaulter, axisName) + ); +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var AxisModel = ComponentModel.extend({ + + type: 'cartesian2dAxis', + + /** + * @type {module:echarts/coord/cartesian/Axis2D} + */ + axis: null, + + /** + * @override + */ + init: function () { + AxisModel.superApply(this, 'init', arguments); + this.resetRange(); + }, + + /** + * @override + */ + mergeOption: function () { + AxisModel.superApply(this, 'mergeOption', arguments); + this.resetRange(); + }, + + /** + * @override + */ + restoreData: function () { + AxisModel.superApply(this, 'restoreData', arguments); + this.resetRange(); + }, + + /** + * @override + * @return {module:echarts/model/Component} + */ + getCoordSysModel: function () { + return this.ecModel.queryComponents({ + mainType: 'grid', + index: this.option.gridIndex, + id: this.option.gridId + })[0]; + } + +}); + +function getAxisType(axisDim, option) { + // Default axis with data is category axis + return option.type || (option.data ? 'category' : 'value'); +} + +merge(AxisModel.prototype, axisModelCommonMixin); + +var extraOption = { + // gridIndex: 0, + // gridId: '', + + // Offset is for multiple axis on the same position + offset: 0 +}; + +axisModelCreator('x', AxisModel, getAxisType, extraOption); +axisModelCreator('y', AxisModel, getAxisType, extraOption); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// Grid 是在有直角坐标系的时候必须要存在的 +// 所以这里也要被 Cartesian2D 依赖 + +ComponentModel.extend({ + + type: 'grid', + + dependencies: ['xAxis', 'yAxis'], + + layoutMode: 'box', + + /** + * @type {module:echarts/coord/cartesian/Grid} + */ + coordinateSystem: null, + + defaultOption: { + show: false, + zlevel: 0, + z: 0, + left: '10%', + top: 60, + right: '10%', + bottom: 60, + // If grid size contain label + containLabel: false, + // width: {totalWidth} - left - right, + // height: {totalHeight} - top - bottom, + backgroundColor: 'rgba(0,0,0,0)', + borderWidth: 1, + borderColor: '#ccc' + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Grid is a region which contains at most 4 cartesian systems + * + * TODO Default cartesian + */ + +// Depends on GridModel, AxisModel, which performs preprocess. +/** + * Check if the axis is used in the specified grid + * @inner + */ +function isAxisUsedInTheGrid(axisModel, gridModel, ecModel) { + return axisModel.getCoordSysModel() === gridModel; +} + +function Grid(gridModel, ecModel, api) { + /** + * @type {Object.<string, module:echarts/coord/cartesian/Cartesian2D>} + * @private + */ + this._coordsMap = {}; + + /** + * @type {Array.<module:echarts/coord/cartesian/Cartesian>} + * @private + */ + this._coordsList = []; + + /** + * @type {Object.<string, module:echarts/coord/cartesian/Axis2D>} + * @private + */ + this._axesMap = {}; + + /** + * @type {Array.<module:echarts/coord/cartesian/Axis2D>} + * @private + */ + this._axesList = []; + + this._initCartesian(gridModel, ecModel, api); + + this.model = gridModel; +} + +var gridProto = Grid.prototype; + +gridProto.type = 'grid'; + +gridProto.axisPointerEnabled = true; + +gridProto.getRect = function () { + return this._rect; +}; + +gridProto.update = function (ecModel, api) { + + var axesMap = this._axesMap; + + this._updateScale(ecModel, this.model); + + each$1(axesMap.x, function (xAxis) { + niceScaleExtent(xAxis.scale, xAxis.model); + }); + each$1(axesMap.y, function (yAxis) { + niceScaleExtent(yAxis.scale, yAxis.model); + }); + each$1(axesMap.x, function (xAxis) { + fixAxisOnZero(axesMap, 'y', xAxis); + }); + each$1(axesMap.y, function (yAxis) { + fixAxisOnZero(axesMap, 'x', yAxis); + }); + + // Resize again if containLabel is enabled + // FIXME It may cause getting wrong grid size in data processing stage + this.resize(this.model, api); +}; + +function fixAxisOnZero(axesMap, otherAxisDim, axis) { + + axis.getAxesOnZeroOf = function () { + // TODO: onZero of multiple axes. + return otherAxis ? [otherAxis] : []; + }; + + // onZero can not be enabled in these two situations: + // 1. When any other axis is a category axis. + // 2. When no axis is cross 0 point. + var otherAxes = axesMap[otherAxisDim]; + + var otherAxis; + var axisModel = axis.model; + var onZero = axisModel.get('axisLine.onZero'); + var onZeroAxisIndex = axisModel.get('axisLine.onZeroAxisIndex'); + + if (!onZero) { + return; + } + + // If target axis is specified. + if (onZeroAxisIndex != null) { + if (canOnZeroToAxis(otherAxes[onZeroAxisIndex])) { + otherAxis = otherAxes[onZeroAxisIndex]; + } + return; + } + + // Find the first available other axis. + for (var idx in otherAxes) { + if (otherAxes.hasOwnProperty(idx) && canOnZeroToAxis(otherAxes[idx])) { + otherAxis = otherAxes[idx]; + break; + } + } +} + +function canOnZeroToAxis(axis) { + return axis && axis.type !== 'category' && axis.type !== 'time' && ifAxisCrossZero(axis); +} + +/** + * Resize the grid + * @param {module:echarts/coord/cartesian/GridModel} gridModel + * @param {module:echarts/ExtensionAPI} api + */ +gridProto.resize = function (gridModel, api, ignoreContainLabel) { + + var gridRect = getLayoutRect( + gridModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + }); + + this._rect = gridRect; + + var axesList = this._axesList; + + adjustAxes(); + + // Minus label size + if (!ignoreContainLabel && gridModel.get('containLabel')) { + each$1(axesList, function (axis) { + if (!axis.model.get('axisLabel.inside')) { + var labelUnionRect = estimateLabelUnionRect(axis); + if (labelUnionRect) { + var dim = axis.isHorizontal() ? 'height' : 'width'; + var margin = axis.model.get('axisLabel.margin'); + gridRect[dim] -= labelUnionRect[dim] + margin; + if (axis.position === 'top') { + gridRect.y += labelUnionRect.height + margin; + } + else if (axis.position === 'left') { + gridRect.x += labelUnionRect.width + margin; + } + } + } + }); + + adjustAxes(); + } + + function adjustAxes() { + each$1(axesList, function (axis) { + var isHorizontal = axis.isHorizontal(); + var extent = isHorizontal ? [0, gridRect.width] : [0, gridRect.height]; + var idx = axis.inverse ? 1 : 0; + axis.setExtent(extent[idx], extent[1 - idx]); + updateAxisTransform(axis, isHorizontal ? gridRect.x : gridRect.y); + }); + } +}; + +/** + * @param {string} axisType + * @param {number} [axisIndex] + */ +gridProto.getAxis = function (axisType, axisIndex) { + var axesMapOnDim = this._axesMap[axisType]; + if (axesMapOnDim != null) { + if (axisIndex == null) { + // Find first axis + for (var name in axesMapOnDim) { + if (axesMapOnDim.hasOwnProperty(name)) { + return axesMapOnDim[name]; + } + } + } + return axesMapOnDim[axisIndex]; + } +}; + +/** + * @return {Array.<module:echarts/coord/Axis>} + */ +gridProto.getAxes = function () { + return this._axesList.slice(); +}; + +/** + * Usage: + * grid.getCartesian(xAxisIndex, yAxisIndex); + * grid.getCartesian(xAxisIndex); + * grid.getCartesian(null, yAxisIndex); + * grid.getCartesian({xAxisIndex: ..., yAxisIndex: ...}); + * + * @param {number|Object} [xAxisIndex] + * @param {number} [yAxisIndex] + */ +gridProto.getCartesian = function (xAxisIndex, yAxisIndex) { + if (xAxisIndex != null && yAxisIndex != null) { + var key = 'x' + xAxisIndex + 'y' + yAxisIndex; + return this._coordsMap[key]; + } + + if (isObject$1(xAxisIndex)) { + yAxisIndex = xAxisIndex.yAxisIndex; + xAxisIndex = xAxisIndex.xAxisIndex; + } + // When only xAxisIndex or yAxisIndex given, find its first cartesian. + for (var i = 0, coordList = this._coordsList; i < coordList.length; i++) { + if (coordList[i].getAxis('x').index === xAxisIndex + || coordList[i].getAxis('y').index === yAxisIndex + ) { + return coordList[i]; + } + } +}; + +gridProto.getCartesians = function () { + return this._coordsList.slice(); +}; + +/** + * @implements + * see {module:echarts/CoodinateSystem} + */ +gridProto.convertToPixel = function (ecModel, finder, value) { + var target = this._findConvertTarget(ecModel, finder); + + return target.cartesian + ? target.cartesian.dataToPoint(value) + : target.axis + ? target.axis.toGlobalCoord(target.axis.dataToCoord(value)) + : null; +}; + +/** + * @implements + * see {module:echarts/CoodinateSystem} + */ +gridProto.convertFromPixel = function (ecModel, finder, value) { + var target = this._findConvertTarget(ecModel, finder); + + return target.cartesian + ? target.cartesian.pointToData(value) + : target.axis + ? target.axis.coordToData(target.axis.toLocalCoord(value)) + : null; +}; + +/** + * @inner + */ +gridProto._findConvertTarget = function (ecModel, finder) { + var seriesModel = finder.seriesModel; + var xAxisModel = finder.xAxisModel + || (seriesModel && seriesModel.getReferringComponents('xAxis')[0]); + var yAxisModel = finder.yAxisModel + || (seriesModel && seriesModel.getReferringComponents('yAxis')[0]); + var gridModel = finder.gridModel; + var coordsList = this._coordsList; + var cartesian; + var axis; + + if (seriesModel) { + cartesian = seriesModel.coordinateSystem; + indexOf(coordsList, cartesian) < 0 && (cartesian = null); + } + else if (xAxisModel && yAxisModel) { + cartesian = this.getCartesian(xAxisModel.componentIndex, yAxisModel.componentIndex); + } + else if (xAxisModel) { + axis = this.getAxis('x', xAxisModel.componentIndex); + } + else if (yAxisModel) { + axis = this.getAxis('y', yAxisModel.componentIndex); + } + // Lowest priority. + else if (gridModel) { + var grid = gridModel.coordinateSystem; + if (grid === this) { + cartesian = this._coordsList[0]; + } + } + + return {cartesian: cartesian, axis: axis}; +}; + +/** + * @implements + * see {module:echarts/CoodinateSystem} + */ +gridProto.containPoint = function (point) { + var coord = this._coordsList[0]; + if (coord) { + return coord.containPoint(point); + } +}; + +/** + * Initialize cartesian coordinate systems + * @private + */ +gridProto._initCartesian = function (gridModel, ecModel, api) { + var axisPositionUsed = { + left: false, + right: false, + top: false, + bottom: false + }; + + var axesMap = { + x: {}, + y: {} + }; + var axesCount = { + x: 0, + y: 0 + }; + + /// Create axis + ecModel.eachComponent('xAxis', createAxisCreator('x'), this); + ecModel.eachComponent('yAxis', createAxisCreator('y'), this); + + if (!axesCount.x || !axesCount.y) { + // Roll back when there no either x or y axis + this._axesMap = {}; + this._axesList = []; + return; + } + + this._axesMap = axesMap; + + /// Create cartesian2d + each$1(axesMap.x, function (xAxis, xAxisIndex) { + each$1(axesMap.y, function (yAxis, yAxisIndex) { + var key = 'x' + xAxisIndex + 'y' + yAxisIndex; + var cartesian = new Cartesian2D(key); + + cartesian.grid = this; + cartesian.model = gridModel; + + this._coordsMap[key] = cartesian; + this._coordsList.push(cartesian); + + cartesian.addAxis(xAxis); + cartesian.addAxis(yAxis); + }, this); + }, this); + + function createAxisCreator(axisType) { + return function (axisModel, idx) { + if (!isAxisUsedInTheGrid(axisModel, gridModel, ecModel)) { + return; + } + + var axisPosition = axisModel.get('position'); + if (axisType === 'x') { + // Fix position + if (axisPosition !== 'top' && axisPosition !== 'bottom') { + // Default bottom of X + axisPosition = 'bottom'; + if (axisPositionUsed[axisPosition]) { + axisPosition = axisPosition === 'top' ? 'bottom' : 'top'; + } + } + } + else { + // Fix position + if (axisPosition !== 'left' && axisPosition !== 'right') { + // Default left of Y + axisPosition = 'left'; + if (axisPositionUsed[axisPosition]) { + axisPosition = axisPosition === 'left' ? 'right' : 'left'; + } + } + } + axisPositionUsed[axisPosition] = true; + + var axis = new Axis2D( + axisType, createScaleByModel(axisModel), + [0, 0], + axisModel.get('type'), + axisPosition + ); + + var isCategory = axis.type === 'category'; + axis.onBand = isCategory && axisModel.get('boundaryGap'); + axis.inverse = axisModel.get('inverse'); + + // Inject axis into axisModel + axisModel.axis = axis; + + // Inject axisModel into axis + axis.model = axisModel; + + // Inject grid info axis + axis.grid = this; + + // Index of axis, can be used as key + axis.index = idx; + + this._axesList.push(axis); + + axesMap[axisType][idx] = axis; + axesCount[axisType]++; + }; + } +}; + +/** + * Update cartesian properties from series + * @param {module:echarts/model/Option} option + * @private + */ +gridProto._updateScale = function (ecModel, gridModel) { + // Reset scale + each$1(this._axesList, function (axis) { + axis.scale.setExtent(Infinity, -Infinity); + }); + ecModel.eachSeries(function (seriesModel) { + if (isCartesian2D(seriesModel)) { + var axesModels = findAxesModels(seriesModel, ecModel); + var xAxisModel = axesModels[0]; + var yAxisModel = axesModels[1]; + + if (!isAxisUsedInTheGrid(xAxisModel, gridModel, ecModel) + || !isAxisUsedInTheGrid(yAxisModel, gridModel, ecModel) + ) { + return; + } + + var cartesian = this.getCartesian( + xAxisModel.componentIndex, yAxisModel.componentIndex + ); + var data = seriesModel.getData(); + var xAxis = cartesian.getAxis('x'); + var yAxis = cartesian.getAxis('y'); + + if (data.type === 'list') { + unionExtent(data, xAxis, seriesModel); + unionExtent(data, yAxis, seriesModel); + } + } + }, this); + + function unionExtent(data, axis, seriesModel) { + each$1(data.mapDimension(axis.dim, true), function (dim) { + axis.scale.unionExtentFromData( + // For example, the extent of the orginal dimension + // is [0.1, 0.5], the extent of the `stackResultDimension` + // is [7, 9], the final extent should not include [0.1, 0.5]. + data, getStackedDimension(data, dim) + ); + }); + } +}; + +/** + * @param {string} [dim] 'x' or 'y' or 'auto' or null/undefined + * @return {Object} {baseAxes: [], otherAxes: []} + */ +gridProto.getTooltipAxes = function (dim) { + var baseAxes = []; + var otherAxes = []; + + each$1(this.getCartesians(), function (cartesian) { + var baseAxis = (dim != null && dim !== 'auto') + ? cartesian.getAxis(dim) : cartesian.getBaseAxis(); + var otherAxis = cartesian.getOtherAxis(baseAxis); + indexOf(baseAxes, baseAxis) < 0 && baseAxes.push(baseAxis); + indexOf(otherAxes, otherAxis) < 0 && otherAxes.push(otherAxis); + }); + + return {baseAxes: baseAxes, otherAxes: otherAxes}; +}; + +/** + * @inner + */ +function updateAxisTransform(axis, coordBase) { + var axisExtent = axis.getExtent(); + var axisExtentSum = axisExtent[0] + axisExtent[1]; + + // Fast transform + axis.toGlobalCoord = axis.dim === 'x' + ? function (coord) { + return coord + coordBase; + } + : function (coord) { + return axisExtentSum - coord + coordBase; + }; + axis.toLocalCoord = axis.dim === 'x' + ? function (coord) { + return coord - coordBase; + } + : function (coord) { + return axisExtentSum - coord + coordBase; + }; +} + +var axesTypes = ['xAxis', 'yAxis']; +/** + * @inner + */ +function findAxesModels(seriesModel, ecModel) { + return map(axesTypes, function (axisType) { + var axisModel = seriesModel.getReferringComponents(axisType)[0]; + + if (__DEV__) { + if (!axisModel) { + throw new Error(axisType + ' "' + retrieve( + seriesModel.get(axisType + 'Index'), + seriesModel.get(axisType + 'Id'), + 0 + ) + '" not found'); + } + } + return axisModel; + }); +} + +/** + * @inner + */ +function isCartesian2D(seriesModel) { + return seriesModel.get('coordinateSystem') === 'cartesian2d'; +} + +Grid.create = function (ecModel, api) { + var grids = []; + ecModel.eachComponent('grid', function (gridModel, idx) { + var grid = new Grid(gridModel, ecModel, api); + grid.name = 'grid_' + idx; + // dataSampling requires axis extent, so resize + // should be performed in create stage. + grid.resize(gridModel, api, true); + + gridModel.coordinateSystem = grid; + + grids.push(grid); + }); + + // Inject the coordinateSystems into seriesModel + ecModel.eachSeries(function (seriesModel) { + if (!isCartesian2D(seriesModel)) { + return; + } + + var axesModels = findAxesModels(seriesModel, ecModel); + var xAxisModel = axesModels[0]; + var yAxisModel = axesModels[1]; + + var gridModel = xAxisModel.getCoordSysModel(); + + if (__DEV__) { + if (!gridModel) { + throw new Error( + 'Grid "' + retrieve( + xAxisModel.get('gridIndex'), + xAxisModel.get('gridId'), + 0 + ) + '" not found' + ); + } + if (xAxisModel.getCoordSysModel() !== yAxisModel.getCoordSysModel()) { + throw new Error('xAxis and yAxis must use the same grid'); + } + } + + var grid = gridModel.coordinateSystem; + + seriesModel.coordinateSystem = grid.getCartesian( + xAxisModel.componentIndex, yAxisModel.componentIndex + ); + }); + + return grids; +}; + +// For deciding which dimensions to use when creating list data +Grid.dimensions = Grid.prototype.dimensions = Cartesian2D.prototype.dimensions; + +CoordinateSystemManager.register('cartesian2d', Grid); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var PI$2 = Math.PI; + +function makeAxisEventDataBase(axisModel) { + var eventData = { + componentType: axisModel.mainType + }; + eventData[axisModel.mainType + 'Index'] = axisModel.componentIndex; + return eventData; +} + +/** + * A final axis is translated and rotated from a "standard axis". + * So opt.position and opt.rotation is required. + * + * A standard axis is and axis from [0, 0] to [0, axisExtent[1]], + * for example: (0, 0) ------------> (0, 50) + * + * nameDirection or tickDirection or labelDirection is 1 means tick + * or label is below the standard axis, whereas is -1 means above + * the standard axis. labelOffset means offset between label and axis, + * which is useful when 'onZero', where axisLabel is in the grid and + * label in outside grid. + * + * Tips: like always, + * positive rotation represents anticlockwise, and negative rotation + * represents clockwise. + * The direction of position coordinate is the same as the direction + * of screen coordinate. + * + * Do not need to consider axis 'inverse', which is auto processed by + * axis extent. + * + * @param {module:zrender/container/Group} group + * @param {Object} axisModel + * @param {Object} opt Standard axis parameters. + * @param {Array.<number>} opt.position [x, y] + * @param {number} opt.rotation by radian + * @param {number} [opt.nameDirection=1] 1 or -1 Used when nameLocation is 'middle' or 'center'. + * @param {number} [opt.tickDirection=1] 1 or -1 + * @param {number} [opt.labelDirection=1] 1 or -1 + * @param {number} [opt.labelOffset=0] Usefull when onZero. + * @param {string} [opt.axisLabelShow] default get from axisModel. + * @param {string} [opt.axisName] default get from axisModel. + * @param {number} [opt.axisNameAvailableWidth] + * @param {number} [opt.labelRotate] by degree, default get from axisModel. + * @param {number} [opt.strokeContainThreshold] Default label interval when label + * @param {number} [opt.nameTruncateMaxWidth] + */ +var AxisBuilder = function (axisModel, opt) { + + /** + * @readOnly + */ + this.opt = opt; + + /** + * @readOnly + */ + this.axisModel = axisModel; + + // Default value + defaults( + opt, + { + labelOffset: 0, + nameDirection: 1, + tickDirection: 1, + labelDirection: 1, + silent: true + } + ); + + /** + * @readOnly + */ + this.group = new Group(); + + // FIXME Not use a seperate text group? + var dumbGroup = new Group({ + position: opt.position.slice(), + rotation: opt.rotation + }); + + // this.group.add(dumbGroup); + // this._dumbGroup = dumbGroup; + + dumbGroup.updateTransform(); + this._transform = dumbGroup.transform; + + this._dumbGroup = dumbGroup; +}; + +AxisBuilder.prototype = { + + constructor: AxisBuilder, + + hasBuilder: function (name) { + return !!builders[name]; + }, + + add: function (name) { + builders[name].call(this); + }, + + getGroup: function () { + return this.group; + } + +}; + +var builders = { + + /** + * @private + */ + axisLine: function () { + var opt = this.opt; + var axisModel = this.axisModel; + + if (!axisModel.get('axisLine.show')) { + return; + } + + var extent = this.axisModel.axis.getExtent(); + + var matrix = this._transform; + var pt1 = [extent[0], 0]; + var pt2 = [extent[1], 0]; + if (matrix) { + applyTransform(pt1, pt1, matrix); + applyTransform(pt2, pt2, matrix); + } + + var lineStyle = extend( + { + lineCap: 'round' + }, + axisModel.getModel('axisLine.lineStyle').getLineStyle() + ); + + this.group.add(new Line(subPixelOptimizeLine({ + // Id for animation + anid: 'line', + + shape: { + x1: pt1[0], + y1: pt1[1], + x2: pt2[0], + y2: pt2[1] + }, + style: lineStyle, + strokeContainThreshold: opt.strokeContainThreshold || 5, + silent: true, + z2: 1 + }))); + + var arrows = axisModel.get('axisLine.symbol'); + var arrowSize = axisModel.get('axisLine.symbolSize'); + + var arrowOffset = axisModel.get('axisLine.symbolOffset') || 0; + if (typeof arrowOffset === 'number') { + arrowOffset = [arrowOffset, arrowOffset]; + } + + if (arrows != null) { + if (typeof arrows === 'string') { + // Use the same arrow for start and end point + arrows = [arrows, arrows]; + } + if (typeof arrowSize === 'string' + || typeof arrowSize === 'number' + ) { + // Use the same size for width and height + arrowSize = [arrowSize, arrowSize]; + } + + var symbolWidth = arrowSize[0]; + var symbolHeight = arrowSize[1]; + + each$1([{ + rotate: opt.rotation + Math.PI / 2, + offset: arrowOffset[0], + r: 0 + }, { + rotate: opt.rotation - Math.PI / 2, + offset: arrowOffset[1], + r: Math.sqrt((pt1[0] - pt2[0]) * (pt1[0] - pt2[0]) + + (pt1[1] - pt2[1]) * (pt1[1] - pt2[1])) + }], function (point, index) { + if (arrows[index] !== 'none' && arrows[index] != null) { + var symbol = createSymbol( + arrows[index], + -symbolWidth / 2, + -symbolHeight / 2, + symbolWidth, + symbolHeight, + lineStyle.stroke, + true + ); + + // Calculate arrow position with offset + var r = point.r + point.offset; + var pos = [ + pt1[0] + r * Math.cos(opt.rotation), + pt1[1] - r * Math.sin(opt.rotation) + ]; + + symbol.attr({ + rotation: point.rotate, + position: pos, + silent: true + }); + this.group.add(symbol); + } + }, this); + } + }, + + /** + * @private + */ + axisTickLabel: function () { + var axisModel = this.axisModel; + var opt = this.opt; + + var tickEls = buildAxisTick(this, axisModel, opt); + var labelEls = buildAxisLabel(this, axisModel, opt); + + fixMinMaxLabelShow(axisModel, labelEls, tickEls); + }, + + /** + * @private + */ + axisName: function () { + var opt = this.opt; + var axisModel = this.axisModel; + var name = retrieve(opt.axisName, axisModel.get('name')); + + if (!name) { + return; + } + + var nameLocation = axisModel.get('nameLocation'); + var nameDirection = opt.nameDirection; + var textStyleModel = axisModel.getModel('nameTextStyle'); + var gap = axisModel.get('nameGap') || 0; + + var extent = this.axisModel.axis.getExtent(); + var gapSignal = extent[0] > extent[1] ? -1 : 1; + var pos = [ + nameLocation === 'start' + ? extent[0] - gapSignal * gap + : nameLocation === 'end' + ? extent[1] + gapSignal * gap + : (extent[0] + extent[1]) / 2, // 'middle' + // Reuse labelOffset. + isNameLocationCenter(nameLocation) ? opt.labelOffset + nameDirection * gap : 0 + ]; + + var labelLayout; + + var nameRotation = axisModel.get('nameRotate'); + if (nameRotation != null) { + nameRotation = nameRotation * PI$2 / 180; // To radian. + } + + var axisNameAvailableWidth; + + if (isNameLocationCenter(nameLocation)) { + labelLayout = innerTextLayout( + opt.rotation, + nameRotation != null ? nameRotation : opt.rotation, // Adapt to axis. + nameDirection + ); + } + else { + labelLayout = endTextLayout( + opt, nameLocation, nameRotation || 0, extent + ); + + axisNameAvailableWidth = opt.axisNameAvailableWidth; + if (axisNameAvailableWidth != null) { + axisNameAvailableWidth = Math.abs( + axisNameAvailableWidth / Math.sin(labelLayout.rotation) + ); + !isFinite(axisNameAvailableWidth) && (axisNameAvailableWidth = null); + } + } + + var textFont = textStyleModel.getFont(); + + var truncateOpt = axisModel.get('nameTruncate', true) || {}; + var ellipsis = truncateOpt.ellipsis; + var maxWidth = retrieve( + opt.nameTruncateMaxWidth, truncateOpt.maxWidth, axisNameAvailableWidth + ); + // FIXME + // truncate rich text? (consider performance) + var truncatedText = (ellipsis != null && maxWidth != null) + ? truncateText$1( + name, maxWidth, textFont, ellipsis, + {minChar: 2, placeholder: truncateOpt.placeholder} + ) + : name; + + var tooltipOpt = axisModel.get('tooltip', true); + + var mainType = axisModel.mainType; + var formatterParams = { + componentType: mainType, + name: name, + $vars: ['name'] + }; + formatterParams[mainType + 'Index'] = axisModel.componentIndex; + + var textEl = new Text({ + // Id for animation + anid: 'name', + + __fullText: name, + __truncatedText: truncatedText, + + position: pos, + rotation: labelLayout.rotation, + silent: isSilent(axisModel), + z2: 1, + tooltip: (tooltipOpt && tooltipOpt.show) + ? extend({ + content: name, + formatter: function () { + return name; + }, + formatterParams: formatterParams + }, tooltipOpt) + : null + }); + + setTextStyle(textEl.style, textStyleModel, { + text: truncatedText, + textFont: textFont, + textFill: textStyleModel.getTextColor() + || axisModel.get('axisLine.lineStyle.color'), + textAlign: labelLayout.textAlign, + textVerticalAlign: labelLayout.textVerticalAlign + }); + + if (axisModel.get('triggerEvent')) { + textEl.eventData = makeAxisEventDataBase(axisModel); + textEl.eventData.targetType = 'axisName'; + textEl.eventData.name = name; + } + + // FIXME + this._dumbGroup.add(textEl); + textEl.updateTransform(); + + this.group.add(textEl); + + textEl.decomposeTransform(); + } + +}; + +/** + * @public + * @static + * @param {Object} opt + * @param {number} axisRotation in radian + * @param {number} textRotation in radian + * @param {number} direction + * @return {Object} { + * rotation, // according to axis + * textAlign, + * textVerticalAlign + * } + */ +var innerTextLayout = AxisBuilder.innerTextLayout = function (axisRotation, textRotation, direction) { + var rotationDiff = remRadian(textRotation - axisRotation); + var textAlign; + var textVerticalAlign; + + if (isRadianAroundZero(rotationDiff)) { // Label is parallel with axis line. + textVerticalAlign = direction > 0 ? 'top' : 'bottom'; + textAlign = 'center'; + } + else if (isRadianAroundZero(rotationDiff - PI$2)) { // Label is inverse parallel with axis line. + textVerticalAlign = direction > 0 ? 'bottom' : 'top'; + textAlign = 'center'; + } + else { + textVerticalAlign = 'middle'; + + if (rotationDiff > 0 && rotationDiff < PI$2) { + textAlign = direction > 0 ? 'right' : 'left'; + } + else { + textAlign = direction > 0 ? 'left' : 'right'; + } + } + + return { + rotation: rotationDiff, + textAlign: textAlign, + textVerticalAlign: textVerticalAlign + }; +}; + +function endTextLayout(opt, textPosition, textRotate, extent) { + var rotationDiff = remRadian(textRotate - opt.rotation); + var textAlign; + var textVerticalAlign; + var inverse = extent[0] > extent[1]; + var onLeft = (textPosition === 'start' && !inverse) + || (textPosition !== 'start' && inverse); + + if (isRadianAroundZero(rotationDiff - PI$2 / 2)) { + textVerticalAlign = onLeft ? 'bottom' : 'top'; + textAlign = 'center'; + } + else if (isRadianAroundZero(rotationDiff - PI$2 * 1.5)) { + textVerticalAlign = onLeft ? 'top' : 'bottom'; + textAlign = 'center'; + } + else { + textVerticalAlign = 'middle'; + if (rotationDiff < PI$2 * 1.5 && rotationDiff > PI$2 / 2) { + textAlign = onLeft ? 'left' : 'right'; + } + else { + textAlign = onLeft ? 'right' : 'left'; + } + } + + return { + rotation: rotationDiff, + textAlign: textAlign, + textVerticalAlign: textVerticalAlign + }; +} + +function isSilent(axisModel) { + var tooltipOpt = axisModel.get('tooltip'); + return axisModel.get('silent') + // Consider mouse cursor, add these restrictions. + || !( + axisModel.get('triggerEvent') || (tooltipOpt && tooltipOpt.show) + ); +} + +function fixMinMaxLabelShow(axisModel, labelEls, tickEls) { + // If min or max are user set, we need to check + // If the tick on min(max) are overlap on their neighbour tick + // If they are overlapped, we need to hide the min(max) tick label + var showMinLabel = axisModel.get('axisLabel.showMinLabel'); + var showMaxLabel = axisModel.get('axisLabel.showMaxLabel'); + + // FIXME + // Have not consider onBand yet, where tick els is more than label els. + + labelEls = labelEls || []; + tickEls = tickEls || []; + + var firstLabel = labelEls[0]; + var nextLabel = labelEls[1]; + var lastLabel = labelEls[labelEls.length - 1]; + var prevLabel = labelEls[labelEls.length - 2]; + + var firstTick = tickEls[0]; + var nextTick = tickEls[1]; + var lastTick = tickEls[tickEls.length - 1]; + var prevTick = tickEls[tickEls.length - 2]; + + if (showMinLabel === false) { + ignoreEl(firstLabel); + ignoreEl(firstTick); + } + else if (isTwoLabelOverlapped(firstLabel, nextLabel)) { + if (showMinLabel) { + ignoreEl(nextLabel); + ignoreEl(nextTick); + } + else { + ignoreEl(firstLabel); + ignoreEl(firstTick); + } + } + + if (showMaxLabel === false) { + ignoreEl(lastLabel); + ignoreEl(lastTick); + } + else if (isTwoLabelOverlapped(prevLabel, lastLabel)) { + if (showMaxLabel) { + ignoreEl(prevLabel); + ignoreEl(prevTick); + } + else { + ignoreEl(lastLabel); + ignoreEl(lastTick); + } + } +} + +function ignoreEl(el) { + el && (el.ignore = true); +} + +function isTwoLabelOverlapped(current, next, labelLayout) { + // current and next has the same rotation. + var firstRect = current && current.getBoundingRect().clone(); + var nextRect = next && next.getBoundingRect().clone(); + + if (!firstRect || !nextRect) { + return; + } + + // When checking intersect of two rotated labels, we use mRotationBack + // to avoid that boundingRect is enlarge when using `boundingRect.applyTransform`. + var mRotationBack = identity([]); + rotate(mRotationBack, mRotationBack, -current.rotation); + + firstRect.applyTransform(mul$1([], mRotationBack, current.getLocalTransform())); + nextRect.applyTransform(mul$1([], mRotationBack, next.getLocalTransform())); + + return firstRect.intersect(nextRect); +} + +function isNameLocationCenter(nameLocation) { + return nameLocation === 'middle' || nameLocation === 'center'; +} + +function buildAxisTick(axisBuilder, axisModel, opt) { + var axis = axisModel.axis; + + if (!axisModel.get('axisTick.show') || axis.scale.isBlank()) { + return; + } + + var tickModel = axisModel.getModel('axisTick'); + + var lineStyleModel = tickModel.getModel('lineStyle'); + var tickLen = tickModel.get('length'); + + var ticksCoords = axis.getTicksCoords(); + + var pt1 = []; + var pt2 = []; + var matrix = axisBuilder._transform; + + var tickEls = []; + + for (var i = 0; i < ticksCoords.length; i++) { + var tickCoord = ticksCoords[i].coord; + + pt1[0] = tickCoord; + pt1[1] = 0; + pt2[0] = tickCoord; + pt2[1] = opt.tickDirection * tickLen; + + if (matrix) { + applyTransform(pt1, pt1, matrix); + applyTransform(pt2, pt2, matrix); + } + // Tick line, Not use group transform to have better line draw + var tickEl = new Line(subPixelOptimizeLine({ + // Id for animation + anid: 'tick_' + ticksCoords[i].tickValue, + + shape: { + x1: pt1[0], + y1: pt1[1], + x2: pt2[0], + y2: pt2[1] + }, + style: defaults( + lineStyleModel.getLineStyle(), + { + stroke: axisModel.get('axisLine.lineStyle.color') + } + ), + z2: 2, + silent: true + })); + axisBuilder.group.add(tickEl); + tickEls.push(tickEl); + } + + return tickEls; +} + +function buildAxisLabel(axisBuilder, axisModel, opt) { + var axis = axisModel.axis; + var show = retrieve(opt.axisLabelShow, axisModel.get('axisLabel.show')); + + if (!show || axis.scale.isBlank()) { + return; + } + + var labelModel = axisModel.getModel('axisLabel'); + var labelMargin = labelModel.get('margin'); + var labels = axis.getViewLabels(); + + // Special label rotate. + var labelRotation = ( + retrieve(opt.labelRotate, labelModel.get('rotate')) || 0 + ) * PI$2 / 180; + + var labelLayout = innerTextLayout(opt.rotation, labelRotation, opt.labelDirection); + var rawCategoryData = axisModel.getCategories(true); + + var labelEls = []; + var silent = isSilent(axisModel); + var triggerEvent = axisModel.get('triggerEvent'); + + each$1(labels, function (labelItem, index) { + var tickValue = labelItem.tickValue; + var formattedLabel = labelItem.formattedLabel; + var rawLabel = labelItem.rawLabel; + + var itemLabelModel = labelModel; + if (rawCategoryData && rawCategoryData[tickValue] && rawCategoryData[tickValue].textStyle) { + itemLabelModel = new Model( + rawCategoryData[tickValue].textStyle, labelModel, axisModel.ecModel + ); + } + + var textColor = itemLabelModel.getTextColor() + || axisModel.get('axisLine.lineStyle.color'); + + var tickCoord = axis.dataToCoord(tickValue); + var pos = [ + tickCoord, + opt.labelOffset + opt.labelDirection * labelMargin + ]; + + var textEl = new Text({ + // Id for animation + anid: 'label_' + tickValue, + position: pos, + rotation: labelLayout.rotation, + silent: silent, + z2: 10 + }); + + setTextStyle(textEl.style, itemLabelModel, { + text: formattedLabel, + textAlign: itemLabelModel.getShallow('align', true) + || labelLayout.textAlign, + textVerticalAlign: itemLabelModel.getShallow('verticalAlign', true) + || itemLabelModel.getShallow('baseline', true) + || labelLayout.textVerticalAlign, + textFill: typeof textColor === 'function' + ? textColor( + // (1) In category axis with data zoom, tick is not the original + // index of axis.data. So tick should not be exposed to user + // in category axis. + // (2) Compatible with previous version, which always use formatted label as + // input. But in interval scale the formatted label is like '223,445', which + // maked user repalce ','. So we modify it to return original val but remain + // it as 'string' to avoid error in replacing. + axis.type === 'category' + ? rawLabel + : axis.type === 'value' + ? tickValue + '' + : tickValue, + index + ) + : textColor + }); + + // Pack data for mouse event + if (triggerEvent) { + textEl.eventData = makeAxisEventDataBase(axisModel); + textEl.eventData.targetType = 'axisLabel'; + textEl.eventData.value = rawLabel; + } + + // FIXME + axisBuilder._dumbGroup.add(textEl); + textEl.updateTransform(); + + labelEls.push(textEl); + axisBuilder.group.add(textEl); + + textEl.decomposeTransform(); + + }); + + return labelEls; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var each$6 = each$1; +var curry$1 = curry; + +// Build axisPointerModel, mergin tooltip.axisPointer model for each axis. +// allAxesInfo should be updated when setOption performed. +function collect(ecModel, api) { + var result = { + /** + * key: makeKey(axis.model) + * value: { + * axis, + * coordSys, + * axisPointerModel, + * triggerTooltip, + * involveSeries, + * snap, + * seriesModels, + * seriesDataCount + * } + */ + axesInfo: {}, + seriesInvolved: false, + /** + * key: makeKey(coordSys.model) + * value: Object: key makeKey(axis.model), value: axisInfo + */ + coordSysAxesInfo: {}, + coordSysMap: {} + }; + + collectAxesInfo(result, ecModel, api); + + // Check seriesInvolved for performance, in case too many series in some chart. + result.seriesInvolved && collectSeriesInfo(result, ecModel); + + return result; +} + +function collectAxesInfo(result, ecModel, api) { + var globalTooltipModel = ecModel.getComponent('tooltip'); + var globalAxisPointerModel = ecModel.getComponent('axisPointer'); + // links can only be set on global. + var linksOption = globalAxisPointerModel.get('link', true) || []; + var linkGroups = []; + + // Collect axes info. + each$6(api.getCoordinateSystems(), function (coordSys) { + // Some coordinate system do not support axes, like geo. + if (!coordSys.axisPointerEnabled) { + return; + } + + var coordSysKey = makeKey(coordSys.model); + var axesInfoInCoordSys = result.coordSysAxesInfo[coordSysKey] = {}; + result.coordSysMap[coordSysKey] = coordSys; + + // Set tooltip (like 'cross') is a convienent way to show axisPointer + // for user. So we enable seting tooltip on coordSys model. + var coordSysModel = coordSys.model; + var baseTooltipModel = coordSysModel.getModel('tooltip', globalTooltipModel); + + each$6(coordSys.getAxes(), curry$1(saveTooltipAxisInfo, false, null)); + + // If axis tooltip used, choose tooltip axis for each coordSys. + // Notice this case: coordSys is `grid` but not `cartesian2D` here. + if (coordSys.getTooltipAxes + && globalTooltipModel + // If tooltip.showContent is set as false, tooltip will not + // show but axisPointer will show as normal. + && baseTooltipModel.get('show') + ) { + // Compatible with previous logic. But series.tooltip.trigger: 'axis' + // or series.data[n].tooltip.trigger: 'axis' are not support any more. + var triggerAxis = baseTooltipModel.get('trigger') === 'axis'; + var cross = baseTooltipModel.get('axisPointer.type') === 'cross'; + var tooltipAxes = coordSys.getTooltipAxes(baseTooltipModel.get('axisPointer.axis')); + if (triggerAxis || cross) { + each$6(tooltipAxes.baseAxes, curry$1( + saveTooltipAxisInfo, cross ? 'cross' : true, triggerAxis + )); + } + if (cross) { + each$6(tooltipAxes.otherAxes, curry$1(saveTooltipAxisInfo, 'cross', false)); + } + } + + // fromTooltip: true | false | 'cross' + // triggerTooltip: true | false | null + function saveTooltipAxisInfo(fromTooltip, triggerTooltip, axis) { + var axisPointerModel = axis.model.getModel('axisPointer', globalAxisPointerModel); + + var axisPointerShow = axisPointerModel.get('show'); + if (!axisPointerShow || ( + axisPointerShow === 'auto' + && !fromTooltip + && !isHandleTrigger(axisPointerModel) + )) { + return; + } + + if (triggerTooltip == null) { + triggerTooltip = axisPointerModel.get('triggerTooltip'); + } + + axisPointerModel = fromTooltip + ? makeAxisPointerModel( + axis, baseTooltipModel, globalAxisPointerModel, ecModel, + fromTooltip, triggerTooltip + ) + : axisPointerModel; + + var snap = axisPointerModel.get('snap'); + var key = makeKey(axis.model); + var involveSeries = triggerTooltip || snap || axis.type === 'category'; + + // If result.axesInfo[key] exist, override it (tooltip has higher priority). + var axisInfo = result.axesInfo[key] = { + key: key, + axis: axis, + coordSys: coordSys, + axisPointerModel: axisPointerModel, + triggerTooltip: triggerTooltip, + involveSeries: involveSeries, + snap: snap, + useHandle: isHandleTrigger(axisPointerModel), + seriesModels: [] + }; + axesInfoInCoordSys[key] = axisInfo; + result.seriesInvolved |= involveSeries; + + var groupIndex = getLinkGroupIndex(linksOption, axis); + if (groupIndex != null) { + var linkGroup = linkGroups[groupIndex] || (linkGroups[groupIndex] = {axesInfo: {}}); + linkGroup.axesInfo[key] = axisInfo; + linkGroup.mapper = linksOption[groupIndex].mapper; + axisInfo.linkGroup = linkGroup; + } + } + }); +} + +function makeAxisPointerModel( + axis, baseTooltipModel, globalAxisPointerModel, ecModel, fromTooltip, triggerTooltip +) { + var tooltipAxisPointerModel = baseTooltipModel.getModel('axisPointer'); + var volatileOption = {}; + + each$6( + [ + 'type', 'snap', 'lineStyle', 'shadowStyle', 'label', + 'animation', 'animationDurationUpdate', 'animationEasingUpdate', 'z' + ], + function (field) { + volatileOption[field] = clone(tooltipAxisPointerModel.get(field)); + } + ); + + // category axis do not auto snap, otherwise some tick that do not + // has value can not be hovered. value/time/log axis default snap if + // triggered from tooltip and trigger tooltip. + volatileOption.snap = axis.type !== 'category' && !!triggerTooltip; + + // Compatibel with previous behavior, tooltip axis do not show label by default. + // Only these properties can be overrided from tooltip to axisPointer. + if (tooltipAxisPointerModel.get('type') === 'cross') { + volatileOption.type = 'line'; + } + var labelOption = volatileOption.label || (volatileOption.label = {}); + // Follow the convention, do not show label when triggered by tooltip by default. + labelOption.show == null && (labelOption.show = false); + + if (fromTooltip === 'cross') { + // When 'cross', both axes show labels. + var tooltipAxisPointerLabelShow = tooltipAxisPointerModel.get('label.show'); + labelOption.show = tooltipAxisPointerLabelShow != null ? tooltipAxisPointerLabelShow : true; + // If triggerTooltip, this is a base axis, which should better not use cross style + // (cross style is dashed by default) + if (!triggerTooltip) { + var crossStyle = volatileOption.lineStyle = tooltipAxisPointerModel.get('crossStyle'); + crossStyle && defaults(labelOption, crossStyle.textStyle); + } + } + + return axis.model.getModel( + 'axisPointer', + new Model(volatileOption, globalAxisPointerModel, ecModel) + ); +} + +function collectSeriesInfo(result, ecModel) { + // Prepare data for axis trigger + ecModel.eachSeries(function (seriesModel) { + + // Notice this case: this coordSys is `cartesian2D` but not `grid`. + var coordSys = seriesModel.coordinateSystem; + var seriesTooltipTrigger = seriesModel.get('tooltip.trigger', true); + var seriesTooltipShow = seriesModel.get('tooltip.show', true); + if (!coordSys + || seriesTooltipTrigger === 'none' + || seriesTooltipTrigger === false + || seriesTooltipTrigger === 'item' + || seriesTooltipShow === false + || seriesModel.get('axisPointer.show', true) === false + ) { + return; + } + + each$6(result.coordSysAxesInfo[makeKey(coordSys.model)], function (axisInfo) { + var axis = axisInfo.axis; + if (coordSys.getAxis(axis.dim) === axis) { + axisInfo.seriesModels.push(seriesModel); + axisInfo.seriesDataCount == null && (axisInfo.seriesDataCount = 0); + axisInfo.seriesDataCount += seriesModel.getData().count(); + } + }); + + }, this); +} + +/** + * For example: + * { + * axisPointer: { + * links: [{ + * xAxisIndex: [2, 4], + * yAxisIndex: 'all' + * }, { + * xAxisId: ['a5', 'a7'], + * xAxisName: 'xxx' + * }] + * } + * } + */ +function getLinkGroupIndex(linksOption, axis) { + var axisModel = axis.model; + var dim = axis.dim; + for (var i = 0; i < linksOption.length; i++) { + var linkOption = linksOption[i] || {}; + if (checkPropInLink(linkOption[dim + 'AxisId'], axisModel.id) + || checkPropInLink(linkOption[dim + 'AxisIndex'], axisModel.componentIndex) + || checkPropInLink(linkOption[dim + 'AxisName'], axisModel.name) + ) { + return i; + } + } +} + +function checkPropInLink(linkPropValue, axisPropValue) { + return linkPropValue === 'all' + || (isArray(linkPropValue) && indexOf(linkPropValue, axisPropValue) >= 0) + || linkPropValue === axisPropValue; +} + +function fixValue(axisModel) { + var axisInfo = getAxisInfo(axisModel); + if (!axisInfo) { + return; + } + + var axisPointerModel = axisInfo.axisPointerModel; + var scale = axisInfo.axis.scale; + var option = axisPointerModel.option; + var status = axisPointerModel.get('status'); + var value = axisPointerModel.get('value'); + + // Parse init value for category and time axis. + if (value != null) { + value = scale.parse(value); + } + + var useHandle = isHandleTrigger(axisPointerModel); + // If `handle` used, `axisPointer` will always be displayed, so value + // and status should be initialized. + if (status == null) { + option.status = useHandle ? 'show' : 'hide'; + } + + var extent = scale.getExtent().slice(); + extent[0] > extent[1] && extent.reverse(); + + if (// Pick a value on axis when initializing. + value == null + // If both `handle` and `dataZoom` are used, value may be out of axis extent, + // where we should re-pick a value to keep `handle` displaying normally. + || value > extent[1] + ) { + // Make handle displayed on the end of the axis when init, which looks better. + value = extent[1]; + } + if (value < extent[0]) { + value = extent[0]; + } + + option.value = value; + + if (useHandle) { + option.status = axisInfo.axis.scale.isBlank() ? 'hide' : 'show'; + } +} + +function getAxisInfo(axisModel) { + var coordSysAxesInfo = (axisModel.ecModel.getComponent('axisPointer') || {}).coordSysAxesInfo; + return coordSysAxesInfo && coordSysAxesInfo.axesInfo[makeKey(axisModel)]; +} + +function getAxisPointerModel(axisModel) { + var axisInfo = getAxisInfo(axisModel); + return axisInfo && axisInfo.axisPointerModel; +} + +function isHandleTrigger(axisPointerModel) { + return !!axisPointerModel.get('handle.show'); +} + +/** + * @param {module:echarts/model/Model} model + * @return {string} unique key + */ +function makeKey(model) { + return model.type + '||' + model.id; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Base class of AxisView. + */ +var AxisView = extendComponentView({ + + type: 'axis', + + /** + * @private + */ + _axisPointer: null, + + /** + * @protected + * @type {string} + */ + axisPointerClass: null, + + /** + * @override + */ + render: function (axisModel, ecModel, api, payload) { + // FIXME + // This process should proformed after coordinate systems updated + // (axis scale updated), and should be performed each time update. + // So put it here temporarily, although it is not appropriate to + // put a model-writing procedure in `view`. + this.axisPointerClass && fixValue(axisModel); + + AxisView.superApply(this, 'render', arguments); + + updateAxisPointer(this, axisModel, ecModel, api, payload, true); + }, + + /** + * Action handler. + * @public + * @param {module:echarts/coord/cartesian/AxisModel} axisModel + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + * @param {Object} payload + */ + updateAxisPointer: function (axisModel, ecModel, api, payload, force) { + updateAxisPointer(this, axisModel, ecModel, api, payload, false); + }, + + /** + * @override + */ + remove: function (ecModel, api) { + var axisPointer = this._axisPointer; + axisPointer && axisPointer.remove(api); + AxisView.superApply(this, 'remove', arguments); + }, + + /** + * @override + */ + dispose: function (ecModel, api) { + disposeAxisPointer(this, api); + AxisView.superApply(this, 'dispose', arguments); + } + +}); + +function updateAxisPointer(axisView, axisModel, ecModel, api, payload, forceRender) { + var Clazz = AxisView.getAxisPointerClass(axisView.axisPointerClass); + if (!Clazz) { + return; + } + var axisPointerModel = getAxisPointerModel(axisModel); + axisPointerModel + ? (axisView._axisPointer || (axisView._axisPointer = new Clazz())) + .render(axisModel, axisPointerModel, api, forceRender) + : disposeAxisPointer(axisView, api); +} + +function disposeAxisPointer(axisView, ecModel, api) { + var axisPointer = axisView._axisPointer; + axisPointer && axisPointer.dispose(ecModel, api); + axisView._axisPointer = null; +} + +var axisPointerClazz = []; + +AxisView.registerAxisPointerClass = function (type, clazz) { + if (__DEV__) { + if (axisPointerClazz[type]) { + throw new Error('axisPointer ' + type + ' exists'); + } + } + axisPointerClazz[type] = clazz; +}; + +AxisView.getAxisPointerClass = function (type) { + return type && axisPointerClazz[type]; +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Can only be called after coordinate system creation stage. + * (Can be called before coordinate system update stage). + * + * @param {Object} opt {labelInside} + * @return {Object} { + * position, rotation, labelDirection, labelOffset, + * tickDirection, labelRotate, z2 + * } + */ +function layout$1(gridModel, axisModel, opt) { + opt = opt || {}; + var grid = gridModel.coordinateSystem; + var axis = axisModel.axis; + var layout = {}; + var otherAxisOnZeroOf = axis.getAxesOnZeroOf()[0]; + + var rawAxisPosition = axis.position; + var axisPosition = otherAxisOnZeroOf ? 'onZero' : rawAxisPosition; + var axisDim = axis.dim; + + var rect = grid.getRect(); + var rectBound = [rect.x, rect.x + rect.width, rect.y, rect.y + rect.height]; + var idx = {left: 0, right: 1, top: 0, bottom: 1, onZero: 2}; + var axisOffset = axisModel.get('offset') || 0; + + var posBound = axisDim === 'x' + ? [rectBound[2] - axisOffset, rectBound[3] + axisOffset] + : [rectBound[0] - axisOffset, rectBound[1] + axisOffset]; + + if (otherAxisOnZeroOf) { + var onZeroCoord = otherAxisOnZeroOf.toGlobalCoord(otherAxisOnZeroOf.dataToCoord(0)); + posBound[idx['onZero']] = Math.max(Math.min(onZeroCoord, posBound[1]), posBound[0]); + } + + // Axis position + layout.position = [ + axisDim === 'y' ? posBound[idx[axisPosition]] : rectBound[0], + axisDim === 'x' ? posBound[idx[axisPosition]] : rectBound[3] + ]; + + // Axis rotation + layout.rotation = Math.PI / 2 * (axisDim === 'x' ? 0 : 1); + + // Tick and label direction, x y is axisDim + var dirMap = {top: -1, bottom: 1, left: -1, right: 1}; + + layout.labelDirection = layout.tickDirection = layout.nameDirection = dirMap[rawAxisPosition]; + layout.labelOffset = otherAxisOnZeroOf ? posBound[idx[rawAxisPosition]] - posBound[idx['onZero']] : 0; + + if (axisModel.get('axisTick.inside')) { + layout.tickDirection = -layout.tickDirection; + } + if (retrieve(opt.labelInside, axisModel.get('axisLabel.inside'))) { + layout.labelDirection = -layout.labelDirection; + } + + // Special label rotation + var labelRotate = axisModel.get('axisLabel.rotate'); + layout.labelRotate = axisPosition === 'top' ? -labelRotate : labelRotate; + + // Over splitLine and splitArea + layout.z2 = 1; + + return layout; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var axisBuilderAttrs = [ + 'axisLine', 'axisTickLabel', 'axisName' +]; +var selfBuilderAttrs = [ + 'splitArea', 'splitLine' +]; + +// function getAlignWithLabel(model, axisModel) { +// var alignWithLabel = model.get('alignWithLabel'); +// if (alignWithLabel === 'auto') { +// alignWithLabel = axisModel.get('axisTick.alignWithLabel'); +// } +// return alignWithLabel; +// } + +var CartesianAxisView = AxisView.extend({ + + type: 'cartesianAxis', + + axisPointerClass: 'CartesianAxisPointer', + + /** + * @override + */ + render: function (axisModel, ecModel, api, payload) { + + this.group.removeAll(); + + var oldAxisGroup = this._axisGroup; + this._axisGroup = new Group(); + + this.group.add(this._axisGroup); + + if (!axisModel.get('show')) { + return; + } + + var gridModel = axisModel.getCoordSysModel(); + + var layout = layout$1(gridModel, axisModel); + + var axisBuilder = new AxisBuilder(axisModel, layout); + + each$1(axisBuilderAttrs, axisBuilder.add, axisBuilder); + + this._axisGroup.add(axisBuilder.getGroup()); + + each$1(selfBuilderAttrs, function (name) { + if (axisModel.get(name + '.show')) { + this['_' + name](axisModel, gridModel); + } + }, this); + + groupTransition(oldAxisGroup, this._axisGroup, axisModel); + + CartesianAxisView.superCall(this, 'render', axisModel, ecModel, api, payload); + }, + + remove: function () { + this._splitAreaColors = null; + }, + + /** + * @param {module:echarts/coord/cartesian/AxisModel} axisModel + * @param {module:echarts/coord/cartesian/GridModel} gridModel + * @private + */ + _splitLine: function (axisModel, gridModel) { + var axis = axisModel.axis; + + if (axis.scale.isBlank()) { + return; + } + + var splitLineModel = axisModel.getModel('splitLine'); + var lineStyleModel = splitLineModel.getModel('lineStyle'); + var lineColors = lineStyleModel.get('color'); + + lineColors = isArray(lineColors) ? lineColors : [lineColors]; + + var gridRect = gridModel.coordinateSystem.getRect(); + var isHorizontal = axis.isHorizontal(); + + var lineCount = 0; + + var ticksCoords = axis.getTicksCoords({ + tickModel: splitLineModel + }); + + var p1 = []; + var p2 = []; + + // Simple optimization + // Batching the lines if color are the same + var lineStyle = lineStyleModel.getLineStyle(); + for (var i = 0; i < ticksCoords.length; i++) { + var tickCoord = axis.toGlobalCoord(ticksCoords[i].coord); + + if (isHorizontal) { + p1[0] = tickCoord; + p1[1] = gridRect.y; + p2[0] = tickCoord; + p2[1] = gridRect.y + gridRect.height; + } + else { + p1[0] = gridRect.x; + p1[1] = tickCoord; + p2[0] = gridRect.x + gridRect.width; + p2[1] = tickCoord; + } + + var colorIndex = (lineCount++) % lineColors.length; + var tickValue = ticksCoords[i].tickValue; + this._axisGroup.add(new Line(subPixelOptimizeLine({ + anid: tickValue != null ? 'line_' + ticksCoords[i].tickValue : null, + shape: { + x1: p1[0], + y1: p1[1], + x2: p2[0], + y2: p2[1] + }, + style: defaults({ + stroke: lineColors[colorIndex] + }, lineStyle), + silent: true + }))); + } + }, + + /** + * @param {module:echarts/coord/cartesian/AxisModel} axisModel + * @param {module:echarts/coord/cartesian/GridModel} gridModel + * @private + */ + _splitArea: function (axisModel, gridModel) { + var axis = axisModel.axis; + + if (axis.scale.isBlank()) { + return; + } + + var splitAreaModel = axisModel.getModel('splitArea'); + var areaStyleModel = splitAreaModel.getModel('areaStyle'); + var areaColors = areaStyleModel.get('color'); + + var gridRect = gridModel.coordinateSystem.getRect(); + + var ticksCoords = axis.getTicksCoords({ + tickModel: splitAreaModel, + clamp: true + }); + + if (!ticksCoords.length) { + return; + } + + // For Making appropriate splitArea animation, the color and anid + // should be corresponding to previous one if possible. + var areaColorsLen = areaColors.length; + var lastSplitAreaColors = this._splitAreaColors; + var newSplitAreaColors = createHashMap(); + var colorIndex = 0; + if (lastSplitAreaColors) { + for (var i = 0; i < ticksCoords.length; i++) { + var cIndex = lastSplitAreaColors.get(ticksCoords[i].tickValue); + if (cIndex != null) { + colorIndex = (cIndex + (areaColorsLen - 1) * i) % areaColorsLen; + break; + } + } + } + + var prev = axis.toGlobalCoord(ticksCoords[0].coord); + + var areaStyle = areaStyleModel.getAreaStyle(); + areaColors = isArray(areaColors) ? areaColors : [areaColors]; + + for (var i = 1; i < ticksCoords.length; i++) { + var tickCoord = axis.toGlobalCoord(ticksCoords[i].coord); + + var x; + var y; + var width; + var height; + if (axis.isHorizontal()) { + x = prev; + y = gridRect.y; + width = tickCoord - x; + height = gridRect.height; + prev = x + width; + } + else { + x = gridRect.x; + y = prev; + width = gridRect.width; + height = tickCoord - y; + prev = y + height; + } + + var tickValue = ticksCoords[i - 1].tickValue; + tickValue != null && newSplitAreaColors.set(tickValue, colorIndex); + + this._axisGroup.add(new Rect({ + anid: tickValue != null ? 'area_' + tickValue : null, + shape: { + x: x, + y: y, + width: width, + height: height + }, + style: defaults({ + fill: areaColors[colorIndex] + }, areaStyle), + silent: true + })); + + colorIndex = (colorIndex + 1) % areaColorsLen; + } + + this._splitAreaColors = newSplitAreaColors; + } +}); + +CartesianAxisView.extend({ + type: 'xAxis' +}); +CartesianAxisView.extend({ + type: 'yAxis' +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// Grid view +extendComponentView({ + + type: 'grid', + + render: function (gridModel, ecModel) { + this.group.removeAll(); + if (gridModel.get('show')) { + this.group.add(new Rect({ + shape: gridModel.coordinateSystem.getRect(), + style: defaults({ + fill: gridModel.get('backgroundColor') + }, gridModel.getItemStyle()), + silent: true, + z2: -1 + })); + } + } + +}); + +registerPreprocessor(function (option) { + // Only create grid when need + if (option.xAxis && option.yAxis && !option.grid) { + option.grid = {}; + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// In case developer forget to include grid component +registerVisual(visualSymbol('line', 'circle', 'line')); +registerLayout(pointsLayout('line')); + +// Down sample after filter +registerProcessor( + PRIORITY.PROCESSOR.STATISTIC, + dataSample('line') +); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var BaseBarSeries = SeriesModel.extend({ + + type: 'series.__base_bar__', + + getInitialData: function (option, ecModel) { + return createListFromArray(this.getSource(), this); + }, + + getMarkerPosition: function (value) { + var coordSys = this.coordinateSystem; + if (coordSys) { + // PENDING if clamp ? + var pt = coordSys.dataToPoint(coordSys.clampData(value)); + var data = this.getData(); + var offset = data.getLayout('offset'); + var size = data.getLayout('size'); + var offsetIndex = coordSys.getBaseAxis().isHorizontal() ? 0 : 1; + pt[offsetIndex] += offset + size / 2; + return pt; + } + return [NaN, NaN]; + }, + + defaultOption: { + zlevel: 0, // 一级层叠 + z: 2, // 二级层叠 + coordinateSystem: 'cartesian2d', + legendHoverLink: true, + // stack: null + + // Cartesian coordinate system + // xAxisIndex: 0, + // yAxisIndex: 0, + + // 最小高度改为0 + barMinHeight: 0, + // 最小角度为0,仅对极坐标系下的柱状图有效 + barMinAngle: 0, + // cursor: null, + + large: false, + largeThreshold: 400, + progressive: 3e3, + progressiveChunkMode: 'mod', + + // barMaxWidth: null, + // 默认自适应 + // barWidth: null, + // 柱间距离,默认为柱形宽度的30%,可设固定值 + // barGap: '30%', + // 类目间柱形距离,默认为类目间距的20%,可设固定值 + // barCategoryGap: '20%', + // label: { + // show: false + // }, + itemStyle: {}, + emphasis: {} + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +BaseBarSeries.extend({ + + type: 'series.bar', + + dependencies: ['grid', 'polar'], + + brushSelector: 'rect', + + /** + * @override + */ + getProgressive: function () { + // Do not support progressive in normal mode. + return this.get('large') + ? this.get('progressive') + : false; + }, + + /** + * @override + */ + getProgressiveThreshold: function () { + // Do not support progressive in normal mode. + var progressiveThreshold = this.get('progressiveThreshold'); + var largeThreshold = this.get('largeThreshold'); + if (largeThreshold > progressiveThreshold) { + progressiveThreshold = largeThreshold; + } + return progressiveThreshold; + } + +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +function setLabel( + normalStyle, hoverStyle, itemModel, color, seriesModel, dataIndex, labelPositionOutside +) { + var labelModel = itemModel.getModel('label'); + var hoverLabelModel = itemModel.getModel('emphasis.label'); + + setLabelStyle( + normalStyle, hoverStyle, labelModel, hoverLabelModel, + { + labelFetcher: seriesModel, + labelDataIndex: dataIndex, + defaultText: getDefaultLabel(seriesModel.getData(), dataIndex), + isRectText: true, + autoColor: color + } + ); + + fixPosition(normalStyle); + fixPosition(hoverStyle); +} + +function fixPosition(style, labelPositionOutside) { + if (style.textPosition === 'outside') { + style.textPosition = labelPositionOutside; + } +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var getBarItemStyle = makeStyleMapper( + [ + ['fill', 'color'], + ['stroke', 'borderColor'], + ['lineWidth', 'borderWidth'], + // Compatitable with 2 + ['stroke', 'barBorderColor'], + ['lineWidth', 'barBorderWidth'], + ['opacity'], + ['shadowBlur'], + ['shadowOffsetX'], + ['shadowOffsetY'], + ['shadowColor'] + ] +); + +var barItemStyle = { + getBarItemStyle: function (excludes) { + var style = getBarItemStyle(this, excludes); + if (this.getBorderLineDash) { + var lineDash = this.getBorderLineDash(); + lineDash && (style.lineDash = lineDash); + } + return style; + } +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var BAR_BORDER_WIDTH_QUERY = ['itemStyle', 'barBorderWidth']; + +// FIXME +// Just for compatible with ec2. +extend(Model.prototype, barItemStyle); + +extendChartView({ + + type: 'bar', + + render: function (seriesModel, ecModel, api) { + this._updateDrawMode(seriesModel); + + var coordinateSystemType = seriesModel.get('coordinateSystem'); + + if (coordinateSystemType === 'cartesian2d' + || coordinateSystemType === 'polar' + ) { + this._isLargeDraw + ? this._renderLarge(seriesModel, ecModel, api) + : this._renderNormal(seriesModel, ecModel, api); + } + else if (__DEV__) { + console.warn('Only cartesian2d and polar supported for bar.'); + } + + return this.group; + }, + + incrementalPrepareRender: function (seriesModel, ecModel, api) { + this._clear(); + this._updateDrawMode(seriesModel); + }, + + incrementalRender: function (params, seriesModel, ecModel, api) { + // Do not support progressive in normal mode. + this._incrementalRenderLarge(params, seriesModel); + }, + + _updateDrawMode: function (seriesModel) { + var isLargeDraw = seriesModel.pipelineContext.large; + if (this._isLargeDraw == null || isLargeDraw ^ this._isLargeDraw) { + this._isLargeDraw = isLargeDraw; + this._clear(); + } + }, + + _renderNormal: function (seriesModel, ecModel, api) { + var group = this.group; + var data = seriesModel.getData(); + var oldData = this._data; + + var coord = seriesModel.coordinateSystem; + var baseAxis = coord.getBaseAxis(); + var isHorizontalOrRadial; + + if (coord.type === 'cartesian2d') { + isHorizontalOrRadial = baseAxis.isHorizontal(); + } + else if (coord.type === 'polar') { + isHorizontalOrRadial = baseAxis.dim === 'angle'; + } + + var animationModel = seriesModel.isAnimationEnabled() ? seriesModel : null; + + data.diff(oldData) + .add(function (dataIndex) { + if (!data.hasValue(dataIndex)) { + return; + } + + var itemModel = data.getItemModel(dataIndex); + var layout = getLayout[coord.type](data, dataIndex, itemModel); + var el = elementCreator[coord.type]( + data, dataIndex, itemModel, layout, isHorizontalOrRadial, animationModel + ); + data.setItemGraphicEl(dataIndex, el); + group.add(el); + + updateStyle( + el, data, dataIndex, itemModel, layout, + seriesModel, isHorizontalOrRadial, coord.type === 'polar' + ); + }) + .update(function (newIndex, oldIndex) { + var el = oldData.getItemGraphicEl(oldIndex); + + if (!data.hasValue(newIndex)) { + group.remove(el); + return; + } + + var itemModel = data.getItemModel(newIndex); + var layout = getLayout[coord.type](data, newIndex, itemModel); + + if (el) { + updateProps(el, {shape: layout}, animationModel, newIndex); + } + else { + el = elementCreator[coord.type]( + data, newIndex, itemModel, layout, isHorizontalOrRadial, animationModel, true + ); + } + + data.setItemGraphicEl(newIndex, el); + // Add back + group.add(el); + + updateStyle( + el, data, newIndex, itemModel, layout, + seriesModel, isHorizontalOrRadial, coord.type === 'polar' + ); + }) + .remove(function (dataIndex) { + var el = oldData.getItemGraphicEl(dataIndex); + if (coord.type === 'cartesian2d') { + el && removeRect(dataIndex, animationModel, el); + } + else { + el && removeSector(dataIndex, animationModel, el); + } + }) + .execute(); + + this._data = data; + }, + + _renderLarge: function (seriesModel, ecModel, api) { + this._clear(); + createLarge(seriesModel, this.group); + }, + + _incrementalRenderLarge: function (params, seriesModel) { + createLarge(seriesModel, this.group, true); + }, + + dispose: noop, + + remove: function (ecModel) { + this._clear(ecModel); + }, + + _clear: function (ecModel) { + var group = this.group; + var data = this._data; + if (ecModel && ecModel.get('animation') && data && !this._isLargeDraw) { + data.eachItemGraphicEl(function (el) { + if (el.type === 'sector') { + removeSector(el.dataIndex, ecModel, el); + } + else { + removeRect(el.dataIndex, ecModel, el); + } + }); + } + else { + group.removeAll(); + } + this._data = null; + } + +}); + +var elementCreator = { + + cartesian2d: function ( + data, dataIndex, itemModel, layout, isHorizontal, + animationModel, isUpdate + ) { + var rect = new Rect({shape: extend({}, layout)}); + + // Animation + if (animationModel) { + var rectShape = rect.shape; + var animateProperty = isHorizontal ? 'height' : 'width'; + var animateTarget = {}; + rectShape[animateProperty] = 0; + animateTarget[animateProperty] = layout[animateProperty]; + graphic[isUpdate ? 'updateProps' : 'initProps'](rect, { + shape: animateTarget + }, animationModel, dataIndex); + } + + return rect; + }, + + polar: function ( + data, dataIndex, itemModel, layout, isRadial, + animationModel, isUpdate + ) { + // Keep the same logic with bar in catesion: use end value to control + // direction. Notice that if clockwise is true (by default), the sector + // will always draw clockwisely, no matter whether endAngle is greater + // or less than startAngle. + var clockwise = layout.startAngle < layout.endAngle; + var sector = new Sector({ + shape: defaults({clockwise: clockwise}, layout) + }); + + // Animation + if (animationModel) { + var sectorShape = sector.shape; + var animateProperty = isRadial ? 'r' : 'endAngle'; + var animateTarget = {}; + sectorShape[animateProperty] = isRadial ? 0 : layout.startAngle; + animateTarget[animateProperty] = layout[animateProperty]; + graphic[isUpdate ? 'updateProps' : 'initProps'](sector, { + shape: animateTarget + }, animationModel, dataIndex); + } + + return sector; + } +}; + +function removeRect(dataIndex, animationModel, el) { + // Not show text when animating + el.style.text = null; + updateProps(el, { + shape: { + width: 0 + } + }, animationModel, dataIndex, function () { + el.parent && el.parent.remove(el); + }); +} + +function removeSector(dataIndex, animationModel, el) { + // Not show text when animating + el.style.text = null; + updateProps(el, { + shape: { + r: el.shape.r0 + } + }, animationModel, dataIndex, function () { + el.parent && el.parent.remove(el); + }); +} + +var getLayout = { + cartesian2d: function (data, dataIndex, itemModel) { + var layout = data.getItemLayout(dataIndex); + var fixedLineWidth = getLineWidth(itemModel, layout); + + // fix layout with lineWidth + var signX = layout.width > 0 ? 1 : -1; + var signY = layout.height > 0 ? 1 : -1; + return { + x: layout.x + signX * fixedLineWidth / 2, + y: layout.y + signY * fixedLineWidth / 2, + width: layout.width - signX * fixedLineWidth, + height: layout.height - signY * fixedLineWidth + }; + }, + + polar: function (data, dataIndex, itemModel) { + var layout = data.getItemLayout(dataIndex); + return { + cx: layout.cx, + cy: layout.cy, + r0: layout.r0, + r: layout.r, + startAngle: layout.startAngle, + endAngle: layout.endAngle + }; + } +}; + +function updateStyle( + el, data, dataIndex, itemModel, layout, seriesModel, isHorizontal, isPolar +) { + var color = data.getItemVisual(dataIndex, 'color'); + var opacity = data.getItemVisual(dataIndex, 'opacity'); + var itemStyleModel = itemModel.getModel('itemStyle'); + var hoverStyle = itemModel.getModel('emphasis.itemStyle').getBarItemStyle(); + + if (!isPolar) { + el.setShape('r', itemStyleModel.get('barBorderRadius') || 0); + } + + el.useStyle(defaults( + { + fill: color, + opacity: opacity + }, + itemStyleModel.getBarItemStyle() + )); + + var cursorStyle = itemModel.getShallow('cursor'); + cursorStyle && el.attr('cursor', cursorStyle); + + var labelPositionOutside = isHorizontal + ? (layout.height > 0 ? 'bottom' : 'top') + : (layout.width > 0 ? 'left' : 'right'); + + if (!isPolar) { + setLabel( + el.style, hoverStyle, itemModel, color, + seriesModel, dataIndex, labelPositionOutside + ); + } + + setHoverStyle(el, hoverStyle); +} + +// In case width or height are too small. +function getLineWidth(itemModel, rawLayout) { + var lineWidth = itemModel.get(BAR_BORDER_WIDTH_QUERY) || 0; + return Math.min(lineWidth, Math.abs(rawLayout.width), Math.abs(rawLayout.height)); +} + + +var LargePath = Path.extend({ + + type: 'largeBar', + + shape: {points: []}, + + buildPath: function (ctx, shape) { + // Drawing lines is more efficient than drawing + // a whole line or drawing rects. + var points = shape.points; + var startPoint = this.__startPoint; + var valueIdx = this.__valueIdx; + + for (var i = 0; i < points.length; i += 2) { + startPoint[this.__valueIdx] = points[i + valueIdx]; + ctx.moveTo(startPoint[0], startPoint[1]); + ctx.lineTo(points[i], points[i + 1]); + } + } +}); + +function createLarge(seriesModel, group, incremental) { + // TODO support polar + var data = seriesModel.getData(); + var startPoint = []; + var valueIdx = data.getLayout('valueAxisHorizontal') ? 1 : 0; + startPoint[1 - valueIdx] = data.getLayout('valueAxisStart'); + + var el = new LargePath({ + shape: {points: data.getLayout('largePoints')}, + incremental: !!incremental, + __startPoint: startPoint, + __valueIdx: valueIdx + }); + group.add(el); + setLargeStyle(el, seriesModel, data); +} + +function setLargeStyle(el, seriesModel, data) { + var borderColor = data.getVisual('borderColor') || data.getVisual('color'); + var itemStyle = seriesModel.getModel('itemStyle').getItemStyle(['color', 'borderColor']); + + el.useStyle(itemStyle); + el.style.fill = null; + el.style.stroke = borderColor; + el.style.lineWidth = data.getLayout('barWidth'); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// In case developer forget to include grid component +registerLayout(curry(layout, 'bar')); +// Should after normal bar layout, otherwise it is blocked by normal bar layout. +registerLayout(largeLayout); + +registerVisual({ + seriesType: 'bar', + reset: function (seriesModel) { + // Visual coding for legend + seriesModel.getData().setVisual('legendSymbol', 'roundRect'); + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +/** + * [Usage]: + * (1) + * createListSimply(seriesModel, ['value']); + * (2) + * createListSimply(seriesModel, { + * coordDimensions: ['value'], + * dimensionsCount: 5 + * }); + * + * @param {module:echarts/model/Series} seriesModel + * @param {Object|Array.<string|Object>} opt opt or coordDimensions + * The options in opt, see `echarts/data/helper/createDimensions` + * @param {Array.<string>} [nameList] + * @return {module:echarts/data/List} + */ +var createListSimply = function (seriesModel, opt, nameList) { + opt = isArray(opt) && {coordDimensions: opt} || extend({}, opt); + + var source = seriesModel.getSource(); + + var dimensionsInfo = createDimensions(source, opt); + + var list = new List(dimensionsInfo, seriesModel); + list.initData(source, nameList); + + return list; +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Data selectable mixin for chart series. + * To eanble data select, option of series must have `selectedMode`. + * And each data item will use `selected` to toggle itself selected status + */ + +var selectableMixin = { + + /** + * @param {Array.<Object>} targetList [{name, value, selected}, ...] + * If targetList is an array, it should like [{name: ..., value: ...}, ...]. + * If targetList is a "List", it must have coordDim: 'value' dimension and name. + */ + updateSelectedMap: function (targetList) { + this._targetList = isArray(targetList) ? targetList.slice() : []; + + this._selectTargetMap = reduce(targetList || [], function (targetMap, target) { + targetMap.set(target.name, target); + return targetMap; + }, createHashMap()); + }, + + /** + * Either name or id should be passed as input here. + * If both of them are defined, id is used. + * + * @param {string|undefined} name name of data + * @param {number|undefined} id dataIndex of data + */ + // PENGING If selectedMode is null ? + select: function (name, id) { + var target = id != null + ? this._targetList[id] + : this._selectTargetMap.get(name); + var selectedMode = this.get('selectedMode'); + if (selectedMode === 'single') { + this._selectTargetMap.each(function (target) { + target.selected = false; + }); + } + target && (target.selected = true); + }, + + /** + * Either name or id should be passed as input here. + * If both of them are defined, id is used. + * + * @param {string|undefined} name name of data + * @param {number|undefined} id dataIndex of data + */ + unSelect: function (name, id) { + var target = id != null + ? this._targetList[id] + : this._selectTargetMap.get(name); + // var selectedMode = this.get('selectedMode'); + // selectedMode !== 'single' && target && (target.selected = false); + target && (target.selected = false); + }, + + /** + * Either name or id should be passed as input here. + * If both of them are defined, id is used. + * + * @param {string|undefined} name name of data + * @param {number|undefined} id dataIndex of data + */ + toggleSelected: function (name, id) { + var target = id != null + ? this._targetList[id] + : this._selectTargetMap.get(name); + if (target != null) { + this[target.selected ? 'unSelect' : 'select'](name, id); + return target.selected; + } + }, + + /** + * Either name or id should be passed as input here. + * If both of them are defined, id is used. + * + * @param {string|undefined} name name of data + * @param {number|undefined} id dataIndex of data + */ + isSelected: function (name, id) { + var target = id != null + ? this._targetList[id] + : this._selectTargetMap.get(name); + return target && target.selected; + } +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var PieSeries = extendSeriesModel({ + + type: 'series.pie', + + // Overwrite + init: function (option) { + PieSeries.superApply(this, 'init', arguments); + + // Enable legend selection for each data item + // Use a function instead of direct access because data reference may changed + this.legendDataProvider = function () { + return this.getRawData(); + }; + + this.updateSelectedMap(this._createSelectableList()); + + this._defaultLabelLine(option); + }, + + // Overwrite + mergeOption: function (newOption) { + PieSeries.superCall(this, 'mergeOption', newOption); + + this.updateSelectedMap(this._createSelectableList()); + }, + + getInitialData: function (option, ecModel) { + return createListSimply(this, ['value']); + }, + + _createSelectableList: function () { + var data = this.getRawData(); + var valueDim = data.mapDimension('value'); + var targetList = []; + for (var i = 0, len = data.count(); i < len; i++) { + targetList.push({ + name: data.getName(i), + value: data.get(valueDim, i), + selected: retrieveRawAttr(data, i, 'selected') + }); + } + return targetList; + }, + + // Overwrite + getDataParams: function (dataIndex) { + var data = this.getData(); + var params = PieSeries.superCall(this, 'getDataParams', dataIndex); + // FIXME toFixed? + + var valueList = []; + data.each(data.mapDimension('value'), function (value) { + valueList.push(value); + }); + + params.percent = getPercentWithPrecision( + valueList, + dataIndex, + data.hostModel.get('percentPrecision') + ); + + params.$vars.push('percent'); + return params; + }, + + _defaultLabelLine: function (option) { + // Extend labelLine emphasis + defaultEmphasis(option, 'labelLine', ['show']); + + var labelLineNormalOpt = option.labelLine; + var labelLineEmphasisOpt = option.emphasis.labelLine; + // Not show label line if `label.normal.show = false` + labelLineNormalOpt.show = labelLineNormalOpt.show + && option.label.show; + labelLineEmphasisOpt.show = labelLineEmphasisOpt.show + && option.emphasis.label.show; + }, + + defaultOption: { + zlevel: 0, + z: 2, + legendHoverLink: true, + + hoverAnimation: true, + // 默认全局居中 + center: ['50%', '50%'], + radius: [0, '75%'], + // 默认顺时针 + clockwise: true, + startAngle: 90, + // 最小角度改为0 + minAngle: 0, + // 选中时扇区偏移量 + selectedOffset: 10, + // 高亮扇区偏移量 + hoverOffset: 10, + + // If use strategy to avoid label overlapping + avoidLabelOverlap: true, + // 选择模式,默认关闭,可选single,multiple + // selectedMode: false, + // 南丁格尔玫瑰图模式,'radius'(半径) | 'area'(面积) + // roseType: null, + + percentPrecision: 2, + + // If still show when all data zero. + stillShowZeroSum: true, + + // cursor: null, + + label: { + // If rotate around circle + rotate: false, + show: true, + // 'outer', 'inside', 'center' + position: 'outer' + // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 + // 默认使用全局文本样式,详见TEXTSTYLE + // distance: 当position为inner时有效,为label位置到圆心的距离与圆半径(环状图为内外半径和)的比例系数 + }, + // Enabled when label.normal.position is 'outer' + labelLine: { + show: true, + // 引导线两段中的第一段长度 + length: 15, + // 引导线两段中的第二段长度 + length2: 15, + smooth: false, + lineStyle: { + // color: 各异, + width: 1, + type: 'solid' + } + }, + itemStyle: { + borderWidth: 1 + }, + + // Animation type canbe expansion, scale + animationType: 'expansion', + + animationEasing: 'cubicOut' + } +}); + +mixin(PieSeries, selectableMixin); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @param {module:echarts/model/Series} seriesModel + * @param {boolean} hasAnimation + * @inner + */ +function updateDataSelected(uid, seriesModel, hasAnimation, api) { + var data = seriesModel.getData(); + var dataIndex = this.dataIndex; + var name = data.getName(dataIndex); + var selectedOffset = seriesModel.get('selectedOffset'); + + api.dispatchAction({ + type: 'pieToggleSelect', + from: uid, + name: name, + seriesId: seriesModel.id + }); + + data.each(function (idx) { + toggleItemSelected( + data.getItemGraphicEl(idx), + data.getItemLayout(idx), + seriesModel.isSelected(data.getName(idx)), + selectedOffset, + hasAnimation + ); + }); +} + +/** + * @param {module:zrender/graphic/Sector} el + * @param {Object} layout + * @param {boolean} isSelected + * @param {number} selectedOffset + * @param {boolean} hasAnimation + * @inner + */ +function toggleItemSelected(el, layout, isSelected, selectedOffset, hasAnimation) { + var midAngle = (layout.startAngle + layout.endAngle) / 2; + + var dx = Math.cos(midAngle); + var dy = Math.sin(midAngle); + + var offset = isSelected ? selectedOffset : 0; + var position = [dx * offset, dy * offset]; + + hasAnimation + // animateTo will stop revious animation like update transition + ? el.animate() + .when(200, { + position: position + }) + .start('bounceOut') + : el.attr('position', position); +} + +/** + * Piece of pie including Sector, Label, LabelLine + * @constructor + * @extends {module:zrender/graphic/Group} + */ +function PiePiece(data, idx) { + + Group.call(this); + + var sector = new Sector({ + z2: 2 + }); + var polyline = new Polyline(); + var text = new Text(); + this.add(sector); + this.add(polyline); + this.add(text); + + this.updateData(data, idx, true); + + // Hover to change label and labelLine + function onEmphasis() { + polyline.ignore = polyline.hoverIgnore; + text.ignore = text.hoverIgnore; + } + function onNormal() { + polyline.ignore = polyline.normalIgnore; + text.ignore = text.normalIgnore; + } + this.on('emphasis', onEmphasis) + .on('normal', onNormal) + .on('mouseover', onEmphasis) + .on('mouseout', onNormal); +} + +var piePieceProto = PiePiece.prototype; + +piePieceProto.updateData = function (data, idx, firstCreate) { + + var sector = this.childAt(0); + + var seriesModel = data.hostModel; + var itemModel = data.getItemModel(idx); + var layout = data.getItemLayout(idx); + var sectorShape = extend({}, layout); + sectorShape.label = null; + + if (firstCreate) { + sector.setShape(sectorShape); + + var animationType = seriesModel.getShallow('animationType'); + if (animationType === 'scale') { + sector.shape.r = layout.r0; + initProps(sector, { + shape: { + r: layout.r + } + }, seriesModel, idx); + } + // Expansion + else { + sector.shape.endAngle = layout.startAngle; + updateProps(sector, { + shape: { + endAngle: layout.endAngle + } + }, seriesModel, idx); + } + + } + else { + updateProps(sector, { + shape: sectorShape + }, seriesModel, idx); + } + + // Update common style + var visualColor = data.getItemVisual(idx, 'color'); + + sector.useStyle( + defaults( + { + lineJoin: 'bevel', + fill: visualColor + }, + itemModel.getModel('itemStyle').getItemStyle() + ) + ); + sector.hoverStyle = itemModel.getModel('emphasis.itemStyle').getItemStyle(); + + var cursorStyle = itemModel.getShallow('cursor'); + cursorStyle && sector.attr('cursor', cursorStyle); + + // Toggle selected + toggleItemSelected( + this, + data.getItemLayout(idx), + seriesModel.isSelected(null, idx), + seriesModel.get('selectedOffset'), + seriesModel.get('animation') + ); + + function onEmphasis() { + // Sector may has animation of updating data. Force to move to the last frame + // Or it may stopped on the wrong shape + sector.stopAnimation(true); + sector.animateTo({ + shape: { + r: layout.r + seriesModel.get('hoverOffset') + } + }, 300, 'elasticOut'); + } + function onNormal() { + sector.stopAnimation(true); + sector.animateTo({ + shape: { + r: layout.r + } + }, 300, 'elasticOut'); + } + sector.off('mouseover').off('mouseout').off('emphasis').off('normal'); + if (itemModel.get('hoverAnimation') && seriesModel.isAnimationEnabled()) { + sector + .on('mouseover', onEmphasis) + .on('mouseout', onNormal) + .on('emphasis', onEmphasis) + .on('normal', onNormal); + } + + this._updateLabel(data, idx); + + setHoverStyle(this); +}; + +piePieceProto._updateLabel = function (data, idx) { + + var labelLine = this.childAt(1); + var labelText = this.childAt(2); + + var seriesModel = data.hostModel; + var itemModel = data.getItemModel(idx); + var layout = data.getItemLayout(idx); + var labelLayout = layout.label; + var visualColor = data.getItemVisual(idx, 'color'); + + updateProps(labelLine, { + shape: { + points: labelLayout.linePoints || [ + [labelLayout.x, labelLayout.y], [labelLayout.x, labelLayout.y], [labelLayout.x, labelLayout.y] + ] + } + }, seriesModel, idx); + + updateProps(labelText, { + style: { + x: labelLayout.x, + y: labelLayout.y + } + }, seriesModel, idx); + labelText.attr({ + rotation: labelLayout.rotation, + origin: [labelLayout.x, labelLayout.y], + z2: 10 + }); + + var labelModel = itemModel.getModel('label'); + var labelHoverModel = itemModel.getModel('emphasis.label'); + var labelLineModel = itemModel.getModel('labelLine'); + var labelLineHoverModel = itemModel.getModel('emphasis.labelLine'); + var visualColor = data.getItemVisual(idx, 'color'); + + setLabelStyle( + labelText.style, labelText.hoverStyle = {}, labelModel, labelHoverModel, + { + labelFetcher: data.hostModel, + labelDataIndex: idx, + defaultText: data.getName(idx), + autoColor: visualColor, + useInsideStyle: !!labelLayout.inside + }, + { + textAlign: labelLayout.textAlign, + textVerticalAlign: labelLayout.verticalAlign, + opacity: data.getItemVisual(idx, 'opacity') + } + ); + + labelText.ignore = labelText.normalIgnore = !labelModel.get('show'); + labelText.hoverIgnore = !labelHoverModel.get('show'); + + labelLine.ignore = labelLine.normalIgnore = !labelLineModel.get('show'); + labelLine.hoverIgnore = !labelLineHoverModel.get('show'); + + // Default use item visual color + labelLine.setStyle({ + stroke: visualColor, + opacity: data.getItemVisual(idx, 'opacity') + }); + labelLine.setStyle(labelLineModel.getModel('lineStyle').getLineStyle()); + + labelLine.hoverStyle = labelLineHoverModel.getModel('lineStyle').getLineStyle(); + + var smooth = labelLineModel.get('smooth'); + if (smooth && smooth === true) { + smooth = 0.4; + } + labelLine.setShape({ + smooth: smooth + }); +}; + +inherits(PiePiece, Group); + + +// Pie view +var PieView = Chart.extend({ + + type: 'pie', + + init: function () { + var sectorGroup = new Group(); + this._sectorGroup = sectorGroup; + }, + + render: function (seriesModel, ecModel, api, payload) { + if (payload && (payload.from === this.uid)) { + return; + } + + var data = seriesModel.getData(); + var oldData = this._data; + var group = this.group; + + var hasAnimation = ecModel.get('animation'); + var isFirstRender = !oldData; + var animationType = seriesModel.get('animationType'); + + var onSectorClick = curry( + updateDataSelected, this.uid, seriesModel, hasAnimation, api + ); + + var selectedMode = seriesModel.get('selectedMode'); + + data.diff(oldData) + .add(function (idx) { + var piePiece = new PiePiece(data, idx); + // Default expansion animation + if (isFirstRender && animationType !== 'scale') { + piePiece.eachChild(function (child) { + child.stopAnimation(true); + }); + } + + selectedMode && piePiece.on('click', onSectorClick); + + data.setItemGraphicEl(idx, piePiece); + + group.add(piePiece); + }) + .update(function (newIdx, oldIdx) { + var piePiece = oldData.getItemGraphicEl(oldIdx); + + piePiece.updateData(data, newIdx); + + piePiece.off('click'); + selectedMode && piePiece.on('click', onSectorClick); + group.add(piePiece); + data.setItemGraphicEl(newIdx, piePiece); + }) + .remove(function (idx) { + var piePiece = oldData.getItemGraphicEl(idx); + group.remove(piePiece); + }) + .execute(); + + if ( + hasAnimation && isFirstRender && data.count() > 0 + // Default expansion animation + && animationType !== 'scale' + ) { + var shape = data.getItemLayout(0); + var r = Math.max(api.getWidth(), api.getHeight()) / 2; + + var removeClipPath = bind(group.removeClipPath, group); + group.setClipPath(this._createClipPath( + shape.cx, shape.cy, r, shape.startAngle, shape.clockwise, removeClipPath, seriesModel + )); + } + + this._data = data; + }, + + dispose: function () {}, + + _createClipPath: function ( + cx, cy, r, startAngle, clockwise, cb, seriesModel + ) { + var clipPath = new Sector({ + shape: { + cx: cx, + cy: cy, + r0: 0, + r: r, + startAngle: startAngle, + endAngle: startAngle, + clockwise: clockwise + } + }); + + initProps(clipPath, { + shape: { + endAngle: startAngle + (clockwise ? 1 : -1) * Math.PI * 2 + } + }, seriesModel, cb); + + return clipPath; + }, + + /** + * @implement + */ + containPoint: function (point, seriesModel) { + var data = seriesModel.getData(); + var itemLayout = data.getItemLayout(0); + if (itemLayout) { + var dx = point[0] - itemLayout.cx; + var dy = point[1] - itemLayout.cy; + var radius = Math.sqrt(dx * dx + dy * dy); + return radius <= itemLayout.r && radius >= itemLayout.r0; + } + } + +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var createDataSelectAction = function (seriesType, actionInfos) { + each$1(actionInfos, function (actionInfo) { + actionInfo.update = 'updateView'; + /** + * @payload + * @property {string} seriesName + * @property {string} name + */ + registerAction(actionInfo, function (payload, ecModel) { + var selected = {}; + ecModel.eachComponent( + {mainType: 'series', subType: seriesType, query: payload}, + function (seriesModel) { + if (seriesModel[actionInfo.method]) { + seriesModel[actionInfo.method]( + payload.name, + payload.dataIndex + ); + } + var data = seriesModel.getData(); + // Create selected map + data.each(function (idx) { + var name = data.getName(idx); + selected[name] = seriesModel.isSelected(name) + || false; + }); + } + ); + return { + name: payload.name, + selected: selected + }; + }); + }); +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// Pick color from palette for each data item. +// Applicable for charts that require applying color palette +// in data level (like pie, funnel, chord). +var dataColor = function (seriesType) { + return { + getTargetSeries: function (ecModel) { + // Pie and funnel may use diferrent scope + var paletteScope = {}; + var seiresModelMap = createHashMap(); + + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + seriesModel.__paletteScope = paletteScope; + seiresModelMap.set(seriesModel.uid, seriesModel); + }); + + return seiresModelMap; + }, + reset: function (seriesModel, ecModel) { + var dataAll = seriesModel.getRawData(); + var idxMap = {}; + var data = seriesModel.getData(); + + data.each(function (idx) { + var rawIdx = data.getRawIndex(idx); + idxMap[rawIdx] = idx; + }); + + dataAll.each(function (rawIdx) { + var filteredIdx = idxMap[rawIdx]; + + // If series.itemStyle.normal.color is a function. itemVisual may be encoded + var singleDataColor = filteredIdx != null + && data.getItemVisual(filteredIdx, 'color', true); + + if (!singleDataColor) { + // FIXME Performance + var itemModel = dataAll.getItemModel(rawIdx); + + var color = itemModel.get('itemStyle.color') + || seriesModel.getColorFromPalette( + dataAll.getName(rawIdx) || (rawIdx + ''), seriesModel.__paletteScope, + dataAll.count() + ); + // Legend may use the visual info in data before processed + dataAll.setItemVisual(rawIdx, 'color', color); + + // Data is not filtered + if (filteredIdx != null) { + data.setItemVisual(filteredIdx, 'color', color); + } + } + else { + // Set data all color for legend + dataAll.setItemVisual(rawIdx, 'color', singleDataColor); + } + }); + } + }; +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// FIXME emphasis label position is not same with normal label position + +function adjustSingleSide(list, cx, cy, r, dir, viewWidth, viewHeight) { + list.sort(function (a, b) { + return a.y - b.y; + }); + + // 压 + function shiftDown(start, end, delta, dir) { + for (var j = start; j < end; j++) { + list[j].y += delta; + if (j > start + && j + 1 < end + && list[j + 1].y > list[j].y + list[j].height + ) { + shiftUp(j, delta / 2); + return; + } + } + + shiftUp(end - 1, delta / 2); + } + + // 弹 + function shiftUp(end, delta) { + for (var j = end; j >= 0; j--) { + list[j].y -= delta; + if (j > 0 + && list[j].y > list[j - 1].y + list[j - 1].height + ) { + break; + } + } + } + + function changeX(list, isDownList, cx, cy, r, dir) { + var lastDeltaX = dir > 0 + ? isDownList // 右侧 + ? Number.MAX_VALUE // 下 + : 0 // 上 + : isDownList // 左侧 + ? Number.MAX_VALUE // 下 + : 0; // 上 + + for (var i = 0, l = list.length; i < l; i++) { + // Not change x for center label + if (list[i].position === 'center') { + continue; + } + var deltaY = Math.abs(list[i].y - cy); + var length = list[i].len; + var length2 = list[i].len2; + var deltaX = (deltaY < r + length) + ? Math.sqrt( + (r + length + length2) * (r + length + length2) + - deltaY * deltaY + ) + : Math.abs(list[i].x - cx); + if (isDownList && deltaX >= lastDeltaX) { + // 右下,左下 + deltaX = lastDeltaX - 10; + } + if (!isDownList && deltaX <= lastDeltaX) { + // 右上,左上 + deltaX = lastDeltaX + 10; + } + + list[i].x = cx + deltaX * dir; + lastDeltaX = deltaX; + } + } + + var lastY = 0; + var delta; + var len = list.length; + var upList = []; + var downList = []; + for (var i = 0; i < len; i++) { + delta = list[i].y - lastY; + if (delta < 0) { + shiftDown(i, len, -delta, dir); + } + lastY = list[i].y + list[i].height; + } + if (viewHeight - lastY < 0) { + shiftUp(len - 1, lastY - viewHeight); + } + for (var i = 0; i < len; i++) { + if (list[i].y >= cy) { + downList.push(list[i]); + } + else { + upList.push(list[i]); + } + } + changeX(upList, false, cx, cy, r, dir); + changeX(downList, true, cx, cy, r, dir); +} + +function avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight) { + var leftList = []; + var rightList = []; + for (var i = 0; i < labelLayoutList.length; i++) { + if (labelLayoutList[i].x < cx) { + leftList.push(labelLayoutList[i]); + } + else { + rightList.push(labelLayoutList[i]); + } + } + + adjustSingleSide(rightList, cx, cy, r, 1, viewWidth, viewHeight); + adjustSingleSide(leftList, cx, cy, r, -1, viewWidth, viewHeight); + + for (var i = 0; i < labelLayoutList.length; i++) { + var linePoints = labelLayoutList[i].linePoints; + if (linePoints) { + var dist = linePoints[1][0] - linePoints[2][0]; + if (labelLayoutList[i].x < cx) { + linePoints[2][0] = labelLayoutList[i].x + 3; + } + else { + linePoints[2][0] = labelLayoutList[i].x - 3; + } + linePoints[1][1] = linePoints[2][1] = labelLayoutList[i].y; + linePoints[1][0] = linePoints[2][0] + dist; + } + } +} + +var labelLayout = function (seriesModel, r, viewWidth, viewHeight) { + var data = seriesModel.getData(); + var labelLayoutList = []; + var cx; + var cy; + var hasLabelRotate = false; + + data.each(function (idx) { + var layout = data.getItemLayout(idx); + + var itemModel = data.getItemModel(idx); + var labelModel = itemModel.getModel('label'); + // Use position in normal or emphasis + var labelPosition = labelModel.get('position') || itemModel.get('emphasis.label.position'); + + var labelLineModel = itemModel.getModel('labelLine'); + var labelLineLen = labelLineModel.get('length'); + var labelLineLen2 = labelLineModel.get('length2'); + + var midAngle = (layout.startAngle + layout.endAngle) / 2; + var dx = Math.cos(midAngle); + var dy = Math.sin(midAngle); + + var textX; + var textY; + var linePoints; + var textAlign; + + cx = layout.cx; + cy = layout.cy; + + var isLabelInside = labelPosition === 'inside' || labelPosition === 'inner'; + if (labelPosition === 'center') { + textX = layout.cx; + textY = layout.cy; + textAlign = 'center'; + } + else { + var x1 = (isLabelInside ? (layout.r + layout.r0) / 2 * dx : layout.r * dx) + cx; + var y1 = (isLabelInside ? (layout.r + layout.r0) / 2 * dy : layout.r * dy) + cy; + + textX = x1 + dx * 3; + textY = y1 + dy * 3; + + if (!isLabelInside) { + // For roseType + var x2 = x1 + dx * (labelLineLen + r - layout.r); + var y2 = y1 + dy * (labelLineLen + r - layout.r); + var x3 = x2 + ((dx < 0 ? -1 : 1) * labelLineLen2); + var y3 = y2; + + textX = x3 + (dx < 0 ? -5 : 5); + textY = y3; + linePoints = [[x1, y1], [x2, y2], [x3, y3]]; + } + + textAlign = isLabelInside ? 'center' : (dx > 0 ? 'left' : 'right'); + } + var font = labelModel.getFont(); + + var labelRotate = labelModel.get('rotate') + ? (dx < 0 ? -midAngle + Math.PI : -midAngle) : 0; + var text = seriesModel.getFormattedLabel(idx, 'normal') + || data.getName(idx); + var textRect = getBoundingRect( + text, font, textAlign, 'top' + ); + hasLabelRotate = !!labelRotate; + layout.label = { + x: textX, + y: textY, + position: labelPosition, + height: textRect.height, + len: labelLineLen, + len2: labelLineLen2, + linePoints: linePoints, + textAlign: textAlign, + verticalAlign: 'middle', + rotation: labelRotate, + inside: isLabelInside + }; + + // Not layout the inside label + if (!isLabelInside) { + labelLayoutList.push(layout.label); + } + }); + if (!hasLabelRotate && seriesModel.get('avoidLabelOverlap')) { + avoidOverlap(labelLayoutList, cx, cy, r, viewWidth, viewHeight); + } +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +var PI2$4 = Math.PI * 2; +var RADIAN = Math.PI / 180; + +var pieLayout = function (seriesType, ecModel, api, payload) { + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + var data = seriesModel.getData(); + var valueDim = data.mapDimension('value'); + + var center = seriesModel.get('center'); + var radius = seriesModel.get('radius'); + + if (!isArray(radius)) { + radius = [0, radius]; + } + if (!isArray(center)) { + center = [center, center]; + } + + var width = api.getWidth(); + var height = api.getHeight(); + var size = Math.min(width, height); + var cx = parsePercent$1(center[0], width); + var cy = parsePercent$1(center[1], height); + var r0 = parsePercent$1(radius[0], size / 2); + var r = parsePercent$1(radius[1], size / 2); + + var startAngle = -seriesModel.get('startAngle') * RADIAN; + + var minAngle = seriesModel.get('minAngle') * RADIAN; + + var validDataCount = 0; + data.each(valueDim, function (value) { + !isNaN(value) && validDataCount++; + }); + + var sum = data.getSum(valueDim); + // Sum may be 0 + var unitRadian = Math.PI / (sum || validDataCount) * 2; + + var clockwise = seriesModel.get('clockwise'); + + var roseType = seriesModel.get('roseType'); + var stillShowZeroSum = seriesModel.get('stillShowZeroSum'); + + // [0...max] + var extent = data.getDataExtent(valueDim); + extent[0] = 0; + + // In the case some sector angle is smaller than minAngle + var restAngle = PI2$4; + var valueSumLargerThanMinAngle = 0; + + var currentAngle = startAngle; + var dir = clockwise ? 1 : -1; + + data.each(valueDim, function (value, idx) { + var angle; + if (isNaN(value)) { + data.setItemLayout(idx, { + angle: NaN, + startAngle: NaN, + endAngle: NaN, + clockwise: clockwise, + cx: cx, + cy: cy, + r0: r0, + r: roseType + ? NaN + : r + }); + return; + } + + // FIXME 兼容 2.0 但是 roseType 是 area 的时候才是这样? + if (roseType !== 'area') { + angle = (sum === 0 && stillShowZeroSum) + ? unitRadian : (value * unitRadian); + } + else { + angle = PI2$4 / validDataCount; + } + + if (angle < minAngle) { + angle = minAngle; + restAngle -= minAngle; + } + else { + valueSumLargerThanMinAngle += value; + } + + var endAngle = currentAngle + dir * angle; + data.setItemLayout(idx, { + angle: angle, + startAngle: currentAngle, + endAngle: endAngle, + clockwise: clockwise, + cx: cx, + cy: cy, + r0: r0, + r: roseType + ? linearMap(value, extent, [r0, r]) + : r + }); + + currentAngle = endAngle; + }); + + // Some sector is constrained by minAngle + // Rest sectors needs recalculate angle + if (restAngle < PI2$4 && validDataCount) { + // Average the angle if rest angle is not enough after all angles is + // Constrained by minAngle + if (restAngle <= 1e-3) { + var angle = PI2$4 / validDataCount; + data.each(valueDim, function (value, idx) { + if (!isNaN(value)) { + var layout = data.getItemLayout(idx); + layout.angle = angle; + layout.startAngle = startAngle + dir * idx * angle; + layout.endAngle = startAngle + dir * (idx + 1) * angle; + } + }); + } + else { + unitRadian = restAngle / valueSumLargerThanMinAngle; + currentAngle = startAngle; + data.each(valueDim, function (value, idx) { + if (!isNaN(value)) { + var layout = data.getItemLayout(idx); + var angle = layout.angle === minAngle + ? minAngle : value * unitRadian; + layout.startAngle = currentAngle; + layout.endAngle = currentAngle + dir * angle; + currentAngle += dir * angle; + } + }); + } + } + + labelLayout(seriesModel, r, width, height); + }); +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var dataFilter = function (seriesType) { + return { + seriesType: seriesType, + reset: function (seriesModel, ecModel) { + var legendModels = ecModel.findComponents({ + mainType: 'legend' + }); + if (!legendModels || !legendModels.length) { + return; + } + var data = seriesModel.getData(); + data.filterSelf(function (idx) { + var name = data.getName(idx); + // If in any legend component the status is not selected. + for (var i = 0; i < legendModels.length; i++) { + if (!legendModels[i].isSelected(name)) { + return false; + } + } + return true; + }); + } + }; +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +createDataSelectAction('pie', [{ + type: 'pieToggleSelect', + event: 'pieselectchanged', + method: 'toggleSelected' +}, { + type: 'pieSelect', + event: 'pieselected', + method: 'select' +}, { + type: 'pieUnSelect', + event: 'pieunselected', + method: 'unSelect' +}]); + +registerVisual(dataColor('pie')); +registerLayout(curry(pieLayout, 'pie')); +registerProcessor(dataFilter('pie')); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +SeriesModel.extend({ + + type: 'series.scatter', + + dependencies: ['grid', 'polar', 'geo', 'singleAxis', 'calendar'], + + getInitialData: function (option, ecModel) { + return createListFromArray(this.getSource(), this); + }, + + brushSelector: 'point', + + getProgressive: function () { + var progressive = this.option.progressive; + if (progressive == null) { + // PENDING + return this.option.large ? 5e3 : this.get('progressive'); + } + return progressive; + }, + + getProgressiveThreshold: function () { + var progressiveThreshold = this.option.progressiveThreshold; + if (progressiveThreshold == null) { + // PENDING + return this.option.large ? 1e4 : this.get('progressiveThreshold'); + } + return progressiveThreshold; + }, + + defaultOption: { + coordinateSystem: 'cartesian2d', + zlevel: 0, + z: 2, + legendHoverLink: true, + + hoverAnimation: true, + // Cartesian coordinate system + // xAxisIndex: 0, + // yAxisIndex: 0, + + // Polar coordinate system + // polarIndex: 0, + + // Geo coordinate system + // geoIndex: 0, + + // symbol: null, // 图形类型 + symbolSize: 10, // 图形大小,半宽(半径)参数,当图形为方向或菱形则总宽度为symbolSize * 2 + // symbolRotate: null, // 图形旋转控制 + + large: false, + // Available when large is true + largeThreshold: 2000, + // cursor: null, + + // label: { + // show: false + // distance: 5, + // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 + // position: 默认自适应,水平布局为'top',垂直布局为'right',可选为 + // 'inside'|'left'|'right'|'top'|'bottom' + // 默认使用全局文本样式,详见TEXTSTYLE + // }, + itemStyle: { + opacity: 0.8 + // color: 各异 + } + + // progressive: null + } + +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// TODO Batch by color + +var BOOST_SIZE_THRESHOLD = 4; + +var LargeSymbolPath = extendShape({ + + shape: { + points: null + }, + + symbolProxy: null, + + buildPath: function (path, shape) { + var points = shape.points; + var size = shape.size; + + var symbolProxy = this.symbolProxy; + var symbolProxyShape = symbolProxy.shape; + var ctx = path.getContext ? path.getContext() : path; + var canBoost = ctx && size[0] < BOOST_SIZE_THRESHOLD; + + // Do draw in afterBrush. + if (canBoost) { + return; + } + + for (var i = 0; i < points.length;) { + var x = points[i++]; + var y = points[i++]; + + if (isNaN(x) || isNaN(y)) { + continue; + } + + symbolProxyShape.x = x - size[0] / 2; + symbolProxyShape.y = y - size[1] / 2; + symbolProxyShape.width = size[0]; + symbolProxyShape.height = size[1]; + + symbolProxy.buildPath(path, symbolProxyShape, true); + } + }, + + afterBrush: function (ctx) { + var shape = this.shape; + var points = shape.points; + var size = shape.size; + var canBoost = size[0] < BOOST_SIZE_THRESHOLD; + + if (!canBoost) { + return; + } + + this.setTransform(ctx); + // PENDING If style or other canvas status changed? + for (var i = 0; i < points.length;) { + var x = points[i++]; + var y = points[i++]; + if (isNaN(x) || isNaN(y)) { + continue; + } + // fillRect is faster than building a rect path and draw. + // And it support light globalCompositeOperation. + ctx.fillRect( + x - size[0] / 2, y - size[1] / 2, + size[0], size[1] + ); + } + + this.restoreTransform(ctx); + }, + + findDataIndex: function (x, y) { + // TODO ??? + // Consider transform + + var shape = this.shape; + var points = shape.points; + var size = shape.size; + + var w = Math.max(size[0], 4); + var h = Math.max(size[1], 4); + + // Not consider transform + // Treat each element as a rect + // top down traverse + for (var idx = points.length / 2 - 1; idx >= 0; idx--) { + var i = idx * 2; + var x0 = points[i] - w / 2; + var y0 = points[i + 1] - h / 2; + if (x >= x0 && y >= y0 && x <= x0 + w && y <= y0 + h) { + return idx; + } + } + + return -1; + } +}); + +function LargeSymbolDraw() { + this.group = new Group(); +} + +var largeSymbolProto = LargeSymbolDraw.prototype; + +largeSymbolProto.isPersistent = function () { + return !this._incremental; +}; + +/** + * Update symbols draw by new data + * @param {module:echarts/data/List} data + */ +largeSymbolProto.updateData = function (data) { + this.group.removeAll(); + var symbolEl = new LargeSymbolPath({ + rectHover: true, + cursor: 'default' + }); + + symbolEl.setShape({ + points: data.getLayout('symbolPoints') + }); + this._setCommon(symbolEl, data); + this.group.add(symbolEl); + + this._incremental = null; +}; + +largeSymbolProto.updateLayout = function (data) { + if (this._incremental) { + return; + } + + var points = data.getLayout('symbolPoints'); + this.group.eachChild(function (child) { + if (child.startIndex != null) { + var len = (child.endIndex - child.startIndex) * 2; + var byteOffset = child.startIndex * 4 * 2; + points = new Float32Array(points.buffer, byteOffset, len); + } + child.setShape('points', points); + }); +}; + +largeSymbolProto.incrementalPrepareUpdate = function (data) { + this.group.removeAll(); + + this._clearIncremental(); + // Only use incremental displayables when data amount is larger than 2 million. + // PENDING Incremental data? + if (data.count() > 2e6) { + if (!this._incremental) { + this._incremental = new IncrementalDisplayble({ + silent: true + }); + } + this.group.add(this._incremental); + } + else { + this._incremental = null; + } +}; + +largeSymbolProto.incrementalUpdate = function (taskParams, data) { + var symbolEl; + if (this._incremental) { + symbolEl = new LargeSymbolPath(); + this._incremental.addDisplayable(symbolEl, true); + } + else { + symbolEl = new LargeSymbolPath({ + rectHover: true, + cursor: 'default', + startIndex: taskParams.start, + endIndex: taskParams.end + }); + symbolEl.incremental = true; + this.group.add(symbolEl); + } + + symbolEl.setShape({ + points: data.getLayout('symbolPoints') + }); + this._setCommon(symbolEl, data, !!this._incremental); +}; + +largeSymbolProto._setCommon = function (symbolEl, data, isIncremental) { + var hostModel = data.hostModel; + + // TODO + // if (data.hasItemVisual.symbolSize) { + // // TODO typed array? + // symbolEl.setShape('sizes', data.mapArray( + // function (idx) { + // var size = data.getItemVisual(idx, 'symbolSize'); + // return (size instanceof Array) ? size : [size, size]; + // } + // )); + // } + // else { + var size = data.getVisual('symbolSize'); + symbolEl.setShape('size', (size instanceof Array) ? size : [size, size]); + // } + + // Create symbolProxy to build path for each data + symbolEl.symbolProxy = createSymbol( + data.getVisual('symbol'), 0, 0, 0, 0 + ); + // Use symbolProxy setColor method + symbolEl.setColor = symbolEl.symbolProxy.setColor; + + var extrudeShadow = symbolEl.shape.size[0] < BOOST_SIZE_THRESHOLD; + symbolEl.useStyle( + // Draw shadow when doing fillRect is extremely slow. + hostModel.getModel('itemStyle').getItemStyle(extrudeShadow ? ['color', 'shadowBlur', 'shadowColor'] : ['color']) + ); + + var visualColor = data.getVisual('color'); + if (visualColor) { + symbolEl.setColor(visualColor); + } + + if (!isIncremental) { + // Enable tooltip + // PENDING May have performance issue when path is extremely large + symbolEl.seriesIndex = hostModel.seriesIndex; + symbolEl.on('mousemove', function (e) { + symbolEl.dataIndex = null; + var dataIndex = symbolEl.findDataIndex(e.offsetX, e.offsetY); + if (dataIndex >= 0) { + // Provide dataIndex for tooltip + symbolEl.dataIndex = dataIndex + (symbolEl.startIndex || 0); + } + }); + } +}; + +largeSymbolProto.remove = function () { + this._clearIncremental(); + this._incremental = null; + this.group.removeAll(); +}; + +largeSymbolProto._clearIncremental = function () { + var incremental = this._incremental; + if (incremental) { + incremental.clearDisplaybles(); + } +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +extendChartView({ + + type: 'scatter', + + render: function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + + var symbolDraw = this._updateSymbolDraw(data, seriesModel); + symbolDraw.updateData(data); + + this._finished = true; + }, + + incrementalPrepareRender: function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var symbolDraw = this._updateSymbolDraw(data, seriesModel); + + symbolDraw.incrementalPrepareUpdate(data); + + this._finished = false; + }, + + incrementalRender: function (taskParams, seriesModel, ecModel) { + this._symbolDraw.incrementalUpdate(taskParams, seriesModel.getData()); + + this._finished = taskParams.end === seriesModel.getData().count(); + }, + + updateTransform: function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + // Must mark group dirty and make sure the incremental layer will be cleared + // PENDING + this.group.dirty(); + + if (!this._finished || data.count() > 1e4 || !this._symbolDraw.isPersistent()) { + return { + update: true + }; + } + else { + var res = pointsLayout().reset(seriesModel); + if (res.progress) { + res.progress({ start: 0, end: data.count() }, data); + } + + this._symbolDraw.updateLayout(data); + } + }, + + _updateSymbolDraw: function (data, seriesModel) { + var symbolDraw = this._symbolDraw; + var pipelineContext = seriesModel.pipelineContext; + var isLargeDraw = pipelineContext.large; + + if (!symbolDraw || isLargeDraw !== this._isLargeDraw) { + symbolDraw && symbolDraw.remove(); + symbolDraw = this._symbolDraw = isLargeDraw + ? new LargeSymbolDraw() + : new SymbolDraw(); + this._isLargeDraw = isLargeDraw; + this.group.removeAll(); + } + + this.group.add(symbolDraw.group); + + return symbolDraw; + }, + + remove: function (ecModel, api) { + this._symbolDraw && this._symbolDraw.remove(true); + this._symbolDraw = null; + }, + + dispose: function () {} +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// import * as zrUtil from 'zrender/src/core/util'; + +// In case developer forget to include grid component +registerVisual(visualSymbol('scatter', 'circle')); +registerLayout(pointsLayout('scatter')); + +// echarts.registerProcessor(function (ecModel, api) { +// ecModel.eachSeriesByType('scatter', function (seriesModel) { +// var data = seriesModel.getData(); +// var coordSys = seriesModel.coordinateSystem; +// if (coordSys.type !== 'geo') { +// return; +// } +// var startPt = coordSys.pointToData([0, 0]); +// var endPt = coordSys.pointToData([api.getWidth(), api.getHeight()]); + +// var dims = zrUtil.map(coordSys.dimensions, function (dim) { +// return data.mapDimension(dim); +// }); +// var range = {}; +// range[dims[0]] = [Math.min(startPt[0], endPt[0]), Math.max(startPt[0], endPt[0])]; +// range[dims[1]] = [Math.min(startPt[1], endPt[1]), Math.max(startPt[1], endPt[1])]; + +// data.selectRange(range); +// }); +// }); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +function IndicatorAxis(dim, scale, radiusExtent) { + Axis.call(this, dim, scale, radiusExtent); + + /** + * Axis type + * - 'category' + * - 'value' + * - 'time' + * - 'log' + * @type {string} + */ + this.type = 'value'; + + this.angle = 0; + + /** + * Indicator name + * @type {string} + */ + this.name = ''; + /** + * @type {module:echarts/model/Model} + */ + this.model; +} + +inherits(IndicatorAxis, Axis); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// TODO clockwise + +function Radar(radarModel, ecModel, api) { + + this._model = radarModel; + /** + * Radar dimensions + * @type {Array.<string>} + */ + this.dimensions = []; + + this._indicatorAxes = map(radarModel.getIndicatorModels(), function (indicatorModel, idx) { + var dim = 'indicator_' + idx; + var indicatorAxis = new IndicatorAxis(dim, new IntervalScale()); + indicatorAxis.name = indicatorModel.get('name'); + // Inject model and axis + indicatorAxis.model = indicatorModel; + indicatorModel.axis = indicatorAxis; + this.dimensions.push(dim); + return indicatorAxis; + }, this); + + this.resize(radarModel, api); + + /** + * @type {number} + * @readOnly + */ + this.cx; + /** + * @type {number} + * @readOnly + */ + this.cy; + /** + * @type {number} + * @readOnly + */ + this.r; + /** + * @type {number} + * @readOnly + */ + this.startAngle; +} + +Radar.prototype.getIndicatorAxes = function () { + return this._indicatorAxes; +}; + +Radar.prototype.dataToPoint = function (value, indicatorIndex) { + var indicatorAxis = this._indicatorAxes[indicatorIndex]; + + return this.coordToPoint(indicatorAxis.dataToCoord(value), indicatorIndex); +}; + +Radar.prototype.coordToPoint = function (coord, indicatorIndex) { + var indicatorAxis = this._indicatorAxes[indicatorIndex]; + var angle = indicatorAxis.angle; + var x = this.cx + coord * Math.cos(angle); + var y = this.cy - coord * Math.sin(angle); + return [x, y]; +}; + +Radar.prototype.pointToData = function (pt) { + var dx = pt[0] - this.cx; + var dy = pt[1] - this.cy; + var radius = Math.sqrt(dx * dx + dy * dy); + dx /= radius; + dy /= radius; + + var radian = Math.atan2(-dy, dx); + + // Find the closest angle + // FIXME index can calculated directly + var minRadianDiff = Infinity; + var closestAxis; + var closestAxisIdx = -1; + for (var i = 0; i < this._indicatorAxes.length; i++) { + var indicatorAxis = this._indicatorAxes[i]; + var diff = Math.abs(radian - indicatorAxis.angle); + if (diff < minRadianDiff) { + closestAxis = indicatorAxis; + closestAxisIdx = i; + minRadianDiff = diff; + } + } + + return [closestAxisIdx, +(closestAxis && closestAxis.coodToData(radius))]; +}; + +Radar.prototype.resize = function (radarModel, api) { + var center = radarModel.get('center'); + var viewWidth = api.getWidth(); + var viewHeight = api.getHeight(); + var viewSize = Math.min(viewWidth, viewHeight) / 2; + this.cx = parsePercent$1(center[0], viewWidth); + this.cy = parsePercent$1(center[1], viewHeight); + + this.startAngle = radarModel.get('startAngle') * Math.PI / 180; + + this.r = parsePercent$1(radarModel.get('radius'), viewSize); + + each$1(this._indicatorAxes, function (indicatorAxis, idx) { + indicatorAxis.setExtent(0, this.r); + var angle = (this.startAngle + idx * Math.PI * 2 / this._indicatorAxes.length); + // Normalize to [-PI, PI] + angle = Math.atan2(Math.sin(angle), Math.cos(angle)); + indicatorAxis.angle = angle; + }, this); +}; + +Radar.prototype.update = function (ecModel, api) { + var indicatorAxes = this._indicatorAxes; + var radarModel = this._model; + each$1(indicatorAxes, function (indicatorAxis) { + indicatorAxis.scale.setExtent(Infinity, -Infinity); + }); + ecModel.eachSeriesByType('radar', function (radarSeries, idx) { + if (radarSeries.get('coordinateSystem') !== 'radar' + || ecModel.getComponent('radar', radarSeries.get('radarIndex')) !== radarModel + ) { + return; + } + var data = radarSeries.getData(); + each$1(indicatorAxes, function (indicatorAxis) { + indicatorAxis.scale.unionExtentFromData(data, data.mapDimension(indicatorAxis.dim)); + }); + }, this); + + var splitNumber = radarModel.get('splitNumber'); + + function increaseInterval(interval) { + var exp10 = Math.pow(10, Math.floor(Math.log(interval) / Math.LN10)); + // Increase interval + var f = interval / exp10; + if (f === 2) { + f = 5; + } + else { // f is 2 or 5 + f *= 2; + } + return f * exp10; + } + // Force all the axis fixing the maxSplitNumber. + each$1(indicatorAxes, function (indicatorAxis, idx) { + var rawExtent = getScaleExtent(indicatorAxis.scale, indicatorAxis.model); + niceScaleExtent(indicatorAxis.scale, indicatorAxis.model); + + var axisModel = indicatorAxis.model; + var scale = indicatorAxis.scale; + var fixedMin = axisModel.getMin(); + var fixedMax = axisModel.getMax(); + var interval = scale.getInterval(); + + if (fixedMin != null && fixedMax != null) { + // User set min, max, divide to get new interval + scale.setExtent(+fixedMin, +fixedMax); + scale.setInterval( + (fixedMax - fixedMin) / splitNumber + ); + } + else if (fixedMin != null) { + var max; + // User set min, expand extent on the other side + do { + max = fixedMin + interval * splitNumber; + scale.setExtent(+fixedMin, max); + // Interval must been set after extent + // FIXME + scale.setInterval(interval); + + interval = increaseInterval(interval); + } while (max < rawExtent[1] && isFinite(max) && isFinite(rawExtent[1])); + } + else if (fixedMax != null) { + var min; + // User set min, expand extent on the other side + do { + min = fixedMax - interval * splitNumber; + scale.setExtent(min, +fixedMax); + scale.setInterval(interval); + interval = increaseInterval(interval); + } while (min > rawExtent[0] && isFinite(min) && isFinite(rawExtent[0])); + } + else { + var nicedSplitNumber = scale.getTicks().length - 1; + if (nicedSplitNumber > splitNumber) { + interval = increaseInterval(interval); + } + // PENDING + var center = Math.round((rawExtent[0] + rawExtent[1]) / 2 / interval) * interval; + var halfSplitNumber = Math.round(splitNumber / 2); + scale.setExtent( + round$1(center - halfSplitNumber * interval), + round$1(center + (splitNumber - halfSplitNumber) * interval) + ); + scale.setInterval(interval); + } + }); +}; + +/** + * Radar dimensions is based on the data + * @type {Array} + */ +Radar.dimensions = []; + +Radar.create = function (ecModel, api) { + var radarList = []; + ecModel.eachComponent('radar', function (radarModel) { + var radar = new Radar(radarModel, ecModel, api); + radarList.push(radar); + radarModel.coordinateSystem = radar; + }); + ecModel.eachSeriesByType('radar', function (radarSeries) { + if (radarSeries.get('coordinateSystem') === 'radar') { + // Inject coordinate system + radarSeries.coordinateSystem = radarList[radarSeries.get('radarIndex') || 0]; + } + }); + return radarList; +}; + +CoordinateSystemManager.register('radar', Radar); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var valueAxisDefault = axisDefault.valueAxis; + +function defaultsShow(opt, show) { + return defaults({ + show: show + }, opt); +} + +var RadarModel = extendComponentModel({ + + type: 'radar', + + optionUpdated: function () { + var boundaryGap = this.get('boundaryGap'); + var splitNumber = this.get('splitNumber'); + var scale = this.get('scale'); + var axisLine = this.get('axisLine'); + var axisTick = this.get('axisTick'); + var axisLabel = this.get('axisLabel'); + var nameTextStyle = this.get('name'); + var showName = this.get('name.show'); + var nameFormatter = this.get('name.formatter'); + var nameGap = this.get('nameGap'); + var triggerEvent = this.get('triggerEvent'); + + var indicatorModels = map(this.get('indicator') || [], function (indicatorOpt) { + // PENDING + if (indicatorOpt.max != null && indicatorOpt.max > 0 && !indicatorOpt.min) { + indicatorOpt.min = 0; + } + else if (indicatorOpt.min != null && indicatorOpt.min < 0 && !indicatorOpt.max) { + indicatorOpt.max = 0; + } + var iNameTextStyle = nameTextStyle; + if(indicatorOpt.color != null) { + iNameTextStyle = defaults({color: indicatorOpt.color}, nameTextStyle); + } + // Use same configuration + indicatorOpt = merge(clone(indicatorOpt), { + boundaryGap: boundaryGap, + splitNumber: splitNumber, + scale: scale, + axisLine: axisLine, + axisTick: axisTick, + axisLabel: axisLabel, + // Competitable with 2 and use text + name: indicatorOpt.text, + nameLocation: 'end', + nameGap: nameGap, + // min: 0, + nameTextStyle: iNameTextStyle, + triggerEvent: triggerEvent + }, false); + if (!showName) { + indicatorOpt.name = ''; + } + if (typeof nameFormatter === 'string') { + var indName = indicatorOpt.name; + indicatorOpt.name = nameFormatter.replace('{value}', indName != null ? indName : ''); + } + else if (typeof nameFormatter === 'function') { + indicatorOpt.name = nameFormatter( + indicatorOpt.name, indicatorOpt + ); + } + var model = extend( + new Model(indicatorOpt, null, this.ecModel), + axisModelCommonMixin + ); + + // For triggerEvent. + model.mainType = 'radar'; + model.componentIndex = this.componentIndex; + + return model; + }, this); + + this.getIndicatorModels = function () { + return indicatorModels; + }; + }, + + defaultOption: { + + zlevel: 0, + + z: 0, + + center: ['50%', '50%'], + + radius: '75%', + + startAngle: 90, + + name: { + show: true + // formatter: null + // textStyle: {} + }, + + boundaryGap: [0, 0], + + splitNumber: 5, + + nameGap: 15, + + scale: false, + + // Polygon or circle + shape: 'polygon', + + axisLine: merge( + { + lineStyle: { + color: '#bbb' + } + }, + valueAxisDefault.axisLine + ), + axisLabel: defaultsShow(valueAxisDefault.axisLabel, false), + axisTick: defaultsShow(valueAxisDefault.axisTick, false), + splitLine: defaultsShow(valueAxisDefault.splitLine, true), + splitArea: defaultsShow(valueAxisDefault.splitArea, true), + + // {text, min, max} + indicator: [] + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var axisBuilderAttrs$1 = [ + 'axisLine', 'axisTickLabel', 'axisName' +]; + +extendComponentView({ + + type: 'radar', + + render: function (radarModel, ecModel, api) { + var group = this.group; + group.removeAll(); + + this._buildAxes(radarModel); + this._buildSplitLineAndArea(radarModel); + }, + + _buildAxes: function (radarModel) { + var radar = radarModel.coordinateSystem; + var indicatorAxes = radar.getIndicatorAxes(); + var axisBuilders = map(indicatorAxes, function (indicatorAxis) { + var axisBuilder = new AxisBuilder(indicatorAxis.model, { + position: [radar.cx, radar.cy], + rotation: indicatorAxis.angle, + labelDirection: -1, + tickDirection: -1, + nameDirection: 1 + }); + return axisBuilder; + }); + + each$1(axisBuilders, function (axisBuilder) { + each$1(axisBuilderAttrs$1, axisBuilder.add, axisBuilder); + this.group.add(axisBuilder.getGroup()); + }, this); + }, + + _buildSplitLineAndArea: function (radarModel) { + var radar = radarModel.coordinateSystem; + var indicatorAxes = radar.getIndicatorAxes(); + if (!indicatorAxes.length) { + return; + } + var shape = radarModel.get('shape'); + var splitLineModel = radarModel.getModel('splitLine'); + var splitAreaModel = radarModel.getModel('splitArea'); + var lineStyleModel = splitLineModel.getModel('lineStyle'); + var areaStyleModel = splitAreaModel.getModel('areaStyle'); + + var showSplitLine = splitLineModel.get('show'); + var showSplitArea = splitAreaModel.get('show'); + var splitLineColors = lineStyleModel.get('color'); + var splitAreaColors = areaStyleModel.get('color'); + + splitLineColors = isArray(splitLineColors) ? splitLineColors : [splitLineColors]; + splitAreaColors = isArray(splitAreaColors) ? splitAreaColors : [splitAreaColors]; + + var splitLines = []; + var splitAreas = []; + + function getColorIndex(areaOrLine, areaOrLineColorList, idx) { + var colorIndex = idx % areaOrLineColorList.length; + areaOrLine[colorIndex] = areaOrLine[colorIndex] || []; + return colorIndex; + } + + if (shape === 'circle') { + var ticksRadius = indicatorAxes[0].getTicksCoords(); + var cx = radar.cx; + var cy = radar.cy; + for (var i = 0; i < ticksRadius.length; i++) { + if (showSplitLine) { + var colorIndex = getColorIndex(splitLines, splitLineColors, i); + splitLines[colorIndex].push(new Circle({ + shape: { + cx: cx, + cy: cy, + r: ticksRadius[i].coord + } + })); + } + if (showSplitArea && i < ticksRadius.length - 1) { + var colorIndex = getColorIndex(splitAreas, splitAreaColors, i); + splitAreas[colorIndex].push(new Ring({ + shape: { + cx: cx, + cy: cy, + r0: ticksRadius[i].coord, + r: ticksRadius[i + 1].coord + } + })); + } + } + } + // Polyyon + else { + var realSplitNumber; + var axesTicksPoints = map(indicatorAxes, function (indicatorAxis, idx) { + var ticksCoords = indicatorAxis.getTicksCoords(); + realSplitNumber = realSplitNumber == null + ? ticksCoords.length - 1 + : Math.min(ticksCoords.length - 1, realSplitNumber); + return map(ticksCoords, function (tickCoord) { + return radar.coordToPoint(tickCoord.coord, idx); + }); + }); + + var prevPoints = []; + for (var i = 0; i <= realSplitNumber; i++) { + var points = []; + for (var j = 0; j < indicatorAxes.length; j++) { + points.push(axesTicksPoints[j][i]); + } + // Close + if (points[0]) { + points.push(points[0].slice()); + } + else { + if (__DEV__) { + console.error('Can\'t draw value axis ' + i); + } + } + + if (showSplitLine) { + var colorIndex = getColorIndex(splitLines, splitLineColors, i); + splitLines[colorIndex].push(new Polyline({ + shape: { + points: points + } + })); + } + if (showSplitArea && prevPoints) { + var colorIndex = getColorIndex(splitAreas, splitAreaColors, i - 1); + splitAreas[colorIndex].push(new Polygon({ + shape: { + points: points.concat(prevPoints) + } + })); + } + prevPoints = points.slice().reverse(); + } + } + + var lineStyle = lineStyleModel.getLineStyle(); + var areaStyle = areaStyleModel.getAreaStyle(); + // Add splitArea before splitLine + each$1(splitAreas, function (splitAreas, idx) { + this.group.add(mergePath( + splitAreas, { + style: defaults({ + stroke: 'none', + fill: splitAreaColors[idx % splitAreaColors.length] + }, areaStyle), + silent: true + } + )); + }, this); + + each$1(splitLines, function (splitLines, idx) { + this.group.add(mergePath( + splitLines, { + style: defaults({ + fill: 'none', + stroke: splitLineColors[idx % splitLineColors.length] + }, lineStyle), + silent: true + } + )); + }, this); + + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var RadarSeries = SeriesModel.extend({ + + type: 'series.radar', + + dependencies: ['radar'], + + + // Overwrite + init: function (option) { + RadarSeries.superApply(this, 'init', arguments); + + // Enable legend selection for each data item + // Use a function instead of direct access because data reference may changed + this.legendDataProvider = function () { + return this.getRawData(); + }; + }, + + getInitialData: function (option, ecModel) { + return createListSimply(this, { + generateCoord: 'indicator_', + generateCoordCount: Infinity + }); + }, + + formatTooltip: function (dataIndex) { + var data = this.getData(); + var coordSys = this.coordinateSystem; + var indicatorAxes = coordSys.getIndicatorAxes(); + var name = this.getData().getName(dataIndex); + return encodeHTML(name === '' ? this.name : name) + '<br/>' + + map(indicatorAxes, function (axis, idx) { + var val = data.get(data.mapDimension(axis.dim), dataIndex); + return encodeHTML(axis.name + ' : ' + val); + }).join('<br />'); + }, + + defaultOption: { + zlevel: 0, + z: 2, + coordinateSystem: 'radar', + legendHoverLink: true, + radarIndex: 0, + lineStyle: { + width: 2, + type: 'solid' + }, + label: { + position: 'top' + }, + // areaStyle: { + // }, + // itemStyle: {} + symbol: 'emptyCircle', + symbolSize: 4 + // symbolRotate: null + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +function normalizeSymbolSize(symbolSize) { + if (!isArray(symbolSize)) { + symbolSize = [+symbolSize, +symbolSize]; + } + return symbolSize; +} + +extendChartView({ + + type: 'radar', + + render: function (seriesModel, ecModel, api) { + var polar = seriesModel.coordinateSystem; + var group = this.group; + + var data = seriesModel.getData(); + var oldData = this._data; + + function createSymbol$$1(data, idx) { + var symbolType = data.getItemVisual(idx, 'symbol') || 'circle'; + var color = data.getItemVisual(idx, 'color'); + if (symbolType === 'none') { + return; + } + var symbolSize = normalizeSymbolSize( + data.getItemVisual(idx, 'symbolSize') + ); + var symbolPath = createSymbol( + symbolType, -1, -1, 2, 2, color + ); + symbolPath.attr({ + style: { + strokeNoScale: true + }, + z2: 100, + scale: [symbolSize[0] / 2, symbolSize[1] / 2] + }); + return symbolPath; + } + + function updateSymbols(oldPoints, newPoints, symbolGroup, data, idx, isInit) { + // Simply rerender all + symbolGroup.removeAll(); + for (var i = 0; i < newPoints.length - 1; i++) { + var symbolPath = createSymbol$$1(data, idx); + if (symbolPath) { + symbolPath.__dimIdx = i; + if (oldPoints[i]) { + symbolPath.attr('position', oldPoints[i]); + graphic[isInit ? 'initProps' : 'updateProps']( + symbolPath, { + position: newPoints[i] + }, seriesModel, idx + ); + } + else { + symbolPath.attr('position', newPoints[i]); + } + symbolGroup.add(symbolPath); + } + } + } + + function getInitialPoints(points) { + return map(points, function (pt) { + return [polar.cx, polar.cy]; + }); + } + data.diff(oldData) + .add(function (idx) { + var points = data.getItemLayout(idx); + if (!points) { + return; + } + var polygon = new Polygon(); + var polyline = new Polyline(); + var target = { + shape: { + points: points + } + }; + polygon.shape.points = getInitialPoints(points); + polyline.shape.points = getInitialPoints(points); + initProps(polygon, target, seriesModel, idx); + initProps(polyline, target, seriesModel, idx); + + var itemGroup = new Group(); + var symbolGroup = new Group(); + itemGroup.add(polyline); + itemGroup.add(polygon); + itemGroup.add(symbolGroup); + + updateSymbols( + polyline.shape.points, points, symbolGroup, data, idx, true + ); + + data.setItemGraphicEl(idx, itemGroup); + }) + .update(function (newIdx, oldIdx) { + var itemGroup = oldData.getItemGraphicEl(oldIdx); + var polyline = itemGroup.childAt(0); + var polygon = itemGroup.childAt(1); + var symbolGroup = itemGroup.childAt(2); + var target = { + shape: { + points: data.getItemLayout(newIdx) + } + }; + if (!target.shape.points) { + return; + } + updateSymbols( + polyline.shape.points, target.shape.points, symbolGroup, data, newIdx, false + ); + + updateProps(polyline, target, seriesModel); + updateProps(polygon, target, seriesModel); + + data.setItemGraphicEl(newIdx, itemGroup); + }) + .remove(function (idx) { + group.remove(oldData.getItemGraphicEl(idx)); + }) + .execute(); + + data.eachItemGraphicEl(function (itemGroup, idx) { + var itemModel = data.getItemModel(idx); + var polyline = itemGroup.childAt(0); + var polygon = itemGroup.childAt(1); + var symbolGroup = itemGroup.childAt(2); + var color = data.getItemVisual(idx, 'color'); + + group.add(itemGroup); + + polyline.useStyle( + defaults( + itemModel.getModel('lineStyle').getLineStyle(), + { + fill: 'none', + stroke: color + } + ) + ); + polyline.hoverStyle = itemModel.getModel('emphasis.lineStyle').getLineStyle(); + + var areaStyleModel = itemModel.getModel('areaStyle'); + var hoverAreaStyleModel = itemModel.getModel('emphasis.areaStyle'); + var polygonIgnore = areaStyleModel.isEmpty() && areaStyleModel.parentModel.isEmpty(); + var hoverPolygonIgnore = hoverAreaStyleModel.isEmpty() && hoverAreaStyleModel.parentModel.isEmpty(); + + hoverPolygonIgnore = hoverPolygonIgnore && polygonIgnore; + polygon.ignore = polygonIgnore; + + polygon.useStyle( + defaults( + areaStyleModel.getAreaStyle(), + { + fill: color, + opacity: 0.7 + } + ) + ); + polygon.hoverStyle = hoverAreaStyleModel.getAreaStyle(); + + var itemStyle = itemModel.getModel('itemStyle').getItemStyle(['color']); + var itemHoverStyle = itemModel.getModel('emphasis.itemStyle').getItemStyle(); + var labelModel = itemModel.getModel('label'); + var labelHoverModel = itemModel.getModel('emphasis.label'); + symbolGroup.eachChild(function (symbolPath) { + symbolPath.setStyle(itemStyle); + symbolPath.hoverStyle = clone(itemHoverStyle); + + setLabelStyle( + symbolPath.style, symbolPath.hoverStyle, labelModel, labelHoverModel, + { + labelFetcher: data.hostModel, + labelDataIndex: idx, + labelDimIndex: symbolPath.__dimIdx, + defaultText: data.get(data.dimensions[symbolPath.__dimIdx], idx), + autoColor: color, + isRectText: true + } + ); + }); + + function onEmphasis() { + polygon.attr('ignore', hoverPolygonIgnore); + } + + function onNormal() { + polygon.attr('ignore', polygonIgnore); + } + + itemGroup.off('mouseover').off('mouseout').off('normal').off('emphasis'); + itemGroup.on('emphasis', onEmphasis) + .on('mouseover', onEmphasis) + .on('normal', onNormal) + .on('mouseout', onNormal); + + setHoverStyle(itemGroup); + }); + + this._data = data; + }, + + remove: function () { + this.group.removeAll(); + this._data = null; + }, + + dispose: function () {} +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +var radarLayout = function (ecModel) { + ecModel.eachSeriesByType('radar', function (seriesModel) { + var data = seriesModel.getData(); + var points = []; + var coordSys = seriesModel.coordinateSystem; + if (!coordSys) { + return; + } + + function pointsConverter(val, idx) { + points[idx] = points[idx] || []; + points[idx][i] = coordSys.dataToPoint(val, i); + } + var axes = coordSys.getIndicatorAxes(); + for (var i = 0; i < axes.length; i++) { + data.each(data.mapDimension(axes[i].dim), pointsConverter); + } + + data.each(function (idx) { + // Close polygon + points[idx][0] && points[idx].push(points[idx][0].slice()); + data.setItemLayout(idx, points[idx]); + }); + }); +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// Backward compat for radar chart in 2 +var backwardCompat$1 = function (option) { + var polarOptArr = option.polar; + if (polarOptArr) { + if (!isArray(polarOptArr)) { + polarOptArr = [polarOptArr]; + } + var polarNotRadar = []; + each$1(polarOptArr, function (polarOpt, idx) { + if (polarOpt.indicator) { + if (polarOpt.type && !polarOpt.shape) { + polarOpt.shape = polarOpt.type; + } + option.radar = option.radar || []; + if (!isArray(option.radar)) { + option.radar = [option.radar]; + } + option.radar.push(polarOpt); + } + else { + polarNotRadar.push(polarOpt); + } + }); + option.polar = polarNotRadar; + } + each$1(option.series, function (seriesOpt) { + if (seriesOpt && seriesOpt.type === 'radar' && seriesOpt.polarIndex) { + seriesOpt.radarIndex = seriesOpt.polarIndex; + } + }); +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +// Must use radar component +registerVisual(dataColor('radar')); +registerVisual(visualSymbol('radar', 'circle')); +registerLayout(radarLayout); +registerProcessor(dataFilter('radar')); +registerPreprocessor(backwardCompat$1); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Simple view coordinate system + * Mapping given x, y to transformd view x, y + */ + +var v2ApplyTransform$1 = applyTransform; + +// Dummy transform node +function TransformDummy() { + Transformable.call(this); +} +mixin(TransformDummy, Transformable); + +function View(name) { + /** + * @type {string} + */ + this.name = name; + + /** + * @type {Object} + */ + this.zoomLimit; + + Transformable.call(this); + + this._roamTransformable = new TransformDummy(); + + this._rawTransformable = new TransformDummy(); + + this._center; + this._zoom; +} + +View.prototype = { + + constructor: View, + + type: 'view', + + /** + * @param {Array.<string>} + * @readOnly + */ + dimensions: ['x', 'y'], + + /** + * Set bounding rect + * @param {number} x + * @param {number} y + * @param {number} width + * @param {number} height + */ + + // PENDING to getRect + setBoundingRect: function (x, y, width, height) { + this._rect = new BoundingRect(x, y, width, height); + return this._rect; + }, + + /** + * @return {module:zrender/core/BoundingRect} + */ + // PENDING to getRect + getBoundingRect: function () { + return this._rect; + }, + + /** + * @param {number} x + * @param {number} y + * @param {number} width + * @param {number} height + */ + setViewRect: function (x, y, width, height) { + this.transformTo(x, y, width, height); + this._viewRect = new BoundingRect(x, y, width, height); + }, + + /** + * Transformed to particular position and size + * @param {number} x + * @param {number} y + * @param {number} width + * @param {number} height + */ + transformTo: function (x, y, width, height) { + var rect = this.getBoundingRect(); + var rawTransform = this._rawTransformable; + + rawTransform.transform = rect.calculateTransform( + new BoundingRect(x, y, width, height) + ); + + rawTransform.decomposeTransform(); + + this._updateTransform(); + }, + + /** + * Set center of view + * @param {Array.<number>} [centerCoord] + */ + setCenter: function (centerCoord) { + if (!centerCoord) { + return; + } + this._center = centerCoord; + + this._updateCenterAndZoom(); + }, + + /** + * @param {number} zoom + */ + setZoom: function (zoom) { + zoom = zoom || 1; + + var zoomLimit = this.zoomLimit; + if (zoomLimit) { + if (zoomLimit.max != null) { + zoom = Math.min(zoomLimit.max, zoom); + } + if (zoomLimit.min != null) { + zoom = Math.max(zoomLimit.min, zoom); + } + } + this._zoom = zoom; + + this._updateCenterAndZoom(); + }, + + /** + * Get default center without roam + */ + getDefaultCenter: function () { + // Rect before any transform + var rawRect = this.getBoundingRect(); + var cx = rawRect.x + rawRect.width / 2; + var cy = rawRect.y + rawRect.height / 2; + + return [cx, cy]; + }, + + getCenter: function () { + return this._center || this.getDefaultCenter(); + }, + + getZoom: function () { + return this._zoom || 1; + }, + + /** + * @return {Array.<number} + */ + getRoamTransform: function () { + return this._roamTransformable.getLocalTransform(); + }, + + /** + * Remove roam + */ + + _updateCenterAndZoom: function () { + // Must update after view transform updated + var rawTransformMatrix = this._rawTransformable.getLocalTransform(); + var roamTransform = this._roamTransformable; + var defaultCenter = this.getDefaultCenter(); + var center = this.getCenter(); + var zoom = this.getZoom(); + + center = applyTransform([], center, rawTransformMatrix); + defaultCenter = applyTransform([], defaultCenter, rawTransformMatrix); + + roamTransform.origin = center; + roamTransform.position = [ + defaultCenter[0] - center[0], + defaultCenter[1] - center[1] + ]; + roamTransform.scale = [zoom, zoom]; + + this._updateTransform(); + }, + + /** + * Update transform from roam and mapLocation + * @private + */ + _updateTransform: function () { + var roamTransformable = this._roamTransformable; + var rawTransformable = this._rawTransformable; + + rawTransformable.parent = roamTransformable; + roamTransformable.updateTransform(); + rawTransformable.updateTransform(); + + copy$1(this.transform || (this.transform = []), rawTransformable.transform || create$1()); + + this._rawTransform = rawTransformable.getLocalTransform(); + + this.invTransform = this.invTransform || []; + invert(this.invTransform, this.transform); + + this.decomposeTransform(); + }, + + /** + * @return {module:zrender/core/BoundingRect} + */ + getViewRect: function () { + return this._viewRect; + }, + + /** + * Get view rect after roam transform + * @return {module:zrender/core/BoundingRect} + */ + getViewRectAfterRoam: function () { + var rect = this.getBoundingRect().clone(); + rect.applyTransform(this.transform); + return rect; + }, + + /** + * Convert a single (lon, lat) data item to (x, y) point. + * @param {Array.<number>} data + * @param {boolean} noRoam + * @param {Array.<number>} [out] + * @return {Array.<number>} + */ + dataToPoint: function (data, noRoam, out) { + var transform = noRoam ? this._rawTransform : this.transform; + out = out || []; + return transform + ? v2ApplyTransform$1(out, data, transform) + : copy(out, data); + }, + + /** + * Convert a (x, y) point to (lon, lat) data + * @param {Array.<number>} point + * @return {Array.<number>} + */ + pointToData: function (point) { + var invTransform = this.invTransform; + return invTransform + ? v2ApplyTransform$1([], point, invTransform) + : [point[0], point[1]]; + }, + + /** + * @implements + * see {module:echarts/CoodinateSystem} + */ + convertToPixel: curry(doConvert$1, 'dataToPoint'), + + /** + * @implements + * see {module:echarts/CoodinateSystem} + */ + convertFromPixel: curry(doConvert$1, 'pointToData'), + + /** + * @implements + * see {module:echarts/CoodinateSystem} + */ + containPoint: function (point) { + return this.getViewRectAfterRoam().contain(point[0], point[1]); + } + + /** + * @return {number} + */ + // getScalarScale: function () { + // // Use determinant square root of transform to mutiply scalar + // var m = this.transform; + // var det = Math.sqrt(Math.abs(m[0] * m[3] - m[2] * m[1])); + // return det; + // } +}; + +mixin(View, Transformable); + +function doConvert$1(methodName, ecModel, finder, value) { + var seriesModel = finder.seriesModel; + var coordSys = seriesModel ? seriesModel.coordinateSystem : null; // e.g., graph. + return coordSys === this ? coordSys[methodName](value) : null; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// Fix for 南海诸岛 + +var geoCoord = [126, 25]; + +var points$1 = [ + [[0,3.5],[7,11.2],[15,11.9],[30,7],[42,0.7],[52,0.7], + [56,7.7],[59,0.7],[64,0.7],[64,0],[5,0],[0,3.5]], + [[13,16.1],[19,14.7],[16,21.7],[11,23.1],[13,16.1]], + [[12,32.2],[14,38.5],[15,38.5],[13,32.2],[12,32.2]], + [[16,47.6],[12,53.2],[13,53.2],[18,47.6],[16,47.6]], + [[6,64.4],[8,70],[9,70],[8,64.4],[6,64.4]], + [[23,82.6],[29,79.8],[30,79.8],[25,82.6],[23,82.6]], + [[37,70.7],[43,62.3],[44,62.3],[39,70.7],[37,70.7]], + [[48,51.1],[51,45.5],[53,45.5],[50,51.1],[48,51.1]], + [[51,35],[51,28.7],[53,28.7],[53,35],[51,35]], + [[52,22.4],[55,17.5],[56,17.5],[53,22.4],[52,22.4]], + [[58,12.6],[62,7],[63,7],[60,12.6],[58,12.6]], + [[0,3.5],[0,93.1],[64,93.1],[64,0],[63,0],[63,92.4], + [1,92.4],[1,3.5],[0,3.5]] +]; + +for (var i$1 = 0; i$1 < points$1.length; i$1++) { + for (var k = 0; k < points$1[i$1].length; k++) { + points$1[i$1][k][0] /= 10.5; + points$1[i$1][k][1] /= -10.5 / 0.75; + + points$1[i$1][k][0] += geoCoord[0]; + points$1[i$1][k][1] += geoCoord[1]; + } +} + +var fixNanhai = function (geo) { + if (geo.map === 'china') { + geo.regions.push(new Region( + '南海诸岛', + map(points$1, function (exterior) { + return { + type: 'polygon', + exterior: exterior + }; + }), geoCoord + )); + } +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var coordsOffsetMap = { + '南海诸岛' : [32, 80], + // 全国 + '广东': [0, -10], + '香港': [10, 5], + '澳门': [-10, 10], + //'北京': [-10, 0], + '天津': [5, 5] +}; + +var fixTextCoord = function (geo) { + each$1(geo.regions, function (region) { + var coordFix = coordsOffsetMap[region.name]; + if (coordFix) { + var cp = region.center; + cp[0] += coordFix[0] / 10.5; + cp[1] += -coordFix[1] / (10.5 / 0.75); + } + }); +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var geoCoordMap = { + 'Russia': [100, 60], + 'United States': [-99, 38], + 'United States of America': [-99, 38] +}; + +var fixGeoCoord = function (geo) { + each$1(geo.regions, function (region) { + var geoCoord = geoCoordMap[region.name]; + if (geoCoord) { + var cp = region.center; + cp[0] = geoCoord[0]; + cp[1] = geoCoord[1]; + } + }); +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// Fix for 钓鱼岛 + +// var Region = require('../Region'); +// var zrUtil = require('zrender/src/core/util'); + +// var geoCoord = [126, 25]; + +var points$2 = [ + [ + [123.45165252685547, 25.73527164402261], + [123.49731445312499, 25.73527164402261], + [123.49731445312499, 25.750734064600884], + [123.45165252685547, 25.750734064600884], + [123.45165252685547, 25.73527164402261] + ] +]; + +var fixDiaoyuIsland = function (geo) { + if (geo.map === 'china') { + for (var i = 0, len = geo.regions.length; i < len; ++i) { + if (geo.regions[i].name === '台湾') { + geo.regions[i].geometries.push({ + type: 'polygon', + exterior: points$2[0] + }); + } + } + } +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// Geo fix functions +var geoFixFuncs = [ + fixNanhai, + fixTextCoord, + fixGeoCoord, + fixDiaoyuIsland +]; + +/** + * [Geo description] + * @param {string} name Geo name + * @param {string} map Map type + * @param {Object} geoJson + * @param {Object} [specialAreas] + * Specify the positioned areas by left, top, width, height + * @param {Object.<string, string>} [nameMap] + * Specify name alias + */ +function Geo(name, map$$1, geoJson, specialAreas, nameMap) { + + View.call(this, name); + + /** + * Map type + * @type {string} + */ + this.map = map$$1; + + this._nameCoordMap = createHashMap(); + + this.loadGeoJson(geoJson, specialAreas, nameMap); +} + +Geo.prototype = { + + constructor: Geo, + + type: 'geo', + + /** + * @param {Array.<string>} + * @readOnly + */ + dimensions: ['lng', 'lat'], + + /** + * If contain given lng,lat coord + * @param {Array.<number>} + * @readOnly + */ + containCoord: function (coord) { + var regions = this.regions; + for (var i = 0; i < regions.length; i++) { + if (regions[i].contain(coord)) { + return true; + } + } + return false; + }, + /** + * @param {Object} geoJson + * @param {Object} [specialAreas] + * Specify the positioned areas by left, top, width, height + * @param {Object.<string, string>} [nameMap] + * Specify name alias + */ + loadGeoJson: function (geoJson, specialAreas, nameMap) { + // https://jsperf.com/try-catch-performance-overhead + try { + this.regions = geoJson ? parseGeoJson$1(geoJson) : []; + } + catch (e) { + throw 'Invalid geoJson format\n' + e.message; + } + specialAreas = specialAreas || {}; + nameMap = nameMap || {}; + var regions = this.regions; + var regionsMap = createHashMap(); + for (var i = 0; i < regions.length; i++) { + var regionName = regions[i].name; + // Try use the alias in nameMap + regionName = nameMap.hasOwnProperty(regionName) ? nameMap[regionName] : regionName; + regions[i].name = regionName; + + regionsMap.set(regionName, regions[i]); + // Add geoJson + this.addGeoCoord(regionName, regions[i].center); + + // Some area like Alaska in USA map needs to be tansformed + // to look better + var specialArea = specialAreas[regionName]; + if (specialArea) { + regions[i].transformTo( + specialArea.left, specialArea.top, specialArea.width, specialArea.height + ); + } + } + + this._regionsMap = regionsMap; + + this._rect = null; + + each$1(geoFixFuncs, function (fixFunc) { + fixFunc(this); + }, this); + }, + + // Overwrite + transformTo: function (x, y, width, height) { + var rect = this.getBoundingRect(); + + rect = rect.clone(); + // Longitute is inverted + rect.y = -rect.y - rect.height; + + var rawTransformable = this._rawTransformable; + + rawTransformable.transform = rect.calculateTransform( + new BoundingRect(x, y, width, height) + ); + + rawTransformable.decomposeTransform(); + + var scale = rawTransformable.scale; + scale[1] = -scale[1]; + + rawTransformable.updateTransform(); + + this._updateTransform(); + }, + + /** + * @param {string} name + * @return {module:echarts/coord/geo/Region} + */ + getRegion: function (name) { + return this._regionsMap.get(name); + }, + + getRegionByCoord: function (coord) { + var regions = this.regions; + for (var i = 0; i < regions.length; i++) { + if (regions[i].contain(coord)) { + return regions[i]; + } + } + }, + + /** + * Add geoCoord for indexing by name + * @param {string} name + * @param {Array.<number>} geoCoord + */ + addGeoCoord: function (name, geoCoord) { + this._nameCoordMap.set(name, geoCoord); + }, + + /** + * Get geoCoord by name + * @param {string} name + * @return {Array.<number>} + */ + getGeoCoord: function (name) { + return this._nameCoordMap.get(name); + }, + + // Overwrite + getBoundingRect: function () { + if (this._rect) { + return this._rect; + } + var rect; + + var regions = this.regions; + for (var i = 0; i < regions.length; i++) { + var regionRect = regions[i].getBoundingRect(); + rect = rect || regionRect.clone(); + rect.union(regionRect); + } + // FIXME Always return new ? + return (this._rect = rect || new BoundingRect(0, 0, 0, 0)); + }, + + /** + * @param {string|Array.<number>} data + * @param {boolean} noRoam + * @param {Array.<number>} [out] + * @return {Array.<number>} + */ + dataToPoint: function (data, noRoam, out) { + if (typeof data === 'string') { + // Map area name to geoCoord + data = this.getGeoCoord(data); + } + if (data) { + return View.prototype.dataToPoint.call(this, data, noRoam, out); + } + }, + + /** + * @inheritDoc + */ + convertToPixel: curry(doConvert, 'dataToPoint'), + + /** + * @inheritDoc + */ + convertFromPixel: curry(doConvert, 'pointToData') + +}; + +mixin(Geo, View); + +function doConvert(methodName, ecModel, finder, value) { + var geoModel = finder.geoModel; + var seriesModel = finder.seriesModel; + + var coordSys = geoModel + ? geoModel.coordinateSystem + : seriesModel + ? ( + seriesModel.coordinateSystem // For map. + || (seriesModel.getReferringComponents('geo')[0] || {}).coordinateSystem + ) + : null; + + return coordSys === this ? coordSys[methodName](value) : null; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Resize method bound to the geo + * @param {module:echarts/coord/geo/GeoModel|module:echarts/chart/map/MapModel} geoModel + * @param {module:echarts/ExtensionAPI} api + */ +function resizeGeo(geoModel, api) { + + var boundingCoords = geoModel.get('boundingCoords'); + if (boundingCoords != null) { + var leftTop = boundingCoords[0]; + var rightBottom = boundingCoords[1]; + if (isNaN(leftTop[0]) || isNaN(leftTop[1]) || isNaN(rightBottom[0]) || isNaN(rightBottom[1])) { + if (__DEV__) { + console.error('Invalid boundingCoords'); + } + } + else { + this.setBoundingRect(leftTop[0], leftTop[1], rightBottom[0] - leftTop[0], rightBottom[1] - leftTop[1]); + } + } + + var rect = this.getBoundingRect(); + + var boxLayoutOption; + + var center = geoModel.get('layoutCenter'); + var size = geoModel.get('layoutSize'); + + var viewWidth = api.getWidth(); + var viewHeight = api.getHeight(); + + var aspectScale = geoModel.get('aspectScale') || 0.75; + var aspect = rect.width / rect.height * aspectScale; + + var useCenterAndSize = false; + + if (center && size) { + center = [ + parsePercent$1(center[0], viewWidth), + parsePercent$1(center[1], viewHeight) + ]; + size = parsePercent$1(size, Math.min(viewWidth, viewHeight)); + + if (!isNaN(center[0]) && !isNaN(center[1]) && !isNaN(size)) { + useCenterAndSize = true; + } + else { + if (__DEV__) { + console.warn('Given layoutCenter or layoutSize data are invalid. Use left/top/width/height instead.'); + } + } + } + + var viewRect; + if (useCenterAndSize) { + var viewRect = {}; + if (aspect > 1) { + // Width is same with size + viewRect.width = size; + viewRect.height = size / aspect; + } + else { + viewRect.height = size; + viewRect.width = size * aspect; + } + viewRect.y = center[1] - viewRect.height / 2; + viewRect.x = center[0] - viewRect.width / 2; + } + else { + // Use left/top/width/height + boxLayoutOption = geoModel.getBoxLayoutParams(); + + // 0.75 rate + boxLayoutOption.aspect = aspect; + + viewRect = getLayoutRect(boxLayoutOption, { + width: viewWidth, + height: viewHeight + }); + } + + this.setViewRect(viewRect.x, viewRect.y, viewRect.width, viewRect.height); + + this.setCenter(geoModel.get('center')); + this.setZoom(geoModel.get('zoom')); +} + +/** + * @param {module:echarts/coord/Geo} geo + * @param {module:echarts/model/Model} model + * @inner + */ +function setGeoCoords(geo, model) { + each$1(model.get('geoCoord'), function (geoCoord, name) { + geo.addGeoCoord(name, geoCoord); + }); +} + +if (__DEV__) { + var mapNotExistsError = function (name) { + console.error('Map ' + name + ' not exists. You can download map file on http://echarts.baidu.com/download-map.html'); + }; +} + +var geoCreator = { + + // For deciding which dimensions to use when creating list data + dimensions: Geo.prototype.dimensions, + + create: function (ecModel, api) { + var geoList = []; + + // FIXME Create each time may be slow + ecModel.eachComponent('geo', function (geoModel, idx) { + var name = geoModel.get('map'); + var mapData = getMap(name); + if (__DEV__) { + if (!mapData) { + mapNotExistsError(name); + } + } + var geo = new Geo( + name + idx, name, + mapData && mapData.geoJson, mapData && mapData.specialAreas, + geoModel.get('nameMap') + ); + geo.zoomLimit = geoModel.get('scaleLimit'); + geoList.push(geo); + + setGeoCoords(geo, geoModel); + + geoModel.coordinateSystem = geo; + geo.model = geoModel; + + // Inject resize method + geo.resize = resizeGeo; + + geo.resize(geoModel, api); + }); + + ecModel.eachSeries(function (seriesModel) { + var coordSys = seriesModel.get('coordinateSystem'); + if (coordSys === 'geo') { + var geoIndex = seriesModel.get('geoIndex') || 0; + seriesModel.coordinateSystem = geoList[geoIndex]; + } + }); + + // If has map series + var mapModelGroupBySeries = {}; + + ecModel.eachSeriesByType('map', function (seriesModel) { + if (!seriesModel.getHostGeoModel()) { + var mapType = seriesModel.getMapType(); + mapModelGroupBySeries[mapType] = mapModelGroupBySeries[mapType] || []; + mapModelGroupBySeries[mapType].push(seriesModel); + } + }); + + each$1(mapModelGroupBySeries, function (mapSeries, mapType) { + var mapData = getMap(mapType); + if (__DEV__) { + if (!mapData) { + mapNotExistsError(mapSeries[0].get('map')); + } + } + + var nameMapList = map(mapSeries, function (singleMapSeries) { + return singleMapSeries.get('nameMap'); + }); + var geo = new Geo( + mapType, mapType, + mapData && mapData.geoJson, mapData && mapData.specialAreas, + mergeAll(nameMapList) + ); + geo.zoomLimit = retrieve.apply(null, map(mapSeries, function (singleMapSeries) { + return singleMapSeries.get('scaleLimit'); + })); + geoList.push(geo); + + // Inject resize method + geo.resize = resizeGeo; + + geo.resize(mapSeries[0], api); + + each$1(mapSeries, function (singleMapSeries) { + singleMapSeries.coordinateSystem = geo; + + setGeoCoords(geo, singleMapSeries); + }); + }); + + return geoList; + }, + + /** + * Fill given regions array + * @param {Array.<Object>} originRegionArr + * @param {string} mapName + * @param {Object} [nameMap] + * @return {Array} + */ + getFilledRegions: function (originRegionArr, mapName, nameMap) { + // Not use the original + var regionsArr = (originRegionArr || []).slice(); + nameMap = nameMap || {}; + + var map$$1 = getMap(mapName); + var geoJson = map$$1 && map$$1.geoJson; + if (!geoJson) { + if (__DEV__) { + mapNotExistsError(mapName); + } + return originRegionArr; + } + + var dataNameMap = createHashMap(); + var features = geoJson.features; + for (var i = 0; i < regionsArr.length; i++) { + dataNameMap.set(regionsArr[i].name, regionsArr[i]); + } + + for (var i = 0; i < features.length; i++) { + var name = features[i].properties.name; + if (!dataNameMap.get(name)) { + if (nameMap.hasOwnProperty(name)) { + name = nameMap[name]; + } + regionsArr.push({ + name: name + }); + } + } + return regionsArr; + } +}; + +registerCoordinateSystem('geo', geoCreator); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var MapSeries = SeriesModel.extend({ + + type: 'series.map', + + dependencies: ['geo'], + + layoutMode: 'box', + + /** + * Only first map series of same mapType will drawMap + * @type {boolean} + */ + needsDrawMap: false, + + /** + * Group of all map series with same mapType + * @type {boolean} + */ + seriesGroup: [], + + init: function (option) { + + // this._fillOption(option, this.getMapType()); + // this.option = option; + + MapSeries.superApply(this, 'init', arguments); + + this.updateSelectedMap(this._createSelectableList()); + }, + + getInitialData: function (option) { + return createListSimply(this, ['value']); + }, + + mergeOption: function (newOption) { + // this._fillOption(newOption, this.getMapType()); + + MapSeries.superApply(this, 'mergeOption', arguments); + + this.updateSelectedMap(this._createSelectableList()); + }, + + _createSelectableList: function () { + var data = this.getRawData(); + var valueDim = data.mapDimension('value'); + var targetList = []; + for (var i = 0, len = data.count(); i < len; i++) { + targetList.push({ + name: data.getName(i), + value: data.get(valueDim, i), + selected: retrieveRawAttr(data, i, 'selected') + }); + } + + targetList = geoCreator.getFilledRegions(targetList, this.getMapType(), this.option.nameMap); + + return targetList; + }, + + /** + * If no host geo model, return null, which means using a + * inner exclusive geo model. + */ + getHostGeoModel: function () { + var geoIndex = this.option.geoIndex; + return geoIndex != null + ? this.dependentModels.geo[geoIndex] + : null; + }, + + getMapType: function () { + return (this.getHostGeoModel() || this).option.map; + }, + + _fillOption: function (option, mapName) { + // Shallow clone + // option = zrUtil.extend({}, option); + + // option.data = geoCreator.getFilledRegions(option.data, mapName, option.nameMap); + + // return option; + }, + + getRawValue: function (dataIndex) { + // Use value stored in data instead because it is calculated from multiple series + // FIXME Provide all value of multiple series ? + var data = this.getData(); + return data.get(data.mapDimension('value'), dataIndex); + }, + + /** + * Get model of region + * @param {string} name + * @return {module:echarts/model/Model} + */ + getRegionModel: function (regionName) { + var data = this.getData(); + return data.getItemModel(data.indexOfName(regionName)); + }, + + /** + * Map tooltip formatter + * + * @param {number} dataIndex + */ + formatTooltip: function (dataIndex) { + // FIXME orignalData and data is a bit confusing + var data = this.getData(); + var formattedValue = addCommas(this.getRawValue(dataIndex)); + var name = data.getName(dataIndex); + + var seriesGroup = this.seriesGroup; + var seriesNames = []; + for (var i = 0; i < seriesGroup.length; i++) { + var otherIndex = seriesGroup[i].originalData.indexOfName(name); + var valueDim = data.mapDimension('value'); + if (!isNaN(seriesGroup[i].originalData.get(valueDim, otherIndex))) { + seriesNames.push( + encodeHTML(seriesGroup[i].name) + ); + } + } + + return seriesNames.join(', ') + '<br />' + + encodeHTML(name + ' : ' + formattedValue); + }, + + /** + * @implement + */ + getTooltipPosition: function (dataIndex) { + if (dataIndex != null) { + var name = this.getData().getName(dataIndex); + var geo = this.coordinateSystem; + var region = geo.getRegion(name); + + return region && geo.dataToPoint(region.center); + } + }, + + setZoom: function (zoom) { + this.option.zoom = zoom; + }, + + setCenter: function (center) { + this.option.center = center; + }, + + defaultOption: { + // 一级层叠 + zlevel: 0, + // 二级层叠 + z: 2, + + coordinateSystem: 'geo', + + // map should be explicitly specified since ec3. + map: '', + + // If `geoIndex` is not specified, a exclusive geo will be + // created. Otherwise use the specified geo component, and + // `map` and `mapType` are ignored. + // geoIndex: 0, + + // 'center' | 'left' | 'right' | 'x%' | {number} + left: 'center', + // 'center' | 'top' | 'bottom' | 'x%' | {number} + top: 'center', + // right + // bottom + // width: + // height + + // Aspect is width / height. Inited to be geoJson bbox aspect + // This parameter is used for scale this aspect + aspectScale: 0.75, + + ///// Layout with center and size + // If you wan't to put map in a fixed size box with right aspect ratio + // This two properties may more conveninet + // layoutCenter: [50%, 50%] + // layoutSize: 100 + + + // 数值合并方式,默认加和,可选为: + // 'sum' | 'average' | 'max' | 'min' + // mapValueCalculation: 'sum', + // 地图数值计算结果小数精度 + // mapValuePrecision: 0, + + + // 显示图例颜色标识(系列标识的小圆点),图例开启时有效 + showLegendSymbol: true, + // 选择模式,默认关闭,可选single,multiple + // selectedMode: false, + dataRangeHoverLink: true, + // 是否开启缩放及漫游模式 + // roam: false, + + // Define left-top, right-bottom coords to control view + // For example, [ [180, 90], [-180, -90] ], + // higher priority than center and zoom + boundingCoords: null, + + // Default on center of map + center: null, + + zoom: 1, + + scaleLimit: null, + + label: { + show: false, + color: '#000' + }, + // scaleLimit: null, + itemStyle: { + borderWidth: 0.5, + borderColor: '#444', + areaColor: '#eee' + }, + + emphasis: { + label: { + show: true, + color: 'rgb(100,0,0)' + }, + itemStyle: { + areaColor: 'rgba(255,215,0,0.8)' + } + } + } + +}); + +mixin(MapSeries, selectableMixin); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var ATTR = '\0_ec_interaction_mutex'; + +function take(zr, resourceKey, userKey) { + var store = getStore(zr); + store[resourceKey] = userKey; +} + +function release(zr, resourceKey, userKey) { + var store = getStore(zr); + var uKey = store[resourceKey]; + + if (uKey === userKey) { + store[resourceKey] = null; + } +} + +function isTaken(zr, resourceKey) { + return !!getStore(zr)[resourceKey]; +} + +function getStore(zr) { + return zr[ATTR] || (zr[ATTR] = {}); +} + +/** + * payload: { + * type: 'takeGlobalCursor', + * key: 'dataZoomSelect', or 'brush', or ..., + * If no userKey, release global cursor. + * } + */ +registerAction( + {type: 'takeGlobalCursor', event: 'globalCursorTaken', update: 'update'}, + function () {} +); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @alias module:echarts/component/helper/RoamController + * @constructor + * @mixin {module:zrender/mixin/Eventful} + * + * @param {module:zrender/zrender~ZRender} zr + */ +function RoamController(zr) { + + /** + * @type {Function} + */ + this.pointerChecker; + + /** + * @type {module:zrender} + */ + this._zr = zr; + + /** + * @type {Object} + */ + this._opt = {}; + + // Avoid two roamController bind the same handler + var bind$$1 = bind; + var mousedownHandler = bind$$1(mousedown, this); + var mousemoveHandler = bind$$1(mousemove, this); + var mouseupHandler = bind$$1(mouseup, this); + var mousewheelHandler = bind$$1(mousewheel, this); + var pinchHandler = bind$$1(pinch, this); + + Eventful.call(this); + + /** + * @param {Function} pointerChecker + * input: x, y + * output: boolean + */ + this.setPointerChecker = function (pointerChecker) { + this.pointerChecker = pointerChecker; + }; + + /** + * Notice: only enable needed types. For example, if 'zoom' + * is not needed, 'zoom' should not be enabled, otherwise + * default mousewheel behaviour (scroll page) will be disabled. + * + * @param {boolean|string} [controlType=true] Specify the control type, + * which can be null/undefined or true/false + * or 'pan/move' or 'zoom'/'scale' + * @param {Object} [opt] + * @param {Object} [opt.zoomOnMouseWheel=true] + * @param {Object} [opt.moveOnMouseMove=true] + * @param {Object} [opt.preventDefaultMouseMove=true] When pan. + */ + this.enable = function (controlType, opt) { + + // Disable previous first + this.disable(); + + this._opt = defaults(clone(opt) || {}, { + zoomOnMouseWheel: true, + moveOnMouseMove: true, + preventDefaultMouseMove: true + }); + + if (controlType == null) { + controlType = true; + } + + if (controlType === true || (controlType === 'move' || controlType === 'pan')) { + zr.on('mousedown', mousedownHandler); + zr.on('mousemove', mousemoveHandler); + zr.on('mouseup', mouseupHandler); + } + if (controlType === true || (controlType === 'scale' || controlType === 'zoom')) { + zr.on('mousewheel', mousewheelHandler); + zr.on('pinch', pinchHandler); + } + }; + + this.disable = function () { + zr.off('mousedown', mousedownHandler); + zr.off('mousemove', mousemoveHandler); + zr.off('mouseup', mouseupHandler); + zr.off('mousewheel', mousewheelHandler); + zr.off('pinch', pinchHandler); + }; + + this.dispose = this.disable; + + this.isDragging = function () { + return this._dragging; + }; + + this.isPinching = function () { + return this._pinching; + }; +} + +mixin(RoamController, Eventful); + + +function mousedown(e) { + if (notLeftMouse(e) + || (e.target && e.target.draggable) + ) { + return; + } + + var x = e.offsetX; + var y = e.offsetY; + + // Only check on mosedown, but not mousemove. + // Mouse can be out of target when mouse moving. + if (this.pointerChecker && this.pointerChecker(e, x, y)) { + this._x = x; + this._y = y; + this._dragging = true; + } +} + +function mousemove(e) { + if (notLeftMouse(e) + || !checkKeyBinding(this, 'moveOnMouseMove', e) + || !this._dragging + || e.gestureEvent === 'pinch' + || isTaken(this._zr, 'globalPan') + ) { + return; + } + + var x = e.offsetX; + var y = e.offsetY; + + var oldX = this._x; + var oldY = this._y; + + var dx = x - oldX; + var dy = y - oldY; + + this._x = x; + this._y = y; + + this._opt.preventDefaultMouseMove && stop(e.event); + + this.trigger('pan', dx, dy, oldX, oldY, x, y); +} + +function mouseup(e) { + if (!notLeftMouse(e)) { + this._dragging = false; + } +} + +function mousewheel(e) { + // wheelDelta maybe -0 in chrome mac. + if (!checkKeyBinding(this, 'zoomOnMouseWheel', e) || e.wheelDelta === 0) { + return; + } + + // Convenience: + // Mac and VM Windows on Mac: scroll up: zoom out. + // Windows: scroll up: zoom in. + var zoomDelta = e.wheelDelta > 0 ? 1.1 : 1 / 1.1; + zoom.call(this, e, zoomDelta, e.offsetX, e.offsetY); +} + +function pinch(e) { + if (isTaken(this._zr, 'globalPan')) { + return; + } + var zoomDelta = e.pinchScale > 1 ? 1.1 : 1 / 1.1; + zoom.call(this, e, zoomDelta, e.pinchX, e.pinchY); +} + +function zoom(e, zoomDelta, zoomX, zoomY) { + if (this.pointerChecker && this.pointerChecker(e, zoomX, zoomY)) { + // When mouse is out of roamController rect, + // default befavoius should not be be disabled, otherwise + // page sliding is disabled, contrary to expectation. + stop(e.event); + + this.trigger('zoom', zoomDelta, zoomX, zoomY); + } +} + +function checkKeyBinding(roamController, prop, e) { + var setting = roamController._opt[prop]; + return setting + && (!isString(setting) || e.event[setting + 'Key']); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +/** + * For geo and graph. + * + * @param {Object} controllerHost + * @param {module:zrender/Element} controllerHost.target + */ +function updateViewOnPan(controllerHost, dx, dy) { + var target = controllerHost.target; + var pos = target.position; + pos[0] += dx; + pos[1] += dy; + target.dirty(); +} + +/** + * For geo and graph. + * + * @param {Object} controllerHost + * @param {module:zrender/Element} controllerHost.target + * @param {number} controllerHost.zoom + * @param {number} controllerHost.zoomLimit like: {min: 1, max: 2} + */ +function updateViewOnZoom(controllerHost, zoomDelta, zoomX, zoomY) { + var target = controllerHost.target; + var zoomLimit = controllerHost.zoomLimit; + var pos = target.position; + var scale = target.scale; + + var newZoom = controllerHost.zoom = controllerHost.zoom || 1; + newZoom *= zoomDelta; + if (zoomLimit) { + var zoomMin = zoomLimit.min || 0; + var zoomMax = zoomLimit.max || Infinity; + newZoom = Math.max( + Math.min(zoomMax, newZoom), + zoomMin + ); + } + var zoomScale = newZoom / controllerHost.zoom; + controllerHost.zoom = newZoom; + // Keep the mouse center when scaling + pos[0] -= (zoomX - pos[0]) * (zoomScale - 1); + pos[1] -= (zoomY - pos[1]) * (zoomScale - 1); + scale[0] *= zoomScale; + scale[1] *= zoomScale; + + target.dirty(); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +var IRRELEVANT_EXCLUDES = {'axisPointer': 1, 'tooltip': 1, 'brush': 1}; + +/** + * Avoid that: mouse click on a elements that is over geo or graph, + * but roam is triggered. + */ +function onIrrelevantElement(e, api, targetCoordSysModel) { + var model = api.getComponentByElement(e.topTarget); + // If model is axisModel, it works only if it is injected with coordinateSystem. + var coordSys = model && model.coordinateSystem; + return model + && model !== targetCoordSysModel + && !IRRELEVANT_EXCLUDES[model.mainType] + && (coordSys && coordSys.model !== targetCoordSysModel); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +function getFixedItemStyle(model, scale) { + var itemStyle = model.getItemStyle(); + var areaColor = model.get('areaColor'); + + // If user want the color not to be changed when hover, + // they should both set areaColor and color to be null. + if (areaColor != null) { + itemStyle.fill = areaColor; + } + + return itemStyle; +} + +function updateMapSelectHandler(mapDraw, mapOrGeoModel, group, api, fromView) { + group.off('click'); + group.off('mousedown'); + + if (mapOrGeoModel.get('selectedMode')) { + + group.on('mousedown', function () { + mapDraw._mouseDownFlag = true; + }); + + group.on('click', function (e) { + if (!mapDraw._mouseDownFlag) { + return; + } + mapDraw._mouseDownFlag = false; + + var el = e.target; + while (!el.__regions) { + el = el.parent; + } + if (!el) { + return; + } + + var action = { + type: (mapOrGeoModel.mainType === 'geo' ? 'geo' : 'map') + 'ToggleSelect', + batch: map(el.__regions, function (region) { + return { + name: region.name, + from: fromView.uid + }; + }) + }; + action[mapOrGeoModel.mainType + 'Id'] = mapOrGeoModel.id; + + api.dispatchAction(action); + + updateMapSelected(mapOrGeoModel, group); + }); + } +} + +function updateMapSelected(mapOrGeoModel, group) { + // FIXME + group.eachChild(function (otherRegionEl) { + each$1(otherRegionEl.__regions, function (region) { + otherRegionEl.trigger(mapOrGeoModel.isSelected(region.name) ? 'emphasis' : 'normal'); + }); + }); +} + +/** + * @alias module:echarts/component/helper/MapDraw + * @param {module:echarts/ExtensionAPI} api + * @param {boolean} updateGroup + */ +function MapDraw(api, updateGroup) { + + var group = new Group(); + + /** + * @type {module:echarts/component/helper/RoamController} + * @private + */ + this._controller = new RoamController(api.getZr()); + + /** + * @type {Object} {target, zoom, zoomLimit} + * @private + */ + this._controllerHost = {target: updateGroup ? group : null}; + + /** + * @type {module:zrender/container/Group} + * @readOnly + */ + this.group = group; + + /** + * @type {boolean} + * @private + */ + this._updateGroup = updateGroup; + + /** + * This flag is used to make sure that only one among + * `pan`, `zoom`, `click` can occurs, otherwise 'selected' + * action may be triggered when `pan`, which is unexpected. + * @type {booelan} + */ + this._mouseDownFlag; +} + +MapDraw.prototype = { + + constructor: MapDraw, + + draw: function (mapOrGeoModel, ecModel, api, fromView, payload) { + + var isGeo = mapOrGeoModel.mainType === 'geo'; + + // Map series has data. GEO model that controlled by map series + // will be assigned with map data. Other GEO model has no data. + var data = mapOrGeoModel.getData && mapOrGeoModel.getData(); + isGeo && ecModel.eachComponent({mainType: 'series', subType: 'map'}, function (mapSeries) { + if (!data && mapSeries.getHostGeoModel() === mapOrGeoModel) { + data = mapSeries.getData(); + } + }); + + var geo = mapOrGeoModel.coordinateSystem; + + var group = this.group; + + var scale = geo.scale; + var groupNewProp = { + position: geo.position, + scale: scale + }; + + // No animation when first draw or in action + if (!group.childAt(0) || payload) { + group.attr(groupNewProp); + } + else { + updateProps(group, groupNewProp, mapOrGeoModel); + } + + group.removeAll(); + + var itemStyleAccessPath = ['itemStyle']; + var hoverItemStyleAccessPath = ['emphasis', 'itemStyle']; + var labelAccessPath = ['label']; + var hoverLabelAccessPath = ['emphasis', 'label']; + var nameMap = createHashMap(); + + each$1(geo.regions, function (region) { + + // Consider in GeoJson properties.name may be duplicated, for example, + // there is multiple region named "United Kindom" or "France" (so many + // colonies). And it is not appropriate to merge them in geo, which + // will make them share the same label and bring trouble in label + // location calculation. + var regionGroup = nameMap.get(region.name) + || nameMap.set(region.name, new Group()); + + var compoundPath = new CompoundPath({ + shape: { + paths: [] + } + }); + regionGroup.add(compoundPath); + + var regionModel = mapOrGeoModel.getRegionModel(region.name) || mapOrGeoModel; + + var itemStyleModel = regionModel.getModel(itemStyleAccessPath); + var hoverItemStyleModel = regionModel.getModel(hoverItemStyleAccessPath); + var itemStyle = getFixedItemStyle(itemStyleModel, scale); + var hoverItemStyle = getFixedItemStyle(hoverItemStyleModel, scale); + + var labelModel = regionModel.getModel(labelAccessPath); + var hoverLabelModel = regionModel.getModel(hoverLabelAccessPath); + + var dataIdx; + // Use the itemStyle in data if has data + if (data) { + dataIdx = data.indexOfName(region.name); + // Only visual color of each item will be used. It can be encoded by dataRange + // But visual color of series is used in symbol drawing + // + // Visual color for each series is for the symbol draw + var visualColor = data.getItemVisual(dataIdx, 'color', true); + if (visualColor) { + itemStyle.fill = visualColor; + } + } + + each$1(region.geometries, function (geometry) { + if (geometry.type !== 'polygon') { + return; + } + compoundPath.shape.paths.push(new Polygon({ + shape: { + points: geometry.exterior + } + })); + + for (var i = 0; i < (geometry.interiors ? geometry.interiors.length : 0); i++) { + compoundPath.shape.paths.push(new Polygon({ + shape: { + points: geometry.interiors[i] + } + })); + } + }); + + compoundPath.setStyle(itemStyle); + compoundPath.style.strokeNoScale = true; + compoundPath.culling = true; + // Label + var showLabel = labelModel.get('show'); + var hoverShowLabel = hoverLabelModel.get('show'); + + var isDataNaN = data && isNaN(data.get(data.mapDimension('value'), dataIdx)); + var itemLayout = data && data.getItemLayout(dataIdx); + // In the following cases label will be drawn + // 1. In map series and data value is NaN + // 2. In geo component + // 4. Region has no series legendSymbol, which will be add a showLabel flag in mapSymbolLayout + if ( + (isGeo || isDataNaN && (showLabel || hoverShowLabel)) + || (itemLayout && itemLayout.showLabel) + ) { + var query = !isGeo ? dataIdx : region.name; + var labelFetcher; + + // Consider dataIdx not found. + if (!data || dataIdx >= 0) { + labelFetcher = mapOrGeoModel; + } + + var textEl = new Text({ + position: region.center.slice(), + scale: [1 / scale[0], 1 / scale[1]], + z2: 10, + silent: true + }); + + setLabelStyle( + textEl.style, textEl.hoverStyle = {}, labelModel, hoverLabelModel, + { + labelFetcher: labelFetcher, + labelDataIndex: query, + defaultText: region.name, + useInsideStyle: false + }, + { + textAlign: 'center', + textVerticalAlign: 'middle' + } + ); + + regionGroup.add(textEl); + } + + // setItemGraphicEl, setHoverStyle after all polygons and labels + // are added to the rigionGroup + if (data) { + data.setItemGraphicEl(dataIdx, regionGroup); + } + else { + var regionModel = mapOrGeoModel.getRegionModel(region.name); + // Package custom mouse event for geo component + compoundPath.eventData = { + componentType: 'geo', + geoIndex: mapOrGeoModel.componentIndex, + name: region.name, + region: (regionModel && regionModel.option) || {} + }; + } + + var groupRegions = regionGroup.__regions || (regionGroup.__regions = []); + groupRegions.push(region); + + setHoverStyle( + regionGroup, + hoverItemStyle, + {hoverSilentOnTouch: !!mapOrGeoModel.get('selectedMode')} + ); + + group.add(regionGroup); + }); + + this._updateController(mapOrGeoModel, ecModel, api); + + updateMapSelectHandler(this, mapOrGeoModel, group, api, fromView); + + updateMapSelected(mapOrGeoModel, group); + }, + + remove: function () { + this.group.removeAll(); + this._controller.dispose(); + this._controllerHost = {}; + }, + + _updateController: function (mapOrGeoModel, ecModel, api) { + var geo = mapOrGeoModel.coordinateSystem; + var controller = this._controller; + var controllerHost = this._controllerHost; + + controllerHost.zoomLimit = mapOrGeoModel.get('scaleLimit'); + controllerHost.zoom = geo.getZoom(); + + // roamType is will be set default true if it is null + controller.enable(mapOrGeoModel.get('roam') || false); + var mainType = mapOrGeoModel.mainType; + + function makeActionBase() { + var action = { + type: 'geoRoam', + componentType: mainType + }; + action[mainType + 'Id'] = mapOrGeoModel.id; + return action; + } + + controller.off('pan').on('pan', function (dx, dy) { + this._mouseDownFlag = false; + + updateViewOnPan(controllerHost, dx, dy); + + api.dispatchAction(extend(makeActionBase(), { + dx: dx, + dy: dy + })); + }, this); + + controller.off('zoom').on('zoom', function (zoom, mouseX, mouseY) { + this._mouseDownFlag = false; + + updateViewOnZoom(controllerHost, zoom, mouseX, mouseY); + + api.dispatchAction(extend(makeActionBase(), { + zoom: zoom, + originX: mouseX, + originY: mouseY + })); + + if (this._updateGroup) { + var group = this.group; + var scale = group.scale; + group.traverse(function (el) { + if (el.type === 'text') { + el.attr('scale', [1 / scale[0], 1 / scale[1]]); + } + }); + } + }, this); + + controller.setPointerChecker(function (e, x, y) { + return geo.getViewRectAfterRoam().contain(x, y) + && !onIrrelevantElement(e, api, mapOrGeoModel); + }); + } +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +extendChartView({ + + type: 'map', + + render: function (mapModel, ecModel, api, payload) { + // Not render if it is an toggleSelect action from self + if (payload && payload.type === 'mapToggleSelect' + && payload.from === this.uid + ) { + return; + } + + var group = this.group; + group.removeAll(); + + if (mapModel.getHostGeoModel()) { + return; + } + + // Not update map if it is an roam action from self + if (!(payload && payload.type === 'geoRoam' + && payload.componentType === 'series' + && payload.seriesId === mapModel.id + ) + ) { + if (mapModel.needsDrawMap) { + var mapDraw = this._mapDraw || new MapDraw(api, true); + group.add(mapDraw.group); + + mapDraw.draw(mapModel, ecModel, api, this, payload); + + this._mapDraw = mapDraw; + } + else { + // Remove drawed map + this._mapDraw && this._mapDraw.remove(); + this._mapDraw = null; + } + } + else { + var mapDraw = this._mapDraw; + mapDraw && group.add(mapDraw.group); + } + + mapModel.get('showLegendSymbol') && ecModel.getComponent('legend') + && this._renderSymbols(mapModel, ecModel, api); + }, + + remove: function () { + this._mapDraw && this._mapDraw.remove(); + this._mapDraw = null; + this.group.removeAll(); + }, + + dispose: function () { + this._mapDraw && this._mapDraw.remove(); + this._mapDraw = null; + }, + + _renderSymbols: function (mapModel, ecModel, api) { + var originalData = mapModel.originalData; + var group = this.group; + + originalData.each(originalData.mapDimension('value'), function (value, idx) { + if (isNaN(value)) { + return; + } + + var layout = originalData.getItemLayout(idx); + + if (!layout || !layout.point) { + // Not exists in map + return; + } + + var point = layout.point; + var offset = layout.offset; + + var circle = new Circle({ + style: { + // Because the special of map draw. + // Which needs statistic of multiple series and draw on one map. + // And each series also need a symbol with legend color + // + // Layout and visual are put one the different data + fill: mapModel.getData().getVisual('color') + }, + shape: { + cx: point[0] + offset * 9, + cy: point[1], + r: 3 + }, + silent: true, + // Do not overlap the first series, on which labels are displayed. + z2: !offset ? 10 : 8 + }); + + // First data on the same region + if (!offset) { + var fullData = mapModel.mainSeries.getData(); + var name = originalData.getName(idx); + + var fullIndex = fullData.indexOfName(name); + + var itemModel = originalData.getItemModel(idx); + var labelModel = itemModel.getModel('label'); + var hoverLabelModel = itemModel.getModel('emphasis.label'); + + var polygonGroups = fullData.getItemGraphicEl(fullIndex); + + var normalText = retrieve2( + mapModel.getFormattedLabel(idx, 'normal'), + name + ); + var emphasisText = retrieve2( + mapModel.getFormattedLabel(idx, 'emphasis'), + normalText + ); + + var onEmphasis = function () { + var hoverStyle = setTextStyle({}, hoverLabelModel, { + text: hoverLabelModel.get('show') ? emphasisText : null + }, {isRectText: true, useInsideStyle: false}, true); + circle.style.extendFrom(hoverStyle); + // Make label upper than others if overlaps. + circle.__mapOriginalZ2 = circle.z2; + circle.z2 += 1; + }; + + var onNormal = function () { + setTextStyle(circle.style, labelModel, { + text: labelModel.get('show') ? normalText : null, + textPosition: labelModel.getShallow('position') || 'bottom' + }, {isRectText: true, useInsideStyle: false}); + + if (circle.__mapOriginalZ2 != null) { + circle.z2 = circle.__mapOriginalZ2; + circle.__mapOriginalZ2 = null; + } + }; + + polygonGroups.on('mouseover', onEmphasis) + .on('mouseout', onNormal) + .on('emphasis', onEmphasis) + .on('normal', onNormal); + + onNormal(); + } + + group.add(circle); + }); + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @param {module:echarts/coord/View} view + * @param {Object} payload + * @param {Object} [zoomLimit] + */ +function updateCenterAndZoom( + view, payload, zoomLimit +) { + var previousZoom = view.getZoom(); + var center = view.getCenter(); + var zoom = payload.zoom; + + var point = view.dataToPoint(center); + + if (payload.dx != null && payload.dy != null) { + point[0] -= payload.dx; + point[1] -= payload.dy; + + var center = view.pointToData(point); + view.setCenter(center); + } + if (zoom != null) { + if (zoomLimit) { + var zoomMin = zoomLimit.min || 0; + var zoomMax = zoomLimit.max || Infinity; + zoom = Math.max( + Math.min(previousZoom * zoom, zoomMax), + zoomMin + ) / previousZoom; + } + + // Zoom on given point(originX, originY) + view.scale[0] *= zoom; + view.scale[1] *= zoom; + var position = view.position; + var fixX = (payload.originX - position[0]) * (zoom - 1); + var fixY = (payload.originY - position[1]) * (zoom - 1); + + position[0] -= fixX; + position[1] -= fixY; + + view.updateTransform(); + // Get the new center + var center = view.pointToData(point); + view.setCenter(center); + view.setZoom(zoom * previousZoom); + } + + return { + center: view.getCenter(), + zoom: view.getZoom() + }; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @payload + * @property {string} [componentType=series] + * @property {number} [dx] + * @property {number} [dy] + * @property {number} [zoom] + * @property {number} [originX] + * @property {number} [originY] + */ +registerAction({ + type: 'geoRoam', + event: 'geoRoam', + update: 'updateTransform' +}, function (payload, ecModel) { + var componentType = payload.componentType || 'series'; + + ecModel.eachComponent( + { mainType: componentType, query: payload }, + function (componentModel) { + var geo = componentModel.coordinateSystem; + if (geo.type !== 'geo') { + return; + } + + var res = updateCenterAndZoom( + geo, payload, componentModel.get('scaleLimit') + ); + + componentModel.setCenter + && componentModel.setCenter(res.center); + + componentModel.setZoom + && componentModel.setZoom(res.zoom); + + // All map series with same `map` use the same geo coordinate system + // So the center and zoom must be in sync. Include the series not selected by legend + if (componentType === 'series') { + each$1(componentModel.seriesGroup, function (seriesModel) { + seriesModel.setCenter(res.center); + seriesModel.setZoom(res.zoom); + }); + } + } + ); +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var mapSymbolLayout = function (ecModel) { + + var processedMapType = {}; + + ecModel.eachSeriesByType('map', function (mapSeries) { + var mapType = mapSeries.getMapType(); + if (mapSeries.getHostGeoModel() || processedMapType[mapType]) { + return; + } + + var mapSymbolOffsets = {}; + + each$1(mapSeries.seriesGroup, function (subMapSeries) { + var geo = subMapSeries.coordinateSystem; + var data = subMapSeries.originalData; + if (subMapSeries.get('showLegendSymbol') && ecModel.getComponent('legend')) { + data.each(data.mapDimension('value'), function (value, idx) { + var name = data.getName(idx); + var region = geo.getRegion(name); + + // If input series.data is [11, 22, '-'/null/undefined, 44], + // it will be filled with NaN: [11, 22, NaN, 44] and NaN will + // not be drawn. So here must validate if value is NaN. + if (!region || isNaN(value)) { + return; + } + + var offset = mapSymbolOffsets[name] || 0; + + var point = geo.dataToPoint(region.center); + + mapSymbolOffsets[name] = offset + 1; + + data.setItemLayout(idx, { + point: point, + offset: offset + }); + }); + } + }); + + // Show label of those region not has legendSymbol(which is offset 0) + var data = mapSeries.getData(); + data.each(function (idx) { + var name = data.getName(idx); + var layout = data.getItemLayout(idx) || {}; + layout.showLabel = !mapSymbolOffsets[name]; + data.setItemLayout(idx, layout); + }); + + processedMapType[mapType] = true; + }); +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +var mapVisual = function (ecModel) { + ecModel.eachSeriesByType('map', function (seriesModel) { + var colorList = seriesModel.get('color'); + var itemStyleModel = seriesModel.getModel('itemStyle'); + + var areaColor = itemStyleModel.get('areaColor'); + var color = itemStyleModel.get('color') + || colorList[seriesModel.seriesIndex % colorList.length]; + + seriesModel.getData().setVisual({ + 'areaColor': areaColor, + 'color': color + }); + }); +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// FIXME 公用? +/** + * @param {Array.<module:echarts/data/List>} datas + * @param {string} statisticType 'average' 'sum' + * @inner + */ +function dataStatistics(datas, statisticType) { + var dataNameMap = {}; + + each$1(datas, function (data) { + data.each(data.mapDimension('value'), function (value, idx) { + // Add prefix to avoid conflict with Object.prototype. + var mapKey = 'ec-' + data.getName(idx); + dataNameMap[mapKey] = dataNameMap[mapKey] || []; + if (!isNaN(value)) { + dataNameMap[mapKey].push(value); + } + }); + }); + + return datas[0].map(datas[0].mapDimension('value'), function (value, idx) { + var mapKey = 'ec-' + datas[0].getName(idx); + var sum = 0; + var min = Infinity; + var max = -Infinity; + var len = dataNameMap[mapKey].length; + for (var i = 0; i < len; i++) { + min = Math.min(min, dataNameMap[mapKey][i]); + max = Math.max(max, dataNameMap[mapKey][i]); + sum += dataNameMap[mapKey][i]; + } + var result; + if (statisticType === 'min') { + result = min; + } + else if (statisticType === 'max') { + result = max; + } + else if (statisticType === 'average') { + result = sum / len; + } + else { + result = sum; + } + return len === 0 ? NaN : result; + }); +} + +var mapDataStatistic = function (ecModel) { + var seriesGroups = {}; + ecModel.eachSeriesByType('map', function (seriesModel) { + var hostGeoModel = seriesModel.getHostGeoModel(); + var key = hostGeoModel ? 'o' + hostGeoModel.id : 'i' + seriesModel.getMapType(); + (seriesGroups[key] = seriesGroups[key] || []).push(seriesModel); + }); + + each$1(seriesGroups, function (seriesList, key) { + var data = dataStatistics( + map(seriesList, function (seriesModel) { + return seriesModel.getData(); + }), + seriesList[0].get('mapValueCalculation') + ); + + for (var i = 0; i < seriesList.length; i++) { + seriesList[i].originalData = seriesList[i].getData(); + } + + // FIXME Put where? + for (var i = 0; i < seriesList.length; i++) { + seriesList[i].seriesGroup = seriesList; + seriesList[i].needsDrawMap = i === 0 && !seriesList[i].getHostGeoModel(); + + seriesList[i].setData(data.cloneShallow()); + seriesList[i].mainSeries = seriesList[0]; + } + }); +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var backwardCompat$2 = function (option) { + // Save geoCoord + var mapSeries = []; + each$1(option.series, function (seriesOpt) { + if (seriesOpt && seriesOpt.type === 'map') { + mapSeries.push(seriesOpt); + seriesOpt.map = seriesOpt.map || seriesOpt.mapType; + // Put x, y, width, height, x2, y2 in the top level + defaults(seriesOpt, seriesOpt.mapLocation); + } + }); +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +registerLayout(mapSymbolLayout); +registerVisual(mapVisual); +registerProcessor(PRIORITY.PROCESSOR.STATISTIC, mapDataStatistic); +registerPreprocessor(backwardCompat$2); + +createDataSelectAction('map', [{ + type: 'mapToggleSelect', + event: 'mapselectchanged', + method: 'toggleSelected' +}, { + type: 'mapSelect', + event: 'mapselected', + method: 'select' +}, { + type: 'mapUnSelect', + event: 'mapunselected', + method: 'unSelect' +}]); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Link lists and struct (graph or tree) + */ + +var each$7 = each$1; + +var DATAS = '\0__link_datas'; +var MAIN_DATA = '\0__link_mainData'; + +// Caution: +// In most case, either list or its shallow clones (see list.cloneShallow) +// is active in echarts process. So considering heap memory consumption, +// we do not clone tree or graph, but share them among list and its shallow clones. +// But in some rare case, we have to keep old list (like do animation in chart). So +// please take care that both the old list and the new list share the same tree/graph. + +/** + * @param {Object} opt + * @param {module:echarts/data/List} opt.mainData + * @param {Object} [opt.struct] For example, instance of Graph or Tree. + * @param {string} [opt.structAttr] designation: list[structAttr] = struct; + * @param {Object} [opt.datas] {dataType: data}, + * like: {node: nodeList, edge: edgeList}. + * Should contain mainData. + * @param {Object} [opt.datasAttr] {dataType: attr}, + * designation: struct[datasAttr[dataType]] = list; + */ +function linkList(opt) { + var mainData = opt.mainData; + var datas = opt.datas; + + if (!datas) { + datas = {main: mainData}; + opt.datasAttr = {main: 'data'}; + } + opt.datas = opt.mainData = null; + + linkAll(mainData, datas, opt); + + // Porxy data original methods. + each$7(datas, function (data) { + each$7(mainData.TRANSFERABLE_METHODS, function (methodName) { + data.wrapMethod(methodName, curry(transferInjection, opt)); + }); + + }); + + // Beyond transfer, additional features should be added to `cloneShallow`. + mainData.wrapMethod('cloneShallow', curry(cloneShallowInjection, opt)); + + // Only mainData trigger change, because struct.update may trigger + // another changable methods, which may bring about dead lock. + each$7(mainData.CHANGABLE_METHODS, function (methodName) { + mainData.wrapMethod(methodName, curry(changeInjection, opt)); + }); + + // Make sure datas contains mainData. + assert$1(datas[mainData.dataType] === mainData); +} + +function transferInjection(opt, res) { + if (isMainData(this)) { + // Transfer datas to new main data. + var datas = extend({}, this[DATAS]); + datas[this.dataType] = res; + linkAll(res, datas, opt); + } + else { + // Modify the reference in main data to point newData. + linkSingle(res, this.dataType, this[MAIN_DATA], opt); + } + return res; +} + +function changeInjection(opt, res) { + opt.struct && opt.struct.update(this); + return res; +} + +function cloneShallowInjection(opt, res) { + // cloneShallow, which brings about some fragilities, may be inappropriate + // to be exposed as an API. So for implementation simplicity we can make + // the restriction that cloneShallow of not-mainData should not be invoked + // outside, but only be invoked here. + each$7(res[DATAS], function (data, dataType) { + data !== res && linkSingle(data.cloneShallow(), dataType, res, opt); + }); + return res; +} + +/** + * Supplement method to List. + * + * @public + * @param {string} [dataType] If not specified, return mainData. + * @return {module:echarts/data/List} + */ +function getLinkedData(dataType) { + var mainData = this[MAIN_DATA]; + return (dataType == null || mainData == null) + ? mainData + : mainData[DATAS][dataType]; +} + +function isMainData(data) { + return data[MAIN_DATA] === data; +} + +function linkAll(mainData, datas, opt) { + mainData[DATAS] = {}; + each$7(datas, function (data, dataType) { + linkSingle(data, dataType, mainData, opt); + }); +} + +function linkSingle(data, dataType, mainData, opt) { + mainData[DATAS][dataType] = data; + data[MAIN_DATA] = mainData; + data.dataType = dataType; + + if (opt.struct) { + data[opt.structAttr] = opt.struct; + opt.struct[opt.datasAttr[dataType]] = data; + } + + // Supplement method. + data.getLinkedData = getLinkedData; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Tree data structure + * + * @module echarts/data/Tree + */ + +/** + * @constructor module:echarts/data/Tree~TreeNode + * @param {string} name + * @param {module:echarts/data/Tree} hostTree + */ +var TreeNode = function (name, hostTree) { + /** + * @type {string} + */ + this.name = name || ''; + + /** + * Depth of node + * + * @type {number} + * @readOnly + */ + this.depth = 0; + + /** + * Height of the subtree rooted at this node. + * @type {number} + * @readOnly + */ + this.height = 0; + + /** + * @type {module:echarts/data/Tree~TreeNode} + * @readOnly + */ + this.parentNode = null; + + /** + * Reference to list item. + * Do not persistent dataIndex outside, + * besause it may be changed by list. + * If dataIndex -1, + * this node is logical deleted (filtered) in list. + * + * @type {Object} + * @readOnly + */ + this.dataIndex = -1; + + /** + * @type {Array.<module:echarts/data/Tree~TreeNode>} + * @readOnly + */ + this.children = []; + + /** + * @type {Array.<module:echarts/data/Tree~TreeNode>} + * @pubilc + */ + this.viewChildren = []; + + /** + * @type {moduel:echarts/data/Tree} + * @readOnly + */ + this.hostTree = hostTree; +}; + +TreeNode.prototype = { + + constructor: TreeNode, + + /** + * The node is removed. + * @return {boolean} is removed. + */ + isRemoved: function () { + return this.dataIndex < 0; + }, + + /** + * Travel this subtree (include this node). + * Usage: + * node.eachNode(function () { ... }); // preorder + * node.eachNode('preorder', function () { ... }); // preorder + * node.eachNode('postorder', function () { ... }); // postorder + * node.eachNode( + * {order: 'postorder', attr: 'viewChildren'}, + * function () { ... } + * ); // postorder + * + * @param {(Object|string)} options If string, means order. + * @param {string=} options.order 'preorder' or 'postorder' + * @param {string=} options.attr 'children' or 'viewChildren' + * @param {Function} cb If in preorder and return false, + * its subtree will not be visited. + * @param {Object} [context] + */ + eachNode: function (options, cb, context) { + if (typeof options === 'function') { + context = cb; + cb = options; + options = null; + } + + options = options || {}; + if (isString(options)) { + options = {order: options}; + } + + var order = options.order || 'preorder'; + var children = this[options.attr || 'children']; + + var suppressVisitSub; + order === 'preorder' && (suppressVisitSub = cb.call(context, this)); + + for (var i = 0; !suppressVisitSub && i < children.length; i++) { + children[i].eachNode(options, cb, context); + } + + order === 'postorder' && cb.call(context, this); + }, + + /** + * Update depth and height of this subtree. + * + * @param {number} depth + */ + updateDepthAndHeight: function (depth) { + var height = 0; + this.depth = depth; + for (var i = 0; i < this.children.length; i++) { + var child = this.children[i]; + child.updateDepthAndHeight(depth + 1); + if (child.height > height) { + height = child.height; + } + } + this.height = height + 1; + }, + + /** + * @param {string} id + * @return {module:echarts/data/Tree~TreeNode} + */ + getNodeById: function (id) { + if (this.getId() === id) { + return this; + } + for (var i = 0, children = this.children, len = children.length; i < len; i++) { + var res = children[i].getNodeById(id); + if (res) { + return res; + } + } + }, + + /** + * @param {module:echarts/data/Tree~TreeNode} node + * @return {boolean} + */ + contains: function (node) { + if (node === this) { + return true; + } + for (var i = 0, children = this.children, len = children.length; i < len; i++) { + var res = children[i].contains(node); + if (res) { + return res; + } + } + }, + + /** + * @param {boolean} includeSelf Default false. + * @return {Array.<module:echarts/data/Tree~TreeNode>} order: [root, child, grandchild, ...] + */ + getAncestors: function (includeSelf) { + var ancestors = []; + var node = includeSelf ? this : this.parentNode; + while (node) { + ancestors.push(node); + node = node.parentNode; + } + ancestors.reverse(); + return ancestors; + }, + + /** + * @param {string|Array=} [dimension='value'] Default 'value'. can be 0, 1, 2, 3 + * @return {number} Value. + */ + getValue: function (dimension) { + var data = this.hostTree.data; + return data.get(data.getDimension(dimension || 'value'), this.dataIndex); + }, + + /** + * @param {Object} layout + * @param {boolean=} [merge=false] + */ + setLayout: function (layout, merge$$1) { + this.dataIndex >= 0 + && this.hostTree.data.setItemLayout(this.dataIndex, layout, merge$$1); + }, + + /** + * @return {Object} layout + */ + getLayout: function () { + return this.hostTree.data.getItemLayout(this.dataIndex); + }, + + /** + * @param {string} [path] + * @return {module:echarts/model/Model} + */ + getModel: function (path) { + if (this.dataIndex < 0) { + return; + } + var hostTree = this.hostTree; + var itemModel = hostTree.data.getItemModel(this.dataIndex); + var levelModel = this.getLevelModel(); + var leavesModel; + if (!levelModel && (this.children.length === 0 || (this.children.length !== 0 && this.isExpand === false))) { + leavesModel = this.getLeavesModel(); + } + return itemModel.getModel(path, (levelModel || leavesModel || hostTree.hostModel).getModel(path)); + }, + + /** + * @return {module:echarts/model/Model} + */ + getLevelModel: function () { + return (this.hostTree.levelModels || [])[this.depth]; + }, + + /** + * @return {module:echarts/model/Model} + */ + getLeavesModel: function () { + return this.hostTree.leavesModel; + }, + + /** + * @example + * setItemVisual('color', color); + * setItemVisual({ + * 'color': color + * }); + */ + setVisual: function (key, value) { + this.dataIndex >= 0 + && this.hostTree.data.setItemVisual(this.dataIndex, key, value); + }, + + /** + * Get item visual + */ + getVisual: function (key, ignoreParent) { + return this.hostTree.data.getItemVisual(this.dataIndex, key, ignoreParent); + }, + + /** + * @public + * @return {number} + */ + getRawIndex: function () { + return this.hostTree.data.getRawIndex(this.dataIndex); + }, + + /** + * @public + * @return {string} + */ + getId: function () { + return this.hostTree.data.getId(this.dataIndex); + }, + + /** + * if this is an ancestor of another node + * + * @public + * @param {TreeNode} node another node + * @return {boolean} if is ancestor + */ + isAncestorOf: function (node) { + var parent = node.parentNode; + while (parent) { + if (parent === this) { + return true; + } + parent = parent.parentNode; + } + return false; + }, + + /** + * if this is an descendant of another node + * + * @public + * @param {TreeNode} node another node + * @return {boolean} if is descendant + */ + isDescendantOf: function (node) { + return node !== this && node.isAncestorOf(this); + } +}; + +/** + * @constructor + * @alias module:echarts/data/Tree + * @param {module:echarts/model/Model} hostModel + * @param {Array.<Object>} levelOptions + * @param {Object} leavesOption + */ +function Tree(hostModel, levelOptions, leavesOption) { + /** + * @type {module:echarts/data/Tree~TreeNode} + * @readOnly + */ + this.root; + + /** + * @type {module:echarts/data/List} + * @readOnly + */ + this.data; + + /** + * Index of each item is the same as the raw index of coresponding list item. + * @private + * @type {Array.<module:echarts/data/Tree~TreeNode} + */ + this._nodes = []; + + /** + * @private + * @readOnly + * @type {module:echarts/model/Model} + */ + this.hostModel = hostModel; + + /** + * @private + * @readOnly + * @type {Array.<module:echarts/model/Model} + */ + this.levelModels = map(levelOptions || [], function (levelDefine) { + return new Model(levelDefine, hostModel, hostModel.ecModel); + }); + + this.leavesModel = new Model(leavesOption || {}, hostModel, hostModel.ecModel); +} + +Tree.prototype = { + + constructor: Tree, + + type: 'tree', + + /** + * Travel this subtree (include this node). + * Usage: + * node.eachNode(function () { ... }); // preorder + * node.eachNode('preorder', function () { ... }); // preorder + * node.eachNode('postorder', function () { ... }); // postorder + * node.eachNode( + * {order: 'postorder', attr: 'viewChildren'}, + * function () { ... } + * ); // postorder + * + * @param {(Object|string)} options If string, means order. + * @param {string=} options.order 'preorder' or 'postorder' + * @param {string=} options.attr 'children' or 'viewChildren' + * @param {Function} cb + * @param {Object} [context] + */ + eachNode: function(options, cb, context) { + this.root.eachNode(options, cb, context); + }, + + /** + * @param {number} dataIndex + * @return {module:echarts/data/Tree~TreeNode} + */ + getNodeByDataIndex: function (dataIndex) { + var rawIndex = this.data.getRawIndex(dataIndex); + return this._nodes[rawIndex]; + }, + + /** + * @param {string} name + * @return {module:echarts/data/Tree~TreeNode} + */ + getNodeByName: function (name) { + return this.root.getNodeByName(name); + }, + + /** + * Update item available by list, + * when list has been performed options like 'filterSelf' or 'map'. + */ + update: function () { + var data = this.data; + var nodes = this._nodes; + + for (var i = 0, len = nodes.length; i < len; i++) { + nodes[i].dataIndex = -1; + } + + for (var i = 0, len = data.count(); i < len; i++) { + nodes[data.getRawIndex(i)].dataIndex = i; + } + }, + + /** + * Clear all layouts + */ + clearLayouts: function () { + this.data.clearItemLayouts(); + } +}; + +/** + * data node format: + * { + * name: ... + * value: ... + * children: [ + * { + * name: ... + * value: ... + * children: ... + * }, + * ... + * ] + * } + * + * @static + * @param {Object} dataRoot Root node. + * @param {module:echarts/model/Model} hostModel + * @param {Object} treeOptions + * @param {Array.<Object>} treeOptions.levels + * @param {Array.<Object>} treeOptions.leaves + * @return module:echarts/data/Tree + */ +Tree.createTree = function (dataRoot, hostModel, treeOptions) { + + var tree = new Tree(hostModel, treeOptions.levels, treeOptions.leaves); + var listData = []; + var dimMax = 1; + + buildHierarchy(dataRoot); + + function buildHierarchy(dataNode, parentNode) { + var value = dataNode.value; + dimMax = Math.max(dimMax, isArray(value) ? value.length : 1); + + listData.push(dataNode); + + var node = new TreeNode(dataNode.name, tree); + parentNode + ? addChild(node, parentNode) + : (tree.root = node); + + tree._nodes.push(node); + + var children = dataNode.children; + if (children) { + for (var i = 0; i < children.length; i++) { + buildHierarchy(children[i], node); + } + } + } + + tree.root.updateDepthAndHeight(0); + + var dimensionsInfo = createDimensions(listData, { + coordDimensions: ['value'], + dimensionsCount: dimMax + }); + + var list = new List(dimensionsInfo, hostModel); + list.initData(listData); + + linkList({ + mainData: list, + struct: tree, + structAttr: 'tree' + }); + + tree.update(); + + return tree; +}; + +/** + * It is needed to consider the mess of 'list', 'hostModel' when creating a TreeNote, + * so this function is not ready and not necessary to be public. + * + * @param {(module:echarts/data/Tree~TreeNode|Object)} child + */ +function addChild(child, node) { + var children = node.children; + if (child.parentNode === node) { + return; + } + + children.push(child); + child.parentNode = node; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @file Create data struct and define tree view's series model + */ + +SeriesModel.extend({ + + type: 'series.tree', + + layoutInfo: null, + + // can support the position parameters 'left', 'top','right','bottom', 'width', + // 'height' in the setOption() with 'merge' mode normal. + layoutMode: 'box', + + /** + * Init a tree data structure from data in option series + * @param {Object} option the object used to config echarts view + * @return {module:echarts/data/List} storage initial data + */ + getInitialData: function (option) { + + //create an virtual root + var root = {name: option.name, children: option.data}; + + var leaves = option.leaves || {}; + + var treeOption = {}; + + treeOption.leaves = leaves; + + var tree = Tree.createTree(root, this, treeOption); + + var treeDepth = 0; + + tree.eachNode('preorder', function (node) { + if (node.depth > treeDepth) { + treeDepth = node.depth; + } + }); + + var expandAndCollapse = option.expandAndCollapse; + var expandTreeDepth = (expandAndCollapse && option.initialTreeDepth >= 0) + ? option.initialTreeDepth : treeDepth; + + tree.root.eachNode('preorder', function (node) { + var item = node.hostTree.data.getRawDataItem(node.dataIndex); + // add item.collapsed != null, because users can collapse node original in the series.data. + node.isExpand = (item && item.collapsed != null) + ? !item.collapsed + : node.depth <= expandTreeDepth; + }); + + return tree.data; + }, + + /** + * Make the configuration 'orient' backward compatibly, with 'horizontal = LR', 'vertical = TB'. + * @returns {string} orient + */ + getOrient: function () { + var orient = this.get('orient'); + if (orient === 'horizontal') { + orient = 'LR'; + } + else if (orient === 'vertical') { + orient = 'TB'; + } + return orient; + }, + + /** + * @override + * @param {number} dataIndex + */ + formatTooltip: function (dataIndex) { + var tree = this.getData().tree; + var realRoot = tree.root.children[0]; + var node = tree.getNodeByDataIndex(dataIndex); + var value = node.getValue(); + var name = node.name; + while (node && (node !== realRoot)) { + name = node.parentNode.name + '.' + name; + node = node.parentNode; + } + return encodeHTML(name + ( + (isNaN(value) || value == null) ? '' : ' : ' + value + )); + }, + + defaultOption: { + zlevel: 0, + z: 2, + + // the position of the whole view + left: '12%', + top: '12%', + right: '12%', + bottom: '12%', + + // the layout of the tree, two value can be selected, 'orthogonal' or 'radial' + layout: 'orthogonal', + + // The orient of orthoginal layout, can be setted to 'LR', 'TB', 'RL', 'BT'. + // and the backward compatibility configuration 'horizontal = LR', 'vertical = TB'. + orient: 'LR', + + symbol: 'emptyCircle', + + symbolSize: 7, + + expandAndCollapse: true, + + initialTreeDepth: 2, + + lineStyle: { + color: '#ccc', + width: 1.5, + curveness: 0.5 + }, + + itemStyle: { + color: 'lightsteelblue', + borderColor: '#c23531', + borderWidth: 1.5 + }, + + label: { + show: true, + color: '#555' + }, + + leaves: { + label: { + show: true + } + }, + + animationEasing: 'linear', + + animationDuration: 700, + + animationDurationUpdate: 1000 + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/* +* The tree layout implementation references to d3.js +* (https://github.com/d3/d3-hierarchy). The use of the source +* code of this file is also subject to the terms and consitions +* of its license (BSD-3Clause, see <echarts/src/licenses/LICENSE-d3>). +*/ + +/** + * @file The layout algorithm of node-link tree diagrams. Here we using Reingold-Tilford algorithm to drawing + * the tree. + * @see https://github.com/d3/d3-hierarchy + */ + +/** + * Initialize all computational message for following algorithm + * @param {module:echarts/data/Tree~TreeNode} root The virtual root of the tree + */ +function init$2(root) { + root.hierNode = { + defaultAncestor: null, + ancestor: root, + prelim: 0, + modifier: 0, + change: 0, + shift: 0, + i: 0, + thread: null + }; + + var nodes = [root]; + var node; + var children; + + while (node = nodes.pop()) { // jshint ignore:line + children = node.children; + if (node.isExpand && children.length) { + var n = children.length; + for (var i = n - 1; i >= 0; i--) { + var child = children[i]; + child.hierNode = { + defaultAncestor: null, + ancestor: child, + prelim: 0, + modifier: 0, + change: 0, + shift: 0, + i: i, + thread: null + }; + nodes.push(child); + } + } + } +} + +/** + * Computes a preliminary x coordinate for node. Before that, this function is + * applied recursively to the children of node, as well as the function + * apportion(). After spacing out the children by calling executeShifts(), the + * node is placed to the midpoint of its outermost children. + * @param {module:echarts/data/Tree~TreeNode} node + * @param {Function} separation + */ +function firstWalk(node, separation) { + var children = node.isExpand ? node.children : []; + var siblings = node.parentNode.children; + var subtreeW = node.hierNode.i ? siblings[node.hierNode.i -1] : null; + if (children.length) { + executeShifts(node); + var midPoint = (children[0].hierNode.prelim + children[children.length - 1].hierNode.prelim) / 2; + if (subtreeW) { + node.hierNode.prelim = subtreeW.hierNode.prelim + separation(node, subtreeW); + node.hierNode.modifier = node.hierNode.prelim - midPoint; + } + else { + node.hierNode.prelim = midPoint; + } + } + else if (subtreeW) { + node.hierNode.prelim = subtreeW.hierNode.prelim + separation(node, subtreeW); + } + node.parentNode.hierNode.defaultAncestor = apportion(node, subtreeW, node.parentNode.hierNode.defaultAncestor || siblings[0], separation); +} + + +/** + * Computes all real x-coordinates by summing up the modifiers recursively. + * @param {module:echarts/data/Tree~TreeNode} node + */ +function secondWalk(node) { + var nodeX = node.hierNode.prelim + node.parentNode.hierNode.modifier; + node.setLayout({x: nodeX}, true); + node.hierNode.modifier += node.parentNode.hierNode.modifier; +} + + +function separation(cb) { + return arguments.length ? cb : defaultSeparation; +} + +/** + * Transform the common coordinate to radial coordinate + * @param {number} x + * @param {number} y + * @return {Object} + */ +function radialCoordinate(x, y) { + var radialCoor = {}; + x -= Math.PI / 2; + radialCoor.x = y * Math.cos(x); + radialCoor.y = y * Math.sin(x); + return radialCoor; +} + +/** + * Get the layout position of the whole view + * @param {module:echarts/model/Series} seriesModel the model object of sankey series + * @param {module:echarts/ExtensionAPI} api provide the API list that the developer can call + * @return {module:zrender/core/BoundingRect} size of rect to draw the sankey view + */ +function getViewRect(seriesModel, api) { + return getLayoutRect( + seriesModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + } + ); +} + +/** + * All other shifts, applied to the smaller subtrees between w- and w+, are + * performed by this function. + * @param {module:echarts/data/Tree~TreeNode} node + */ +function executeShifts(node) { + var children = node.children; + var n = children.length; + var shift = 0; + var change = 0; + while (--n >= 0) { + var child = children[n]; + child.hierNode.prelim += shift; + child.hierNode.modifier += shift; + change += child.hierNode.change; + shift += child.hierNode.shift + change; + } +} + +/** + * The core of the algorithm. Here, a new subtree is combined with the + * previous subtrees. Threads are used to traverse the inside and outside + * contours of the left and right subtree up to the highest common level. + * Whenever two nodes of the inside contours conflict, we compute the left + * one of the greatest uncommon ancestors using the function nextAncestor() + * and call moveSubtree() to shift the subtree and prepare the shifts of + * smaller subtrees. Finally, we add a new thread (if necessary). + * @param {module:echarts/data/Tree~TreeNode} subtreeV + * @param {module:echarts/data/Tree~TreeNode} subtreeW + * @param {module:echarts/data/Tree~TreeNode} ancestor + * @param {Function} separation + * @return {module:echarts/data/Tree~TreeNode} + */ +function apportion(subtreeV, subtreeW, ancestor, separation) { + + if (subtreeW) { + var nodeOutRight = subtreeV; + var nodeInRight = subtreeV; + var nodeOutLeft = nodeInRight.parentNode.children[0]; + var nodeInLeft = subtreeW; + + var sumOutRight = nodeOutRight.hierNode.modifier; + var sumInRight = nodeInRight.hierNode.modifier; + var sumOutLeft = nodeOutLeft.hierNode.modifier; + var sumInLeft = nodeInLeft.hierNode.modifier; + + while (nodeInLeft = nextRight(nodeInLeft), nodeInRight = nextLeft(nodeInRight), nodeInLeft && nodeInRight) { + nodeOutRight = nextRight(nodeOutRight); + nodeOutLeft = nextLeft(nodeOutLeft); + nodeOutRight.hierNode.ancestor = subtreeV; + var shift = nodeInLeft.hierNode.prelim + sumInLeft - nodeInRight.hierNode.prelim + - sumInRight + separation(nodeInLeft, nodeInRight); + if (shift > 0) { + moveSubtree(nextAncestor(nodeInLeft, subtreeV, ancestor), subtreeV, shift); + sumInRight += shift; + sumOutRight += shift; + } + sumInLeft += nodeInLeft.hierNode.modifier; + sumInRight += nodeInRight.hierNode.modifier; + sumOutRight += nodeOutRight.hierNode.modifier; + sumOutLeft += nodeOutLeft.hierNode.modifier; + } + if (nodeInLeft && !nextRight(nodeOutRight)) { + nodeOutRight.hierNode.thread = nodeInLeft; + nodeOutRight.hierNode.modifier += sumInLeft - sumOutRight; + + } + if (nodeInRight && !nextLeft(nodeOutLeft)) { + nodeOutLeft.hierNode.thread = nodeInRight; + nodeOutLeft.hierNode.modifier += sumInRight - sumOutLeft; + ancestor = subtreeV; + } + } + return ancestor; +} + +/** + * This function is used to traverse the right contour of a subtree. + * It returns the rightmost child of node or the thread of node. The function + * returns null if and only if node is on the highest depth of its subtree. + * @param {module:echarts/data/Tree~TreeNode} node + * @return {module:echarts/data/Tree~TreeNode} + */ +function nextRight(node) { + var children = node.children; + return children.length && node.isExpand ? children[children.length - 1] : node.hierNode.thread; +} + +/** + * This function is used to traverse the left contour of a subtree (or a subforest). + * It returns the leftmost child of node or the thread of node. The function + * returns null if and only if node is on the highest depth of its subtree. + * @param {module:echarts/data/Tree~TreeNode} node + * @return {module:echarts/data/Tree~TreeNode} + */ +function nextLeft(node) { + var children = node.children; + return children.length && node.isExpand ? children[0] : node.hierNode.thread; +} + +/** + * If nodeInLeft’s ancestor is a sibling of node, returns nodeInLeft’s ancestor. + * Otherwise, returns the specified ancestor. + * @param {module:echarts/data/Tree~TreeNode} nodeInLeft + * @param {module:echarts/data/Tree~TreeNode} node + * @param {module:echarts/data/Tree~TreeNode} ancestor + * @return {module:echarts/data/Tree~TreeNode} + */ +function nextAncestor(nodeInLeft, node, ancestor) { + return nodeInLeft.hierNode.ancestor.parentNode === node.parentNode + ? nodeInLeft.hierNode.ancestor : ancestor; +} + +/** + * Shifts the current subtree rooted at wr. This is done by increasing prelim(w+) and modifier(w+) by shift. + * @param {module:echarts/data/Tree~TreeNode} wl + * @param {module:echarts/data/Tree~TreeNode} wr + * @param {number} shift [description] + */ +function moveSubtree(wl, wr,shift) { + var change = shift / (wr.hierNode.i - wl.hierNode.i); + wr.hierNode.change -= change; + wr.hierNode.shift += shift; + wr.hierNode.modifier += shift; + wr.hierNode.prelim += shift; + wl.hierNode.change += change; +} + +function defaultSeparation(node1, node2) { + return node1.parentNode === node2.parentNode ? 1 : 2; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @file This file used to draw tree view + */ + +extendChartView({ + + type: 'tree', + + /** + * Init the chart + * @override + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + */ + init: function (ecModel, api) { + + /** + * @private + * @type {module:echarts/data/Tree} + */ + this._oldTree; + + /** + * @private + * @type {module:zrender/container/Group} + */ + this._mainGroup = new Group(); + + this.group.add(this._mainGroup); + }, + + render: function (seriesModel, ecModel, api, payload) { + + var data = seriesModel.getData(); + + var layoutInfo = seriesModel.layoutInfo; + + var group = this._mainGroup; + + var layout = seriesModel.get('layout'); + + if (layout === 'radial') { + group.attr('position', [layoutInfo.x + layoutInfo.width / 2, layoutInfo.y + layoutInfo.height / 2]); + } + else { + group.attr('position', [layoutInfo.x, layoutInfo.y]); + } + + var oldData = this._data; + + var seriesScope = { + expandAndCollapse: seriesModel.get('expandAndCollapse'), + layout: layout, + orient: seriesModel.getOrient(), + curvature: seriesModel.get('lineStyle.curveness'), + symbolRotate: seriesModel.get('symbolRotate'), + symbolOffset: seriesModel.get('symbolOffset'), + hoverAnimation: seriesModel.get('hoverAnimation'), + useNameLabel: true, + fadeIn: true + }; + + data.diff(oldData) + .add(function (newIdx) { + if (symbolNeedsDraw$1(data, newIdx)) { + // create node and edge + updateNode(data, newIdx, null, group, seriesModel, seriesScope); + } + }) + .update(function (newIdx, oldIdx) { + var symbolEl = oldData.getItemGraphicEl(oldIdx); + if (!symbolNeedsDraw$1(data, newIdx)) { + symbolEl && removeNode(oldData, oldIdx, symbolEl, group, seriesModel, seriesScope); + return; + } + // update node and edge + updateNode(data, newIdx, symbolEl, group, seriesModel, seriesScope); + }) + .remove(function (oldIdx) { + var symbolEl = oldData.getItemGraphicEl(oldIdx); + // When remove a collapsed node of subtree, since the collapsed + // node haven't been initialized with a symbol element, + // you can't found it's symbol element through index. + // so if we want to remove the symbol element we should insure + // that the symbol element is not null. + if (symbolEl) { + removeNode(oldData, oldIdx, symbolEl, group, seriesModel, seriesScope); + } + }) + .execute(); + + if (seriesScope.expandAndCollapse === true) { + data.eachItemGraphicEl(function (el, dataIndex) { + el.off('click').on('click', function () { + api.dispatchAction({ + type: 'treeExpandAndCollapse', + seriesId: seriesModel.id, + dataIndex: dataIndex + }); + }); + }); + } + + this._data = data; + }, + + dispose: function () {}, + + remove: function () { + this._mainGroup.removeAll(); + this._data = null; + } + +}); + +function symbolNeedsDraw$1(data, dataIndex) { + var layout = data.getItemLayout(dataIndex); + + return layout + && !isNaN(layout.x) && !isNaN(layout.y) + && data.getItemVisual(dataIndex, 'symbol') !== 'none'; +} + +function getTreeNodeStyle(node, itemModel, seriesScope) { + seriesScope.itemModel = itemModel; + seriesScope.itemStyle = itemModel.getModel('itemStyle').getItemStyle(); + seriesScope.hoverItemStyle = itemModel.getModel('emphasis.itemStyle').getItemStyle(); + seriesScope.lineStyle = itemModel.getModel('lineStyle').getLineStyle(); + seriesScope.labelModel = itemModel.getModel('label'); + seriesScope.hoverLabelModel = itemModel.getModel('emphasis.label'); + + if (node.isExpand === false && node.children.length !== 0) { + seriesScope.symbolInnerColor = seriesScope.itemStyle.fill; + } + else { + seriesScope.symbolInnerColor = '#fff'; + } + + return seriesScope; +} + +function updateNode(data, dataIndex, symbolEl, group, seriesModel, seriesScope) { + var isInit = !symbolEl; + var node = data.tree.getNodeByDataIndex(dataIndex); + var itemModel = node.getModel(); + var seriesScope = getTreeNodeStyle(node, itemModel, seriesScope); + var virtualRoot = data.tree.root; + + var source = node.parentNode === virtualRoot ? node : node.parentNode || node; + var sourceSymbolEl = data.getItemGraphicEl(source.dataIndex); + var sourceLayout = source.getLayout(); + var sourceOldLayout = sourceSymbolEl + ? { + x: sourceSymbolEl.position[0], + y: sourceSymbolEl.position[1], + rawX: sourceSymbolEl.__radialOldRawX, + rawY: sourceSymbolEl.__radialOldRawY + } + : sourceLayout; + var targetLayout = node.getLayout(); + + if (isInit) { + symbolEl = new SymbolClz$1(data, dataIndex, seriesScope); + symbolEl.attr('position', [sourceOldLayout.x, sourceOldLayout.y]); + } + else { + symbolEl.updateData(data, dataIndex, seriesScope); + } + + symbolEl.__radialOldRawX = symbolEl.__radialRawX; + symbolEl.__radialOldRawY = symbolEl.__radialRawY; + symbolEl.__radialRawX = targetLayout.rawX; + symbolEl.__radialRawY = targetLayout.rawY; + + group.add(symbolEl); + data.setItemGraphicEl(dataIndex, symbolEl); + updateProps(symbolEl, { + position: [targetLayout.x, targetLayout.y] + }, seriesModel); + + var symbolPath = symbolEl.getSymbolPath(); + + if (seriesScope.layout === 'radial') { + var realRoot = virtualRoot.children[0]; + var rootLayout = realRoot.getLayout(); + var length = realRoot.children.length; + var rad; + var isLeft; + + if (targetLayout.x === rootLayout.x && node.isExpand === true) { + var center = {}; + center.x = (realRoot.children[0].getLayout().x + realRoot.children[length - 1].getLayout().x) / 2; + center.y = (realRoot.children[0].getLayout().y + realRoot.children[length - 1].getLayout().y) / 2; + rad = Math.atan2(center.y - rootLayout.y, center.x - rootLayout.x); + if (rad < 0) { + rad = Math.PI * 2 + rad; + } + isLeft = center.x < rootLayout.x; + if (isLeft) { + rad = rad - Math.PI; + } + } + else { + rad = Math.atan2(targetLayout.y - rootLayout.y, targetLayout.x - rootLayout.x); + if (rad < 0) { + rad = Math.PI * 2 + rad; + } + if (node.children.length === 0 || (node.children.length !== 0 && node.isExpand === false)) { + isLeft = targetLayout.x < rootLayout.x; + if (isLeft) { + rad = rad - Math.PI; + } + } + else { + isLeft = targetLayout.x > rootLayout.x; + if (!isLeft) { + rad = rad - Math.PI; + } + } + } + + var textPosition = isLeft ? 'left' : 'right'; + symbolPath.setStyle({ + textPosition: textPosition, + textRotation: -rad, + textOrigin: 'center', + verticalAlign: 'middle' + }); + } + + if (node.parentNode && node.parentNode !== virtualRoot) { + var edge = symbolEl.__edge; + if (!edge) { + edge = symbolEl.__edge = new BezierCurve({ + shape: getEdgeShape(seriesScope, sourceOldLayout, sourceOldLayout), + style: defaults({opacity: 0}, seriesScope.lineStyle) + }); + } + + updateProps(edge, { + shape: getEdgeShape(seriesScope, sourceLayout, targetLayout), + style: {opacity: 1} + }, seriesModel); + + group.add(edge); + } +} + +function removeNode(data, dataIndex, symbolEl, group, seriesModel, seriesScope) { + var node = data.tree.getNodeByDataIndex(dataIndex); + var virtualRoot = data.tree.root; + var itemModel = node.getModel(); + var seriesScope = getTreeNodeStyle(node, itemModel, seriesScope); + + var source = node.parentNode === virtualRoot ? node : node.parentNode || node; + var sourceLayout; + while (sourceLayout = source.getLayout(), sourceLayout == null) { + source = source.parentNode === virtualRoot ? source : source.parentNode || source; + } + + updateProps(symbolEl, { + position: [sourceLayout.x + 1, sourceLayout.y + 1] + }, seriesModel, function () { + group.remove(symbolEl); + data.setItemGraphicEl(dataIndex, null); + }); + + symbolEl.fadeOut(null, {keepLabel: true}); + + var edge = symbolEl.__edge; + if (edge) { + updateProps(edge, { + shape: getEdgeShape(seriesScope, sourceLayout, sourceLayout), + style: { + opacity: 0 + } + }, seriesModel, function () { + group.remove(edge); + }); + } +} + +function getEdgeShape(seriesScope, sourceLayout, targetLayout) { + var cpx1; + var cpy1; + var cpx2; + var cpy2; + var orient = seriesScope.orient; + + if (seriesScope.layout === 'radial') { + var x1 = sourceLayout.rawX; + var y1 = sourceLayout.rawY; + var x2 = targetLayout.rawX; + var y2 = targetLayout.rawY; + + var radialCoor1 = radialCoordinate(x1, y1); + var radialCoor2 = radialCoordinate(x1, y1 + (y2 - y1) * seriesScope.curvature); + var radialCoor3 = radialCoordinate(x2, y2 + (y1 - y2) * seriesScope.curvature); + var radialCoor4 = radialCoordinate(x2, y2); + + return { + x1: radialCoor1.x, + y1: radialCoor1.y, + x2: radialCoor4.x, + y2: radialCoor4.y, + cpx1: radialCoor2.x, + cpy1: radialCoor2.y, + cpx2: radialCoor3.x, + cpy2: radialCoor3.y + }; + } + else { + var x1 = sourceLayout.x; + var y1 = sourceLayout.y; + var x2 = targetLayout.x; + var y2 = targetLayout.y; + + if (orient === 'LR' || orient === 'RL') { + cpx1 = x1 + (x2 - x1) * seriesScope.curvature; + cpy1 = y1; + cpx2 = x2 + (x1 - x2) * seriesScope.curvature; + cpy2 = y2; + } + if (orient === 'TB' || orient === 'BT') { + cpx1 = x1; + cpy1 = y1 + (y2 - y1) * seriesScope.curvature; + cpx2 = x2; + cpy2 = y2 + (y1 - y2) * seriesScope.curvature; + } + return { + x1: x1, + y1: y1, + x2: x2, + y2: y2, + cpx1: cpx1, + cpy1: cpy1, + cpx2: cpx2, + cpy2: cpy2 + }; + } +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +registerAction({ + type: 'treeExpandAndCollapse', + event: 'treeExpandAndCollapse', + update: 'update' +}, function (payload, ecModel) { + ecModel.eachComponent({mainType: 'series', subType: 'tree', query: payload}, function (seriesModel) { + var dataIndex = payload.dataIndex; + var tree = seriesModel.getData().tree; + var node = tree.getNodeByDataIndex(dataIndex); + node.isExpand = !node.isExpand; + + }); +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +/** + * Traverse the tree from bottom to top and do something + * @param {module:echarts/data/Tree~TreeNode} root The real root of the tree + * @param {Function} callback + */ +function eachAfter (root, callback, separation) { + var nodes = [root]; + var next = []; + var node; + + while (node = nodes.pop()) { // jshint ignore:line + next.push(node); + if (node.isExpand) { + var children = node.children; + if (children.length) { + for (var i = 0; i < children.length; i++) { + nodes.push(children[i]); + } + } + } + } + + while (node = next.pop()) { // jshint ignore:line + callback(node, separation); + } +} + +/** + * Traverse the tree from top to bottom and do something + * @param {module:echarts/data/Tree~TreeNode} root The real root of the tree + * @param {Function} callback + */ +function eachBefore (root, callback) { + var nodes = [root]; + var node; + while (node = nodes.pop()) { // jshint ignore:line + callback(node); + if (node.isExpand) { + var children = node.children; + if (children.length) { + for (var i = children.length - 1; i >= 0; i--) { + nodes.push(children[i]); + } + } + } + } +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var treeLayout = function (ecModel, api) { + ecModel.eachSeriesByType('tree', function (seriesModel) { + commonLayout(seriesModel, api); + }); +}; + +function commonLayout(seriesModel, api) { + var layoutInfo = getViewRect(seriesModel, api); + seriesModel.layoutInfo = layoutInfo; + var layout = seriesModel.get('layout'); + var width = 0; + var height = 0; + var separation$$1 = null; + + if (layout === 'radial') { + width = 2 * Math.PI; + height = Math.min(layoutInfo.height, layoutInfo.width) / 2; + separation$$1 = separation(function (node1, node2) { + return (node1.parentNode === node2.parentNode ? 1 : 2) / node1.depth; + }); + } + else { + width = layoutInfo.width; + height = layoutInfo.height; + separation$$1 = separation(); + } + + var virtualRoot = seriesModel.getData().tree.root; + var realRoot = virtualRoot.children[0]; + + if (realRoot) { + init$2(virtualRoot); + eachAfter(realRoot, firstWalk, separation$$1); + virtualRoot.hierNode.modifier = - realRoot.hierNode.prelim; + eachBefore(realRoot, secondWalk); + + var left = realRoot; + var right = realRoot; + var bottom = realRoot; + eachBefore(realRoot, function (node) { + var x = node.getLayout().x; + if (x < left.getLayout().x) { + left = node; + } + if (x > right.getLayout().x) { + right = node; + } + if (node.depth > bottom.depth) { + bottom = node; + } + }); + + var delta = left === right ? 1 : separation$$1(left, right) / 2; + var tx = delta - left.getLayout().x; + var kx = 0; + var ky = 0; + var coorX = 0; + var coorY = 0; + if (layout === 'radial') { + kx = width / (right.getLayout().x + delta + tx); + // here we use (node.depth - 1), bucause the real root's depth is 1 + ky = height / ((bottom.depth - 1) || 1); + eachBefore(realRoot, function (node) { + coorX = (node.getLayout().x + tx) * kx; + coorY = (node.depth - 1) * ky; + var finalCoor = radialCoordinate(coorX, coorY); + node.setLayout({x: finalCoor.x, y: finalCoor.y, rawX: coorX, rawY: coorY}, true); + }); + } + else { + var orient = seriesModel.getOrient(); + if (orient === 'RL' || orient === 'LR') { + ky = height / (right.getLayout().x + delta + tx); + kx = width / ((bottom.depth - 1) || 1); + eachBefore(realRoot, function (node) { + coorY = (node.getLayout().x + tx) * ky; + coorX = orient === 'LR' + ? (node.depth - 1) * kx + : width - (node.depth - 1) * kx; + node.setLayout({x: coorX, y: coorY}, true); + }); + } + else if (orient === 'TB' || orient === 'BT') { + kx = width / (right.getLayout().x + delta + tx); + ky = height / ((bottom.depth - 1) || 1); + eachBefore(realRoot, function (node) { + coorX = (node.getLayout().x + tx) * kx; + coorY = orient === 'TB' + ? (node.depth - 1) * ky + : height - (node.depth - 1) * ky; + node.setLayout({x: coorX, y: coorY}, true); + }); + } + } + } +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +registerVisual(visualSymbol('tree', 'circle')); +registerLayout(treeLayout); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +function retrieveTargetInfo(payload, validPayloadTypes, seriesModel) { + if (payload && indexOf(validPayloadTypes, payload.type) >= 0) { + var root = seriesModel.getData().tree.root; + var targetNode = payload.targetNode; + if (targetNode && root.contains(targetNode)) { + return {node: targetNode}; + } + + var targetNodeId = payload.targetNodeId; + if (targetNodeId != null && (targetNode = root.getNodeById(targetNodeId))) { + return {node: targetNode}; + } + } +} + +// Not includes the given node at the last item. +function getPathToRoot(node) { + var path = []; + while (node) { + node = node.parentNode; + node && path.push(node); + } + return path.reverse(); +} + +function aboveViewRoot(viewRoot, node) { + var viewPath = getPathToRoot(viewRoot); + return indexOf(viewPath, node) >= 0; +} + +// From root to the input node (the input node will be included). +function wrapTreePathInfo(node, seriesModel) { + var treePathInfo = []; + + while (node) { + var nodeDataIndex = node.dataIndex; + treePathInfo.push({ + name: node.name, + dataIndex: nodeDataIndex, + value: seriesModel.getRawValue(nodeDataIndex) + }); + node = node.parentNode; + } + + treePathInfo.reverse(); + + return treePathInfo; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +SeriesModel.extend({ + + type: 'series.treemap', + + layoutMode: 'box', + + dependencies: ['grid', 'polar'], + + /** + * @type {module:echarts/data/Tree~Node} + */ + _viewRoot: null, + + defaultOption: { + // Disable progressive rendering + progressive: 0, + hoverLayerThreshold: Infinity, + // center: ['50%', '50%'], // not supported in ec3. + // size: ['80%', '80%'], // deprecated, compatible with ec2. + left: 'center', + top: 'middle', + right: null, + bottom: null, + width: '80%', + height: '80%', + sort: true, // Can be null or false or true + // (order by desc default, asc not supported yet (strange effect)) + clipWindow: 'origin', // Size of clipped window when zooming. 'origin' or 'fullscreen' + squareRatio: 0.5 * (1 + Math.sqrt(5)), // golden ratio + leafDepth: null, // Nodes on depth from root are regarded as leaves. + // Count from zero (zero represents only view root). + drillDownIcon: '▶', // Use html character temporarily because it is complicated + // to align specialized icon. ▷▶❒❐▼✚ + + zoomToNodeRatio: 0.32 * 0.32, // Be effective when using zoomToNode. Specify the proportion of the + // target node area in the view area. + roam: true, // true, false, 'scale' or 'zoom', 'move'. + nodeClick: 'zoomToNode', // Leaf node click behaviour: 'zoomToNode', 'link', false. + // If leafDepth is set and clicking a node which has children but + // be on left depth, the behaviour would be changing root. Otherwise + // use behavious defined above. + animation: true, + animationDurationUpdate: 900, + animationEasing: 'quinticInOut', + breadcrumb: { + show: true, + height: 22, + left: 'center', + top: 'bottom', + // right + // bottom + emptyItemWidth: 25, // Width of empty node. + itemStyle: { + color: 'rgba(0,0,0,0.7)', //'#5793f3', + borderColor: 'rgba(255,255,255,0.7)', + borderWidth: 1, + shadowColor: 'rgba(150,150,150,1)', + shadowBlur: 3, + shadowOffsetX: 0, + shadowOffsetY: 0, + textStyle: { + color: '#fff' + } + }, + emphasis: { + textStyle: {} + } + }, + label: { + show: true, + // Do not use textDistance, for ellipsis rect just the same as treemap node rect. + distance: 0, + padding: 5, + position: 'inside', // Can be [5, '5%'] or position stirng like 'insideTopLeft', ... + // formatter: null, + color: '#fff', + ellipsis: true + // align + // verticalAlign + }, + upperLabel: { // Label when node is parent. + show: false, + position: [0, '50%'], + height: 20, + // formatter: null, + color: '#fff', + ellipsis: true, + // align: null, + verticalAlign: 'middle' + }, + itemStyle: { + color: null, // Can be 'none' if not necessary. + colorAlpha: null, // Can be 'none' if not necessary. + colorSaturation: null, // Can be 'none' if not necessary. + borderWidth: 0, + gapWidth: 0, + borderColor: '#fff', + borderColorSaturation: null // If specified, borderColor will be ineffective, and the + // border color is evaluated by color of current node and + // borderColorSaturation. + }, + emphasis: { + upperLabel: { + show: true, + position: [0, '50%'], + color: '#fff', + ellipsis: true, + verticalAlign: 'middle' + } + }, + + visualDimension: 0, // Can be 0, 1, 2, 3. + visualMin: null, + visualMax: null, + + color: [], // + treemapSeries.color should not be modified. Please only modified + // level[n].color (if necessary). + // + Specify color list of each level. level[0].color would be global + // color list if not specified. (see method `setDefault`). + // + But set as a empty array to forbid fetch color from global palette + // when using nodeModel.get('color'), otherwise nodes on deep level + // will always has color palette set and are not able to inherit color + // from parent node. + // + TreemapSeries.color can not be set as 'none', otherwise effect + // legend color fetching (see seriesColor.js). + colorAlpha: null, // Array. Specify color alpha range of each level, like [0.2, 0.8] + colorSaturation: null, // Array. Specify color saturation of each level, like [0.2, 0.5] + colorMappingBy: 'index', // 'value' or 'index' or 'id'. + visibleMin: 10, // If area less than this threshold (unit: pixel^2), node will not + // be rendered. Only works when sort is 'asc' or 'desc'. + childrenVisibleMin: null, // If area of a node less than this threshold (unit: pixel^2), + // grandchildren will not show. + // Why grandchildren? If not grandchildren but children, + // some siblings show children and some not, + // the appearance may be mess and not consistent, + levels: [] // Each item: { + // visibleMin, itemStyle, visualDimension, label + // } + // data: { + // value: [], + // children: [], + // link: 'http://xxx.xxx.xxx', + // target: 'blank' or 'self' + // } + }, + + /** + * @override + */ + getInitialData: function (option, ecModel) { + // Create a virtual root. + var root = {name: option.name, children: option.data}; + + completeTreeValue(root); + + var levels = option.levels || []; + + levels = option.levels = setDefault(levels, ecModel); + + var treeOption = {}; + + treeOption.levels = levels; + + // Make sure always a new tree is created when setOption, + // in TreemapView, we check whether oldTree === newTree + // to choose mappings approach among old shapes and new shapes. + return Tree.createTree(root, this, treeOption).data; + }, + + optionUpdated: function () { + this.resetViewRoot(); + }, + + /** + * @override + * @param {number} dataIndex + * @param {boolean} [mutipleSeries=false] + */ + formatTooltip: function (dataIndex) { + var data = this.getData(); + var value = this.getRawValue(dataIndex); + var formattedValue = isArray(value) + ? addCommas(value[0]) : addCommas(value); + var name = data.getName(dataIndex); + + return encodeHTML(name + ': ' + formattedValue); + }, + + /** + * Add tree path to tooltip param + * + * @override + * @param {number} dataIndex + * @return {Object} + */ + getDataParams: function (dataIndex) { + var params = SeriesModel.prototype.getDataParams.apply(this, arguments); + + var node = this.getData().tree.getNodeByDataIndex(dataIndex); + params.treePathInfo = wrapTreePathInfo(node, this); + + return params; + }, + + /** + * @public + * @param {Object} layoutInfo { + * x: containerGroup x + * y: containerGroup y + * width: containerGroup width + * height: containerGroup height + * } + */ + setLayoutInfo: function (layoutInfo) { + /** + * @readOnly + * @type {Object} + */ + this.layoutInfo = this.layoutInfo || {}; + extend(this.layoutInfo, layoutInfo); + }, + + /** + * @param {string} id + * @return {number} index + */ + mapIdToIndex: function (id) { + // A feature is implemented: + // index is monotone increasing with the sequence of + // input id at the first time. + // This feature can make sure that each data item and its + // mapped color have the same index between data list and + // color list at the beginning, which is useful for user + // to adjust data-color mapping. + + /** + * @private + * @type {Object} + */ + var idIndexMap = this._idIndexMap; + + if (!idIndexMap) { + idIndexMap = this._idIndexMap = createHashMap(); + /** + * @private + * @type {number} + */ + this._idIndexMapCount = 0; + } + + var index = idIndexMap.get(id); + if (index == null) { + idIndexMap.set(id, index = this._idIndexMapCount++); + } + + return index; + }, + + getViewRoot: function () { + return this._viewRoot; + }, + + /** + * @param {module:echarts/data/Tree~Node} [viewRoot] + */ + resetViewRoot: function (viewRoot) { + viewRoot + ? (this._viewRoot = viewRoot) + : (viewRoot = this._viewRoot); + + var root = this.getRawData().tree.root; + + if (!viewRoot + || (viewRoot !== root && !root.contains(viewRoot)) + ) { + this._viewRoot = root; + } + } +}); + +/** + * @param {Object} dataNode + */ +function completeTreeValue(dataNode) { + // Postorder travel tree. + // If value of none-leaf node is not set, + // calculate it by suming up the value of all children. + var sum = 0; + + each$1(dataNode.children, function (child) { + + completeTreeValue(child); + + var childValue = child.value; + isArray(childValue) && (childValue = childValue[0]); + + sum += childValue; + }); + + var thisValue = dataNode.value; + if (isArray(thisValue)) { + thisValue = thisValue[0]; + } + + if (thisValue == null || isNaN(thisValue)) { + thisValue = sum; + } + // Value should not less than 0. + if (thisValue < 0) { + thisValue = 0; + } + + isArray(dataNode.value) + ? (dataNode.value[0] = thisValue) + : (dataNode.value = thisValue); +} + +/** + * set default to level configuration + */ +function setDefault(levels, ecModel) { + var globalColorList = ecModel.get('color'); + + if (!globalColorList) { + return; + } + + levels = levels || []; + var hasColorDefine; + each$1(levels, function (levelDefine) { + var model = new Model(levelDefine); + var modelColor = model.get('color'); + + if (model.get('itemStyle.color') + || (modelColor && modelColor !== 'none') + ) { + hasColorDefine = true; + } + }); + + if (!hasColorDefine) { + var level0 = levels[0] || (levels[0] = {}); + level0.color = globalColorList.slice(); + } + + return levels; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var TEXT_PADDING = 8; +var ITEM_GAP = 8; +var ARRAY_LENGTH = 5; + +function Breadcrumb(containerGroup) { + /** + * @private + * @type {module:zrender/container/Group} + */ + this.group = new Group(); + + containerGroup.add(this.group); +} + +Breadcrumb.prototype = { + + constructor: Breadcrumb, + + render: function (seriesModel, api, targetNode, onSelect) { + var model = seriesModel.getModel('breadcrumb'); + var thisGroup = this.group; + + thisGroup.removeAll(); + + if (!model.get('show') || !targetNode) { + return; + } + + var normalStyleModel = model.getModel('itemStyle'); + // var emphasisStyleModel = model.getModel('emphasis.itemStyle'); + var textStyleModel = normalStyleModel.getModel('textStyle'); + + var layoutParam = { + pos: { + left: model.get('left'), + right: model.get('right'), + top: model.get('top'), + bottom: model.get('bottom') + }, + box: { + width: api.getWidth(), + height: api.getHeight() + }, + emptyItemWidth: model.get('emptyItemWidth'), + totalWidth: 0, + renderList: [] + }; + + this._prepare(targetNode, layoutParam, textStyleModel); + this._renderContent(seriesModel, layoutParam, normalStyleModel, textStyleModel, onSelect); + + positionElement(thisGroup, layoutParam.pos, layoutParam.box); + }, + + /** + * Prepare render list and total width + * @private + */ + _prepare: function (targetNode, layoutParam, textStyleModel) { + for (var node = targetNode; node; node = node.parentNode) { + var text = node.getModel().get('name'); + var textRect = textStyleModel.getTextRect(text); + var itemWidth = Math.max( + textRect.width + TEXT_PADDING * 2, + layoutParam.emptyItemWidth + ); + layoutParam.totalWidth += itemWidth + ITEM_GAP; + layoutParam.renderList.push({node: node, text: text, width: itemWidth}); + } + }, + + /** + * @private + */ + _renderContent: function ( + seriesModel, layoutParam, normalStyleModel, textStyleModel, onSelect + ) { + // Start rendering. + var lastX = 0; + var emptyItemWidth = layoutParam.emptyItemWidth; + var height = seriesModel.get('breadcrumb.height'); + var availableSize = getAvailableSize(layoutParam.pos, layoutParam.box); + var totalWidth = layoutParam.totalWidth; + var renderList = layoutParam.renderList; + + for (var i = renderList.length - 1; i >= 0; i--) { + var item = renderList[i]; + var itemNode = item.node; + var itemWidth = item.width; + var text = item.text; + + // Hdie text and shorten width if necessary. + if (totalWidth > availableSize.width) { + totalWidth -= itemWidth - emptyItemWidth; + itemWidth = emptyItemWidth; + text = null; + } + + var el = new Polygon({ + shape: { + points: makeItemPoints( + lastX, 0, itemWidth, height, + i === renderList.length - 1, i === 0 + ) + }, + style: defaults( + normalStyleModel.getItemStyle(), + { + lineJoin: 'bevel', + text: text, + textFill: textStyleModel.getTextColor(), + textFont: textStyleModel.getFont() + } + ), + z: 10, + onclick: curry(onSelect, itemNode) + }); + this.group.add(el); + + packEventData(el, seriesModel, itemNode); + + lastX += itemWidth + ITEM_GAP; + } + }, + + /** + * @override + */ + remove: function () { + this.group.removeAll(); + } +}; + +function makeItemPoints(x, y, itemWidth, itemHeight, head, tail) { + var points = [ + [head ? x : x - ARRAY_LENGTH, y], + [x + itemWidth, y], + [x + itemWidth, y + itemHeight], + [head ? x : x - ARRAY_LENGTH, y + itemHeight] + ]; + !tail && points.splice(2, 0, [x + itemWidth + ARRAY_LENGTH, y + itemHeight / 2]); + !head && points.push([x, y + itemHeight / 2]); + return points; +} + +// Package custom mouse event. +function packEventData(el, seriesModel, itemNode) { + el.eventData = { + componentType: 'series', + componentSubType: 'treemap', + seriesIndex: seriesModel.componentIndex, + seriesName: seriesModel.name, + seriesType: 'treemap', + selfType: 'breadcrumb', // Distinguish with click event on treemap node. + nodeData: { + dataIndex: itemNode && itemNode.dataIndex, + name: itemNode && itemNode.name + }, + treePathInfo: itemNode && wrapTreePathInfo(itemNode, seriesModel) + }; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @param {number} [time=500] Time in ms + * @param {string} [easing='linear'] + * @param {number} [delay=0] + * @param {Function} [callback] + * + * @example + * // Animate position + * animation + * .createWrap() + * .add(el1, {position: [10, 10]}) + * .add(el2, {shape: {width: 500}, style: {fill: 'red'}}, 400) + * .done(function () { // done }) + * .start('cubicOut'); + */ +function createWrap() { + + var storage = []; + var elExistsMap = {}; + var doneCallback; + + return { + + /** + * Caution: a el can only be added once, otherwise 'done' + * might not be called. This method checks this (by el.id), + * suppresses adding and returns false when existing el found. + * + * @param {modele:zrender/Element} el + * @param {Object} target + * @param {number} [time=500] + * @param {number} [delay=0] + * @param {string} [easing='linear'] + * @return {boolean} Whether adding succeeded. + * + * @example + * add(el, target, time, delay, easing); + * add(el, target, time, easing); + * add(el, target, time); + * add(el, target); + */ + add: function (el, target, time, delay, easing) { + if (isString(delay)) { + easing = delay; + delay = 0; + } + + if (elExistsMap[el.id]) { + return false; + } + elExistsMap[el.id] = 1; + + storage.push( + {el: el, target: target, time: time, delay: delay, easing: easing} + ); + + return true; + }, + + /** + * Only execute when animation finished. Will not execute when any + * of 'stop' or 'stopAnimation' called. + * + * @param {Function} callback + */ + done: function (callback) { + doneCallback = callback; + return this; + }, + + /** + * Will stop exist animation firstly. + */ + start: function () { + var count = storage.length; + + for (var i = 0, len = storage.length; i < len; i++) { + var item = storage[i]; + item.el.animateTo(item.target, item.time, item.delay, item.easing, done); + } + + return this; + + function done() { + count--; + if (!count) { + storage.length = 0; + elExistsMap = {}; + doneCallback && doneCallback(); + } + } + } + }; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var bind$1 = bind; +var Group$2 = Group; +var Rect$1 = Rect; +var each$8 = each$1; + +var DRAG_THRESHOLD = 3; +var PATH_LABEL_NOAMAL = ['label']; +var PATH_LABEL_EMPHASIS = ['emphasis', 'label']; +var PATH_UPPERLABEL_NORMAL = ['upperLabel']; +var PATH_UPPERLABEL_EMPHASIS = ['emphasis', 'upperLabel']; +var Z_BASE = 10; // Should bigger than every z. +var Z_BG = 1; +var Z_CONTENT = 2; + +var getItemStyleEmphasis = makeStyleMapper([ + ['fill', 'color'], + // `borderColor` and `borderWidth` has been occupied, + // so use `stroke` to indicate the stroke of the rect. + ['stroke', 'strokeColor'], + ['lineWidth', 'strokeWidth'], + ['shadowBlur'], + ['shadowOffsetX'], + ['shadowOffsetY'], + ['shadowColor'] +]); +var getItemStyleNormal = function (model) { + // Normal style props should include emphasis style props. + var itemStyle = getItemStyleEmphasis(model); + // Clear styles set by emphasis. + itemStyle.stroke = itemStyle.fill = itemStyle.lineWidth = null; + return itemStyle; +}; + +extendChartView({ + + type: 'treemap', + + /** + * @override + */ + init: function (o, api) { + + /** + * @private + * @type {module:zrender/container/Group} + */ + this._containerGroup; + + /** + * @private + * @type {Object.<string, Array.<module:zrender/container/Group>>} + */ + this._storage = createStorage(); + + /** + * @private + * @type {module:echarts/data/Tree} + */ + this._oldTree; + + /** + * @private + * @type {module:echarts/chart/treemap/Breadcrumb} + */ + this._breadcrumb; + + /** + * @private + * @type {module:echarts/component/helper/RoamController} + */ + this._controller; + + /** + * 'ready', 'animating' + * @private + */ + this._state = 'ready'; + }, + + /** + * @override + */ + render: function (seriesModel, ecModel, api, payload) { + + var models = ecModel.findComponents({ + mainType: 'series', subType: 'treemap', query: payload + }); + if (indexOf(models, seriesModel) < 0) { + return; + } + + this.seriesModel = seriesModel; + this.api = api; + this.ecModel = ecModel; + + var types = ['treemapZoomToNode', 'treemapRootToNode']; + var targetInfo = retrieveTargetInfo(payload, types, seriesModel); + var payloadType = payload && payload.type; + var layoutInfo = seriesModel.layoutInfo; + var isInit = !this._oldTree; + var thisStorage = this._storage; + + // Mark new root when action is treemapRootToNode. + var reRoot = (payloadType === 'treemapRootToNode' && targetInfo && thisStorage) + ? { + rootNodeGroup: thisStorage.nodeGroup[targetInfo.node.getRawIndex()], + direction: payload.direction + } + : null; + + var containerGroup = this._giveContainerGroup(layoutInfo); + + var renderResult = this._doRender(containerGroup, seriesModel, reRoot); + ( + !isInit && ( + !payloadType + || payloadType === 'treemapZoomToNode' + || payloadType === 'treemapRootToNode' + ) + ) + ? this._doAnimation(containerGroup, renderResult, seriesModel, reRoot) + : renderResult.renderFinally(); + + this._resetController(api); + + this._renderBreadcrumb(seriesModel, api, targetInfo); + }, + + /** + * @private + */ + _giveContainerGroup: function (layoutInfo) { + var containerGroup = this._containerGroup; + if (!containerGroup) { + // FIXME + // 加一层containerGroup是为了clip,但是现在clip功能并没有实现。 + containerGroup = this._containerGroup = new Group$2(); + this._initEvents(containerGroup); + this.group.add(containerGroup); + } + containerGroup.attr('position', [layoutInfo.x, layoutInfo.y]); + + return containerGroup; + }, + + /** + * @private + */ + _doRender: function (containerGroup, seriesModel, reRoot) { + var thisTree = seriesModel.getData().tree; + var oldTree = this._oldTree; + + // Clear last shape records. + var lastsForAnimation = createStorage(); + var thisStorage = createStorage(); + var oldStorage = this._storage; + var willInvisibleEls = []; + var doRenderNode = curry( + renderNode, seriesModel, + thisStorage, oldStorage, reRoot, + lastsForAnimation, willInvisibleEls + ); + + // Notice: when thisTree and oldTree are the same tree (see list.cloneShallow), + // the oldTree is actually losted, so we can not find all of the old graphic + // elements from tree. So we use this stragegy: make element storage, move + // from old storage to new storage, clear old storage. + + dualTravel( + thisTree.root ? [thisTree.root] : [], + (oldTree && oldTree.root) ? [oldTree.root] : [], + containerGroup, + thisTree === oldTree || !oldTree, + 0 + ); + + // Process all removing. + var willDeleteEls = clearStorage(oldStorage); + + this._oldTree = thisTree; + this._storage = thisStorage; + + return { + lastsForAnimation: lastsForAnimation, + willDeleteEls: willDeleteEls, + renderFinally: renderFinally + }; + + function dualTravel(thisViewChildren, oldViewChildren, parentGroup, sameTree, depth) { + // When 'render' is triggered by action, + // 'this' and 'old' may be the same tree, + // we use rawIndex in that case. + if (sameTree) { + oldViewChildren = thisViewChildren; + each$8(thisViewChildren, function (child, index) { + !child.isRemoved() && processNode(index, index); + }); + } + // Diff hierarchically (diff only in each subtree, but not whole). + // because, consistency of view is important. + else { + (new DataDiffer(oldViewChildren, thisViewChildren, getKey, getKey)) + .add(processNode) + .update(processNode) + .remove(curry(processNode, null)) + .execute(); + } + + function getKey(node) { + // Identify by name or raw index. + return node.getId(); + } + + function processNode(newIndex, oldIndex) { + var thisNode = newIndex != null ? thisViewChildren[newIndex] : null; + var oldNode = oldIndex != null ? oldViewChildren[oldIndex] : null; + + var group = doRenderNode(thisNode, oldNode, parentGroup, depth); + + group && dualTravel( + thisNode && thisNode.viewChildren || [], + oldNode && oldNode.viewChildren || [], + group, + sameTree, + depth + 1 + ); + } + } + + function clearStorage(storage) { + var willDeleteEls = createStorage(); + storage && each$8(storage, function (store, storageName) { + var delEls = willDeleteEls[storageName]; + each$8(store, function (el) { + el && (delEls.push(el), el.__tmWillDelete = 1); + }); + }); + return willDeleteEls; + } + + function renderFinally() { + each$8(willDeleteEls, function (els) { + each$8(els, function (el) { + el.parent && el.parent.remove(el); + }); + }); + each$8(willInvisibleEls, function (el) { + el.invisible = true; + // Setting invisible is for optimizing, so no need to set dirty, + // just mark as invisible. + el.dirty(); + }); + } + }, + + /** + * @private + */ + _doAnimation: function (containerGroup, renderResult, seriesModel, reRoot) { + if (!seriesModel.get('animation')) { + return; + } + + var duration = seriesModel.get('animationDurationUpdate'); + var easing = seriesModel.get('animationEasing'); + var animationWrap = createWrap(); + + // Make delete animations. + each$8(renderResult.willDeleteEls, function (store, storageName) { + each$8(store, function (el, rawIndex) { + if (el.invisible) { + return; + } + + var parent = el.parent; // Always has parent, and parent is nodeGroup. + var target; + + if (reRoot && reRoot.direction === 'drillDown') { + target = parent === reRoot.rootNodeGroup + // This is the content element of view root. + // Only `content` will enter this branch, because + // `background` and `nodeGroup` will not be deleted. + ? { + shape: { + x: 0, + y: 0, + width: parent.__tmNodeWidth, + height: parent.__tmNodeHeight + }, + style: { + opacity: 0 + } + } + // Others. + : {style: {opacity: 0}}; + } + else { + var targetX = 0; + var targetY = 0; + + if (!parent.__tmWillDelete) { + // Let node animate to right-bottom corner, cooperating with fadeout, + // which is appropriate for user understanding. + // Divided by 2 for reRoot rolling up effect. + targetX = parent.__tmNodeWidth / 2; + targetY = parent.__tmNodeHeight / 2; + } + + target = storageName === 'nodeGroup' + ? {position: [targetX, targetY], style: {opacity: 0}} + : { + shape: {x: targetX, y: targetY, width: 0, height: 0}, + style: {opacity: 0} + }; + } + + target && animationWrap.add(el, target, duration, easing); + }); + }); + + // Make other animations + each$8(this._storage, function (store, storageName) { + each$8(store, function (el, rawIndex) { + var last = renderResult.lastsForAnimation[storageName][rawIndex]; + var target = {}; + + if (!last) { + return; + } + + if (storageName === 'nodeGroup') { + if (last.old) { + target.position = el.position.slice(); + el.attr('position', last.old); + } + } + else { + if (last.old) { + target.shape = extend({}, el.shape); + el.setShape(last.old); + } + + if (last.fadein) { + el.setStyle('opacity', 0); + target.style = {opacity: 1}; + } + // When animation is stopped for succedent animation starting, + // el.style.opacity might not be 1 + else if (el.style.opacity !== 1) { + target.style = {opacity: 1}; + } + } + + animationWrap.add(el, target, duration, easing); + }); + }, this); + + this._state = 'animating'; + + animationWrap + .done(bind$1(function () { + this._state = 'ready'; + renderResult.renderFinally(); + }, this)) + .start(); + }, + + /** + * @private + */ + _resetController: function (api) { + var controller = this._controller; + + // Init controller. + if (!controller) { + controller = this._controller = new RoamController(api.getZr()); + controller.enable(this.seriesModel.get('roam')); + controller.on('pan', bind$1(this._onPan, this)); + controller.on('zoom', bind$1(this._onZoom, this)); + } + + var rect = new BoundingRect(0, 0, api.getWidth(), api.getHeight()); + controller.setPointerChecker(function (e, x, y) { + return rect.contain(x, y); + }); + }, + + /** + * @private + */ + _clearController: function () { + var controller = this._controller; + if (controller) { + controller.dispose(); + controller = null; + } + }, + + /** + * @private + */ + _onPan: function (dx, dy) { + if (this._state !== 'animating' + && (Math.abs(dx) > DRAG_THRESHOLD || Math.abs(dy) > DRAG_THRESHOLD) + ) { + // These param must not be cached. + var root = this.seriesModel.getData().tree.root; + + if (!root) { + return; + } + + var rootLayout = root.getLayout(); + + if (!rootLayout) { + return; + } + + this.api.dispatchAction({ + type: 'treemapMove', + from: this.uid, + seriesId: this.seriesModel.id, + rootRect: { + x: rootLayout.x + dx, y: rootLayout.y + dy, + width: rootLayout.width, height: rootLayout.height + } + }); + } + }, + + /** + * @private + */ + _onZoom: function (scale, mouseX, mouseY) { + if (this._state !== 'animating') { + // These param must not be cached. + var root = this.seriesModel.getData().tree.root; + + if (!root) { + return; + } + + var rootLayout = root.getLayout(); + + if (!rootLayout) { + return; + } + + var rect = new BoundingRect( + rootLayout.x, rootLayout.y, rootLayout.width, rootLayout.height + ); + var layoutInfo = this.seriesModel.layoutInfo; + + // Transform mouse coord from global to containerGroup. + mouseX -= layoutInfo.x; + mouseY -= layoutInfo.y; + + // Scale root bounding rect. + var m = create$1(); + translate(m, m, [-mouseX, -mouseY]); + scale$1(m, m, [scale, scale]); + translate(m, m, [mouseX, mouseY]); + + rect.applyTransform(m); + + this.api.dispatchAction({ + type: 'treemapRender', + from: this.uid, + seriesId: this.seriesModel.id, + rootRect: { + x: rect.x, y: rect.y, + width: rect.width, height: rect.height + } + }); + } + }, + + /** + * @private + */ + _initEvents: function (containerGroup) { + containerGroup.on('click', function (e) { + if (this._state !== 'ready') { + return; + } + + var nodeClick = this.seriesModel.get('nodeClick', true); + + if (!nodeClick) { + return; + } + + var targetInfo = this.findTarget(e.offsetX, e.offsetY); + + if (!targetInfo) { + return; + } + + var node = targetInfo.node; + if (node.getLayout().isLeafRoot) { + this._rootToNode(targetInfo); + } + else { + if (nodeClick === 'zoomToNode') { + this._zoomToNode(targetInfo); + } + else if (nodeClick === 'link') { + var itemModel = node.hostTree.data.getItemModel(node.dataIndex); + var link = itemModel.get('link', true); + var linkTarget = itemModel.get('target', true) || 'blank'; + link && window.open(link, linkTarget); + } + } + + }, this); + }, + + /** + * @private + */ + _renderBreadcrumb: function (seriesModel, api, targetInfo) { + if (!targetInfo) { + targetInfo = seriesModel.get('leafDepth', true) != null + ? {node: seriesModel.getViewRoot()} + // FIXME + // better way? + // Find breadcrumb tail on center of containerGroup. + : this.findTarget(api.getWidth() / 2, api.getHeight() / 2); + + if (!targetInfo) { + targetInfo = {node: seriesModel.getData().tree.root}; + } + } + + (this._breadcrumb || (this._breadcrumb = new Breadcrumb(this.group))) + .render(seriesModel, api, targetInfo.node, bind$1(onSelect, this)); + + function onSelect(node) { + if (this._state !== 'animating') { + aboveViewRoot(seriesModel.getViewRoot(), node) + ? this._rootToNode({node: node}) + : this._zoomToNode({node: node}); + } + } + }, + + /** + * @override + */ + remove: function () { + this._clearController(); + this._containerGroup && this._containerGroup.removeAll(); + this._storage = createStorage(); + this._state = 'ready'; + this._breadcrumb && this._breadcrumb.remove(); + }, + + dispose: function () { + this._clearController(); + }, + + /** + * @private + */ + _zoomToNode: function (targetInfo) { + this.api.dispatchAction({ + type: 'treemapZoomToNode', + from: this.uid, + seriesId: this.seriesModel.id, + targetNode: targetInfo.node + }); + }, + + /** + * @private + */ + _rootToNode: function (targetInfo) { + this.api.dispatchAction({ + type: 'treemapRootToNode', + from: this.uid, + seriesId: this.seriesModel.id, + targetNode: targetInfo.node + }); + }, + + /** + * @public + * @param {number} x Global coord x. + * @param {number} y Global coord y. + * @return {Object} info If not found, return undefined; + * @return {number} info.node Target node. + * @return {number} info.offsetX x refer to target node. + * @return {number} info.offsetY y refer to target node. + */ + findTarget: function (x, y) { + var targetInfo; + var viewRoot = this.seriesModel.getViewRoot(); + + viewRoot.eachNode({attr: 'viewChildren', order: 'preorder'}, function (node) { + var bgEl = this._storage.background[node.getRawIndex()]; + // If invisible, there might be no element. + if (bgEl) { + var point = bgEl.transformCoordToLocal(x, y); + var shape = bgEl.shape; + + // For performance consideration, dont use 'getBoundingRect'. + if (shape.x <= point[0] + && point[0] <= shape.x + shape.width + && shape.y <= point[1] + && point[1] <= shape.y + shape.height + ) { + targetInfo = {node: node, offsetX: point[0], offsetY: point[1]}; + } + else { + return false; // Suppress visit subtree. + } + } + }, this); + + return targetInfo; + } + +}); + +/** + * @inner + */ +function createStorage() { + return {nodeGroup: [], background: [], content: []}; +} + +/** + * @inner + * @return Return undefined means do not travel further. + */ +function renderNode( + seriesModel, thisStorage, oldStorage, reRoot, + lastsForAnimation, willInvisibleEls, + thisNode, oldNode, parentGroup, depth +) { + // Whether under viewRoot. + if (!thisNode) { + // Deleting nodes will be performed finally. This method just find + // element from old storage, or create new element, set them to new + // storage, and set styles. + return; + } + + // ------------------------------------------------------------------- + // Start of closure variables available in "Procedures in renderNode". + + var thisLayout = thisNode.getLayout(); + + if (!thisLayout || !thisLayout.isInView) { + return; + } + + var thisWidth = thisLayout.width; + var thisHeight = thisLayout.height; + var borderWidth = thisLayout.borderWidth; + var thisInvisible = thisLayout.invisible; + + var thisRawIndex = thisNode.getRawIndex(); + var oldRawIndex = oldNode && oldNode.getRawIndex(); + + var thisViewChildren = thisNode.viewChildren; + var upperHeight = thisLayout.upperHeight; + var isParent = thisViewChildren && thisViewChildren.length; + var itemStyleNormalModel = thisNode.getModel('itemStyle'); + var itemStyleEmphasisModel = thisNode.getModel('emphasis.itemStyle'); + + // End of closure ariables available in "Procedures in renderNode". + // ----------------------------------------------------------------- + + // Node group + var group = giveGraphic('nodeGroup', Group$2); + + if (!group) { + return; + } + + parentGroup.add(group); + // x,y are not set when el is above view root. + group.attr('position', [thisLayout.x || 0, thisLayout.y || 0]); + group.__tmNodeWidth = thisWidth; + group.__tmNodeHeight = thisHeight; + + if (thisLayout.isAboveViewRoot) { + return group; + } + + // Background + var bg = giveGraphic('background', Rect$1, depth, Z_BG); + bg && renderBackground(group, bg, isParent && thisLayout.upperHeight); + + // No children, render content. + if (!isParent) { + var content = giveGraphic('content', Rect$1, depth, Z_CONTENT); + content && renderContent(group, content); + } + + return group; + + // ---------------------------- + // | Procedures in renderNode | + // ---------------------------- + + function renderBackground(group, bg, useUpperLabel) { + // For tooltip. + bg.dataIndex = thisNode.dataIndex; + bg.seriesIndex = seriesModel.seriesIndex; + + bg.setShape({x: 0, y: 0, width: thisWidth, height: thisHeight}); + var visualBorderColor = thisNode.getVisual('borderColor', true); + var emphasisBorderColor = itemStyleEmphasisModel.get('borderColor'); + + updateStyle(bg, function () { + var normalStyle = getItemStyleNormal(itemStyleNormalModel); + normalStyle.fill = visualBorderColor; + var emphasisStyle = getItemStyleEmphasis(itemStyleEmphasisModel); + emphasisStyle.fill = emphasisBorderColor; + + if (useUpperLabel) { + var upperLabelWidth = thisWidth - 2 * borderWidth; + + prepareText( + normalStyle, emphasisStyle, visualBorderColor, upperLabelWidth, upperHeight, + {x: borderWidth, y: 0, width: upperLabelWidth, height: upperHeight} + ); + } + // For old bg. + else { + normalStyle.text = emphasisStyle.text = null; + } + + bg.setStyle(normalStyle); + setHoverStyle(bg, emphasisStyle); + }); + + group.add(bg); + } + + function renderContent(group, content) { + // For tooltip. + content.dataIndex = thisNode.dataIndex; + content.seriesIndex = seriesModel.seriesIndex; + + var contentWidth = Math.max(thisWidth - 2 * borderWidth, 0); + var contentHeight = Math.max(thisHeight - 2 * borderWidth, 0); + + content.culling = true; + content.setShape({ + x: borderWidth, + y: borderWidth, + width: contentWidth, + height: contentHeight + }); + + var visualColor = thisNode.getVisual('color', true); + updateStyle(content, function () { + var normalStyle = getItemStyleNormal(itemStyleNormalModel); + normalStyle.fill = visualColor; + var emphasisStyle = getItemStyleEmphasis(itemStyleEmphasisModel); + + prepareText(normalStyle, emphasisStyle, visualColor, contentWidth, contentHeight); + + content.setStyle(normalStyle); + setHoverStyle(content, emphasisStyle); + }); + + group.add(content); + } + + function updateStyle(element, cb) { + if (!thisInvisible) { + // If invisible, do not set visual, otherwise the element will + // change immediately before animation. We think it is OK to + // remain its origin color when moving out of the view window. + cb(); + + if (!element.__tmWillVisible) { + element.invisible = false; + } + } + else { + // Delay invisible setting utill animation finished, + // avoid element vanish suddenly before animation. + !element.invisible && willInvisibleEls.push(element); + } + } + + function prepareText(normalStyle, emphasisStyle, visualColor, width, height, upperLabelRect) { + var nodeModel = thisNode.getModel(); + var text = retrieve( + seriesModel.getFormattedLabel( + thisNode.dataIndex, 'normal', null, null, upperLabelRect ? 'upperLabel' : 'label' + ), + nodeModel.get('name') + ); + if (!upperLabelRect && thisLayout.isLeafRoot) { + var iconChar = seriesModel.get('drillDownIcon', true); + text = iconChar ? iconChar + ' ' + text : text; + } + + var normalLabelModel = nodeModel.getModel( + upperLabelRect ? PATH_UPPERLABEL_NORMAL : PATH_LABEL_NOAMAL + ); + var emphasisLabelModel = nodeModel.getModel( + upperLabelRect ? PATH_UPPERLABEL_EMPHASIS : PATH_LABEL_EMPHASIS + ); + + var isShow = normalLabelModel.getShallow('show'); + + setLabelStyle( + normalStyle, emphasisStyle, normalLabelModel, emphasisLabelModel, + { + defaultText: isShow ? text : null, + autoColor: visualColor, + isRectText: true + } + ); + + upperLabelRect && (normalStyle.textRect = clone(upperLabelRect)); + + normalStyle.truncate = (isShow && normalLabelModel.get('ellipsis')) + ? { + outerWidth: width, + outerHeight: height, + minChar: 2 + } + : null; + } + + function giveGraphic(storageName, Ctor, depth, z) { + var element = oldRawIndex != null && oldStorage[storageName][oldRawIndex]; + var lasts = lastsForAnimation[storageName]; + + if (element) { + // Remove from oldStorage + oldStorage[storageName][oldRawIndex] = null; + prepareAnimationWhenHasOld(lasts, element, storageName); + } + // If invisible and no old element, do not create new element (for optimizing). + else if (!thisInvisible) { + element = new Ctor({z: calculateZ(depth, z)}); + element.__tmDepth = depth; + element.__tmStorageName = storageName; + prepareAnimationWhenNoOld(lasts, element, storageName); + } + + // Set to thisStorage + return (thisStorage[storageName][thisRawIndex] = element); + } + + function prepareAnimationWhenHasOld(lasts, element, storageName) { + var lastCfg = lasts[thisRawIndex] = {}; + lastCfg.old = storageName === 'nodeGroup' + ? element.position.slice() + : extend({}, element.shape); + } + + // If a element is new, we need to find the animation start point carefully, + // otherwise it will looks strange when 'zoomToNode'. + function prepareAnimationWhenNoOld(lasts, element, storageName) { + var lastCfg = lasts[thisRawIndex] = {}; + var parentNode = thisNode.parentNode; + + if (parentNode && (!reRoot || reRoot.direction === 'drillDown')) { + var parentOldX = 0; + var parentOldY = 0; + + // New nodes appear from right-bottom corner in 'zoomToNode' animation. + // For convenience, get old bounding rect from background. + var parentOldBg = lastsForAnimation.background[parentNode.getRawIndex()]; + if (!reRoot && parentOldBg && parentOldBg.old) { + parentOldX = parentOldBg.old.width; + parentOldY = parentOldBg.old.height; + } + + // When no parent old shape found, its parent is new too, + // so we can just use {x:0, y:0}. + lastCfg.old = storageName === 'nodeGroup' + ? [0, parentOldY] + : {x: parentOldX, y: parentOldY, width: 0, height: 0}; + } + + // Fade in, user can be aware that these nodes are new. + lastCfg.fadein = storageName !== 'nodeGroup'; + } +} + +// We can not set all backgroud with the same z, Because the behaviour of +// drill down and roll up differ background creation sequence from tree +// hierarchy sequence, which cause that lowser background element overlap +// upper ones. So we calculate z based on depth. +// Moreover, we try to shrink down z interval to [0, 1] to avoid that +// treemap with large z overlaps other components. +function calculateZ(depth, zInLevel) { + var zb = depth * Z_BASE + zInLevel; + return (zb - 1) / zb; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @file Treemap action + */ + +var noop$1 = function () {}; + +var actionTypes = [ + 'treemapZoomToNode', + 'treemapRender', + 'treemapMove' +]; + +for (var i$2 = 0; i$2 < actionTypes.length; i$2++) { + registerAction({type: actionTypes[i$2], update: 'updateView'}, noop$1); +} + +registerAction( + {type: 'treemapRootToNode', update: 'updateView'}, + function (payload, ecModel) { + + ecModel.eachComponent( + {mainType: 'series', subType: 'treemap', query: payload}, + handleRootToNode + ); + + function handleRootToNode(model, index) { + var types = ['treemapZoomToNode', 'treemapRootToNode']; + var targetInfo = retrieveTargetInfo(payload, types, model); + + if (targetInfo) { + var originViewRoot = model.getViewRoot(); + if (originViewRoot) { + payload.direction = aboveViewRoot(originViewRoot, targetInfo.node) + ? 'rollUp' : 'drillDown'; + } + model.resetViewRoot(targetInfo.node); + } + } + } +); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var each$9 = each$1; +var isObject$5 = isObject$1; + +var CATEGORY_DEFAULT_VISUAL_INDEX = -1; + +/** + * @param {Object} option + * @param {string} [option.type] See visualHandlers. + * @param {string} [option.mappingMethod] 'linear' or 'piecewise' or 'category' or 'fixed' + * @param {Array.<number>=} [option.dataExtent] [minExtent, maxExtent], + * required when mappingMethod is 'linear' + * @param {Array.<Object>=} [option.pieceList] [ + * {value: someValue}, + * {interval: [min1, max1], visual: {...}}, + * {interval: [min2, max2]} + * ], + * required when mappingMethod is 'piecewise'. + * Visual for only each piece can be specified. + * @param {Array.<string|Object>=} [option.categories] ['cate1', 'cate2'] + * required when mappingMethod is 'category'. + * If no option.categories, categories is set + * as [0, 1, 2, ...]. + * @param {boolean} [option.loop=false] Whether loop mapping when mappingMethod is 'category'. + * @param {(Array|Object|*)} [option.visual] Visual data. + * when mappingMethod is 'category', + * visual data can be array or object + * (like: {cate1: '#222', none: '#fff'}) + * or primary types (which represents + * defualt category visual), otherwise visual + * can be array or primary (which will be + * normalized to array). + * + */ +var VisualMapping = function (option) { + var mappingMethod = option.mappingMethod; + var visualType = option.type; + + /** + * @readOnly + * @type {Object} + */ + var thisOption = this.option = clone(option); + + /** + * @readOnly + * @type {string} + */ + this.type = visualType; + + /** + * @readOnly + * @type {string} + */ + this.mappingMethod = mappingMethod; + + /** + * @private + * @type {Function} + */ + this._normalizeData = normalizers[mappingMethod]; + + var visualHandler = visualHandlers[visualType]; + + /** + * @public + * @type {Function} + */ + this.applyVisual = visualHandler.applyVisual; + + /** + * @public + * @type {Function} + */ + this.getColorMapper = visualHandler.getColorMapper; + + /** + * @private + * @type {Function} + */ + this._doMap = visualHandler._doMap[mappingMethod]; + + if (mappingMethod === 'piecewise') { + normalizeVisualRange(thisOption); + preprocessForPiecewise(thisOption); + } + else if (mappingMethod === 'category') { + thisOption.categories + ? preprocessForSpecifiedCategory(thisOption) + // categories is ordinal when thisOption.categories not specified, + // which need no more preprocess except normalize visual. + : normalizeVisualRange(thisOption, true); + } + else { // mappingMethod === 'linear' or 'fixed' + assert$1(mappingMethod !== 'linear' || thisOption.dataExtent); + normalizeVisualRange(thisOption); + } +}; + +VisualMapping.prototype = { + + constructor: VisualMapping, + + mapValueToVisual: function (value) { + var normalized = this._normalizeData(value); + return this._doMap(normalized, value); + }, + + getNormalizer: function () { + return bind(this._normalizeData, this); + } +}; + +var visualHandlers = VisualMapping.visualHandlers = { + + color: { + + applyVisual: makeApplyVisual('color'), + + /** + * Create a mapper function + * @return {Function} + */ + getColorMapper: function () { + var thisOption = this.option; + + return bind( + thisOption.mappingMethod === 'category' + ? function (value, isNormalized) { + !isNormalized && (value = this._normalizeData(value)); + return doMapCategory.call(this, value); + } + : function (value, isNormalized, out) { + // If output rgb array + // which will be much faster and useful in pixel manipulation + var returnRGBArray = !!out; + !isNormalized && (value = this._normalizeData(value)); + out = fastLerp(value, thisOption.parsedVisual, out); + return returnRGBArray ? out : stringify(out, 'rgba'); + }, + this + ); + }, + + _doMap: { + linear: function (normalized) { + return stringify( + fastLerp(normalized, this.option.parsedVisual), + 'rgba' + ); + }, + category: doMapCategory, + piecewise: function (normalized, value) { + var result = getSpecifiedVisual.call(this, value); + if (result == null) { + result = stringify( + fastLerp(normalized, this.option.parsedVisual), + 'rgba' + ); + } + return result; + }, + fixed: doMapFixed + } + }, + + colorHue: makePartialColorVisualHandler(function (color, value) { + return modifyHSL(color, value); + }), + + colorSaturation: makePartialColorVisualHandler(function (color, value) { + return modifyHSL(color, null, value); + }), + + colorLightness: makePartialColorVisualHandler(function (color, value) { + return modifyHSL(color, null, null, value); + }), + + colorAlpha: makePartialColorVisualHandler(function (color, value) { + return modifyAlpha(color, value); + }), + + opacity: { + applyVisual: makeApplyVisual('opacity'), + _doMap: makeDoMap([0, 1]) + }, + + liftZ: { + applyVisual: makeApplyVisual('liftZ'), + _doMap: { + linear: doMapFixed, + category: doMapFixed, + piecewise: doMapFixed, + fixed: doMapFixed + } + }, + + symbol: { + applyVisual: function (value, getter, setter) { + var symbolCfg = this.mapValueToVisual(value); + if (isString(symbolCfg)) { + setter('symbol', symbolCfg); + } + else if (isObject$5(symbolCfg)) { + for (var name in symbolCfg) { + if (symbolCfg.hasOwnProperty(name)) { + setter(name, symbolCfg[name]); + } + } + } + }, + _doMap: { + linear: doMapToArray, + category: doMapCategory, + piecewise: function (normalized, value) { + var result = getSpecifiedVisual.call(this, value); + if (result == null) { + result = doMapToArray.call(this, normalized); + } + return result; + }, + fixed: doMapFixed + } + }, + + symbolSize: { + applyVisual: makeApplyVisual('symbolSize'), + _doMap: makeDoMap([0, 1]) + } +}; + + +function preprocessForPiecewise(thisOption) { + var pieceList = thisOption.pieceList; + thisOption.hasSpecialVisual = false; + + each$1(pieceList, function (piece, index) { + piece.originIndex = index; + // piece.visual is "result visual value" but not + // a visual range, so it does not need to be normalized. + if (piece.visual != null) { + thisOption.hasSpecialVisual = true; + } + }); +} + +function preprocessForSpecifiedCategory(thisOption) { + // Hash categories. + var categories = thisOption.categories; + var visual = thisOption.visual; + + var categoryMap = thisOption.categoryMap = {}; + each$9(categories, function (cate, index) { + categoryMap[cate] = index; + }); + + // Process visual map input. + if (!isArray(visual)) { + var visualArr = []; + + if (isObject$1(visual)) { + each$9(visual, function (v, cate) { + var index = categoryMap[cate]; + visualArr[index != null ? index : CATEGORY_DEFAULT_VISUAL_INDEX] = v; + }); + } + else { // Is primary type, represents default visual. + visualArr[CATEGORY_DEFAULT_VISUAL_INDEX] = visual; + } + + visual = setVisualToOption(thisOption, visualArr); + } + + // Remove categories that has no visual, + // then we can mapping them to CATEGORY_DEFAULT_VISUAL_INDEX. + for (var i = categories.length - 1; i >= 0; i--) { + if (visual[i] == null) { + delete categoryMap[categories[i]]; + categories.pop(); + } + } +} + +function normalizeVisualRange(thisOption, isCategory) { + var visual = thisOption.visual; + var visualArr = []; + + if (isObject$1(visual)) { + each$9(visual, function (v) { + visualArr.push(v); + }); + } + else if (visual != null) { + visualArr.push(visual); + } + + var doNotNeedPair = {color: 1, symbol: 1}; + + if (!isCategory + && visualArr.length === 1 + && !doNotNeedPair.hasOwnProperty(thisOption.type) + ) { + // Do not care visualArr.length === 0, which is illegal. + visualArr[1] = visualArr[0]; + } + + setVisualToOption(thisOption, visualArr); +} + +function makePartialColorVisualHandler(applyValue) { + return { + applyVisual: function (value, getter, setter) { + value = this.mapValueToVisual(value); + // Must not be array value + setter('color', applyValue(getter('color'), value)); + }, + _doMap: makeDoMap([0, 1]) + }; +} + +function doMapToArray(normalized) { + var visual = this.option.visual; + return visual[ + Math.round(linearMap(normalized, [0, 1], [0, visual.length - 1], true)) + ] || {}; +} + +function makeApplyVisual(visualType) { + return function (value, getter, setter) { + setter(visualType, this.mapValueToVisual(value)); + }; +} + +function doMapCategory(normalized) { + var visual = this.option.visual; + return visual[ + (this.option.loop && normalized !== CATEGORY_DEFAULT_VISUAL_INDEX) + ? normalized % visual.length + : normalized + ]; +} + +function doMapFixed() { + return this.option.visual[0]; +} + +function makeDoMap(sourceExtent) { + return { + linear: function (normalized) { + return linearMap(normalized, sourceExtent, this.option.visual, true); + }, + category: doMapCategory, + piecewise: function (normalized, value) { + var result = getSpecifiedVisual.call(this, value); + if (result == null) { + result = linearMap(normalized, sourceExtent, this.option.visual, true); + } + return result; + }, + fixed: doMapFixed + }; +} + +function getSpecifiedVisual(value) { + var thisOption = this.option; + var pieceList = thisOption.pieceList; + if (thisOption.hasSpecialVisual) { + var pieceIndex = VisualMapping.findPieceIndex(value, pieceList); + var piece = pieceList[pieceIndex]; + if (piece && piece.visual) { + return piece.visual[this.type]; + } + } +} + +function setVisualToOption(thisOption, visualArr) { + thisOption.visual = visualArr; + if (thisOption.type === 'color') { + thisOption.parsedVisual = map(visualArr, function (item) { + return parse(item); + }); + } + return visualArr; +} + + +/** + * Normalizers by mapping methods. + */ +var normalizers = { + + linear: function (value) { + return linearMap(value, this.option.dataExtent, [0, 1], true); + }, + + piecewise: function (value) { + var pieceList = this.option.pieceList; + var pieceIndex = VisualMapping.findPieceIndex(value, pieceList, true); + if (pieceIndex != null) { + return linearMap(pieceIndex, [0, pieceList.length - 1], [0, 1], true); + } + }, + + category: function (value) { + var index = this.option.categories + ? this.option.categoryMap[value] + : value; // ordinal + return index == null ? CATEGORY_DEFAULT_VISUAL_INDEX : index; + }, + + fixed: noop +}; + + + +/** + * List available visual types. + * + * @public + * @return {Array.<string>} + */ +VisualMapping.listVisualTypes = function () { + var visualTypes = []; + each$1(visualHandlers, function (handler, key) { + visualTypes.push(key); + }); + return visualTypes; +}; + +/** + * @public + */ +VisualMapping.addVisualHandler = function (name, handler) { + visualHandlers[name] = handler; +}; + +/** + * @public + */ +VisualMapping.isValidType = function (visualType) { + return visualHandlers.hasOwnProperty(visualType); +}; + +/** + * Convinent method. + * Visual can be Object or Array or primary type. + * + * @public + */ +VisualMapping.eachVisual = function (visual, callback, context) { + if (isObject$1(visual)) { + each$1(visual, callback, context); + } + else { + callback.call(context, visual); + } +}; + +VisualMapping.mapVisual = function (visual, callback, context) { + var isPrimary; + var newVisual = isArray(visual) + ? [] + : isObject$1(visual) + ? {} + : (isPrimary = true, null); + + VisualMapping.eachVisual(visual, function (v, key) { + var newVal = callback.call(context, v, key); + isPrimary ? (newVisual = newVal) : (newVisual[key] = newVal); + }); + return newVisual; +}; + +/** + * @public + * @param {Object} obj + * @return {Object} new object containers visual values. + * If no visuals, return null. + */ +VisualMapping.retrieveVisuals = function (obj) { + var ret = {}; + var hasVisual; + + obj && each$9(visualHandlers, function (h, visualType) { + if (obj.hasOwnProperty(visualType)) { + ret[visualType] = obj[visualType]; + hasVisual = true; + } + }); + + return hasVisual ? ret : null; +}; + +/** + * Give order to visual types, considering colorSaturation, colorAlpha depends on color. + * + * @public + * @param {(Object|Array)} visualTypes If Object, like: {color: ..., colorSaturation: ...} + * IF Array, like: ['color', 'symbol', 'colorSaturation'] + * @return {Array.<string>} Sorted visual types. + */ +VisualMapping.prepareVisualTypes = function (visualTypes) { + if (isObject$5(visualTypes)) { + var types = []; + each$9(visualTypes, function (item, type) { + types.push(type); + }); + visualTypes = types; + } + else if (isArray(visualTypes)) { + visualTypes = visualTypes.slice(); + } + else { + return []; + } + + visualTypes.sort(function (type1, type2) { + // color should be front of colorSaturation, colorAlpha, ... + // symbol and symbolSize do not matter. + return (type2 === 'color' && type1 !== 'color' && type1.indexOf('color') === 0) + ? 1 : -1; + }); + + return visualTypes; +}; + +/** + * 'color', 'colorSaturation', 'colorAlpha', ... are depends on 'color'. + * Other visuals are only depends on themself. + * + * @public + * @param {string} visualType1 + * @param {string} visualType2 + * @return {boolean} + */ +VisualMapping.dependsOn = function (visualType1, visualType2) { + return visualType2 === 'color' + ? !!(visualType1 && visualType1.indexOf(visualType2) === 0) + : visualType1 === visualType2; +}; + +/** + * @param {number} value + * @param {Array.<Object>} pieceList [{value: ..., interval: [min, max]}, ...] + * Always from small to big. + * @param {boolean} [findClosestWhenOutside=false] + * @return {number} index + */ +VisualMapping.findPieceIndex = function (value, pieceList, findClosestWhenOutside) { + var possibleI; + var abs = Infinity; + + // value has the higher priority. + for (var i = 0, len = pieceList.length; i < len; i++) { + var pieceValue = pieceList[i].value; + if (pieceValue != null) { + if (pieceValue === value + // FIXME + // It is supposed to compare value according to value type of dimension, + // but currently value type can exactly be string or number. + // Compromise for numeric-like string (like '12'), especially + // in the case that visualMap.categories is ['22', '33']. + || (typeof pieceValue === 'string' && pieceValue === value + '') + ) { + return i; + } + findClosestWhenOutside && updatePossible(pieceValue, i); + } + } + + for (var i = 0, len = pieceList.length; i < len; i++) { + var piece = pieceList[i]; + var interval = piece.interval; + var close = piece.close; + + if (interval) { + if (interval[0] === -Infinity) { + if (littleThan(close[1], value, interval[1])) { + return i; + } + } + else if (interval[1] === Infinity) { + if (littleThan(close[0], interval[0], value)) { + return i; + } + } + else if ( + littleThan(close[0], interval[0], value) + && littleThan(close[1], value, interval[1]) + ) { + return i; + } + findClosestWhenOutside && updatePossible(interval[0], i); + findClosestWhenOutside && updatePossible(interval[1], i); + } + } + + if (findClosestWhenOutside) { + return value === Infinity + ? pieceList.length - 1 + : value === -Infinity + ? 0 + : possibleI; + } + + function updatePossible(val, index) { + var newAbs = Math.abs(val - value); + if (newAbs < abs) { + abs = newAbs; + possibleI = index; + } + } + +}; + +function littleThan(close, a, b) { + return close ? a <= b : a < b; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var isArray$2 = isArray; + +var ITEM_STYLE_NORMAL = 'itemStyle'; + +var treemapVisual = { + seriesType: 'treemap', + reset: function (seriesModel, ecModel, api, payload) { + var tree = seriesModel.getData().tree; + var root = tree.root; + var seriesItemStyleModel = seriesModel.getModel(ITEM_STYLE_NORMAL); + + if (root.isRemoved()) { + return; + } + + var levelItemStyles = map(tree.levelModels, function (levelModel) { + return levelModel ? levelModel.get(ITEM_STYLE_NORMAL) : null; + }); + + travelTree( + root, // Visual should calculate from tree root but not view root. + {}, + levelItemStyles, + seriesItemStyleModel, + seriesModel.getViewRoot().getAncestors(), + seriesModel + ); + } +}; + +function travelTree( + node, designatedVisual, levelItemStyles, seriesItemStyleModel, + viewRootAncestors, seriesModel +) { + var nodeModel = node.getModel(); + var nodeLayout = node.getLayout(); + + // Optimize + if (!nodeLayout || nodeLayout.invisible || !nodeLayout.isInView) { + return; + } + + var nodeItemStyleModel = node.getModel(ITEM_STYLE_NORMAL); + var levelItemStyle = levelItemStyles[node.depth]; + var visuals = buildVisuals( + nodeItemStyleModel, designatedVisual, levelItemStyle, seriesItemStyleModel + ); + + // calculate border color + var borderColor = nodeItemStyleModel.get('borderColor'); + var borderColorSaturation = nodeItemStyleModel.get('borderColorSaturation'); + var thisNodeColor; + if (borderColorSaturation != null) { + // For performance, do not always execute 'calculateColor'. + thisNodeColor = calculateColor(visuals, node); + borderColor = calculateBorderColor(borderColorSaturation, thisNodeColor); + } + node.setVisual('borderColor', borderColor); + + var viewChildren = node.viewChildren; + if (!viewChildren || !viewChildren.length) { + thisNodeColor = calculateColor(visuals, node); + // Apply visual to this node. + node.setVisual('color', thisNodeColor); + } + else { + var mapping = buildVisualMapping( + node, nodeModel, nodeLayout, nodeItemStyleModel, visuals, viewChildren + ); + + // Designate visual to children. + each$1(viewChildren, function (child, index) { + // If higher than viewRoot, only ancestors of viewRoot is needed to visit. + if (child.depth >= viewRootAncestors.length + || child === viewRootAncestors[child.depth] + ) { + var childVisual = mapVisual$1( + nodeModel, visuals, child, index, mapping, seriesModel + ); + travelTree( + child, childVisual, levelItemStyles, seriesItemStyleModel, + viewRootAncestors, seriesModel + ); + } + }); + } +} + +function buildVisuals( + nodeItemStyleModel, designatedVisual, levelItemStyle, seriesItemStyleModel +) { + var visuals = extend({}, designatedVisual); + + each$1(['color', 'colorAlpha', 'colorSaturation'], function (visualName) { + // Priority: thisNode > thisLevel > parentNodeDesignated > seriesModel + var val = nodeItemStyleModel.get(visualName, true); // Ignore parent + val == null && levelItemStyle && (val = levelItemStyle[visualName]); + val == null && (val = designatedVisual[visualName]); + val == null && (val = seriesItemStyleModel.get(visualName)); + + val != null && (visuals[visualName] = val); + }); + + return visuals; +} + +function calculateColor(visuals) { + var color = getValueVisualDefine(visuals, 'color'); + + if (color) { + var colorAlpha = getValueVisualDefine(visuals, 'colorAlpha'); + var colorSaturation = getValueVisualDefine(visuals, 'colorSaturation'); + if (colorSaturation) { + color = modifyHSL(color, null, null, colorSaturation); + } + if (colorAlpha) { + color = modifyAlpha(color, colorAlpha); + } + + return color; + } +} + +function calculateBorderColor(borderColorSaturation, thisNodeColor) { + return thisNodeColor != null + ? modifyHSL(thisNodeColor, null, null, borderColorSaturation) + : null; +} + +function getValueVisualDefine(visuals, name) { + var value = visuals[name]; + if (value != null && value !== 'none') { + return value; + } +} + +function buildVisualMapping( + node, nodeModel, nodeLayout, nodeItemStyleModel, visuals, viewChildren +) { + if (!viewChildren || !viewChildren.length) { + return; + } + + var rangeVisual = getRangeVisual(nodeModel, 'color') + || ( + visuals.color != null + && visuals.color !== 'none' + && ( + getRangeVisual(nodeModel, 'colorAlpha') + || getRangeVisual(nodeModel, 'colorSaturation') + ) + ); + + if (!rangeVisual) { + return; + } + + var visualMin = nodeModel.get('visualMin'); + var visualMax = nodeModel.get('visualMax'); + var dataExtent = nodeLayout.dataExtent.slice(); + visualMin != null && visualMin < dataExtent[0] && (dataExtent[0] = visualMin); + visualMax != null && visualMax > dataExtent[1] && (dataExtent[1] = visualMax); + + var colorMappingBy = nodeModel.get('colorMappingBy'); + var opt = { + type: rangeVisual.name, + dataExtent: dataExtent, + visual: rangeVisual.range + }; + if (opt.type === 'color' + && (colorMappingBy === 'index' || colorMappingBy === 'id') + ) { + opt.mappingMethod = 'category'; + opt.loop = true; + // categories is ordinal, so do not set opt.categories. + } + else { + opt.mappingMethod = 'linear'; + } + + var mapping = new VisualMapping(opt); + mapping.__drColorMappingBy = colorMappingBy; + + return mapping; +} + +// Notice: If we dont have the attribute 'colorRange', but only use +// attribute 'color' to represent both concepts of 'colorRange' and 'color', +// (It means 'colorRange' when 'color' is Array, means 'color' when not array), +// this problem will be encountered: +// If a level-1 node dont have children, and its siblings has children, +// and colorRange is set on level-1, then the node can not be colored. +// So we separate 'colorRange' and 'color' to different attributes. +function getRangeVisual(nodeModel, name) { + // 'colorRange', 'colorARange', 'colorSRange'. + // If not exsits on this node, fetch from levels and series. + var range = nodeModel.get(name); + return (isArray$2(range) && range.length) ? {name: name, range: range} : null; +} + +function mapVisual$1(nodeModel, visuals, child, index, mapping, seriesModel) { + var childVisuals = extend({}, visuals); + + if (mapping) { + var mappingType = mapping.type; + var colorMappingBy = mappingType === 'color' && mapping.__drColorMappingBy; + var value = + colorMappingBy === 'index' + ? index + : colorMappingBy === 'id' + ? seriesModel.mapIdToIndex(child.getId()) + : child.getValue(nodeModel.get('visualDimension')); + + childVisuals[mappingType] = mapping.mapValueToVisual(value); + } + + return childVisuals; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/* +* The treemap layout implementation references to the treemap +* layout of d3.js (d3/src/layout/treemap.js in v3). The use of +* the source code of this file is also subject to the terms +* and consitions of its license (BSD-3Clause, see +* <echarts/src/licenses/LICENSE-d3>). +*/ + +var mathMax$4 = Math.max; +var mathMin$4 = Math.min; +var retrieveValue = retrieve; +var each$10 = each$1; + +var PATH_BORDER_WIDTH = ['itemStyle', 'borderWidth']; +var PATH_GAP_WIDTH = ['itemStyle', 'gapWidth']; +var PATH_UPPER_LABEL_SHOW = ['upperLabel', 'show']; +var PATH_UPPER_LABEL_HEIGHT = ['upperLabel', 'height']; + +/** + * @public + */ +var treemapLayout = { + seriesType: 'treemap', + reset: function (seriesModel, ecModel, api, payload) { + // Layout result in each node: + // {x, y, width, height, area, borderWidth} + var ecWidth = api.getWidth(); + var ecHeight = api.getHeight(); + var seriesOption = seriesModel.option; + + var layoutInfo = getLayoutRect( + seriesModel.getBoxLayoutParams(), + { + width: api.getWidth(), + height: api.getHeight() + } + ); + + var size = seriesOption.size || []; // Compatible with ec2. + var containerWidth = parsePercent$1( + retrieveValue(layoutInfo.width, size[0]), + ecWidth + ); + var containerHeight = parsePercent$1( + retrieveValue(layoutInfo.height, size[1]), + ecHeight + ); + + // Fetch payload info. + var payloadType = payload && payload.type; + var types = ['treemapZoomToNode', 'treemapRootToNode']; + var targetInfo = retrieveTargetInfo(payload, types, seriesModel); + var rootRect = (payloadType === 'treemapRender' || payloadType === 'treemapMove') + ? payload.rootRect : null; + var viewRoot = seriesModel.getViewRoot(); + var viewAbovePath = getPathToRoot(viewRoot); + + if (payloadType !== 'treemapMove') { + var rootSize = payloadType === 'treemapZoomToNode' + ? estimateRootSize( + seriesModel, targetInfo, viewRoot, containerWidth, containerHeight + ) + : rootRect + ? [rootRect.width, rootRect.height] + : [containerWidth, containerHeight]; + + var sort = seriesOption.sort; + if (sort && sort !== 'asc' && sort !== 'desc') { + sort = 'desc'; + } + var options = { + squareRatio: seriesOption.squareRatio, + sort: sort, + leafDepth: seriesOption.leafDepth + }; + + // layout should be cleared because using updateView but not update. + viewRoot.hostTree.clearLayouts(); + + // TODO + // optimize: if out of view clip, do not layout. + // But take care that if do not render node out of view clip, + // how to calculate start po + + var viewRootLayout = { + x: 0, y: 0, + width: rootSize[0], height: rootSize[1], + area: rootSize[0] * rootSize[1] + }; + viewRoot.setLayout(viewRootLayout); + + squarify(viewRoot, options, false, 0); + // Supplement layout. + var viewRootLayout = viewRoot.getLayout(); + each$10(viewAbovePath, function (node, index) { + var childValue = (viewAbovePath[index + 1] || viewRoot).getValue(); + node.setLayout(extend( + {dataExtent: [childValue, childValue], borderWidth: 0, upperHeight: 0}, + viewRootLayout + )); + }); + } + + var treeRoot = seriesModel.getData().tree.root; + + treeRoot.setLayout( + calculateRootPosition(layoutInfo, rootRect, targetInfo), + true + ); + + seriesModel.setLayoutInfo(layoutInfo); + + // FIXME + // 现在没有clip功能,暂时取ec高宽。 + prunning( + treeRoot, + // Transform to base element coordinate system. + new BoundingRect(-layoutInfo.x, -layoutInfo.y, ecWidth, ecHeight), + viewAbovePath, + viewRoot, + 0 + ); + } +}; + +/** + * Layout treemap with squarify algorithm. + * @see https://graphics.ethz.ch/teaching/scivis_common/Literature/squarifiedTreeMaps.pdf + * The implementation references to the treemap layout of d3.js. + * See the license statement at the head of this file. + * + * @protected + * @param {module:echarts/data/Tree~TreeNode} node + * @param {Object} options + * @param {string} options.sort 'asc' or 'desc' + * @param {number} options.squareRatio + * @param {boolean} hideChildren + * @param {number} depth + */ +function squarify(node, options, hideChildren, depth) { + var width; + var height; + + if (node.isRemoved()) { + return; + } + + var thisLayout = node.getLayout(); + width = thisLayout.width; + height = thisLayout.height; + + // Considering border and gap + var nodeModel = node.getModel(); + var borderWidth = nodeModel.get(PATH_BORDER_WIDTH); + var halfGapWidth = nodeModel.get(PATH_GAP_WIDTH) / 2; + var upperLabelHeight = getUpperLabelHeight(nodeModel); + var upperHeight = Math.max(borderWidth, upperLabelHeight); + var layoutOffset = borderWidth - halfGapWidth; + var layoutOffsetUpper = upperHeight - halfGapWidth; + var nodeModel = node.getModel(); + + node.setLayout({ + borderWidth: borderWidth, + upperHeight: upperHeight, + upperLabelHeight: upperLabelHeight + }, true); + + width = mathMax$4(width - 2 * layoutOffset, 0); + height = mathMax$4(height - layoutOffset - layoutOffsetUpper, 0); + + var totalArea = width * height; + var viewChildren = initChildren( + node, nodeModel, totalArea, options, hideChildren, depth + ); + + if (!viewChildren.length) { + return; + } + + var rect = {x: layoutOffset, y: layoutOffsetUpper, width: width, height: height}; + var rowFixedLength = mathMin$4(width, height); + var best = Infinity; // the best row score so far + var row = []; + row.area = 0; + + for (var i = 0, len = viewChildren.length; i < len;) { + var child = viewChildren[i]; + + row.push(child); + row.area += child.getLayout().area; + var score = worst(row, rowFixedLength, options.squareRatio); + + // continue with this orientation + if (score <= best) { + i++; + best = score; + } + // abort, and try a different orientation + else { + row.area -= row.pop().getLayout().area; + position(row, rowFixedLength, rect, halfGapWidth, false); + rowFixedLength = mathMin$4(rect.width, rect.height); + row.length = row.area = 0; + best = Infinity; + } + } + + if (row.length) { + position(row, rowFixedLength, rect, halfGapWidth, true); + } + + if (!hideChildren) { + var childrenVisibleMin = nodeModel.get('childrenVisibleMin'); + if (childrenVisibleMin != null && totalArea < childrenVisibleMin) { + hideChildren = true; + } + } + + for (var i = 0, len = viewChildren.length; i < len; i++) { + squarify(viewChildren[i], options, hideChildren, depth + 1); + } +} + +/** + * Set area to each child, and calculate data extent for visual coding. + */ +function initChildren(node, nodeModel, totalArea, options, hideChildren, depth) { + var viewChildren = node.children || []; + var orderBy = options.sort; + orderBy !== 'asc' && orderBy !== 'desc' && (orderBy = null); + + var overLeafDepth = options.leafDepth != null && options.leafDepth <= depth; + + // leafDepth has higher priority. + if (hideChildren && !overLeafDepth) { + return (node.viewChildren = []); + } + + // Sort children, order by desc. + viewChildren = filter(viewChildren, function (child) { + return !child.isRemoved(); + }); + + sort$1(viewChildren, orderBy); + + var info = statistic(nodeModel, viewChildren, orderBy); + + if (info.sum === 0) { + return (node.viewChildren = []); + } + + info.sum = filterByThreshold(nodeModel, totalArea, info.sum, orderBy, viewChildren); + + if (info.sum === 0) { + return (node.viewChildren = []); + } + + // Set area to each child. + for (var i = 0, len = viewChildren.length; i < len; i++) { + var area = viewChildren[i].getValue() / info.sum * totalArea; + // Do not use setLayout({...}, true), because it is needed to clear last layout. + viewChildren[i].setLayout({area: area}); + } + + if (overLeafDepth) { + viewChildren.length && node.setLayout({isLeafRoot: true}, true); + viewChildren.length = 0; + } + + node.viewChildren = viewChildren; + node.setLayout({dataExtent: info.dataExtent}, true); + + return viewChildren; +} + +/** + * Consider 'visibleMin'. Modify viewChildren and get new sum. + */ +function filterByThreshold(nodeModel, totalArea, sum, orderBy, orderedChildren) { + + // visibleMin is not supported yet when no option.sort. + if (!orderBy) { + return sum; + } + + var visibleMin = nodeModel.get('visibleMin'); + var len = orderedChildren.length; + var deletePoint = len; + + // Always travel from little value to big value. + for (var i = len - 1; i >= 0; i--) { + var value = orderedChildren[ + orderBy === 'asc' ? len - i - 1 : i + ].getValue(); + + if (value / sum * totalArea < visibleMin) { + deletePoint = i; + sum -= value; + } + } + + orderBy === 'asc' + ? orderedChildren.splice(0, len - deletePoint) + : orderedChildren.splice(deletePoint, len - deletePoint); + + return sum; +} + +/** + * Sort + */ +function sort$1(viewChildren, orderBy) { + if (orderBy) { + viewChildren.sort(function (a, b) { + var diff = orderBy === 'asc' + ? a.getValue() - b.getValue() : b.getValue() - a.getValue(); + return diff === 0 + ? (orderBy === 'asc' + ? a.dataIndex - b.dataIndex : b.dataIndex - a.dataIndex + ) + : diff; + }); + } + return viewChildren; +} + +/** + * Statistic + */ +function statistic(nodeModel, children, orderBy) { + // Calculate sum. + var sum = 0; + for (var i = 0, len = children.length; i < len; i++) { + sum += children[i].getValue(); + } + + // Statistic data extent for latter visual coding. + // Notice: data extent should be calculate based on raw children + // but not filtered view children, otherwise visual mapping will not + // be stable when zoom (where children is filtered by visibleMin). + + var dimension = nodeModel.get('visualDimension'); + var dataExtent; + + // The same as area dimension. + if (!children || !children.length) { + dataExtent = [NaN, NaN]; + } + else if (dimension === 'value' && orderBy) { + dataExtent = [ + children[children.length - 1].getValue(), + children[0].getValue() + ]; + orderBy === 'asc' && dataExtent.reverse(); + } + // Other dimension. + else { + var dataExtent = [Infinity, -Infinity]; + each$10(children, function (child) { + var value = child.getValue(dimension); + value < dataExtent[0] && (dataExtent[0] = value); + value > dataExtent[1] && (dataExtent[1] = value); + }); + } + + return {sum: sum, dataExtent: dataExtent}; +} + +/** + * Computes the score for the specified row, + * as the worst aspect ratio. + */ +function worst(row, rowFixedLength, ratio) { + var areaMax = 0; + var areaMin = Infinity; + + for (var i = 0, area, len = row.length; i < len; i++) { + area = row[i].getLayout().area; + if (area) { + area < areaMin && (areaMin = area); + area > areaMax && (areaMax = area); + } + } + + var squareArea = row.area * row.area; + var f = rowFixedLength * rowFixedLength * ratio; + + return squareArea + ? mathMax$4( + (f * areaMax) / squareArea, + squareArea / (f * areaMin) + ) + : Infinity; +} + +/** + * Positions the specified row of nodes. Modifies `rect`. + */ +function position(row, rowFixedLength, rect, halfGapWidth, flush) { + // When rowFixedLength === rect.width, + // it is horizontal subdivision, + // rowFixedLength is the width of the subdivision, + // rowOtherLength is the height of the subdivision, + // and nodes will be positioned from left to right. + + // wh[idx0WhenH] means: when horizontal, + // wh[idx0WhenH] => wh[0] => 'width'. + // xy[idx1WhenH] => xy[1] => 'y'. + var idx0WhenH = rowFixedLength === rect.width ? 0 : 1; + var idx1WhenH = 1 - idx0WhenH; + var xy = ['x', 'y']; + var wh = ['width', 'height']; + + var last = rect[xy[idx0WhenH]]; + var rowOtherLength = rowFixedLength + ? row.area / rowFixedLength : 0; + + if (flush || rowOtherLength > rect[wh[idx1WhenH]]) { + rowOtherLength = rect[wh[idx1WhenH]]; // over+underflow + } + for (var i = 0, rowLen = row.length; i < rowLen; i++) { + var node = row[i]; + var nodeLayout = {}; + var step = rowOtherLength + ? node.getLayout().area / rowOtherLength : 0; + + var wh1 = nodeLayout[wh[idx1WhenH]] = mathMax$4(rowOtherLength - 2 * halfGapWidth, 0); + + // We use Math.max/min to avoid negative width/height when considering gap width. + var remain = rect[xy[idx0WhenH]] + rect[wh[idx0WhenH]] - last; + var modWH = (i === rowLen - 1 || remain < step) ? remain : step; + var wh0 = nodeLayout[wh[idx0WhenH]] = mathMax$4(modWH - 2 * halfGapWidth, 0); + + nodeLayout[xy[idx1WhenH]] = rect[xy[idx1WhenH]] + mathMin$4(halfGapWidth, wh1 / 2); + nodeLayout[xy[idx0WhenH]] = last + mathMin$4(halfGapWidth, wh0 / 2); + + last += modWH; + node.setLayout(nodeLayout, true); + } + + rect[xy[idx1WhenH]] += rowOtherLength; + rect[wh[idx1WhenH]] -= rowOtherLength; +} + +// Return [containerWidth, containerHeight] as defualt. +function estimateRootSize(seriesModel, targetInfo, viewRoot, containerWidth, containerHeight) { + // If targetInfo.node exists, we zoom to the node, + // so estimate whold width and heigth by target node. + var currNode = (targetInfo || {}).node; + var defaultSize = [containerWidth, containerHeight]; + + if (!currNode || currNode === viewRoot) { + return defaultSize; + } + + var parent; + var viewArea = containerWidth * containerHeight; + var area = viewArea * seriesModel.option.zoomToNodeRatio; + + while (parent = currNode.parentNode) { // jshint ignore:line + var sum = 0; + var siblings = parent.children; + + for (var i = 0, len = siblings.length; i < len; i++) { + sum += siblings[i].getValue(); + } + var currNodeValue = currNode.getValue(); + if (currNodeValue === 0) { + return defaultSize; + } + area *= sum / currNodeValue; + + // Considering border, suppose aspect ratio is 1. + var parentModel = parent.getModel(); + var borderWidth = parentModel.get(PATH_BORDER_WIDTH); + var upperHeight = Math.max(borderWidth, getUpperLabelHeight(parentModel, borderWidth)); + area += 4 * borderWidth * borderWidth + + (3 * borderWidth + upperHeight) * Math.pow(area, 0.5); + + area > MAX_SAFE_INTEGER && (area = MAX_SAFE_INTEGER); + + currNode = parent; + } + + area < viewArea && (area = viewArea); + var scale = Math.pow(area / viewArea, 0.5); + + return [containerWidth * scale, containerHeight * scale]; +} + +// Root postion base on coord of containerGroup +function calculateRootPosition(layoutInfo, rootRect, targetInfo) { + if (rootRect) { + return {x: rootRect.x, y: rootRect.y}; + } + + var defaultPosition = {x: 0, y: 0}; + if (!targetInfo) { + return defaultPosition; + } + + // If targetInfo is fetched by 'retrieveTargetInfo', + // old tree and new tree are the same tree, + // so the node still exists and we can visit it. + + var targetNode = targetInfo.node; + var layout = targetNode.getLayout(); + + if (!layout) { + return defaultPosition; + } + + // Transform coord from local to container. + var targetCenter = [layout.width / 2, layout.height / 2]; + var node = targetNode; + while (node) { + var nodeLayout = node.getLayout(); + targetCenter[0] += nodeLayout.x; + targetCenter[1] += nodeLayout.y; + node = node.parentNode; + } + + return { + x: layoutInfo.width / 2 - targetCenter[0], + y: layoutInfo.height / 2 - targetCenter[1] + }; +} + +// Mark nodes visible for prunning when visual coding and rendering. +// Prunning depends on layout and root position, so we have to do it after layout. +function prunning(node, clipRect, viewAbovePath, viewRoot, depth) { + var nodeLayout = node.getLayout(); + var nodeInViewAbovePath = viewAbovePath[depth]; + var isAboveViewRoot = nodeInViewAbovePath && nodeInViewAbovePath === node; + + if ( + (nodeInViewAbovePath && !isAboveViewRoot) + || (depth === viewAbovePath.length && node !== viewRoot) + ) { + return; + } + + node.setLayout({ + // isInView means: viewRoot sub tree + viewAbovePath + isInView: true, + // invisible only means: outside view clip so that the node can not + // see but still layout for animation preparation but not render. + invisible: !isAboveViewRoot && !clipRect.intersect(nodeLayout), + isAboveViewRoot: isAboveViewRoot + }, true); + + // Transform to child coordinate. + var childClipRect = new BoundingRect( + clipRect.x - nodeLayout.x, + clipRect.y - nodeLayout.y, + clipRect.width, + clipRect.height + ); + + each$10(node.viewChildren || [], function (child) { + prunning(child, childClipRect, viewAbovePath, viewRoot, depth + 1); + }); +} + +function getUpperLabelHeight(model) { + return model.get(PATH_UPPER_LABEL_SHOW) ? model.get(PATH_UPPER_LABEL_HEIGHT) : 0; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +registerVisual(treemapVisual); +registerLayout(treemapLayout); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Graph data structure + * + * @module echarts/data/Graph + * @author Yi Shen(https://www.github.com/pissang) + */ + +// id may be function name of Object, add a prefix to avoid this problem. +function generateNodeKey (id) { + return '_EC_' + id; +} +/** + * @alias module:echarts/data/Graph + * @constructor + * @param {boolean} directed + */ +var Graph = function(directed) { + /** + * 是否是有向图 + * @type {boolean} + * @private + */ + this._directed = directed || false; + + /** + * @type {Array.<module:echarts/data/Graph.Node>} + * @readOnly + */ + this.nodes = []; + + /** + * @type {Array.<module:echarts/data/Graph.Edge>} + * @readOnly + */ + this.edges = []; + + /** + * @type {Object.<string, module:echarts/data/Graph.Node>} + * @private + */ + this._nodesMap = {}; + /** + * @type {Object.<string, module:echarts/data/Graph.Edge>} + * @private + */ + this._edgesMap = {}; + + /** + * @type {module:echarts/data/List} + * @readOnly + */ + this.data; + + /** + * @type {module:echarts/data/List} + * @readOnly + */ + this.edgeData; +}; + +var graphProto = Graph.prototype; +/** + * @type {string} + */ +graphProto.type = 'graph'; + +/** + * If is directed graph + * @return {boolean} + */ +graphProto.isDirected = function () { + return this._directed; +}; + +/** + * Add a new node + * @param {string} id + * @param {number} [dataIndex] + */ +graphProto.addNode = function (id, dataIndex) { + id = id || ('' + dataIndex); + + var nodesMap = this._nodesMap; + + if (nodesMap[generateNodeKey(id)]) { + if (__DEV__) { + console.error('Graph nodes have duplicate name or id'); + } + return; + } + + var node = new Node(id, dataIndex); + node.hostGraph = this; + + this.nodes.push(node); + + nodesMap[generateNodeKey(id)] = node; + return node; +}; + +/** + * Get node by data index + * @param {number} dataIndex + * @return {module:echarts/data/Graph~Node} + */ +graphProto.getNodeByIndex = function (dataIndex) { + var rawIdx = this.data.getRawIndex(dataIndex); + return this.nodes[rawIdx]; +}; +/** + * Get node by id + * @param {string} id + * @return {module:echarts/data/Graph.Node} + */ +graphProto.getNodeById = function (id) { + return this._nodesMap[generateNodeKey(id)]; +}; + +/** + * Add a new edge + * @param {number|string|module:echarts/data/Graph.Node} n1 + * @param {number|string|module:echarts/data/Graph.Node} n2 + * @param {number} [dataIndex=-1] + * @return {module:echarts/data/Graph.Edge} + */ +graphProto.addEdge = function (n1, n2, dataIndex) { + var nodesMap = this._nodesMap; + var edgesMap = this._edgesMap; + + // PNEDING + if (typeof n1 === 'number') { + n1 = this.nodes[n1]; + } + if (typeof n2 === 'number') { + n2 = this.nodes[n2]; + } + + if (!Node.isInstance(n1)) { + n1 = nodesMap[generateNodeKey(n1)]; + } + if (!Node.isInstance(n2)) { + n2 = nodesMap[generateNodeKey(n2)]; + } + if (!n1 || !n2) { + return; + } + + var key = n1.id + '-' + n2.id; + // PENDING + if (edgesMap[key]) { + return; + } + + var edge = new Edge(n1, n2, dataIndex); + edge.hostGraph = this; + + if (this._directed) { + n1.outEdges.push(edge); + n2.inEdges.push(edge); + } + n1.edges.push(edge); + if (n1 !== n2) { + n2.edges.push(edge); + } + + this.edges.push(edge); + edgesMap[key] = edge; + + return edge; +}; + +/** + * Get edge by data index + * @param {number} dataIndex + * @return {module:echarts/data/Graph~Node} + */ +graphProto.getEdgeByIndex = function (dataIndex) { + var rawIdx = this.edgeData.getRawIndex(dataIndex); + return this.edges[rawIdx]; +}; +/** + * Get edge by two linked nodes + * @param {module:echarts/data/Graph.Node|string} n1 + * @param {module:echarts/data/Graph.Node|string} n2 + * @return {module:echarts/data/Graph.Edge} + */ +graphProto.getEdge = function (n1, n2) { + if (Node.isInstance(n1)) { + n1 = n1.id; + } + if (Node.isInstance(n2)) { + n2 = n2.id; + } + + var edgesMap = this._edgesMap; + + if (this._directed) { + return edgesMap[n1 + '-' + n2]; + } else { + return edgesMap[n1 + '-' + n2] + || edgesMap[n2 + '-' + n1]; + } +}; + +/** + * Iterate all nodes + * @param {Function} cb + * @param {*} [context] + */ +graphProto.eachNode = function (cb, context) { + var nodes = this.nodes; + var len = nodes.length; + for (var i = 0; i < len; i++) { + if (nodes[i].dataIndex >= 0) { + cb.call(context, nodes[i], i); + } + } +}; + +/** + * Iterate all edges + * @param {Function} cb + * @param {*} [context] + */ +graphProto.eachEdge = function (cb, context) { + var edges = this.edges; + var len = edges.length; + for (var i = 0; i < len; i++) { + if (edges[i].dataIndex >= 0 + && edges[i].node1.dataIndex >= 0 + && edges[i].node2.dataIndex >= 0 + ) { + cb.call(context, edges[i], i); + } + } +}; + +/** + * Breadth first traverse + * @param {Function} cb + * @param {module:echarts/data/Graph.Node} startNode + * @param {string} [direction='none'] 'none'|'in'|'out' + * @param {*} [context] + */ +graphProto.breadthFirstTraverse = function ( + cb, startNode, direction, context +) { + if (!Node.isInstance(startNode)) { + startNode = this._nodesMap[generateNodeKey(startNode)]; + } + if (!startNode) { + return; + } + + var edgeType = direction === 'out' + ? 'outEdges' : (direction === 'in' ? 'inEdges' : 'edges'); + + for (var i = 0; i < this.nodes.length; i++) { + this.nodes[i].__visited = false; + } + + if (cb.call(context, startNode, null)) { + return; + } + + var queue = [startNode]; + while (queue.length) { + var currentNode = queue.shift(); + var edges = currentNode[edgeType]; + + for (var i = 0; i < edges.length; i++) { + var e = edges[i]; + var otherNode = e.node1 === currentNode + ? e.node2 : e.node1; + if (!otherNode.__visited) { + if (cb.call(context, otherNode, currentNode)) { + // Stop traversing + return; + } + queue.push(otherNode); + otherNode.__visited = true; + } + } + } +}; + +// TODO +// graphProto.depthFirstTraverse = function ( +// cb, startNode, direction, context +// ) { + +// }; + +// Filter update +graphProto.update = function () { + var data = this.data; + var edgeData = this.edgeData; + var nodes = this.nodes; + var edges = this.edges; + + for (var i = 0, len = nodes.length; i < len; i++) { + nodes[i].dataIndex = -1; + } + for (var i = 0, len = data.count(); i < len; i++) { + nodes[data.getRawIndex(i)].dataIndex = i; + } + + edgeData.filterSelf(function (idx) { + var edge = edges[edgeData.getRawIndex(idx)]; + return edge.node1.dataIndex >= 0 && edge.node2.dataIndex >= 0; + }); + + // Update edge + for (var i = 0, len = edges.length; i < len; i++) { + edges[i].dataIndex = -1; + } + for (var i = 0, len = edgeData.count(); i < len; i++) { + edges[edgeData.getRawIndex(i)].dataIndex = i; + } +}; + +/** + * @return {module:echarts/data/Graph} + */ +graphProto.clone = function () { + var graph = new Graph(this._directed); + var nodes = this.nodes; + var edges = this.edges; + for (var i = 0; i < nodes.length; i++) { + graph.addNode(nodes[i].id, nodes[i].dataIndex); + } + for (var i = 0; i < edges.length; i++) { + var e = edges[i]; + graph.addEdge(e.node1.id, e.node2.id, e.dataIndex); + } + return graph; +}; + + +/** + * @alias module:echarts/data/Graph.Node + */ +function Node(id, dataIndex) { + /** + * @type {string} + */ + this.id = id == null ? '' : id; + + /** + * @type {Array.<module:echarts/data/Graph.Edge>} + */ + this.inEdges = []; + /** + * @type {Array.<module:echarts/data/Graph.Edge>} + */ + this.outEdges = []; + /** + * @type {Array.<module:echarts/data/Graph.Edge>} + */ + this.edges = []; + /** + * @type {module:echarts/data/Graph} + */ + this.hostGraph; + + /** + * @type {number} + */ + this.dataIndex = dataIndex == null ? -1 : dataIndex; +} + +Node.prototype = { + + constructor: Node, + + /** + * @return {number} + */ + degree: function () { + return this.edges.length; + }, + + /** + * @return {number} + */ + inDegree: function () { + return this.inEdges.length; + }, + + /** + * @return {number} + */ + outDegree: function () { + return this.outEdges.length; + }, + + /** + * @param {string} [path] + * @return {module:echarts/model/Model} + */ + getModel: function (path) { + if (this.dataIndex < 0) { + return; + } + var graph = this.hostGraph; + var itemModel = graph.data.getItemModel(this.dataIndex); + + return itemModel.getModel(path); + } +}; + +/** + * 图边 + * @alias module:echarts/data/Graph.Edge + * @param {module:echarts/data/Graph.Node} n1 + * @param {module:echarts/data/Graph.Node} n2 + * @param {number} [dataIndex=-1] + */ +function Edge(n1, n2, dataIndex) { + + /** + * 节点1,如果是有向图则为源节点 + * @type {module:echarts/data/Graph.Node} + */ + this.node1 = n1; + + /** + * 节点2,如果是有向图则为目标节点 + * @type {module:echarts/data/Graph.Node} + */ + this.node2 = n2; + + this.dataIndex = dataIndex == null ? -1 : dataIndex; +} + +/** + * @param {string} [path] + * @return {module:echarts/model/Model} + */ +Edge.prototype.getModel = function (path) { + if (this.dataIndex < 0) { + return; + } + var graph = this.hostGraph; + var itemModel = graph.edgeData.getItemModel(this.dataIndex); + + return itemModel.getModel(path); +}; + +var createGraphDataProxyMixin = function (hostName, dataName) { + return { + /** + * @param {string=} [dimension='value'] Default 'value'. can be 'a', 'b', 'c', 'd', 'e'. + * @return {number} + */ + getValue: function (dimension) { + var data = this[hostName][dataName]; + return data.get(data.getDimension(dimension || 'value'), this.dataIndex); + }, + + /** + * @param {Object|string} key + * @param {*} [value] + */ + setVisual: function (key, value) { + this.dataIndex >= 0 + && this[hostName][dataName].setItemVisual(this.dataIndex, key, value); + }, + + /** + * @param {string} key + * @return {boolean} + */ + getVisual: function (key, ignoreParent) { + return this[hostName][dataName].getItemVisual(this.dataIndex, key, ignoreParent); + }, + + /** + * @param {Object} layout + * @return {boolean} [merge=false] + */ + setLayout: function (layout, merge$$1) { + this.dataIndex >= 0 + && this[hostName][dataName].setItemLayout(this.dataIndex, layout, merge$$1); + }, + + /** + * @return {Object} + */ + getLayout: function () { + return this[hostName][dataName].getItemLayout(this.dataIndex); + }, + + /** + * @return {module:zrender/Element} + */ + getGraphicEl: function () { + return this[hostName][dataName].getItemGraphicEl(this.dataIndex); + }, + + /** + * @return {number} + */ + getRawIndex: function () { + return this[hostName][dataName].getRawIndex(this.dataIndex); + } + }; +}; + +mixin(Node, createGraphDataProxyMixin('hostGraph', 'data')); +mixin(Edge, createGraphDataProxyMixin('hostGraph', 'edgeData')); + +Graph.Node = Node; +Graph.Edge = Edge; + +enableClassCheck(Node); +enableClassCheck(Edge); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var createGraphFromNodeEdge = function (nodes, edges, seriesModel, directed, beforeLink) { + // ??? TODO + // support dataset? + var graph = new Graph(directed); + for (var i = 0; i < nodes.length; i++) { + graph.addNode(retrieve( + // Id, name, dataIndex + nodes[i].id, nodes[i].name, i + ), i); + } + + var linkNameList = []; + var validEdges = []; + var linkCount = 0; + for (var i = 0; i < edges.length; i++) { + var link = edges[i]; + var source = link.source; + var target = link.target; + // addEdge may fail when source or target not exists + if (graph.addEdge(source, target, linkCount)) { + validEdges.push(link); + linkNameList.push(retrieve(link.id, source + ' > ' + target)); + linkCount++; + } + } + + var coordSys = seriesModel.get('coordinateSystem'); + var nodeData; + if (coordSys === 'cartesian2d' || coordSys === 'polar') { + nodeData = createListFromArray(nodes, seriesModel); + } + else { + var coordSysCtor = CoordinateSystemManager.get(coordSys); + var coordDimensions = (coordSysCtor && coordSysCtor.type !== 'view') + ? (coordSysCtor.dimensions || []) : []; + // FIXME: Some geo do not need `value` dimenson, whereas `calendar` needs + // `value` dimension, but graph need `value` dimension. It's better to + // uniform this behavior. + if (indexOf(coordDimensions, 'value') < 0) { + coordDimensions.concat(['value']); + } + + var dimensionNames = createDimensions(nodes, { + coordDimensions: coordDimensions + }); + nodeData = new List(dimensionNames, seriesModel); + nodeData.initData(nodes); + } + + var edgeData = new List(['value'], seriesModel); + edgeData.initData(validEdges, linkNameList); + + beforeLink && beforeLink(nodeData, edgeData); + + linkList({ + mainData: nodeData, + struct: graph, + structAttr: 'graph', + datas: {node: nodeData, edge: edgeData}, + datasAttr: {node: 'data', edge: 'edgeData'} + }); + + // Update dataIndex of nodes and edges because invalid edge may be removed + graph.update(); + + return graph; +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var GraphSeries = extendSeriesModel({ + + type: 'series.graph', + + init: function (option) { + GraphSeries.superApply(this, 'init', arguments); + + // Provide data for legend select + this.legendDataProvider = function () { + return this._categoriesData; + }; + + this.fillDataTextStyle(option.edges || option.links); + + this._updateCategoriesData(); + }, + + mergeOption: function (option) { + GraphSeries.superApply(this, 'mergeOption', arguments); + + this.fillDataTextStyle(option.edges || option.links); + + this._updateCategoriesData(); + }, + + mergeDefaultAndTheme: function (option) { + GraphSeries.superApply(this, 'mergeDefaultAndTheme', arguments); + defaultEmphasis(option, ['edgeLabel'], ['show']); + }, + + getInitialData: function (option, ecModel) { + var edges = option.edges || option.links || []; + var nodes = option.data || option.nodes || []; + var self = this; + + if (nodes && edges) { + return createGraphFromNodeEdge(nodes, edges, this, true, beforeLink).data; + } + + function beforeLink(nodeData, edgeData) { + // Overwrite nodeData.getItemModel to + nodeData.wrapMethod('getItemModel', function (model) { + var categoriesModels = self._categoriesModels; + var categoryIdx = model.getShallow('category'); + var categoryModel = categoriesModels[categoryIdx]; + if (categoryModel) { + categoryModel.parentModel = model.parentModel; + model.parentModel = categoryModel; + } + return model; + }); + + var edgeLabelModel = self.getModel('edgeLabel'); + // For option `edgeLabel` can be found by label.xxx.xxx on item mode. + var fakeSeriesModel = new Model( + {label: edgeLabelModel.option}, + edgeLabelModel.parentModel, + ecModel + ); + var emphasisEdgeLabelModel = self.getModel('emphasis.edgeLabel'); + var emphasisFakeSeriesModel = new Model( + {emphasis: {label: emphasisEdgeLabelModel.option}}, + emphasisEdgeLabelModel.parentModel, + ecModel + ); + + edgeData.wrapMethod('getItemModel', function (model) { + model.customizeGetParent(edgeGetParent); + return model; + }); + + function edgeGetParent(path) { + path = this.parsePath(path); + return (path && path[0] === 'label') + ? fakeSeriesModel + : (path && path[0] === 'emphasis' && path[1] === 'label') + ? emphasisFakeSeriesModel + : this.parentModel; + } + } + }, + + /** + * @return {module:echarts/data/Graph} + */ + getGraph: function () { + return this.getData().graph; + }, + + /** + * @return {module:echarts/data/List} + */ + getEdgeData: function () { + return this.getGraph().edgeData; + }, + + /** + * @return {module:echarts/data/List} + */ + getCategoriesData: function () { + return this._categoriesData; + }, + + /** + * @override + */ + formatTooltip: function (dataIndex, multipleSeries, dataType) { + if (dataType === 'edge') { + var nodeData = this.getData(); + var params = this.getDataParams(dataIndex, dataType); + var edge = nodeData.graph.getEdgeByIndex(dataIndex); + var sourceName = nodeData.getName(edge.node1.dataIndex); + var targetName = nodeData.getName(edge.node2.dataIndex); + + var html = []; + sourceName != null && html.push(sourceName); + targetName != null && html.push(targetName); + html = encodeHTML(html.join(' > ')); + + if (params.value) { + html += ' : ' + encodeHTML(params.value); + } + return html; + } + else { // dataType === 'node' or empty + return GraphSeries.superApply(this, 'formatTooltip', arguments); + } + }, + + _updateCategoriesData: function () { + var categories = map(this.option.categories || [], function (category) { + // Data must has value + return category.value != null ? category : extend({ + value: 0 + }, category); + }); + var categoriesData = new List(['value'], this); + categoriesData.initData(categories); + + this._categoriesData = categoriesData; + + this._categoriesModels = categoriesData.mapArray(function (idx) { + return categoriesData.getItemModel(idx, true); + }); + }, + + setZoom: function (zoom) { + this.option.zoom = zoom; + }, + + setCenter: function (center) { + this.option.center = center; + }, + + isAnimationEnabled: function () { + return GraphSeries.superCall(this, 'isAnimationEnabled') + // Not enable animation when do force layout + && !(this.get('layout') === 'force' && this.get('force.layoutAnimation')); + }, + + defaultOption: { + zlevel: 0, + z: 2, + + coordinateSystem: 'view', + + // Default option for all coordinate systems + // xAxisIndex: 0, + // yAxisIndex: 0, + // polarIndex: 0, + // geoIndex: 0, + + legendHoverLink: true, + + hoverAnimation: true, + + layout: null, + + focusNodeAdjacency: false, + + // Configuration of circular layout + circular: { + rotateLabel: false + }, + // Configuration of force directed layout + force: { + initLayout: null, + // Node repulsion. Can be an array to represent range. + repulsion: [0, 50], + gravity: 0.1, + + // Edge length. Can be an array to represent range. + edgeLength: 30, + + layoutAnimation: true + }, + + left: 'center', + top: 'center', + // right: null, + // bottom: null, + // width: '80%', + // height: '80%', + + symbol: 'circle', + symbolSize: 10, + + edgeSymbol: ['none', 'none'], + edgeSymbolSize: 10, + edgeLabel: { + position: 'middle' + }, + + draggable: false, + + roam: false, + + // Default on center of graph + center: null, + + zoom: 1, + // Symbol size scale ratio in roam + nodeScaleRatio: 0.6, + // cursor: null, + + // categories: [], + + // data: [] + // Or + // nodes: [] + // + // links: [] + // Or + // edges: [] + + label: { + show: false, + formatter: '{b}' + }, + + itemStyle: {}, + + lineStyle: { + color: '#aaa', + width: 1, + curveness: 0, + opacity: 0.5 + }, + emphasis: { + label: { + show: true + } + } + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Line path for bezier and straight line draw + */ + +var straightLineProto = Line.prototype; +var bezierCurveProto = BezierCurve.prototype; + +function isLine(shape) { + return isNaN(+shape.cpx1) || isNaN(+shape.cpy1); +} + +var LinePath = extendShape({ + + type: 'ec-line', + + style: { + stroke: '#000', + fill: null + }, + + shape: { + x1: 0, + y1: 0, + x2: 0, + y2: 0, + percent: 1, + cpx1: null, + cpy1: null + }, + + buildPath: function (ctx, shape) { + (isLine(shape) ? straightLineProto : bezierCurveProto).buildPath(ctx, shape); + }, + + pointAt: function (t) { + return isLine(this.shape) + ? straightLineProto.pointAt.call(this, t) + : bezierCurveProto.pointAt.call(this, t); + }, + + tangentAt: function (t) { + var shape = this.shape; + var p = isLine(shape) + ? [shape.x2 - shape.x1, shape.y2 - shape.y1] + : bezierCurveProto.tangentAt.call(this, t); + return normalize(p, p); + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @module echarts/chart/helper/Line + */ + +var SYMBOL_CATEGORIES = ['fromSymbol', 'toSymbol']; + +function makeSymbolTypeKey(symbolCategory) { + return '_' + symbolCategory + 'Type'; +} +/** + * @inner + */ +function createSymbol$1(name, lineData, idx) { + var color = lineData.getItemVisual(idx, 'color'); + var symbolType = lineData.getItemVisual(idx, name); + var symbolSize = lineData.getItemVisual(idx, name + 'Size'); + + if (!symbolType || symbolType === 'none') { + return; + } + + if (!isArray(symbolSize)) { + symbolSize = [symbolSize, symbolSize]; + } + var symbolPath = createSymbol( + symbolType, -symbolSize[0] / 2, -symbolSize[1] / 2, + symbolSize[0], symbolSize[1], color + ); + + symbolPath.name = name; + + return symbolPath; +} + +function createLine(points) { + var line = new LinePath({ + name: 'line' + }); + setLinePoints(line.shape, points); + return line; +} + +function setLinePoints(targetShape, points) { + var p1 = points[0]; + var p2 = points[1]; + var cp1 = points[2]; + targetShape.x1 = p1[0]; + targetShape.y1 = p1[1]; + targetShape.x2 = p2[0]; + targetShape.y2 = p2[1]; + targetShape.percent = 1; + + if (cp1) { + targetShape.cpx1 = cp1[0]; + targetShape.cpy1 = cp1[1]; + } + else { + targetShape.cpx1 = NaN; + targetShape.cpy1 = NaN; + } +} + +function updateSymbolAndLabelBeforeLineUpdate () { + var lineGroup = this; + var symbolFrom = lineGroup.childOfName('fromSymbol'); + var symbolTo = lineGroup.childOfName('toSymbol'); + var label = lineGroup.childOfName('label'); + // Quick reject + if (!symbolFrom && !symbolTo && label.ignore) { + return; + } + + var invScale = 1; + var parentNode = this.parent; + while (parentNode) { + if (parentNode.scale) { + invScale /= parentNode.scale[0]; + } + parentNode = parentNode.parent; + } + + var line = lineGroup.childOfName('line'); + // If line not changed + // FIXME Parent scale changed + if (!this.__dirty && !line.__dirty) { + return; + } + + var percent = line.shape.percent; + var fromPos = line.pointAt(0); + var toPos = line.pointAt(percent); + + var d = sub([], toPos, fromPos); + normalize(d, d); + + if (symbolFrom) { + symbolFrom.attr('position', fromPos); + var tangent = line.tangentAt(0); + symbolFrom.attr('rotation', Math.PI / 2 - Math.atan2( + tangent[1], tangent[0] + )); + symbolFrom.attr('scale', [invScale * percent, invScale * percent]); + } + if (symbolTo) { + symbolTo.attr('position', toPos); + var tangent = line.tangentAt(1); + symbolTo.attr('rotation', -Math.PI / 2 - Math.atan2( + tangent[1], tangent[0] + )); + symbolTo.attr('scale', [invScale * percent, invScale * percent]); + } + + if (!label.ignore) { + label.attr('position', toPos); + + var textPosition; + var textAlign; + var textVerticalAlign; + + var distance$$1 = 5 * invScale; + // End + if (label.__position === 'end') { + textPosition = [d[0] * distance$$1 + toPos[0], d[1] * distance$$1 + toPos[1]]; + textAlign = d[0] > 0.8 ? 'left' : (d[0] < -0.8 ? 'right' : 'center'); + textVerticalAlign = d[1] > 0.8 ? 'top' : (d[1] < -0.8 ? 'bottom' : 'middle'); + } + // Middle + else if (label.__position === 'middle') { + var halfPercent = percent / 2; + var tangent = line.tangentAt(halfPercent); + var n = [tangent[1], -tangent[0]]; + var cp = line.pointAt(halfPercent); + if (n[1] > 0) { + n[0] = -n[0]; + n[1] = -n[1]; + } + textPosition = [cp[0] + n[0] * distance$$1, cp[1] + n[1] * distance$$1]; + textAlign = 'center'; + textVerticalAlign = 'bottom'; + var rotation = -Math.atan2(tangent[1], tangent[0]); + if (toPos[0] < fromPos[0]) { + rotation = Math.PI + rotation; + } + label.attr('rotation', rotation); + } + // Start + else { + textPosition = [-d[0] * distance$$1 + fromPos[0], -d[1] * distance$$1 + fromPos[1]]; + textAlign = d[0] > 0.8 ? 'right' : (d[0] < -0.8 ? 'left' : 'center'); + textVerticalAlign = d[1] > 0.8 ? 'bottom' : (d[1] < -0.8 ? 'top' : 'middle'); + } + label.attr({ + style: { + // Use the user specified text align and baseline first + textVerticalAlign: label.__verticalAlign || textVerticalAlign, + textAlign: label.__textAlign || textAlign + }, + position: textPosition, + scale: [invScale, invScale] + }); + } +} + +/** + * @constructor + * @extends {module:zrender/graphic/Group} + * @alias {module:echarts/chart/helper/Line} + */ +function Line$1(lineData, idx, seriesScope) { + Group.call(this); + + this._createLine(lineData, idx, seriesScope); +} + +var lineProto = Line$1.prototype; + +// Update symbol position and rotation +lineProto.beforeUpdate = updateSymbolAndLabelBeforeLineUpdate; + +lineProto._createLine = function (lineData, idx, seriesScope) { + var seriesModel = lineData.hostModel; + var linePoints = lineData.getItemLayout(idx); + + var line = createLine(linePoints); + line.shape.percent = 0; + initProps(line, { + shape: { + percent: 1 + } + }, seriesModel, idx); + + this.add(line); + + var label = new Text({ + name: 'label' + }); + this.add(label); + + each$1(SYMBOL_CATEGORIES, function (symbolCategory) { + var symbol = createSymbol$1(symbolCategory, lineData, idx); + // symbols must added after line to make sure + // it will be updated after line#update. + // Or symbol position and rotation update in line#beforeUpdate will be one frame slow + this.add(symbol); + this[makeSymbolTypeKey(symbolCategory)] = lineData.getItemVisual(idx, symbolCategory); + }, this); + + this._updateCommonStl(lineData, idx, seriesScope); +}; + +lineProto.updateData = function (lineData, idx, seriesScope) { + var seriesModel = lineData.hostModel; + + var line = this.childOfName('line'); + var linePoints = lineData.getItemLayout(idx); + var target = { + shape: {} + }; + setLinePoints(target.shape, linePoints); + updateProps(line, target, seriesModel, idx); + + each$1(SYMBOL_CATEGORIES, function (symbolCategory) { + var symbolType = lineData.getItemVisual(idx, symbolCategory); + var key = makeSymbolTypeKey(symbolCategory); + // Symbol changed + if (this[key] !== symbolType) { + this.remove(this.childOfName(symbolCategory)); + var symbol = createSymbol$1(symbolCategory, lineData, idx); + this.add(symbol); + } + this[key] = symbolType; + }, this); + + this._updateCommonStl(lineData, idx, seriesScope); +}; + +lineProto._updateCommonStl = function (lineData, idx, seriesScope) { + var seriesModel = lineData.hostModel; + + var line = this.childOfName('line'); + + var lineStyle = seriesScope && seriesScope.lineStyle; + var hoverLineStyle = seriesScope && seriesScope.hoverLineStyle; + var labelModel = seriesScope && seriesScope.labelModel; + var hoverLabelModel = seriesScope && seriesScope.hoverLabelModel; + + // Optimization for large dataset + if (!seriesScope || lineData.hasItemOption) { + var itemModel = lineData.getItemModel(idx); + + lineStyle = itemModel.getModel('lineStyle').getLineStyle(); + hoverLineStyle = itemModel.getModel('emphasis.lineStyle').getLineStyle(); + + labelModel = itemModel.getModel('label'); + hoverLabelModel = itemModel.getModel('emphasis.label'); + } + + var visualColor = lineData.getItemVisual(idx, 'color'); + var visualOpacity = retrieve3( + lineData.getItemVisual(idx, 'opacity'), + lineStyle.opacity, + 1 + ); + + line.useStyle(defaults( + { + strokeNoScale: true, + fill: 'none', + stroke: visualColor, + opacity: visualOpacity + }, + lineStyle + )); + line.hoverStyle = hoverLineStyle; + + // Update symbol + each$1(SYMBOL_CATEGORIES, function (symbolCategory) { + var symbol = this.childOfName(symbolCategory); + if (symbol) { + symbol.setColor(visualColor); + symbol.setStyle({ + opacity: visualOpacity + }); + } + }, this); + + var showLabel = labelModel.getShallow('show'); + var hoverShowLabel = hoverLabelModel.getShallow('show'); + + var label = this.childOfName('label'); + var defaultLabelColor; + var baseText; + + // FIXME: the logic below probably should be merged to `graphic.setLabelStyle`. + if (showLabel || hoverShowLabel) { + defaultLabelColor = visualColor || '#000'; + + baseText = seriesModel.getFormattedLabel(idx, 'normal', lineData.dataType); + if (baseText == null) { + var rawVal = seriesModel.getRawValue(idx); + baseText = rawVal == null + ? lineData.getName(idx) + : isFinite(rawVal) + ? round$1(rawVal) + : rawVal; + } + } + var normalText = showLabel ? baseText : null; + var emphasisText = hoverShowLabel + ? retrieve2( + seriesModel.getFormattedLabel(idx, 'emphasis', lineData.dataType), + baseText + ) + : null; + + var labelStyle = label.style; + + // Always set `textStyle` even if `normalStyle.text` is null, because default + // values have to be set on `normalStyle`. + if (normalText != null || emphasisText != null) { + setTextStyle(label.style, labelModel, { + text: normalText + }, { + autoColor: defaultLabelColor + }); + + label.__textAlign = labelStyle.textAlign; + label.__verticalAlign = labelStyle.textVerticalAlign; + // 'start', 'middle', 'end' + label.__position = labelModel.get('position') || 'middle'; + } + + if (emphasisText != null) { + // Only these properties supported in this emphasis style here. + label.hoverStyle = { + text: emphasisText, + textFill: hoverLabelModel.getTextColor(true), + // For merging hover style to normal style, do not use + // `hoverLabelModel.getFont()` here. + fontStyle: hoverLabelModel.getShallow('fontStyle'), + fontWeight: hoverLabelModel.getShallow('fontWeight'), + fontSize: hoverLabelModel.getShallow('fontSize'), + fontFamily: hoverLabelModel.getShallow('fontFamily') + }; + } + else { + label.hoverStyle = { + text: null + }; + } + + label.ignore = !showLabel && !hoverShowLabel; + + setHoverStyle(this); +}; + +lineProto.highlight = function () { + this.trigger('emphasis'); +}; + +lineProto.downplay = function () { + this.trigger('normal'); +}; + +lineProto.updateLayout = function (lineData, idx) { + this.setLinePoints(lineData.getItemLayout(idx)); +}; + +lineProto.setLinePoints = function (points) { + var linePath = this.childOfName('line'); + setLinePoints(linePath.shape, points); + linePath.dirty(); +}; + +inherits(Line$1, Group); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @module echarts/chart/helper/LineDraw + */ + +// import IncrementalDisplayable from 'zrender/src/graphic/IncrementalDisplayable'; + +/** + * @alias module:echarts/component/marker/LineDraw + * @constructor + */ +function LineDraw(ctor) { + this._ctor = ctor || Line$1; + + this.group = new Group(); +} + +var lineDrawProto = LineDraw.prototype; + +lineDrawProto.isPersistent = function () { + return true; +}; + +/** + * @param {module:echarts/data/List} lineData + */ +lineDrawProto.updateData = function (lineData) { + var lineDraw = this; + var group = lineDraw.group; + + var oldLineData = lineDraw._lineData; + lineDraw._lineData = lineData; + + // There is no oldLineData only when first rendering or switching from + // stream mode to normal mode, where previous elements should be removed. + if (!oldLineData) { + group.removeAll(); + } + + var seriesScope = makeSeriesScope$1(lineData); + + lineData.diff(oldLineData) + .add(function (idx) { + doAdd(lineDraw, lineData, idx, seriesScope); + }) + .update(function (newIdx, oldIdx) { + doUpdate(lineDraw, oldLineData, lineData, oldIdx, newIdx, seriesScope); + }) + .remove(function (idx) { + group.remove(oldLineData.getItemGraphicEl(idx)); + }) + .execute(); +}; + +function doAdd(lineDraw, lineData, idx, seriesScope) { + var itemLayout = lineData.getItemLayout(idx); + + if (!lineNeedsDraw(itemLayout)) { + return; + } + + var el = new lineDraw._ctor(lineData, idx, seriesScope); + lineData.setItemGraphicEl(idx, el); + lineDraw.group.add(el); +} + +function doUpdate(lineDraw, oldLineData, newLineData, oldIdx, newIdx, seriesScope) { + var itemEl = oldLineData.getItemGraphicEl(oldIdx); + + if (!lineNeedsDraw(newLineData.getItemLayout(newIdx))) { + lineDraw.group.remove(itemEl); + return; + } + + if (!itemEl) { + itemEl = new lineDraw._ctor(newLineData, newIdx, seriesScope); + } + else { + itemEl.updateData(newLineData, newIdx, seriesScope); + } + + newLineData.setItemGraphicEl(newIdx, itemEl); + + lineDraw.group.add(itemEl); +} + +lineDrawProto.updateLayout = function () { + var lineData = this._lineData; + + // Do not support update layout in incremental mode. + if (!lineData) { + return; + } + + lineData.eachItemGraphicEl(function (el, idx) { + el.updateLayout(lineData, idx); + }, this); +}; + +lineDrawProto.incrementalPrepareUpdate = function (lineData) { + this._seriesScope = makeSeriesScope$1(lineData); + this._lineData = null; + this.group.removeAll(); +}; + +lineDrawProto.incrementalUpdate = function (taskParams, lineData) { + function updateIncrementalAndHover(el) { + if (!el.isGroup) { + el.incremental = el.useHoverLayer = true; + } + } + + for (var idx = taskParams.start; idx < taskParams.end; idx++) { + var itemLayout = lineData.getItemLayout(idx); + + if (lineNeedsDraw(itemLayout)) { + var el = new this._ctor(lineData, idx, this._seriesScope); + el.traverse(updateIncrementalAndHover); + + this.group.add(el); + lineData.setItemGraphicEl(idx, el); + } + } +}; + +function makeSeriesScope$1(lineData) { + var hostModel = lineData.hostModel; + return { + lineStyle: hostModel.getModel('lineStyle').getLineStyle(), + hoverLineStyle: hostModel.getModel('emphasis.lineStyle').getLineStyle(), + labelModel: hostModel.getModel('label'), + hoverLabelModel: hostModel.getModel('emphasis.label') + }; +} + +lineDrawProto.remove = function () { + this._clearIncremental(); + this._incremental = null; + this.group.removeAll(); +}; + +lineDrawProto._clearIncremental = function () { + var incremental = this._incremental; + if (incremental) { + incremental.clearDisplaybles(); + } +}; + +function isPointNaN(pt) { + return isNaN(pt[0]) || isNaN(pt[1]); +} + +function lineNeedsDraw(pts) { + return !isPointNaN(pts[0]) && !isPointNaN(pts[1]); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var v1 = []; +var v2 = []; +var v3 = []; +var quadraticAt$1 = quadraticAt; +var v2DistSquare = distSquare; +var mathAbs$1 = Math.abs; +function intersectCurveCircle(curvePoints, center, radius) { + var p0 = curvePoints[0]; + var p1 = curvePoints[1]; + var p2 = curvePoints[2]; + + var d = Infinity; + var t; + var radiusSquare = radius * radius; + var interval = 0.1; + + for (var _t = 0.1; _t <= 0.9; _t += 0.1) { + v1[0] = quadraticAt$1(p0[0], p1[0], p2[0], _t); + v1[1] = quadraticAt$1(p0[1], p1[1], p2[1], _t); + var diff = mathAbs$1(v2DistSquare(v1, center) - radiusSquare); + if (diff < d) { + d = diff; + t = _t; + } + } + + // Assume the segment is monotone,Find root through Bisection method + // At most 32 iteration + for (var i = 0; i < 32; i++) { + // var prev = t - interval; + var next = t + interval; + // v1[0] = quadraticAt(p0[0], p1[0], p2[0], prev); + // v1[1] = quadraticAt(p0[1], p1[1], p2[1], prev); + v2[0] = quadraticAt$1(p0[0], p1[0], p2[0], t); + v2[1] = quadraticAt$1(p0[1], p1[1], p2[1], t); + v3[0] = quadraticAt$1(p0[0], p1[0], p2[0], next); + v3[1] = quadraticAt$1(p0[1], p1[1], p2[1], next); + + var diff = v2DistSquare(v2, center) - radiusSquare; + if (mathAbs$1(diff) < 1e-2) { + break; + } + + // var prevDiff = v2DistSquare(v1, center) - radiusSquare; + var nextDiff = v2DistSquare(v3, center) - radiusSquare; + + interval /= 2; + if (diff < 0) { + if (nextDiff >= 0) { + t = t + interval; + } + else { + t = t - interval; + } + } + else { + if (nextDiff >= 0) { + t = t - interval; + } + else { + t = t + interval; + } + } + } + + return t; +} + +// Adjust edge to avoid +var adjustEdge = function (graph, scale$$1) { + var tmp0 = []; + var quadraticSubdivide$$1 = quadraticSubdivide; + var pts = [[], [], []]; + var pts2 = [[], []]; + var v = []; + scale$$1 /= 2; + + function getSymbolSize(node) { + var symbolSize = node.getVisual('symbolSize'); + if (symbolSize instanceof Array) { + symbolSize = (symbolSize[0] + symbolSize[1]) / 2; + } + return symbolSize; + } + graph.eachEdge(function (edge, idx) { + var linePoints = edge.getLayout(); + var fromSymbol = edge.getVisual('fromSymbol'); + var toSymbol = edge.getVisual('toSymbol'); + + if (!linePoints.__original) { + linePoints.__original = [ + clone$1(linePoints[0]), + clone$1(linePoints[1]) + ]; + if (linePoints[2]) { + linePoints.__original.push(clone$1(linePoints[2])); + } + } + var originalPoints = linePoints.__original; + // Quadratic curve + if (linePoints[2] != null) { + copy(pts[0], originalPoints[0]); + copy(pts[1], originalPoints[2]); + copy(pts[2], originalPoints[1]); + if (fromSymbol && fromSymbol != 'none') { + var symbolSize = getSymbolSize(edge.node1); + + var t = intersectCurveCircle(pts, originalPoints[0], symbolSize * scale$$1); + // Subdivide and get the second + quadraticSubdivide$$1(pts[0][0], pts[1][0], pts[2][0], t, tmp0); + pts[0][0] = tmp0[3]; + pts[1][0] = tmp0[4]; + quadraticSubdivide$$1(pts[0][1], pts[1][1], pts[2][1], t, tmp0); + pts[0][1] = tmp0[3]; + pts[1][1] = tmp0[4]; + } + if (toSymbol && toSymbol != 'none') { + var symbolSize = getSymbolSize(edge.node2); + + var t = intersectCurveCircle(pts, originalPoints[1], symbolSize * scale$$1); + // Subdivide and get the first + quadraticSubdivide$$1(pts[0][0], pts[1][0], pts[2][0], t, tmp0); + pts[1][0] = tmp0[1]; + pts[2][0] = tmp0[2]; + quadraticSubdivide$$1(pts[0][1], pts[1][1], pts[2][1], t, tmp0); + pts[1][1] = tmp0[1]; + pts[2][1] = tmp0[2]; + } + // Copy back to layout + copy(linePoints[0], pts[0]); + copy(linePoints[1], pts[2]); + copy(linePoints[2], pts[1]); + } + // Line + else { + copy(pts2[0], originalPoints[0]); + copy(pts2[1], originalPoints[1]); + + sub(v, pts2[1], pts2[0]); + normalize(v, v); + if (fromSymbol && fromSymbol != 'none') { + + var symbolSize = getSymbolSize(edge.node1); + + scaleAndAdd(pts2[0], pts2[0], v, symbolSize * scale$$1); + } + if (toSymbol && toSymbol != 'none') { + var symbolSize = getSymbolSize(edge.node2); + + scaleAndAdd(pts2[1], pts2[1], v, -symbolSize * scale$$1); + } + copy(linePoints[0], pts2[0]); + copy(linePoints[1], pts2[1]); + } + }); +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var nodeOpacityPath = ['itemStyle', 'opacity']; +var lineOpacityPath = ['lineStyle', 'opacity']; + +function getItemOpacity(item, opacityPath) { + return item.getVisual('opacity') || item.getModel().get(opacityPath); +} + +function fadeOutItem(item, opacityPath, opacityRatio) { + var el = item.getGraphicEl(); + + var opacity = getItemOpacity(item, opacityPath); + if (opacityRatio != null) { + opacity == null && (opacity = 1); + opacity *= opacityRatio; + } + + el.downplay && el.downplay(); + el.traverse(function (child) { + if (child.type !== 'group') { + child.setStyle('opacity', opacity); + } + }); +} + +function fadeInItem(item, opacityPath) { + var opacity = getItemOpacity(item, opacityPath); + var el = item.getGraphicEl(); + + el.highlight && el.highlight(); + el.traverse(function (child) { + if (child.type !== 'group') { + child.setStyle('opacity', opacity); + } + }); +} + +extendChartView({ + + type: 'graph', + + init: function (ecModel, api) { + var symbolDraw = new SymbolDraw(); + var lineDraw = new LineDraw(); + var group = this.group; + + this._controller = new RoamController(api.getZr()); + this._controllerHost = {target: group}; + + group.add(symbolDraw.group); + group.add(lineDraw.group); + + this._symbolDraw = symbolDraw; + this._lineDraw = lineDraw; + + this._firstRender = true; + }, + + render: function (seriesModel, ecModel, api) { + var coordSys = seriesModel.coordinateSystem; + + this._model = seriesModel; + this._nodeScaleRatio = seriesModel.get('nodeScaleRatio'); + + var symbolDraw = this._symbolDraw; + var lineDraw = this._lineDraw; + + var group = this.group; + + if (coordSys.type === 'view') { + var groupNewProp = { + position: coordSys.position, + scale: coordSys.scale + }; + if (this._firstRender) { + group.attr(groupNewProp); + } + else { + updateProps(group, groupNewProp, seriesModel); + } + } + // Fix edge contact point with node + adjustEdge(seriesModel.getGraph(), this._getNodeGlobalScale(seriesModel)); + + var data = seriesModel.getData(); + symbolDraw.updateData(data); + + var edgeData = seriesModel.getEdgeData(); + lineDraw.updateData(edgeData); + + this._updateNodeAndLinkScale(); + + this._updateController(seriesModel, ecModel, api); + + clearTimeout(this._layoutTimeout); + var forceLayout = seriesModel.forceLayout; + var layoutAnimation = seriesModel.get('force.layoutAnimation'); + if (forceLayout) { + this._startForceLayoutIteration(forceLayout, layoutAnimation); + } + + data.eachItemGraphicEl(function (el, idx) { + var itemModel = data.getItemModel(idx); + // Update draggable + el.off('drag').off('dragend'); + var draggable = data.getItemModel(idx).get('draggable'); + if (draggable) { + el.on('drag', function () { + if (forceLayout) { + forceLayout.warmUp(); + !this._layouting + && this._startForceLayoutIteration(forceLayout, layoutAnimation); + forceLayout.setFixed(idx); + // Write position back to layout + data.setItemLayout(idx, el.position); + } + }, this).on('dragend', function () { + if (forceLayout) { + forceLayout.setUnfixed(idx); + } + }, this); + } + el.setDraggable(draggable && forceLayout); + + el.off('mouseover', el.__focusNodeAdjacency); + el.off('mouseout', el.__unfocusNodeAdjacency); + + if (itemModel.get('focusNodeAdjacency')) { + el.on('mouseover', el.__focusNodeAdjacency = function () { + api.dispatchAction({ + type: 'focusNodeAdjacency', + seriesId: seriesModel.id, + dataIndex: el.dataIndex + }); + }); + el.on('mouseout', el.__unfocusNodeAdjacency = function () { + api.dispatchAction({ + type: 'unfocusNodeAdjacency', + seriesId: seriesModel.id + }); + }); + + } + + }, this); + + data.graph.eachEdge(function (edge) { + var el = edge.getGraphicEl(); + + el.off('mouseover', el.__focusNodeAdjacency); + el.off('mouseout', el.__unfocusNodeAdjacency); + + if (edge.getModel().get('focusNodeAdjacency')) { + el.on('mouseover', el.__focusNodeAdjacency = function () { + api.dispatchAction({ + type: 'focusNodeAdjacency', + seriesId: seriesModel.id, + edgeDataIndex: edge.dataIndex + }); + }); + el.on('mouseout', el.__unfocusNodeAdjacency = function () { + api.dispatchAction({ + type: 'unfocusNodeAdjacency', + seriesId: seriesModel.id + }); + }); + } + }); + + var circularRotateLabel = seriesModel.get('layout') === 'circular' + && seriesModel.get('circular.rotateLabel'); + var cx = data.getLayout('cx'); + var cy = data.getLayout('cy'); + data.eachItemGraphicEl(function (el, idx) { + var symbolPath = el.getSymbolPath(); + if (circularRotateLabel) { + var pos = data.getItemLayout(idx); + var rad = Math.atan2(pos[1] - cy, pos[0] - cx); + if (rad < 0) { + rad = Math.PI * 2 + rad; + } + var isLeft = pos[0] < cx; + if (isLeft) { + rad = rad - Math.PI; + } + var textPosition = isLeft ? 'left' : 'right'; + symbolPath.setStyle({ + textRotation: -rad, + textPosition: textPosition, + textOrigin: 'center' + }); + symbolPath.hoverStyle && (symbolPath.hoverStyle.textPosition = textPosition); + } + else { + symbolPath.setStyle({ + textRotation: 0 + }); + } + }); + + this._firstRender = false; + }, + + dispose: function () { + this._controller && this._controller.dispose(); + this._controllerHost = {}; + }, + + focusNodeAdjacency: function (seriesModel, ecModel, api, payload) { + var data = this._model.getData(); + var graph = data.graph; + var dataIndex = payload.dataIndex; + var edgeDataIndex = payload.edgeDataIndex; + + var node = graph.getNodeByIndex(dataIndex); + var edge = graph.getEdgeByIndex(edgeDataIndex); + + if (!node && !edge) { + return; + } + + graph.eachNode(function (node) { + fadeOutItem(node, nodeOpacityPath, 0.1); + }); + graph.eachEdge(function (edge) { + fadeOutItem(edge, lineOpacityPath, 0.1); + }); + + if (node) { + fadeInItem(node, nodeOpacityPath); + each$1(node.edges, function (adjacentEdge) { + if (adjacentEdge.dataIndex < 0) { + return; + } + fadeInItem(adjacentEdge, lineOpacityPath); + fadeInItem(adjacentEdge.node1, nodeOpacityPath); + fadeInItem(adjacentEdge.node2, nodeOpacityPath); + }); + } + if (edge) { + fadeInItem(edge, lineOpacityPath); + fadeInItem(edge.node1, nodeOpacityPath); + fadeInItem(edge.node2, nodeOpacityPath); + } + }, + + unfocusNodeAdjacency: function (seriesModel, ecModel, api, payload) { + var graph = this._model.getData().graph; + + graph.eachNode(function (node) { + fadeOutItem(node, nodeOpacityPath); + }); + graph.eachEdge(function (edge) { + fadeOutItem(edge, lineOpacityPath); + }); + }, + + _startForceLayoutIteration: function (forceLayout, layoutAnimation) { + var self = this; + (function step() { + forceLayout.step(function (stopped) { + self.updateLayout(self._model); + (self._layouting = !stopped) && ( + layoutAnimation + ? (self._layoutTimeout = setTimeout(step, 16)) + : step() + ); + }); + })(); + }, + + _updateController: function (seriesModel, ecModel, api) { + var controller = this._controller; + var controllerHost = this._controllerHost; + var group = this.group; + + controller.setPointerChecker(function (e, x, y) { + var rect = group.getBoundingRect(); + rect.applyTransform(group.transform); + return rect.contain(x, y) + && !onIrrelevantElement(e, api, seriesModel); + }); + + if (seriesModel.coordinateSystem.type !== 'view') { + controller.disable(); + return; + } + controller.enable(seriesModel.get('roam')); + controllerHost.zoomLimit = seriesModel.get('scaleLimit'); + controllerHost.zoom = seriesModel.coordinateSystem.getZoom(); + + controller + .off('pan') + .off('zoom') + .on('pan', function (dx, dy) { + updateViewOnPan(controllerHost, dx, dy); + api.dispatchAction({ + seriesId: seriesModel.id, + type: 'graphRoam', + dx: dx, + dy: dy + }); + }) + .on('zoom', function (zoom, mouseX, mouseY) { + updateViewOnZoom(controllerHost, zoom, mouseX, mouseY); + api.dispatchAction({ + seriesId: seriesModel.id, + type: 'graphRoam', + zoom: zoom, + originX: mouseX, + originY: mouseY + }); + this._updateNodeAndLinkScale(); + adjustEdge(seriesModel.getGraph(), this._getNodeGlobalScale(seriesModel)); + this._lineDraw.updateLayout(); + }, this); + }, + + _updateNodeAndLinkScale: function () { + var seriesModel = this._model; + var data = seriesModel.getData(); + + var nodeScale = this._getNodeGlobalScale(seriesModel); + var invScale = [nodeScale, nodeScale]; + + data.eachItemGraphicEl(function (el, idx) { + el.attr('scale', invScale); + }); + }, + + _getNodeGlobalScale: function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + if (coordSys.type !== 'view') { + return 1; + } + + var nodeScaleRatio = this._nodeScaleRatio; + + var groupScale = coordSys.scale; + var groupZoom = (groupScale && groupScale[0]) || 1; + // Scale node when zoom changes + var roamZoom = coordSys.getZoom(); + var nodeScale = (roamZoom - 1) * nodeScaleRatio + 1; + + return nodeScale / groupZoom; + }, + + updateLayout: function (seriesModel) { + adjustEdge(seriesModel.getGraph(), this._getNodeGlobalScale(seriesModel)); + + this._symbolDraw.updateLayout(); + this._lineDraw.updateLayout(); + }, + + remove: function (ecModel, api) { + this._symbolDraw && this._symbolDraw.remove(); + this._lineDraw && this._lineDraw.remove(); + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var actionInfo = { + type: 'graphRoam', + event: 'graphRoam', + update: 'none' +}; + +/** + * @payload + * @property {string} name Series name + * @property {number} [dx] + * @property {number} [dy] + * @property {number} [zoom] + * @property {number} [originX] + * @property {number} [originY] + */ +registerAction(actionInfo, function (payload, ecModel) { + ecModel.eachComponent({mainType: 'series', query: payload}, function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + + var res = updateCenterAndZoom(coordSys, payload); + + seriesModel.setCenter + && seriesModel.setCenter(res.center); + + seriesModel.setZoom + && seriesModel.setZoom(res.zoom); + }); +}); + + +/** + * @payload + * @property {number} [seriesIndex] + * @property {string} [seriesId] + * @property {string} [seriesName] + * @property {number} [dataIndex] + */ +registerAction({ + type: 'focusNodeAdjacency', + event: 'focusNodeAdjacency', + update: 'series.graph:focusNodeAdjacency' +}, function () {}); + +/** + * @payload + * @property {number} [seriesIndex] + * @property {string} [seriesId] + * @property {string} [seriesName] + */ +registerAction({ + type: 'unfocusNodeAdjacency', + event: 'unfocusNodeAdjacency', + update: 'series.graph:unfocusNodeAdjacency' +}, function () {}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +var categoryFilter = function (ecModel) { + var legendModels = ecModel.findComponents({ + mainType: 'legend' + }); + if (!legendModels || !legendModels.length) { + return; + } + ecModel.eachSeriesByType('graph', function (graphSeries) { + var categoriesData = graphSeries.getCategoriesData(); + var graph = graphSeries.getGraph(); + var data = graph.data; + + var categoryNames = categoriesData.mapArray(categoriesData.getName); + + data.filterSelf(function (idx) { + var model = data.getItemModel(idx); + var category = model.getShallow('category'); + if (category != null) { + if (typeof category === 'number') { + category = categoryNames[category]; + } + // If in any legend component the status is not selected. + for (var i = 0; i < legendModels.length; i++) { + if (!legendModels[i].isSelected(category)) { + return false; + } + } + } + return true; + }); + }, this); +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +var categoryVisual = function (ecModel) { + + var paletteScope = {}; + ecModel.eachSeriesByType('graph', function (seriesModel) { + var categoriesData = seriesModel.getCategoriesData(); + var data = seriesModel.getData(); + + var categoryNameIdxMap = {}; + + categoriesData.each(function (idx) { + var name = categoriesData.getName(idx); + // Add prefix to avoid conflict with Object.prototype. + categoryNameIdxMap['ec-' + name] = idx; + + var itemModel = categoriesData.getItemModel(idx); + var color = itemModel.get('itemStyle.color') + || seriesModel.getColorFromPalette(name, paletteScope); + categoriesData.setItemVisual(idx, 'color', color); + }); + + // Assign category color to visual + if (categoriesData.count()) { + data.each(function (idx) { + var model = data.getItemModel(idx); + var category = model.getShallow('category'); + if (category != null) { + if (typeof category === 'string') { + category = categoryNameIdxMap['ec-' + category]; + } + if (!data.getItemVisual(idx, 'color', true)) { + data.setItemVisual( + idx, 'color', + categoriesData.getItemVisual(category, 'color') + ); + } + } + }); + } + }); +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +function normalize$1(a) { + if (!(a instanceof Array)) { + a = [a, a]; + } + return a; +} + +var edgeVisual = function (ecModel) { + ecModel.eachSeriesByType('graph', function (seriesModel) { + var graph = seriesModel.getGraph(); + var edgeData = seriesModel.getEdgeData(); + var symbolType = normalize$1(seriesModel.get('edgeSymbol')); + var symbolSize = normalize$1(seriesModel.get('edgeSymbolSize')); + + var colorQuery = 'lineStyle.color'.split('.'); + var opacityQuery = 'lineStyle.opacity'.split('.'); + + edgeData.setVisual('fromSymbol', symbolType && symbolType[0]); + edgeData.setVisual('toSymbol', symbolType && symbolType[1]); + edgeData.setVisual('fromSymbolSize', symbolSize && symbolSize[0]); + edgeData.setVisual('toSymbolSize', symbolSize && symbolSize[1]); + edgeData.setVisual('color', seriesModel.get(colorQuery)); + edgeData.setVisual('opacity', seriesModel.get(opacityQuery)); + + edgeData.each(function (idx) { + var itemModel = edgeData.getItemModel(idx); + var edge = graph.getEdgeByIndex(idx); + var symbolType = normalize$1(itemModel.getShallow('symbol', true)); + var symbolSize = normalize$1(itemModel.getShallow('symbolSize', true)); + // Edge visual must after node visual + var color = itemModel.get(colorQuery); + var opacity = itemModel.get(opacityQuery); + switch (color) { + case 'source': + color = edge.node1.getVisual('color'); + break; + case 'target': + color = edge.node2.getVisual('color'); + break; + } + + symbolType[0] && edge.setVisual('fromSymbol', symbolType[0]); + symbolType[1] && edge.setVisual('toSymbol', symbolType[1]); + symbolSize[0] && edge.setVisual('fromSymbolSize', symbolSize[0]); + symbolSize[1] && edge.setVisual('toSymbolSize', symbolSize[1]); + + edge.setVisual('color', color); + edge.setVisual('opacity', opacity); + }); + }); +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +function simpleLayout$1(seriesModel) { + var coordSys = seriesModel.coordinateSystem; + if (coordSys && coordSys.type !== 'view') { + return; + } + var graph = seriesModel.getGraph(); + + graph.eachNode(function (node) { + var model = node.getModel(); + node.setLayout([+model.get('x'), +model.get('y')]); + }); + + simpleLayoutEdge(graph); +} + +function simpleLayoutEdge(graph) { + graph.eachEdge(function (edge) { + var curveness = edge.getModel().get('lineStyle.curveness') || 0; + var p1 = clone$1(edge.node1.getLayout()); + var p2 = clone$1(edge.node2.getLayout()); + var points = [p1, p2]; + if (+curveness) { + points.push([ + (p1[0] + p2[0]) / 2 - (p1[1] - p2[1]) * curveness, + (p1[1] + p2[1]) / 2 - (p2[0] - p1[0]) * curveness + ]); + } + edge.setLayout(points); + }); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var simpleLayout = function (ecModel, api) { + ecModel.eachSeriesByType('graph', function (seriesModel) { + var layout = seriesModel.get('layout'); + var coordSys = seriesModel.coordinateSystem; + if (coordSys && coordSys.type !== 'view') { + var data = seriesModel.getData(); + + var dimensions = []; + each$1(coordSys.dimensions, function (coordDim) { + dimensions = dimensions.concat(data.mapDimension(coordDim, true)); + }); + + for (var dataIndex = 0; dataIndex < data.count(); dataIndex++) { + var value = []; + var hasValue = false; + for (var i = 0; i < dimensions.length; i++) { + var val = data.get(dimensions[i], dataIndex); + if (!isNaN(val)) { + hasValue = true; + } + value.push(val); + } + if (hasValue) { + data.setItemLayout(dataIndex, coordSys.dataToPoint(value)); + } + else { + // Also {Array.<number>}, not undefined to avoid if...else... statement + data.setItemLayout(dataIndex, [NaN, NaN]); + } + } + + simpleLayoutEdge(data.graph); + } + else if (!layout || layout === 'none') { + simpleLayout$1(seriesModel); + } + }); +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +function circularLayout$1(seriesModel) { + var coordSys = seriesModel.coordinateSystem; + if (coordSys && coordSys.type !== 'view') { + return; + } + + var rect = coordSys.getBoundingRect(); + + var nodeData = seriesModel.getData(); + var graph = nodeData.graph; + + var angle = 0; + var sum = nodeData.getSum('value'); + var unitAngle = Math.PI * 2 / (sum || nodeData.count()); + + var cx = rect.width / 2 + rect.x; + var cy = rect.height / 2 + rect.y; + + var r = Math.min(rect.width, rect.height) / 2; + + graph.eachNode(function (node) { + var value = node.getValue('value'); + + angle += unitAngle * (sum ? value : 1) / 2; + + node.setLayout([ + r * Math.cos(angle) + cx, + r * Math.sin(angle) + cy + ]); + + angle += unitAngle * (sum ? value : 1) / 2; + }); + + nodeData.setLayout({ + cx: cx, + cy: cy + }); + + graph.eachEdge(function (edge) { + var curveness = edge.getModel().get('lineStyle.curveness') || 0; + var p1 = clone$1(edge.node1.getLayout()); + var p2 = clone$1(edge.node2.getLayout()); + var cp1; + var x12 = (p1[0] + p2[0]) / 2; + var y12 = (p1[1] + p2[1]) / 2; + if (+curveness) { + curveness *= 3; + cp1 = [ + cx * curveness + x12 * (1 - curveness), + cy * curveness + y12 * (1 - curveness) + ]; + } + edge.setLayout([p1, p2, cp1]); + }); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var circularLayout = function (ecModel) { + ecModel.eachSeriesByType('graph', function (seriesModel) { + if (seriesModel.get('layout') === 'circular') { + circularLayout$1(seriesModel); + } + }); +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/* +* The layout implementation references to d3.js. The use of +* the source code of this file is also subject to the terms +* and consitions of its license (BSD-3Clause, see +* <echarts/src/licenses/LICENSE-d3>). +*/ + +var scaleAndAdd$2 = scaleAndAdd; + +// function adjacentNode(n, e) { +// return e.n1 === n ? e.n2 : e.n1; +// } + +function forceLayout$1(nodes, edges, opts) { + var rect = opts.rect; + var width = rect.width; + var height = rect.height; + var center = [rect.x + width / 2, rect.y + height / 2]; + // var scale = opts.scale || 1; + var gravity = opts.gravity == null ? 0.1 : opts.gravity; + + // for (var i = 0; i < edges.length; i++) { + // var e = edges[i]; + // var n1 = e.n1; + // var n2 = e.n2; + // n1.edges = n1.edges || []; + // n2.edges = n2.edges || []; + // n1.edges.push(e); + // n2.edges.push(e); + // } + // Init position + for (var i = 0; i < nodes.length; i++) { + var n = nodes[i]; + if (!n.p) { + // Use the position from first adjecent node with defined position + // Or use a random position + // From d3 + // if (n.edges) { + // var j = -1; + // while (++j < n.edges.length) { + // var e = n.edges[j]; + // var other = adjacentNode(n, e); + // if (other.p) { + // n.p = vec2.clone(other.p); + // break; + // } + // } + // } + // if (!n.p) { + n.p = create( + width * (Math.random() - 0.5) + center[0], + height * (Math.random() - 0.5) + center[1] + ); + // } + } + n.pp = clone$1(n.p); + n.edges = null; + } + + // Formula in 'Graph Drawing by Force-directed Placement' + // var k = scale * Math.sqrt(width * height / nodes.length); + // var k2 = k * k; + + var friction = 0.6; + + return { + warmUp: function () { + friction = 0.5; + }, + + setFixed: function (idx) { + nodes[idx].fixed = true; + }, + + setUnfixed: function (idx) { + nodes[idx].fixed = false; + }, + + step: function (cb) { + var v12 = []; + var nLen = nodes.length; + for (var i = 0; i < edges.length; i++) { + var e = edges[i]; + var n1 = e.n1; + var n2 = e.n2; + + sub(v12, n2.p, n1.p); + var d = len(v12) - e.d; + var w = n2.w / (n1.w + n2.w); + + if (isNaN(w)) { + w = 0; + } + + normalize(v12, v12); + + !n1.fixed && scaleAndAdd$2(n1.p, n1.p, v12, w * d * friction); + !n2.fixed && scaleAndAdd$2(n2.p, n2.p, v12, -(1 - w) * d * friction); + } + // Gravity + for (var i = 0; i < nLen; i++) { + var n = nodes[i]; + if (!n.fixed) { + sub(v12, center, n.p); + // var d = vec2.len(v12); + // vec2.scale(v12, v12, 1 / d); + // var gravityFactor = gravity; + scaleAndAdd$2(n.p, n.p, v12, gravity * friction); + } + } + + // Repulsive + // PENDING + for (var i = 0; i < nLen; i++) { + var n1 = nodes[i]; + for (var j = i + 1; j < nLen; j++) { + var n2 = nodes[j]; + sub(v12, n2.p, n1.p); + var d = len(v12); + if (d === 0) { + // Random repulse + set(v12, Math.random() - 0.5, Math.random() - 0.5); + d = 1; + } + var repFact = (n1.rep + n2.rep) / d / d; + !n1.fixed && scaleAndAdd$2(n1.pp, n1.pp, v12, repFact); + !n2.fixed && scaleAndAdd$2(n2.pp, n2.pp, v12, -repFact); + } + } + var v = []; + for (var i = 0; i < nLen; i++) { + var n = nodes[i]; + if (!n.fixed) { + sub(v, n.p, n.pp); + scaleAndAdd$2(n.p, n.p, v, friction); + copy(n.pp, n.p); + } + } + + friction = friction * 0.992; + + cb && cb(nodes, edges, friction < 0.01); + } + }; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var forceLayout = function (ecModel) { + ecModel.eachSeriesByType('graph', function (graphSeries) { + var coordSys = graphSeries.coordinateSystem; + if (coordSys && coordSys.type !== 'view') { + return; + } + if (graphSeries.get('layout') === 'force') { + var preservedPoints = graphSeries.preservedPoints || {}; + var graph = graphSeries.getGraph(); + var nodeData = graph.data; + var edgeData = graph.edgeData; + var forceModel = graphSeries.getModel('force'); + var initLayout = forceModel.get('initLayout'); + if (graphSeries.preservedPoints) { + nodeData.each(function (idx) { + var id = nodeData.getId(idx); + nodeData.setItemLayout(idx, preservedPoints[id] || [NaN, NaN]); + }); + } + else if (!initLayout || initLayout === 'none') { + simpleLayout$1(graphSeries); + } + else if (initLayout === 'circular') { + circularLayout$1(graphSeries); + } + + var nodeDataExtent = nodeData.getDataExtent('value'); + var edgeDataExtent = edgeData.getDataExtent('value'); + // var edgeDataExtent = edgeData.getDataExtent('value'); + var repulsion = forceModel.get('repulsion'); + var edgeLength = forceModel.get('edgeLength'); + if (!isArray(repulsion)) { + repulsion = [repulsion, repulsion]; + } + if (!isArray(edgeLength)) { + edgeLength = [edgeLength, edgeLength]; + } + // Larger value has smaller length + edgeLength = [edgeLength[1], edgeLength[0]]; + + var nodes = nodeData.mapArray('value', function (value, idx) { + var point = nodeData.getItemLayout(idx); + var rep = linearMap(value, nodeDataExtent, repulsion); + if (isNaN(rep)) { + rep = (repulsion[0] + repulsion[1]) / 2; + } + return { + w: rep, + rep: rep, + fixed: nodeData.getItemModel(idx).get('fixed'), + p: (!point || isNaN(point[0]) || isNaN(point[1])) ? null : point + }; + }); + var edges = edgeData.mapArray('value', function (value, idx) { + var edge = graph.getEdgeByIndex(idx); + var d = linearMap(value, edgeDataExtent, edgeLength); + if (isNaN(d)) { + d = (edgeLength[0] + edgeLength[1]) / 2; + } + return { + n1: nodes[edge.node1.dataIndex], + n2: nodes[edge.node2.dataIndex], + d: d, + curveness: edge.getModel().get('lineStyle.curveness') || 0 + }; + }); + + var coordSys = graphSeries.coordinateSystem; + var rect = coordSys.getBoundingRect(); + var forceInstance = forceLayout$1(nodes, edges, { + rect: rect, + gravity: forceModel.get('gravity') + }); + var oldStep = forceInstance.step; + forceInstance.step = function (cb) { + for (var i = 0, l = nodes.length; i < l; i++) { + if (nodes[i].fixed) { + // Write back to layout instance + copy(nodes[i].p, graph.getNodeByIndex(i).getLayout()); + } + } + oldStep(function (nodes, edges, stopped) { + for (var i = 0, l = nodes.length; i < l; i++) { + if (!nodes[i].fixed) { + graph.getNodeByIndex(i).setLayout(nodes[i].p); + } + preservedPoints[nodeData.getId(i)] = nodes[i].p; + } + for (var i = 0, l = edges.length; i < l; i++) { + var e = edges[i]; + var edge = graph.getEdgeByIndex(i); + var p1 = e.n1.p; + var p2 = e.n2.p; + var points = edge.getLayout(); + points = points ? points.slice() : []; + points[0] = points[0] || []; + points[1] = points[1] || []; + copy(points[0], p1); + copy(points[1], p2); + if (+e.curveness) { + points[2] = [ + (p1[0] + p2[0]) / 2 - (p1[1] - p2[1]) * e.curveness, + (p1[1] + p2[1]) / 2 - (p2[0] - p1[0]) * e.curveness + ]; + } + edge.setLayout(points); + } + // Update layout + + cb && cb(stopped); + }); + }; + graphSeries.forceLayout = forceInstance; + graphSeries.preservedPoints = preservedPoints; + + // Step to get the layout + forceInstance.step(); + } + else { + // Remove prev injected forceLayout instance + graphSeries.forceLayout = null; + } + }); +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// FIXME Where to create the simple view coordinate system +function getViewRect$1(seriesModel, api, aspect) { + var option = seriesModel.getBoxLayoutParams(); + option.aspect = aspect; + return getLayoutRect(option, { + width: api.getWidth(), + height: api.getHeight() + }); +} + +var createView = function (ecModel, api) { + var viewList = []; + ecModel.eachSeriesByType('graph', function (seriesModel) { + var coordSysType = seriesModel.get('coordinateSystem'); + if (!coordSysType || coordSysType === 'view') { + + var data = seriesModel.getData(); + var positions = data.mapArray(function (idx) { + var itemModel = data.getItemModel(idx); + return [+itemModel.get('x'), +itemModel.get('y')]; + }); + + var min = []; + var max = []; + + fromPoints(positions, min, max); + + // If width or height is 0 + if (max[0] - min[0] === 0) { + max[0] += 1; + min[0] -= 1; + } + if (max[1] - min[1] === 0) { + max[1] += 1; + min[1] -= 1; + } + var aspect = (max[0] - min[0]) / (max[1] - min[1]); + // FIXME If get view rect after data processed? + var viewRect = getViewRect$1(seriesModel, api, aspect); + // Position may be NaN, use view rect instead + if (isNaN(aspect)) { + min = [viewRect.x, viewRect.y]; + max = [viewRect.x + viewRect.width, viewRect.y + viewRect.height]; + } + + var bbWidth = max[0] - min[0]; + var bbHeight = max[1] - min[1]; + + var viewWidth = viewRect.width; + var viewHeight = viewRect.height; + + var viewCoordSys = seriesModel.coordinateSystem = new View(); + viewCoordSys.zoomLimit = seriesModel.get('scaleLimit'); + + viewCoordSys.setBoundingRect( + min[0], min[1], bbWidth, bbHeight + ); + viewCoordSys.setViewRect( + viewRect.x, viewRect.y, viewWidth, viewHeight + ); + + // Update roam info + viewCoordSys.setCenter(seriesModel.get('center')); + viewCoordSys.setZoom(seriesModel.get('zoom')); + + viewList.push(viewCoordSys); + } + }); + + return viewList; +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +registerProcessor(categoryFilter); + +registerVisual(visualSymbol('graph', 'circle', null)); +registerVisual(categoryVisual); +registerVisual(edgeVisual); + +registerLayout(simpleLayout); +registerLayout(circularLayout); +registerLayout(forceLayout); + +// Graph view coordinate system +registerCoordinateSystem('graphView', { + create: createView +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var GaugeSeries = SeriesModel.extend({ + + type: 'series.gauge', + + getInitialData: function (option, ecModel) { + var dataOpt = option.data || []; + if (!isArray(dataOpt)) { + dataOpt = [dataOpt]; + } + option.data = dataOpt; + return createListSimply(this, ['value']); + }, + + defaultOption: { + zlevel: 0, + z: 2, + // 默认全局居中 + center: ['50%', '50%'], + legendHoverLink: true, + radius: '75%', + startAngle: 225, + endAngle: -45, + clockwise: true, + // 最小值 + min: 0, + // 最大值 + max: 100, + // 分割段数,默认为10 + splitNumber: 10, + // 坐标轴线 + axisLine: { + // 默认显示,属性show控制显示与否 + show: true, + lineStyle: { // 属性lineStyle控制线条样式 + color: [[0.2, '#91c7ae'], [0.8, '#63869e'], [1, '#c23531']], + width: 30 + } + }, + // 分隔线 + splitLine: { + // 默认显示,属性show控制显示与否 + show: true, + // 属性length控制线长 + length: 30, + // 属性lineStyle(详见lineStyle)控制线条样式 + lineStyle: { + color: '#eee', + width: 2, + type: 'solid' + } + }, + // 坐标轴小标记 + axisTick: { + // 属性show控制显示与否,默认不显示 + show: true, + // 每份split细分多少段 + splitNumber: 5, + // 属性length控制线长 + length: 8, + // 属性lineStyle控制线条样式 + lineStyle: { + color: '#eee', + width: 1, + type: 'solid' + } + }, + axisLabel: { + show: true, + distance: 5, + // formatter: null, + color: 'auto' + }, + pointer: { + show: true, + length: '80%', + width: 8 + }, + itemStyle: { + color: 'auto' + }, + title: { + show: true, + // x, y,单位px + offsetCenter: [0, '-40%'], + // 其余属性默认使用全局文本样式,详见TEXTSTYLE + color: '#333', + fontSize: 15 + }, + detail: { + show: true, + backgroundColor: 'rgba(0,0,0,0)', + borderWidth: 0, + borderColor: '#ccc', + width: 100, + height: null, // self-adaption + padding: [5, 10], + // x, y,单位px + offsetCenter: [0, '40%'], + // formatter: null, + // 其余属性默认使用全局文本样式,详见TEXTSTYLE + color: 'auto', + fontSize: 30 + } + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var PointerPath = Path.extend({ + + type: 'echartsGaugePointer', + + shape: { + angle: 0, + + width: 10, + + r: 10, + + x: 0, + + y: 0 + }, + + buildPath: function (ctx, shape) { + var mathCos = Math.cos; + var mathSin = Math.sin; + + var r = shape.r; + var width = shape.width; + var angle = shape.angle; + var x = shape.x - mathCos(angle) * width * (width >= r / 3 ? 1 : 2); + var y = shape.y - mathSin(angle) * width * (width >= r / 3 ? 1 : 2); + + angle = shape.angle - Math.PI / 2; + ctx.moveTo(x, y); + ctx.lineTo( + shape.x + mathCos(angle) * width, + shape.y + mathSin(angle) * width + ); + ctx.lineTo( + shape.x + mathCos(shape.angle) * r, + shape.y + mathSin(shape.angle) * r + ); + ctx.lineTo( + shape.x - mathCos(angle) * width, + shape.y - mathSin(angle) * width + ); + ctx.lineTo(x, y); + return; + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +function parsePosition(seriesModel, api) { + var center = seriesModel.get('center'); + var width = api.getWidth(); + var height = api.getHeight(); + var size = Math.min(width, height); + var cx = parsePercent$1(center[0], api.getWidth()); + var cy = parsePercent$1(center[1], api.getHeight()); + var r = parsePercent$1(seriesModel.get('radius'), size / 2); + + return { + cx: cx, + cy: cy, + r: r + }; +} + +function formatLabel(label, labelFormatter) { + if (labelFormatter) { + if (typeof labelFormatter === 'string') { + label = labelFormatter.replace('{value}', label != null ? label : ''); + } + else if (typeof labelFormatter === 'function') { + label = labelFormatter(label); + } + } + + return label; +} + +var PI2$5 = Math.PI * 2; + +var GaugeView = Chart.extend({ + + type: 'gauge', + + render: function (seriesModel, ecModel, api) { + + this.group.removeAll(); + + var colorList = seriesModel.get('axisLine.lineStyle.color'); + var posInfo = parsePosition(seriesModel, api); + + this._renderMain( + seriesModel, ecModel, api, colorList, posInfo + ); + }, + + dispose: function () {}, + + _renderMain: function (seriesModel, ecModel, api, colorList, posInfo) { + var group = this.group; + + var axisLineModel = seriesModel.getModel('axisLine'); + var lineStyleModel = axisLineModel.getModel('lineStyle'); + + var clockwise = seriesModel.get('clockwise'); + var startAngle = -seriesModel.get('startAngle') / 180 * Math.PI; + var endAngle = -seriesModel.get('endAngle') / 180 * Math.PI; + + var angleRangeSpan = (endAngle - startAngle) % PI2$5; + + var prevEndAngle = startAngle; + var axisLineWidth = lineStyleModel.get('width'); + + for (var i = 0; i < colorList.length; i++) { + // Clamp + var percent = Math.min(Math.max(colorList[i][0], 0), 1); + var endAngle = startAngle + angleRangeSpan * percent; + var sector = new Sector({ + shape: { + startAngle: prevEndAngle, + endAngle: endAngle, + cx: posInfo.cx, + cy: posInfo.cy, + clockwise: clockwise, + r0: posInfo.r - axisLineWidth, + r: posInfo.r + }, + silent: true + }); + + sector.setStyle({ + fill: colorList[i][1] + }); + + sector.setStyle(lineStyleModel.getLineStyle( + // Because we use sector to simulate arc + // so the properties for stroking are useless + ['color', 'borderWidth', 'borderColor'] + )); + + group.add(sector); + + prevEndAngle = endAngle; + } + + var getColor = function (percent) { + // Less than 0 + if (percent <= 0) { + return colorList[0][1]; + } + for (var i = 0; i < colorList.length; i++) { + if (colorList[i][0] >= percent + && (i === 0 ? 0 : colorList[i - 1][0]) < percent + ) { + return colorList[i][1]; + } + } + // More than 1 + return colorList[i - 1][1]; + }; + + if (!clockwise) { + var tmp = startAngle; + startAngle = endAngle; + endAngle = tmp; + } + + this._renderTicks( + seriesModel, ecModel, api, getColor, posInfo, + startAngle, endAngle, clockwise + ); + + this._renderPointer( + seriesModel, ecModel, api, getColor, posInfo, + startAngle, endAngle, clockwise + ); + + this._renderTitle( + seriesModel, ecModel, api, getColor, posInfo + ); + this._renderDetail( + seriesModel, ecModel, api, getColor, posInfo + ); + }, + + _renderTicks: function ( + seriesModel, ecModel, api, getColor, posInfo, + startAngle, endAngle, clockwise + ) { + var group = this.group; + var cx = posInfo.cx; + var cy = posInfo.cy; + var r = posInfo.r; + + var minVal = +seriesModel.get('min'); + var maxVal = +seriesModel.get('max'); + + var splitLineModel = seriesModel.getModel('splitLine'); + var tickModel = seriesModel.getModel('axisTick'); + var labelModel = seriesModel.getModel('axisLabel'); + + var splitNumber = seriesModel.get('splitNumber'); + var subSplitNumber = tickModel.get('splitNumber'); + + var splitLineLen = parsePercent$1( + splitLineModel.get('length'), r + ); + var tickLen = parsePercent$1( + tickModel.get('length'), r + ); + + var angle = startAngle; + var step = (endAngle - startAngle) / splitNumber; + var subStep = step / subSplitNumber; + + var splitLineStyle = splitLineModel.getModel('lineStyle').getLineStyle(); + var tickLineStyle = tickModel.getModel('lineStyle').getLineStyle(); + + for (var i = 0; i <= splitNumber; i++) { + var unitX = Math.cos(angle); + var unitY = Math.sin(angle); + // Split line + if (splitLineModel.get('show')) { + var splitLine = new Line({ + shape: { + x1: unitX * r + cx, + y1: unitY * r + cy, + x2: unitX * (r - splitLineLen) + cx, + y2: unitY * (r - splitLineLen) + cy + }, + style: splitLineStyle, + silent: true + }); + if (splitLineStyle.stroke === 'auto') { + splitLine.setStyle({ + stroke: getColor(i / splitNumber) + }); + } + + group.add(splitLine); + } + + // Label + if (labelModel.get('show')) { + var label = formatLabel( + round$1(i / splitNumber * (maxVal - minVal) + minVal), + labelModel.get('formatter') + ); + var distance = labelModel.get('distance'); + var autoColor = getColor(i / splitNumber); + + group.add(new Text({ + style: setTextStyle({}, labelModel, { + text: label, + x: unitX * (r - splitLineLen - distance) + cx, + y: unitY * (r - splitLineLen - distance) + cy, + textVerticalAlign: unitY < -0.4 ? 'top' : (unitY > 0.4 ? 'bottom' : 'middle'), + textAlign: unitX < -0.4 ? 'left' : (unitX > 0.4 ? 'right' : 'center') + }, {autoColor: autoColor}), + silent: true + })); + } + + // Axis tick + if (tickModel.get('show') && i !== splitNumber) { + for (var j = 0; j <= subSplitNumber; j++) { + var unitX = Math.cos(angle); + var unitY = Math.sin(angle); + var tickLine = new Line({ + shape: { + x1: unitX * r + cx, + y1: unitY * r + cy, + x2: unitX * (r - tickLen) + cx, + y2: unitY * (r - tickLen) + cy + }, + silent: true, + style: tickLineStyle + }); + + if (tickLineStyle.stroke === 'auto') { + tickLine.setStyle({ + stroke: getColor((i + j / subSplitNumber) / splitNumber) + }); + } + + group.add(tickLine); + angle += subStep; + } + angle -= subStep; + } + else { + angle += step; + } + } + }, + + _renderPointer: function ( + seriesModel, ecModel, api, getColor, posInfo, + startAngle, endAngle, clockwise + ) { + + var group = this.group; + var oldData = this._data; + + if (!seriesModel.get('pointer.show')) { + // Remove old element + oldData && oldData.eachItemGraphicEl(function (el) { + group.remove(el); + }); + return; + } + + var valueExtent = [+seriesModel.get('min'), +seriesModel.get('max')]; + var angleExtent = [startAngle, endAngle]; + + var data = seriesModel.getData(); + var valueDim = data.mapDimension('value'); + + data.diff(oldData) + .add(function (idx) { + var pointer = new PointerPath({ + shape: { + angle: startAngle + } + }); + + initProps(pointer, { + shape: { + angle: linearMap(data.get(valueDim, idx), valueExtent, angleExtent, true) + } + }, seriesModel); + + group.add(pointer); + data.setItemGraphicEl(idx, pointer); + }) + .update(function (newIdx, oldIdx) { + var pointer = oldData.getItemGraphicEl(oldIdx); + + updateProps(pointer, { + shape: { + angle: linearMap(data.get(valueDim, newIdx), valueExtent, angleExtent, true) + } + }, seriesModel); + + group.add(pointer); + data.setItemGraphicEl(newIdx, pointer); + }) + .remove(function (idx) { + var pointer = oldData.getItemGraphicEl(idx); + group.remove(pointer); + }) + .execute(); + + data.eachItemGraphicEl(function (pointer, idx) { + var itemModel = data.getItemModel(idx); + var pointerModel = itemModel.getModel('pointer'); + + pointer.setShape({ + x: posInfo.cx, + y: posInfo.cy, + width: parsePercent$1( + pointerModel.get('width'), posInfo.r + ), + r: parsePercent$1(pointerModel.get('length'), posInfo.r) + }); + + pointer.useStyle(itemModel.getModel('itemStyle').getItemStyle()); + + if (pointer.style.fill === 'auto') { + pointer.setStyle('fill', getColor( + linearMap(data.get(valueDim, idx), valueExtent, [0, 1], true) + )); + } + + setHoverStyle( + pointer, itemModel.getModel('emphasis.itemStyle').getItemStyle() + ); + }); + + this._data = data; + }, + + _renderTitle: function ( + seriesModel, ecModel, api, getColor, posInfo + ) { + var data = seriesModel.getData(); + var valueDim = data.mapDimension('value'); + var titleModel = seriesModel.getModel('title'); + if (titleModel.get('show')) { + var offsetCenter = titleModel.get('offsetCenter'); + var x = posInfo.cx + parsePercent$1(offsetCenter[0], posInfo.r); + var y = posInfo.cy + parsePercent$1(offsetCenter[1], posInfo.r); + + var minVal = +seriesModel.get('min'); + var maxVal = +seriesModel.get('max'); + var value = seriesModel.getData().get(valueDim, 0); + var autoColor = getColor( + linearMap(value, [minVal, maxVal], [0, 1], true) + ); + + this.group.add(new Text({ + silent: true, + style: setTextStyle({}, titleModel, { + x: x, + y: y, + // FIXME First data name ? + text: data.getName(0), + textAlign: 'center', + textVerticalAlign: 'middle' + }, {autoColor: autoColor, forceRich: true}) + })); + } + }, + + _renderDetail: function ( + seriesModel, ecModel, api, getColor, posInfo + ) { + var detailModel = seriesModel.getModel('detail'); + var minVal = +seriesModel.get('min'); + var maxVal = +seriesModel.get('max'); + if (detailModel.get('show')) { + var offsetCenter = detailModel.get('offsetCenter'); + var x = posInfo.cx + parsePercent$1(offsetCenter[0], posInfo.r); + var y = posInfo.cy + parsePercent$1(offsetCenter[1], posInfo.r); + var width = parsePercent$1(detailModel.get('width'), posInfo.r); + var height = parsePercent$1(detailModel.get('height'), posInfo.r); + var data = seriesModel.getData(); + var value = data.get(data.mapDimension('value'), 0); + var autoColor = getColor( + linearMap(value, [minVal, maxVal], [0, 1], true) + ); + + this.group.add(new Text({ + silent: true, + style: setTextStyle({}, detailModel, { + x: x, + y: y, + text: formatLabel( + // FIXME First data name ? + value, detailModel.get('formatter') + ), + textWidth: isNaN(width) ? null : width, + textHeight: isNaN(height) ? null : height, + textAlign: 'center', + textVerticalAlign: 'middle' + }, {autoColor: autoColor, forceRich: true}) + })); + } + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var FunnelSeries = extendSeriesModel({ + + type: 'series.funnel', + + init: function (option) { + FunnelSeries.superApply(this, 'init', arguments); + + // Enable legend selection for each data item + // Use a function instead of direct access because data reference may changed + this.legendDataProvider = function () { + return this.getRawData(); + }; + // Extend labelLine emphasis + this._defaultLabelLine(option); + }, + + getInitialData: function (option, ecModel) { + return createListSimply(this, ['value']); + }, + + _defaultLabelLine: function (option) { + // Extend labelLine emphasis + defaultEmphasis(option, 'labelLine', ['show']); + + var labelLineNormalOpt = option.labelLine; + var labelLineEmphasisOpt = option.emphasis.labelLine; + // Not show label line if `label.normal.show = false` + labelLineNormalOpt.show = labelLineNormalOpt.show + && option.label.show; + labelLineEmphasisOpt.show = labelLineEmphasisOpt.show + && option.emphasis.label.show; + }, + + // Overwrite + getDataParams: function (dataIndex) { + var data = this.getData(); + var params = FunnelSeries.superCall(this, 'getDataParams', dataIndex); + var valueDim = data.mapDimension('value'); + var sum = data.getSum(valueDim); + // Percent is 0 if sum is 0 + params.percent = !sum ? 0 : +(data.get(valueDim, dataIndex) / sum * 100).toFixed(2); + + params.$vars.push('percent'); + return params; + }, + + defaultOption: { + zlevel: 0, // 一级层叠 + z: 2, // 二级层叠 + legendHoverLink: true, + left: 80, + top: 60, + right: 80, + bottom: 60, + // width: {totalWidth} - left - right, + // height: {totalHeight} - top - bottom, + + // 默认取数据最小最大值 + // min: 0, + // max: 100, + minSize: '0%', + maxSize: '100%', + sort: 'descending', // 'ascending', 'descending' + gap: 0, + funnelAlign: 'center', + label: { + show: true, + position: 'outer' + // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 + }, + labelLine: { + show: true, + length: 20, + lineStyle: { + // color: 各异, + width: 1, + type: 'solid' + } + }, + itemStyle: { + // color: 各异, + borderColor: '#fff', + borderWidth: 1 + }, + emphasis: { + label: { + show: true + } + } + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Piece of pie including Sector, Label, LabelLine + * @constructor + * @extends {module:zrender/graphic/Group} + */ +function FunnelPiece(data, idx) { + + Group.call(this); + + var polygon = new Polygon(); + var labelLine = new Polyline(); + var text = new Text(); + this.add(polygon); + this.add(labelLine); + this.add(text); + + this.updateData(data, idx, true); + + // Hover to change label and labelLine + function onEmphasis() { + labelLine.ignore = labelLine.hoverIgnore; + text.ignore = text.hoverIgnore; + } + function onNormal() { + labelLine.ignore = labelLine.normalIgnore; + text.ignore = text.normalIgnore; + } + this.on('emphasis', onEmphasis) + .on('normal', onNormal) + .on('mouseover', onEmphasis) + .on('mouseout', onNormal); +} + +var funnelPieceProto = FunnelPiece.prototype; + +var opacityAccessPath = ['itemStyle', 'opacity']; +funnelPieceProto.updateData = function (data, idx, firstCreate) { + + var polygon = this.childAt(0); + + var seriesModel = data.hostModel; + var itemModel = data.getItemModel(idx); + var layout = data.getItemLayout(idx); + var opacity = data.getItemModel(idx).get(opacityAccessPath); + opacity = opacity == null ? 1 : opacity; + + // Reset style + polygon.useStyle({}); + + if (firstCreate) { + polygon.setShape({ + points: layout.points + }); + polygon.setStyle({ opacity : 0 }); + initProps(polygon, { + style: { + opacity: opacity + } + }, seriesModel, idx); + } + else { + updateProps(polygon, { + style: { + opacity: opacity + }, + shape: { + points: layout.points + } + }, seriesModel, idx); + } + + // Update common style + var itemStyleModel = itemModel.getModel('itemStyle'); + var visualColor = data.getItemVisual(idx, 'color'); + + polygon.setStyle( + defaults( + { + lineJoin: 'round', + fill: visualColor + }, + itemStyleModel.getItemStyle(['opacity']) + ) + ); + polygon.hoverStyle = itemStyleModel.getModel('emphasis').getItemStyle(); + + this._updateLabel(data, idx); + + setHoverStyle(this); +}; + +funnelPieceProto._updateLabel = function (data, idx) { + + var labelLine = this.childAt(1); + var labelText = this.childAt(2); + + var seriesModel = data.hostModel; + var itemModel = data.getItemModel(idx); + var layout = data.getItemLayout(idx); + var labelLayout = layout.label; + var visualColor = data.getItemVisual(idx, 'color'); + + updateProps(labelLine, { + shape: { + points: labelLayout.linePoints || labelLayout.linePoints + } + }, seriesModel, idx); + + updateProps(labelText, { + style: { + x: labelLayout.x, + y: labelLayout.y + } + }, seriesModel, idx); + labelText.attr({ + rotation: labelLayout.rotation, + origin: [labelLayout.x, labelLayout.y], + z2: 10 + }); + + var labelModel = itemModel.getModel('label'); + var labelHoverModel = itemModel.getModel('emphasis.label'); + var labelLineModel = itemModel.getModel('labelLine'); + var labelLineHoverModel = itemModel.getModel('emphasis.labelLine'); + var visualColor = data.getItemVisual(idx, 'color'); + + setLabelStyle( + labelText.style, labelText.hoverStyle = {}, labelModel, labelHoverModel, + { + labelFetcher: data.hostModel, + labelDataIndex: idx, + defaultText: data.getName(idx), + autoColor: visualColor, + useInsideStyle: !!labelLayout.inside + }, + { + textAlign: labelLayout.textAlign, + textVerticalAlign: labelLayout.verticalAlign + } + ); + + labelText.ignore = labelText.normalIgnore = !labelModel.get('show'); + labelText.hoverIgnore = !labelHoverModel.get('show'); + + labelLine.ignore = labelLine.normalIgnore = !labelLineModel.get('show'); + labelLine.hoverIgnore = !labelLineHoverModel.get('show'); + + // Default use item visual color + labelLine.setStyle({ + stroke: visualColor + }); + labelLine.setStyle(labelLineModel.getModel('lineStyle').getLineStyle()); + + labelLine.hoverStyle = labelLineHoverModel.getModel('lineStyle').getLineStyle(); +}; + +inherits(FunnelPiece, Group); + + +var FunnelView = Chart.extend({ + + type: 'funnel', + + render: function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var oldData = this._data; + + var group = this.group; + + data.diff(oldData) + .add(function (idx) { + var funnelPiece = new FunnelPiece(data, idx); + + data.setItemGraphicEl(idx, funnelPiece); + + group.add(funnelPiece); + }) + .update(function (newIdx, oldIdx) { + var piePiece = oldData.getItemGraphicEl(oldIdx); + + piePiece.updateData(data, newIdx); + + group.add(piePiece); + data.setItemGraphicEl(newIdx, piePiece); + }) + .remove(function (idx) { + var piePiece = oldData.getItemGraphicEl(idx); + group.remove(piePiece); + }) + .execute(); + + this._data = data; + }, + + remove: function () { + this.group.removeAll(); + this._data = null; + }, + + dispose: function () {} +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +function getViewRect$2(seriesModel, api) { + return getLayoutRect( + seriesModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + } + ); +} + +function getSortedIndices(data, sort) { + var valueDim = data.mapDimension('value'); + var valueArr = data.mapArray(valueDim, function (val) { + return val; + }); + var indices = []; + var isAscending = sort === 'ascending'; + for (var i = 0, len = data.count(); i < len; i++) { + indices[i] = i; + } + + // Add custom sortable function & none sortable opetion by "options.sort" + if (typeof sort === 'function') { + indices.sort(sort); + } else if (sort !== 'none') { + indices.sort(function (a, b) { + return isAscending ? valueArr[a] - valueArr[b] : valueArr[b] - valueArr[a]; + }); + } + return indices; +} + +function labelLayout$1(data) { + data.each(function (idx) { + var itemModel = data.getItemModel(idx); + var labelModel = itemModel.getModel('label'); + var labelPosition = labelModel.get('position'); + + var labelLineModel = itemModel.getModel('labelLine'); + + var layout = data.getItemLayout(idx); + var points = layout.points; + + var isLabelInside = labelPosition === 'inner' + || labelPosition === 'inside' || labelPosition === 'center'; + + var textAlign; + var textX; + var textY; + var linePoints; + + if (isLabelInside) { + textX = (points[0][0] + points[1][0] + points[2][0] + points[3][0]) / 4; + textY = (points[0][1] + points[1][1] + points[2][1] + points[3][1]) / 4; + textAlign = 'center'; + linePoints = [ + [textX, textY], [textX, textY] + ]; + } + else { + var x1; + var y1; + var x2; + var labelLineLen = labelLineModel.get('length'); + if (labelPosition === 'left') { + // Left side + x1 = (points[3][0] + points[0][0]) / 2; + y1 = (points[3][1] + points[0][1]) / 2; + x2 = x1 - labelLineLen; + textX = x2 - 5; + textAlign = 'right'; + } + else { + // Right side + x1 = (points[1][0] + points[2][0]) / 2; + y1 = (points[1][1] + points[2][1]) / 2; + x2 = x1 + labelLineLen; + textX = x2 + 5; + textAlign = 'left'; + } + var y2 = y1; + + linePoints = [[x1, y1], [x2, y2]]; + textY = y2; + } + + layout.label = { + linePoints: linePoints, + x: textX, + y: textY, + verticalAlign: 'middle', + textAlign: textAlign, + inside: isLabelInside + }; + }); +} + +var funnelLayout = function (ecModel, api, payload) { + ecModel.eachSeriesByType('funnel', function (seriesModel) { + var data = seriesModel.getData(); + var valueDim = data.mapDimension('value'); + var sort = seriesModel.get('sort'); + var viewRect = getViewRect$2(seriesModel, api); + var indices = getSortedIndices(data, sort); + + var sizeExtent = [ + parsePercent$1(seriesModel.get('minSize'), viewRect.width), + parsePercent$1(seriesModel.get('maxSize'), viewRect.width) + ]; + var dataExtent = data.getDataExtent(valueDim); + var min = seriesModel.get('min'); + var max = seriesModel.get('max'); + if (min == null) { + min = Math.min(dataExtent[0], 0); + } + if (max == null) { + max = dataExtent[1]; + } + + var funnelAlign = seriesModel.get('funnelAlign'); + var gap = seriesModel.get('gap'); + var itemHeight = (viewRect.height - gap * (data.count() - 1)) / data.count(); + + var y = viewRect.y; + + var getLinePoints = function (idx, offY) { + // End point index is data.count() and we assign it 0 + var val = data.get(valueDim, idx) || 0; + var itemWidth = linearMap(val, [min, max], sizeExtent, true); + var x0; + switch (funnelAlign) { + case 'left': + x0 = viewRect.x; + break; + case 'center': + x0 = viewRect.x + (viewRect.width - itemWidth) / 2; + break; + case 'right': + x0 = viewRect.x + viewRect.width - itemWidth; + break; + } + return [ + [x0, offY], + [x0 + itemWidth, offY] + ]; + }; + + if (sort === 'ascending') { + // From bottom to top + itemHeight = -itemHeight; + gap = -gap; + y += viewRect.height; + indices = indices.reverse(); + } + + for (var i = 0; i < indices.length; i++) { + var idx = indices[i]; + var nextIdx = indices[i + 1]; + + var itemModel = data.getItemModel(idx); + var height = itemModel.get('itemStyle.height'); + if (height == null) { + height = itemHeight; + } + else { + height = parsePercent$1(height, viewRect.height); + if (sort === 'ascending') { + height = -height; + } + } + + var start = getLinePoints(idx, y); + var end = getLinePoints(nextIdx, y + height); + + y += height + gap; + + data.setItemLayout(idx, { + points: start.concat(end.slice().reverse()) + }); + } + + labelLayout$1(data); + }); +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +registerVisual(dataColor('funnel')); +registerLayout(funnelLayout); +registerProcessor(dataFilter('funnel')); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var parallelPreprocessor = function (option) { + createParallelIfNeeded(option); + mergeAxisOptionFromParallel(option); +}; + +/** + * Create a parallel coordinate if not exists. + * @inner + */ +function createParallelIfNeeded(option) { + if (option.parallel) { + return; + } + + var hasParallelSeries = false; + + each$1(option.series, function (seriesOpt) { + if (seriesOpt && seriesOpt.type === 'parallel') { + hasParallelSeries = true; + } + }); + + if (hasParallelSeries) { + option.parallel = [{}]; + } +} + +/** + * Merge aixs definition from parallel option (if exists) to axis option. + * @inner + */ +function mergeAxisOptionFromParallel(option) { + var axes = normalizeToArray(option.parallelAxis); + + each$1(axes, function (axisOption) { + if (!isObject$1(axisOption)) { + return; + } + + var parallelIndex = axisOption.parallelIndex || 0; + var parallelOption = normalizeToArray(option.parallel)[parallelIndex]; + + if (parallelOption && parallelOption.parallelAxisDefault) { + merge(axisOption, parallelOption.parallelAxisDefault, false); + } + }); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @constructor module:echarts/coord/parallel/ParallelAxis + * @extends {module:echarts/coord/Axis} + * @param {string} dim + * @param {*} scale + * @param {Array.<number>} coordExtent + * @param {string} axisType + */ +var ParallelAxis = function (dim, scale, coordExtent, axisType, axisIndex) { + + Axis.call(this, dim, scale, coordExtent); + + /** + * Axis type + * - 'category' + * - 'value' + * - 'time' + * - 'log' + * @type {string} + */ + this.type = axisType || 'value'; + + /** + * @type {number} + * @readOnly + */ + this.axisIndex = axisIndex; +}; + +ParallelAxis.prototype = { + + constructor: ParallelAxis, + + /** + * Axis model + * @param {module:echarts/coord/parallel/AxisModel} + */ + model: null, + + /** + * @override + */ + isHorizontal: function () { + return this.coordinateSystem.getModel().get('layout') !== 'horizontal'; + } + +}; + +inherits(ParallelAxis, Axis); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Calculate slider move result. + * Usage: + * (1) If both handle0 and handle1 are needed to be moved, set minSpan the same as + * maxSpan and the same as `Math.abs(handleEnd[1] - handleEnds[0])`. + * (2) If handle0 is forbidden to cross handle1, set minSpan as `0`. + * + * @param {number} delta Move length. + * @param {Array.<number>} handleEnds handleEnds[0] can be bigger then handleEnds[1]. + * handleEnds will be modified in this method. + * @param {Array.<number>} extent handleEnds is restricted by extent. + * extent[0] should less or equals than extent[1]. + * @param {number|string} handleIndex Can be 'all', means that both move the two handleEnds, + * where the input minSpan and maxSpan will not work. + * @param {number} [minSpan] The range of dataZoom can not be smaller than that. + * If not set, handle0 and cross handle1. If set as a non-negative + * number (including `0`), handles will push each other when reaching + * the minSpan. + * @param {number} [maxSpan] The range of dataZoom can not be larger than that. + * @return {Array.<number>} The input handleEnds. + */ +var sliderMove = function (delta, handleEnds, extent, handleIndex, minSpan, maxSpan) { + // Normalize firstly. + handleEnds[0] = restrict$1(handleEnds[0], extent); + handleEnds[1] = restrict$1(handleEnds[1], extent); + + delta = delta || 0; + + var extentSpan = extent[1] - extent[0]; + + // Notice maxSpan and minSpan can be null/undefined. + if (minSpan != null) { + minSpan = restrict$1(minSpan, [0, extentSpan]); + } + if (maxSpan != null) { + maxSpan = Math.max(maxSpan, minSpan != null ? minSpan : 0); + } + if (handleIndex === 'all') { + minSpan = maxSpan = Math.abs(handleEnds[1] - handleEnds[0]); + handleIndex = 0; + } + + var originalDistSign = getSpanSign(handleEnds, handleIndex); + + handleEnds[handleIndex] += delta; + + // Restrict in extent. + var extentMinSpan = minSpan || 0; + var realExtent = extent.slice(); + originalDistSign.sign < 0 ? (realExtent[0] += extentMinSpan) : (realExtent[1] -= extentMinSpan); + handleEnds[handleIndex] = restrict$1(handleEnds[handleIndex], realExtent); + + // Expand span. + var currDistSign = getSpanSign(handleEnds, handleIndex); + if (minSpan != null && ( + currDistSign.sign !== originalDistSign.sign || currDistSign.span < minSpan + )) { + // If minSpan exists, 'cross' is forbinden. + handleEnds[1 - handleIndex] = handleEnds[handleIndex] + originalDistSign.sign * minSpan; + } + + // Shrink span. + var currDistSign = getSpanSign(handleEnds, handleIndex); + if (maxSpan != null && currDistSign.span > maxSpan) { + handleEnds[1 - handleIndex] = handleEnds[handleIndex] + currDistSign.sign * maxSpan; + } + + return handleEnds; +}; + +function getSpanSign(handleEnds, handleIndex) { + var dist = handleEnds[handleIndex] - handleEnds[1 - handleIndex]; + // If `handleEnds[0] === handleEnds[1]`, always believe that handleEnd[0] + // is at left of handleEnds[1] for non-cross case. + return {span: Math.abs(dist), sign: dist > 0 ? -1 : dist < 0 ? 1 : handleIndex ? -1 : 1}; +} + +function restrict$1(value, extend) { + return Math.min(extend[1], Math.max(extend[0], value)); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Parallel Coordinates + * <https://en.wikipedia.org/wiki/Parallel_coordinates> + */ + +var each$11 = each$1; +var mathMin$5 = Math.min; +var mathMax$5 = Math.max; +var mathFloor$2 = Math.floor; +var mathCeil$2 = Math.ceil; +var round$2 = round$1; + +var PI$3 = Math.PI; + +function Parallel(parallelModel, ecModel, api) { + + /** + * key: dimension + * @type {Object.<string, module:echarts/coord/parallel/Axis>} + * @private + */ + this._axesMap = createHashMap(); + + /** + * key: dimension + * value: {position: [], rotation, } + * @type {Object.<string, Object>} + * @private + */ + this._axesLayout = {}; + + /** + * Always follow axis order. + * @type {Array.<string>} + * @readOnly + */ + this.dimensions = parallelModel.dimensions; + + /** + * @type {module:zrender/core/BoundingRect} + */ + this._rect; + + /** + * @type {module:echarts/coord/parallel/ParallelModel} + */ + this._model = parallelModel; + + this._init(parallelModel, ecModel, api); +} + +Parallel.prototype = { + + type: 'parallel', + + constructor: Parallel, + + /** + * Initialize cartesian coordinate systems + * @private + */ + _init: function (parallelModel, ecModel, api) { + + var dimensions = parallelModel.dimensions; + var parallelAxisIndex = parallelModel.parallelAxisIndex; + + each$11(dimensions, function (dim, idx) { + + var axisIndex = parallelAxisIndex[idx]; + var axisModel = ecModel.getComponent('parallelAxis', axisIndex); + + var axis = this._axesMap.set(dim, new ParallelAxis( + dim, + createScaleByModel(axisModel), + [0, 0], + axisModel.get('type'), + axisIndex + )); + + var isCategory = axis.type === 'category'; + axis.onBand = isCategory && axisModel.get('boundaryGap'); + axis.inverse = axisModel.get('inverse'); + + // Injection + axisModel.axis = axis; + axis.model = axisModel; + axis.coordinateSystem = axisModel.coordinateSystem = this; + + }, this); + }, + + /** + * Update axis scale after data processed + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + */ + update: function (ecModel, api) { + this._updateAxesFromSeries(this._model, ecModel); + }, + + /** + * @override + */ + containPoint: function (point) { + var layoutInfo = this._makeLayoutInfo(); + var axisBase = layoutInfo.axisBase; + var layoutBase = layoutInfo.layoutBase; + var pixelDimIndex = layoutInfo.pixelDimIndex; + var pAxis = point[1 - pixelDimIndex]; + var pLayout = point[pixelDimIndex]; + + return pAxis >= axisBase + && pAxis <= axisBase + layoutInfo.axisLength + && pLayout >= layoutBase + && pLayout <= layoutBase + layoutInfo.layoutLength; + }, + + getModel: function () { + return this._model; + }, + + /** + * Update properties from series + * @private + */ + _updateAxesFromSeries: function (parallelModel, ecModel) { + ecModel.eachSeries(function (seriesModel) { + + if (!parallelModel.contains(seriesModel, ecModel)) { + return; + } + + var data = seriesModel.getData(); + + each$11(this.dimensions, function (dim) { + var axis = this._axesMap.get(dim); + axis.scale.unionExtentFromData(data, data.mapDimension(dim)); + niceScaleExtent(axis.scale, axis.model); + }, this); + }, this); + }, + + /** + * Resize the parallel coordinate system. + * @param {module:echarts/coord/parallel/ParallelModel} parallelModel + * @param {module:echarts/ExtensionAPI} api + */ + resize: function (parallelModel, api) { + this._rect = getLayoutRect( + parallelModel.getBoxLayoutParams(), + { + width: api.getWidth(), + height: api.getHeight() + } + ); + + this._layoutAxes(); + }, + + /** + * @return {module:zrender/core/BoundingRect} + */ + getRect: function () { + return this._rect; + }, + + /** + * @private + */ + _makeLayoutInfo: function () { + var parallelModel = this._model; + var rect = this._rect; + var xy = ['x', 'y']; + var wh = ['width', 'height']; + var layout = parallelModel.get('layout'); + var pixelDimIndex = layout === 'horizontal' ? 0 : 1; + var layoutLength = rect[wh[pixelDimIndex]]; + var layoutExtent = [0, layoutLength]; + var axisCount = this.dimensions.length; + + var axisExpandWidth = restrict(parallelModel.get('axisExpandWidth'), layoutExtent); + var axisExpandCount = restrict(parallelModel.get('axisExpandCount') || 0, [0, axisCount]); + var axisExpandable = parallelModel.get('axisExpandable') + && axisCount > 3 + && axisCount > axisExpandCount + && axisExpandCount > 1 + && axisExpandWidth > 0 + && layoutLength > 0; + + // `axisExpandWindow` is According to the coordinates of [0, axisExpandLength], + // for sake of consider the case that axisCollapseWidth is 0 (when screen is narrow), + // where collapsed axes should be overlapped. + var axisExpandWindow = parallelModel.get('axisExpandWindow'); + var winSize; + if (!axisExpandWindow) { + winSize = restrict(axisExpandWidth * (axisExpandCount - 1), layoutExtent); + var axisExpandCenter = parallelModel.get('axisExpandCenter') || mathFloor$2(axisCount / 2); + axisExpandWindow = [axisExpandWidth * axisExpandCenter - winSize / 2]; + axisExpandWindow[1] = axisExpandWindow[0] + winSize; + } + else { + winSize = restrict(axisExpandWindow[1] - axisExpandWindow[0], layoutExtent); + axisExpandWindow[1] = axisExpandWindow[0] + winSize; + } + + var axisCollapseWidth = (layoutLength - winSize) / (axisCount - axisExpandCount); + // Avoid axisCollapseWidth is too small. + axisCollapseWidth < 3 && (axisCollapseWidth = 0); + + // Find the first and last indices > ewin[0] and < ewin[1]. + var winInnerIndices = [ + mathFloor$2(round$2(axisExpandWindow[0] / axisExpandWidth, 1)) + 1, + mathCeil$2(round$2(axisExpandWindow[1] / axisExpandWidth, 1)) - 1 + ]; + + // Pos in ec coordinates. + var axisExpandWindow0Pos = axisCollapseWidth / axisExpandWidth * axisExpandWindow[0]; + + return { + layout: layout, + pixelDimIndex: pixelDimIndex, + layoutBase: rect[xy[pixelDimIndex]], + layoutLength: layoutLength, + axisBase: rect[xy[1 - pixelDimIndex]], + axisLength: rect[wh[1 - pixelDimIndex]], + axisExpandable: axisExpandable, + axisExpandWidth: axisExpandWidth, + axisCollapseWidth: axisCollapseWidth, + axisExpandWindow: axisExpandWindow, + axisCount: axisCount, + winInnerIndices: winInnerIndices, + axisExpandWindow0Pos: axisExpandWindow0Pos + }; + }, + + /** + * @private + */ + _layoutAxes: function () { + var rect = this._rect; + var axes = this._axesMap; + var dimensions = this.dimensions; + var layoutInfo = this._makeLayoutInfo(); + var layout = layoutInfo.layout; + + axes.each(function (axis) { + var axisExtent = [0, layoutInfo.axisLength]; + var idx = axis.inverse ? 1 : 0; + axis.setExtent(axisExtent[idx], axisExtent[1 - idx]); + }); + + each$11(dimensions, function (dim, idx) { + var posInfo = (layoutInfo.axisExpandable + ? layoutAxisWithExpand : layoutAxisWithoutExpand + )(idx, layoutInfo); + + var positionTable = { + horizontal: { + x: posInfo.position, + y: layoutInfo.axisLength + }, + vertical: { + x: 0, + y: posInfo.position + } + }; + var rotationTable = { + horizontal: PI$3 / 2, + vertical: 0 + }; + + var position = [ + positionTable[layout].x + rect.x, + positionTable[layout].y + rect.y + ]; + + var rotation = rotationTable[layout]; + var transform = create$1(); + rotate(transform, transform, rotation); + translate(transform, transform, position); + + // TODO + // tick等排布信息。 + + // TODO + // 根据axis order 更新 dimensions顺序。 + + this._axesLayout[dim] = { + position: position, + rotation: rotation, + transform: transform, + axisNameAvailableWidth: posInfo.axisNameAvailableWidth, + axisLabelShow: posInfo.axisLabelShow, + nameTruncateMaxWidth: posInfo.nameTruncateMaxWidth, + tickDirection: 1, + labelDirection: 1 + }; + }, this); + }, + + /** + * Get axis by dim. + * @param {string} dim + * @return {module:echarts/coord/parallel/ParallelAxis} [description] + */ + getAxis: function (dim) { + return this._axesMap.get(dim); + }, + + /** + * Convert a dim value of a single item of series data to Point. + * @param {*} value + * @param {string} dim + * @return {Array} + */ + dataToPoint: function (value, dim) { + return this.axisCoordToPoint( + this._axesMap.get(dim).dataToCoord(value), + dim + ); + }, + + /** + * Travel data for one time, get activeState of each data item. + * @param {module:echarts/data/List} data + * @param {Functio} cb param: {string} activeState 'active' or 'inactive' or 'normal' + * {number} dataIndex + * @param {number} [start=0] the start dataIndex that travel from. + * @param {number} [end=data.count()] the next dataIndex of the last dataIndex will be travel. + */ + eachActiveState: function (data, callback, start, end) { + start == null && (start = 0); + end == null && (end = data.count()); + + var axesMap = this._axesMap; + var dimensions = this.dimensions; + var dataDimensions = []; + var axisModels = []; + + each$1(dimensions, function (axisDim) { + dataDimensions.push(data.mapDimension(axisDim)); + axisModels.push(axesMap.get(axisDim).model); + }); + + var hasActiveSet = this.hasAxisBrushed(); + + for (var dataIndex = start; dataIndex < end; dataIndex++) { + var activeState; + + if (!hasActiveSet) { + activeState = 'normal'; + } + else { + activeState = 'active'; + var values = data.getValues(dataDimensions, dataIndex); + for (var j = 0, lenj = dimensions.length; j < lenj; j++) { + var state = axisModels[j].getActiveState(values[j]); + + if (state === 'inactive') { + activeState = 'inactive'; + break; + } + } + } + + callback(activeState, dataIndex); + } + }, + + /** + * Whether has any activeSet. + * @return {boolean} + */ + hasAxisBrushed: function () { + var dimensions = this.dimensions; + var axesMap = this._axesMap; + var hasActiveSet = false; + + for (var j = 0, lenj = dimensions.length; j < lenj; j++) { + if (axesMap.get(dimensions[j]).model.getActiveState() !== 'normal') { + hasActiveSet = true; + } + } + + return hasActiveSet; + }, + + /** + * Convert coords of each axis to Point. + * Return point. For example: [10, 20] + * @param {Array.<number>} coords + * @param {string} dim + * @return {Array.<number>} + */ + axisCoordToPoint: function (coord, dim) { + var axisLayout = this._axesLayout[dim]; + return applyTransform$1([coord, 0], axisLayout.transform); + }, + + /** + * Get axis layout. + */ + getAxisLayout: function (dim) { + return clone(this._axesLayout[dim]); + }, + + /** + * @param {Array.<number>} point + * @return {Object} {axisExpandWindow, delta, behavior: 'jump' | 'slide' | 'none'}. + */ + getSlidedAxisExpandWindow: function (point) { + var layoutInfo = this._makeLayoutInfo(); + var pixelDimIndex = layoutInfo.pixelDimIndex; + var axisExpandWindow = layoutInfo.axisExpandWindow.slice(); + var winSize = axisExpandWindow[1] - axisExpandWindow[0]; + var extent = [0, layoutInfo.axisExpandWidth * (layoutInfo.axisCount - 1)]; + + // Out of the area of coordinate system. + if (!this.containPoint(point)) { + return {behavior: 'none', axisExpandWindow: axisExpandWindow}; + } + + // Conver the point from global to expand coordinates. + var pointCoord = point[pixelDimIndex] - layoutInfo.layoutBase - layoutInfo.axisExpandWindow0Pos; + + // For dragging operation convenience, the window should not be + // slided when mouse is the center area of the window. + var delta; + var behavior = 'slide'; + var axisCollapseWidth = layoutInfo.axisCollapseWidth; + var triggerArea = this._model.get('axisExpandSlideTriggerArea'); + // But consider touch device, jump is necessary. + var useJump = triggerArea[0] != null; + + if (axisCollapseWidth) { + if (useJump && axisCollapseWidth && pointCoord < winSize * triggerArea[0]) { + behavior = 'jump'; + delta = pointCoord - winSize * triggerArea[2]; + } + else if (useJump && axisCollapseWidth && pointCoord > winSize * (1 - triggerArea[0])) { + behavior = 'jump'; + delta = pointCoord - winSize * (1 - triggerArea[2]); + } + else { + (delta = pointCoord - winSize * triggerArea[1]) >= 0 + && (delta = pointCoord - winSize * (1 - triggerArea[1])) <= 0 + && (delta = 0); + } + delta *= layoutInfo.axisExpandWidth / axisCollapseWidth; + delta + ? sliderMove(delta, axisExpandWindow, extent, 'all') + // Avoid nonsense triger on mousemove. + : (behavior = 'none'); + } + // When screen is too narrow, make it visible and slidable, although it is hard to interact. + else { + var winSize = axisExpandWindow[1] - axisExpandWindow[0]; + var pos = extent[1] * pointCoord / winSize; + axisExpandWindow = [mathMax$5(0, pos - winSize / 2)]; + axisExpandWindow[1] = mathMin$5(extent[1], axisExpandWindow[0] + winSize); + axisExpandWindow[0] = axisExpandWindow[1] - winSize; + } + + return { + axisExpandWindow: axisExpandWindow, + behavior: behavior + }; + } +}; + +function restrict(len, extent) { + return mathMin$5(mathMax$5(len, extent[0]), extent[1]); +} + +function layoutAxisWithoutExpand(axisIndex, layoutInfo) { + var step = layoutInfo.layoutLength / (layoutInfo.axisCount - 1); + return { + position: step * axisIndex, + axisNameAvailableWidth: step, + axisLabelShow: true + }; +} + +function layoutAxisWithExpand(axisIndex, layoutInfo) { + var layoutLength = layoutInfo.layoutLength; + var axisExpandWidth = layoutInfo.axisExpandWidth; + var axisCount = layoutInfo.axisCount; + var axisCollapseWidth = layoutInfo.axisCollapseWidth; + var winInnerIndices = layoutInfo.winInnerIndices; + + var position; + var axisNameAvailableWidth = axisCollapseWidth; + var axisLabelShow = false; + var nameTruncateMaxWidth; + + if (axisIndex < winInnerIndices[0]) { + position = axisIndex * axisCollapseWidth; + nameTruncateMaxWidth = axisCollapseWidth; + } + else if (axisIndex <= winInnerIndices[1]) { + position = layoutInfo.axisExpandWindow0Pos + + axisIndex * axisExpandWidth - layoutInfo.axisExpandWindow[0]; + axisNameAvailableWidth = axisExpandWidth; + axisLabelShow = true; + } + else { + position = layoutLength - (axisCount - 1 - axisIndex) * axisCollapseWidth; + nameTruncateMaxWidth = axisCollapseWidth; + } + + return { + position: position, + axisNameAvailableWidth: axisNameAvailableWidth, + axisLabelShow: axisLabelShow, + nameTruncateMaxWidth: nameTruncateMaxWidth + }; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Parallel coordinate system creater. + */ + +function create$2(ecModel, api) { + var coordSysList = []; + + ecModel.eachComponent('parallel', function (parallelModel, idx) { + var coordSys = new Parallel(parallelModel, ecModel, api); + + coordSys.name = 'parallel_' + idx; + coordSys.resize(parallelModel, api); + + parallelModel.coordinateSystem = coordSys; + coordSys.model = parallelModel; + + coordSysList.push(coordSys); + }); + + // Inject the coordinateSystems into seriesModel + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.get('coordinateSystem') === 'parallel') { + var parallelModel = ecModel.queryComponents({ + mainType: 'parallel', + index: seriesModel.get('parallelIndex'), + id: seriesModel.get('parallelId') + })[0]; + seriesModel.coordinateSystem = parallelModel.coordinateSystem; + } + }); + + return coordSysList; +} + +CoordinateSystemManager.register('parallel', {create: create$2}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var AxisModel$2 = ComponentModel.extend({ + + type: 'baseParallelAxis', + + /** + * @type {module:echarts/coord/parallel/Axis} + */ + axis: null, + + /** + * @type {Array.<Array.<number>} + * @readOnly + */ + activeIntervals: [], + + /** + * @return {Object} + */ + getAreaSelectStyle: function () { + return makeStyleMapper( + [ + ['fill', 'color'], + ['lineWidth', 'borderWidth'], + ['stroke', 'borderColor'], + ['width', 'width'], + ['opacity', 'opacity'] + ] + )(this.getModel('areaSelectStyle')); + }, + + /** + * The code of this feature is put on AxisModel but not ParallelAxis, + * because axisModel can be alive after echarts updating but instance of + * ParallelAxis having been disposed. this._activeInterval should be kept + * when action dispatched (i.e. legend click). + * + * @param {Array.<Array<number>>} intervals interval.length === 0 + * means set all active. + * @public + */ + setActiveIntervals: function (intervals) { + var activeIntervals = this.activeIntervals = clone(intervals); + + // Normalize + if (activeIntervals) { + for (var i = activeIntervals.length - 1; i >= 0; i--) { + asc(activeIntervals[i]); + } + } + }, + + /** + * @param {number|string} [value] When attempting to detect 'no activeIntervals set', + * value can not be input. + * @return {string} 'normal': no activeIntervals set, + * 'active', + * 'inactive'. + * @public + */ + getActiveState: function (value) { + var activeIntervals = this.activeIntervals; + + if (!activeIntervals.length) { + return 'normal'; + } + + if (value == null || isNaN(value)) { + return 'inactive'; + } + + // Simple optimization + if (activeIntervals.length === 1) { + var interval = activeIntervals[0]; + if (interval[0] <= value && value <= interval[1]) { + return 'active'; + } + } + else { + for (var i = 0, len = activeIntervals.length; i < len; i++) { + if (activeIntervals[i][0] <= value && value <= activeIntervals[i][1]) { + return 'active'; + } + } + } + + return 'inactive'; + } + +}); + +var defaultOption$1 = { + + type: 'value', + + /** + * @type {Array.<number>} + */ + dim: null, // 0, 1, 2, ... + + // parallelIndex: null, + + areaSelectStyle: { + width: 20, + borderWidth: 1, + borderColor: 'rgba(160,197,232)', + color: 'rgba(160,197,232)', + opacity: 0.3 + }, + + realtime: true, // Whether realtime update view when select. + + z: 10 +}; + +merge(AxisModel$2.prototype, axisModelCommonMixin); + +function getAxisType$1(axisName, option) { + return option.type || (option.data ? 'category' : 'value'); +} + +axisModelCreator('parallel', AxisModel$2, getAxisType$1, defaultOption$1); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +ComponentModel.extend({ + + type: 'parallel', + + dependencies: ['parallelAxis'], + + /** + * @type {module:echarts/coord/parallel/Parallel} + */ + coordinateSystem: null, + + /** + * Each item like: 'dim0', 'dim1', 'dim2', ... + * @type {Array.<string>} + * @readOnly + */ + dimensions: null, + + /** + * Coresponding to dimensions. + * @type {Array.<number>} + * @readOnly + */ + parallelAxisIndex: null, + + layoutMode: 'box', + + defaultOption: { + zlevel: 0, + z: 0, + left: 80, + top: 60, + right: 80, + bottom: 60, + // width: {totalWidth} - left - right, + // height: {totalHeight} - top - bottom, + + layout: 'horizontal', // 'horizontal' or 'vertical' + + // FIXME + // naming? + axisExpandable: false, + axisExpandCenter: null, + axisExpandCount: 0, + axisExpandWidth: 50, // FIXME '10%' ? + axisExpandRate: 17, + axisExpandDebounce: 50, + // [out, in, jumpTarget]. In percentage. If use [null, 0.05], null means full. + // Do not doc to user until necessary. + axisExpandSlideTriggerArea: [-0.15, 0.05, 0.4], + axisExpandTriggerOn: 'click', // 'mousemove' or 'click' + + parallelAxisDefault: null + }, + + /** + * @override + */ + init: function () { + ComponentModel.prototype.init.apply(this, arguments); + + this.mergeOption({}); + }, + + /** + * @override + */ + mergeOption: function (newOption) { + var thisOption = this.option; + + newOption && merge(thisOption, newOption, true); + + this._initDimensions(); + }, + + /** + * Whether series or axis is in this coordinate system. + * @param {module:echarts/model/Series|module:echarts/coord/parallel/AxisModel} model + * @param {module:echarts/model/Global} ecModel + */ + contains: function (model, ecModel) { + var parallelIndex = model.get('parallelIndex'); + return parallelIndex != null + && ecModel.getComponent('parallel', parallelIndex) === this; + }, + + setAxisExpand: function (opt) { + each$1( + ['axisExpandable', 'axisExpandCenter', 'axisExpandCount', 'axisExpandWidth', 'axisExpandWindow'], + function (name) { + if (opt.hasOwnProperty(name)) { + this.option[name] = opt[name]; + } + }, + this + ); + }, + + /** + * @private + */ + _initDimensions: function () { + var dimensions = this.dimensions = []; + var parallelAxisIndex = this.parallelAxisIndex = []; + + var axisModels = filter(this.dependentModels.parallelAxis, function (axisModel) { + // Can not use this.contains here, because + // initialization has not been completed yet. + return (axisModel.get('parallelIndex') || 0) === this.componentIndex; + }, this); + + each$1(axisModels, function (axisModel) { + dimensions.push('dim' + axisModel.get('dim')); + parallelAxisIndex.push(axisModel.componentIndex); + }); + } + +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @payload + * @property {string} parallelAxisId + * @property {Array.<Array.<number>>} intervals + */ +var actionInfo$1 = { + type: 'axisAreaSelect', + event: 'axisAreaSelected' + // update: 'updateVisual' +}; + +registerAction(actionInfo$1, function (payload, ecModel) { + ecModel.eachComponent( + {mainType: 'parallelAxis', query: payload}, + function (parallelAxisModel) { + parallelAxisModel.axis.model.setActiveIntervals(payload.intervals); + } + ); +}); + +/** + * @payload + */ +registerAction('parallelAxisExpand', function (payload, ecModel) { + ecModel.eachComponent( + {mainType: 'parallel', query: payload}, + function (parallelModel) { + parallelModel.setAxisExpand(payload); + } + ); + +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var curry$2 = curry; +var each$12 = each$1; +var map$2 = map; +var mathMin$6 = Math.min; +var mathMax$6 = Math.max; +var mathPow$2 = Math.pow; + +var COVER_Z = 10000; +var UNSELECT_THRESHOLD = 6; +var MIN_RESIZE_LINE_WIDTH = 6; +var MUTEX_RESOURCE_KEY = 'globalPan'; + +var DIRECTION_MAP = { + w: [0, 0], + e: [0, 1], + n: [1, 0], + s: [1, 1] +}; +var CURSOR_MAP = { + w: 'ew', + e: 'ew', + n: 'ns', + s: 'ns', + ne: 'nesw', + sw: 'nesw', + nw: 'nwse', + se: 'nwse' +}; +var DEFAULT_BRUSH_OPT = { + brushStyle: { + lineWidth: 2, + stroke: 'rgba(0,0,0,0.3)', + fill: 'rgba(0,0,0,0.1)' + }, + transformable: true, + brushMode: 'single', + removeOnClick: false +}; + +var baseUID = 0; + +/** + * @alias module:echarts/component/helper/BrushController + * @constructor + * @mixin {module:zrender/mixin/Eventful} + * @event module:echarts/component/helper/BrushController#brush + * params: + * areas: Array.<Array>, coord relates to container group, + * If no container specified, to global. + * opt { + * isEnd: boolean, + * removeOnClick: boolean + * } + * + * @param {module:zrender/zrender~ZRender} zr + */ +function BrushController(zr) { + + if (__DEV__) { + assert$1(zr); + } + + Eventful.call(this); + + /** + * @type {module:zrender/zrender~ZRender} + * @private + */ + this._zr = zr; + + /** + * @type {module:zrender/container/Group} + * @readOnly + */ + this.group = new Group(); + + /** + * Only for drawing (after enabledBrush). + * 'line', 'rect', 'polygon' or false + * If passing false/null/undefined, disable brush. + * If passing 'auto', determined by panel.defaultBrushType + * @private + * @type {string} + */ + this._brushType; + + /** + * Only for drawing (after enabledBrush). + * + * @private + * @type {Object} + */ + this._brushOption; + + /** + * @private + * @type {Object} + */ + this._panels; + + /** + * @private + * @type {Array.<nubmer>} + */ + this._track = []; + + /** + * @private + * @type {boolean} + */ + this._dragging; + + /** + * @private + * @type {Array} + */ + this._covers = []; + + /** + * @private + * @type {moudule:zrender/container/Group} + */ + this._creatingCover; + + /** + * `true` means global panel + * @private + * @type {module:zrender/container/Group|boolean} + */ + this._creatingPanel; + + /** + * @private + * @type {boolean} + */ + this._enableGlobalPan; + + /** + * @private + * @type {boolean} + */ + if (__DEV__) { + this._mounted; + } + + /** + * @private + * @type {string} + */ + this._uid = 'brushController_' + baseUID++; + + /** + * @private + * @type {Object} + */ + this._handlers = {}; + each$12(mouseHandlers, function (handler, eventName) { + this._handlers[eventName] = bind(handler, this); + }, this); +} + +BrushController.prototype = { + + constructor: BrushController, + + /** + * If set to null/undefined/false, select disabled. + * @param {Object} brushOption + * @param {string|boolean} brushOption.brushType 'line', 'rect', 'polygon' or false + * If passing false/null/undefined, disable brush. + * If passing 'auto', determined by panel.defaultBrushType. + * ('auto' can not be used in global panel) + * @param {number} [brushOption.brushMode='single'] 'single' or 'multiple' + * @param {boolean} [brushOption.transformable=true] + * @param {boolean} [brushOption.removeOnClick=false] + * @param {Object} [brushOption.brushStyle] + * @param {number} [brushOption.brushStyle.width] + * @param {number} [brushOption.brushStyle.lineWidth] + * @param {string} [brushOption.brushStyle.stroke] + * @param {string} [brushOption.brushStyle.fill] + * @param {number} [brushOption.z] + */ + enableBrush: function (brushOption) { + if (__DEV__) { + assert$1(this._mounted); + } + + this._brushType && doDisableBrush(this); + brushOption.brushType && doEnableBrush(this, brushOption); + + return this; + }, + + /** + * @param {Array.<Object>} panelOpts If not pass, it is global brush. + * Each items: { + * panelId, // mandatory. + * clipPath, // mandatory. function. + * isTargetByCursor, // mandatory. function. + * defaultBrushType, // optional, only used when brushType is 'auto'. + * getLinearBrushOtherExtent, // optional. function. + * } + */ + setPanels: function (panelOpts) { + if (panelOpts && panelOpts.length) { + var panels = this._panels = {}; + each$1(panelOpts, function (panelOpts) { + panels[panelOpts.panelId] = clone(panelOpts); + }); + } + else { + this._panels = null; + } + return this; + }, + + /** + * @param {Object} [opt] + * @return {boolean} [opt.enableGlobalPan=false] + */ + mount: function (opt) { + opt = opt || {}; + + if (__DEV__) { + this._mounted = true; // should be at first. + } + + this._enableGlobalPan = opt.enableGlobalPan; + + var thisGroup = this.group; + this._zr.add(thisGroup); + + thisGroup.attr({ + position: opt.position || [0, 0], + rotation: opt.rotation || 0, + scale: opt.scale || [1, 1] + }); + this._transform = thisGroup.getLocalTransform(); + + return this; + }, + + eachCover: function (cb, context) { + each$12(this._covers, cb, context); + }, + + /** + * Update covers. + * @param {Array.<Object>} brushOptionList Like: + * [ + * {id: 'xx', brushType: 'line', range: [23, 44], brushStyle, transformable}, + * {id: 'yy', brushType: 'rect', range: [[23, 44], [23, 54]]}, + * ... + * ] + * `brushType` is required in each cover info. (can not be 'auto') + * `id` is not mandatory. + * `brushStyle`, `transformable` is not mandatory, use DEFAULT_BRUSH_OPT by default. + * If brushOptionList is null/undefined, all covers removed. + */ + updateCovers: function (brushOptionList) { + if (__DEV__) { + assert$1(this._mounted); + } + + brushOptionList = map(brushOptionList, function (brushOption) { + return merge(clone(DEFAULT_BRUSH_OPT), brushOption, true); + }); + + var tmpIdPrefix = '\0-brush-index-'; + var oldCovers = this._covers; + var newCovers = this._covers = []; + var controller = this; + var creatingCover = this._creatingCover; + + (new DataDiffer(oldCovers, brushOptionList, oldGetKey, getKey)) + .add(addOrUpdate) + .update(addOrUpdate) + .remove(remove) + .execute(); + + return this; + + function getKey(brushOption, index) { + return (brushOption.id != null ? brushOption.id : tmpIdPrefix + index) + + '-' + brushOption.brushType; + } + + function oldGetKey(cover, index) { + return getKey(cover.__brushOption, index); + } + + function addOrUpdate(newIndex, oldIndex) { + var newBrushOption = brushOptionList[newIndex]; + // Consider setOption in event listener of brushSelect, + // where updating cover when creating should be forbiden. + if (oldIndex != null && oldCovers[oldIndex] === creatingCover) { + newCovers[newIndex] = oldCovers[oldIndex]; + } + else { + var cover = newCovers[newIndex] = oldIndex != null + ? ( + oldCovers[oldIndex].__brushOption = newBrushOption, + oldCovers[oldIndex] + ) + : endCreating(controller, createCover(controller, newBrushOption)); + updateCoverAfterCreation(controller, cover); + } + } + + function remove(oldIndex) { + if (oldCovers[oldIndex] !== creatingCover) { + controller.group.remove(oldCovers[oldIndex]); + } + } + }, + + unmount: function () { + if (__DEV__) { + if (!this._mounted) { + return; + } + } + + this.enableBrush(false); + + // container may 'removeAll' outside. + clearCovers(this); + this._zr.remove(this.group); + + if (__DEV__) { + this._mounted = false; // should be at last. + } + + return this; + }, + + dispose: function () { + this.unmount(); + this.off(); + } +}; + +mixin(BrushController, Eventful); + +function doEnableBrush(controller, brushOption) { + var zr = controller._zr; + + // Consider roam, which takes globalPan too. + if (!controller._enableGlobalPan) { + take(zr, MUTEX_RESOURCE_KEY, controller._uid); + } + + each$12(controller._handlers, function (handler, eventName) { + zr.on(eventName, handler); + }); + + controller._brushType = brushOption.brushType; + controller._brushOption = merge(clone(DEFAULT_BRUSH_OPT), brushOption, true); +} + +function doDisableBrush(controller) { + var zr = controller._zr; + + release(zr, MUTEX_RESOURCE_KEY, controller._uid); + + each$12(controller._handlers, function (handler, eventName) { + zr.off(eventName, handler); + }); + + controller._brushType = controller._brushOption = null; +} + +function createCover(controller, brushOption) { + var cover = coverRenderers[brushOption.brushType].createCover(controller, brushOption); + cover.__brushOption = brushOption; + updateZ$1(cover, brushOption); + controller.group.add(cover); + return cover; +} + +function endCreating(controller, creatingCover) { + var coverRenderer = getCoverRenderer(creatingCover); + if (coverRenderer.endCreating) { + coverRenderer.endCreating(controller, creatingCover); + updateZ$1(creatingCover, creatingCover.__brushOption); + } + return creatingCover; +} + +function updateCoverShape(controller, cover) { + var brushOption = cover.__brushOption; + getCoverRenderer(cover).updateCoverShape( + controller, cover, brushOption.range, brushOption + ); +} + +function updateZ$1(cover, brushOption) { + var z = brushOption.z; + z == null && (z = COVER_Z); + cover.traverse(function (el) { + el.z = z; + el.z2 = z; // Consider in given container. + }); +} + +function updateCoverAfterCreation(controller, cover) { + getCoverRenderer(cover).updateCommon(controller, cover); + updateCoverShape(controller, cover); +} + +function getCoverRenderer(cover) { + return coverRenderers[cover.__brushOption.brushType]; +} + +// return target panel or `true` (means global panel) +function getPanelByPoint(controller, e, localCursorPoint) { + var panels = controller._panels; + if (!panels) { + return true; // Global panel + } + var panel; + var transform = controller._transform; + each$12(panels, function (pn) { + pn.isTargetByCursor(e, localCursorPoint, transform) && (panel = pn); + }); + return panel; +} + +// Return a panel or true +function getPanelByCover(controller, cover) { + var panels = controller._panels; + if (!panels) { + return true; // Global panel + } + var panelId = cover.__brushOption.panelId; + // User may give cover without coord sys info, + // which is then treated as global panel. + return panelId != null ? panels[panelId] : true; +} + +function clearCovers(controller) { + var covers = controller._covers; + var originalLength = covers.length; + each$12(covers, function (cover) { + controller.group.remove(cover); + }, controller); + covers.length = 0; + + return !!originalLength; +} + +function trigger(controller, opt) { + var areas = map$2(controller._covers, function (cover) { + var brushOption = cover.__brushOption; + var range = clone(brushOption.range); + return { + brushType: brushOption.brushType, + panelId: brushOption.panelId, + range: range + }; + }); + + controller.trigger('brush', areas, { + isEnd: !!opt.isEnd, + removeOnClick: !!opt.removeOnClick + }); +} + +function shouldShowCover(controller) { + var track = controller._track; + + if (!track.length) { + return false; + } + + var p2 = track[track.length - 1]; + var p1 = track[0]; + var dx = p2[0] - p1[0]; + var dy = p2[1] - p1[1]; + var dist = mathPow$2(dx * dx + dy * dy, 0.5); + + return dist > UNSELECT_THRESHOLD; +} + +function getTrackEnds(track) { + var tail = track.length - 1; + tail < 0 && (tail = 0); + return [track[0], track[tail]]; +} + +function createBaseRectCover(doDrift, controller, brushOption, edgeNames) { + var cover = new Group(); + + cover.add(new Rect({ + name: 'main', + style: makeStyle(brushOption), + silent: true, + draggable: true, + cursor: 'move', + drift: curry$2(doDrift, controller, cover, 'nswe'), + ondragend: curry$2(trigger, controller, {isEnd: true}) + })); + + each$12( + edgeNames, + function (name) { + cover.add(new Rect({ + name: name, + style: {opacity: 0}, + draggable: true, + silent: true, + invisible: true, + drift: curry$2(doDrift, controller, cover, name), + ondragend: curry$2(trigger, controller, {isEnd: true}) + })); + } + ); + + return cover; +} + +function updateBaseRect(controller, cover, localRange, brushOption) { + var lineWidth = brushOption.brushStyle.lineWidth || 0; + var handleSize = mathMax$6(lineWidth, MIN_RESIZE_LINE_WIDTH); + var x = localRange[0][0]; + var y = localRange[1][0]; + var xa = x - lineWidth / 2; + var ya = y - lineWidth / 2; + var x2 = localRange[0][1]; + var y2 = localRange[1][1]; + var x2a = x2 - handleSize + lineWidth / 2; + var y2a = y2 - handleSize + lineWidth / 2; + var width = x2 - x; + var height = y2 - y; + var widtha = width + lineWidth; + var heighta = height + lineWidth; + + updateRectShape(controller, cover, 'main', x, y, width, height); + + if (brushOption.transformable) { + updateRectShape(controller, cover, 'w', xa, ya, handleSize, heighta); + updateRectShape(controller, cover, 'e', x2a, ya, handleSize, heighta); + updateRectShape(controller, cover, 'n', xa, ya, widtha, handleSize); + updateRectShape(controller, cover, 's', xa, y2a, widtha, handleSize); + + updateRectShape(controller, cover, 'nw', xa, ya, handleSize, handleSize); + updateRectShape(controller, cover, 'ne', x2a, ya, handleSize, handleSize); + updateRectShape(controller, cover, 'sw', xa, y2a, handleSize, handleSize); + updateRectShape(controller, cover, 'se', x2a, y2a, handleSize, handleSize); + } +} + +function updateCommon(controller, cover) { + var brushOption = cover.__brushOption; + var transformable = brushOption.transformable; + + var mainEl = cover.childAt(0); + mainEl.useStyle(makeStyle(brushOption)); + mainEl.attr({ + silent: !transformable, + cursor: transformable ? 'move' : 'default' + }); + + each$12( + ['w', 'e', 'n', 's', 'se', 'sw', 'ne', 'nw'], + function (name) { + var el = cover.childOfName(name); + var globalDir = getGlobalDirection(controller, name); + + el && el.attr({ + silent: !transformable, + invisible: !transformable, + cursor: transformable ? CURSOR_MAP[globalDir] + '-resize' : null + }); + } + ); +} + +function updateRectShape(controller, cover, name, x, y, w, h) { + var el = cover.childOfName(name); + el && el.setShape(pointsToRect( + clipByPanel(controller, cover, [[x, y], [x + w, y + h]]) + )); +} + +function makeStyle(brushOption) { + return defaults({strokeNoScale: true}, brushOption.brushStyle); +} + +function formatRectRange(x, y, x2, y2) { + var min = [mathMin$6(x, x2), mathMin$6(y, y2)]; + var max = [mathMax$6(x, x2), mathMax$6(y, y2)]; + + return [ + [min[0], max[0]], // x range + [min[1], max[1]] // y range + ]; +} + +function getTransform$1(controller) { + return getTransform(controller.group); +} + +function getGlobalDirection(controller, localDirection) { + if (localDirection.length > 1) { + localDirection = localDirection.split(''); + var globalDir = [ + getGlobalDirection(controller, localDirection[0]), + getGlobalDirection(controller, localDirection[1]) + ]; + (globalDir[0] === 'e' || globalDir[0] === 'w') && globalDir.reverse(); + return globalDir.join(''); + } + else { + var map$$1 = {w: 'left', e: 'right', n: 'top', s: 'bottom'}; + var inverseMap = {left: 'w', right: 'e', top: 'n', bottom: 's'}; + var globalDir = transformDirection( + map$$1[localDirection], getTransform$1(controller) + ); + return inverseMap[globalDir]; + } +} + +function driftRect(toRectRange, fromRectRange, controller, cover, name, dx, dy, e) { + var brushOption = cover.__brushOption; + var rectRange = toRectRange(brushOption.range); + var localDelta = toLocalDelta(controller, dx, dy); + + each$12(name.split(''), function (namePart) { + var ind = DIRECTION_MAP[namePart]; + rectRange[ind[0]][ind[1]] += localDelta[ind[0]]; + }); + + brushOption.range = fromRectRange(formatRectRange( + rectRange[0][0], rectRange[1][0], rectRange[0][1], rectRange[1][1] + )); + + updateCoverAfterCreation(controller, cover); + trigger(controller, {isEnd: false}); +} + +function driftPolygon(controller, cover, dx, dy, e) { + var range = cover.__brushOption.range; + var localDelta = toLocalDelta(controller, dx, dy); + + each$12(range, function (point) { + point[0] += localDelta[0]; + point[1] += localDelta[1]; + }); + + updateCoverAfterCreation(controller, cover); + trigger(controller, {isEnd: false}); +} + +function toLocalDelta(controller, dx, dy) { + var thisGroup = controller.group; + var localD = thisGroup.transformCoordToLocal(dx, dy); + var localZero = thisGroup.transformCoordToLocal(0, 0); + + return [localD[0] - localZero[0], localD[1] - localZero[1]]; +} + +function clipByPanel(controller, cover, data) { + var panel = getPanelByCover(controller, cover); + + return (panel && panel !== true) + ? panel.clipPath(data, controller._transform) + : clone(data); +} + +function pointsToRect(points) { + var xmin = mathMin$6(points[0][0], points[1][0]); + var ymin = mathMin$6(points[0][1], points[1][1]); + var xmax = mathMax$6(points[0][0], points[1][0]); + var ymax = mathMax$6(points[0][1], points[1][1]); + + return { + x: xmin, + y: ymin, + width: xmax - xmin, + height: ymax - ymin + }; +} + +function resetCursor(controller, e, localCursorPoint) { + // Check active + if (!controller._brushType) { + return; + } + + var zr = controller._zr; + var covers = controller._covers; + var currPanel = getPanelByPoint(controller, e, localCursorPoint); + + // Check whether in covers. + if (!controller._dragging) { + for (var i = 0; i < covers.length; i++) { + var brushOption = covers[i].__brushOption; + if (currPanel + && (currPanel === true || brushOption.panelId === currPanel.panelId) + && coverRenderers[brushOption.brushType].contain( + covers[i], localCursorPoint[0], localCursorPoint[1] + ) + ) { + // Use cursor style set on cover. + return; + } + } + } + + currPanel && zr.setCursorStyle('crosshair'); +} + +function preventDefault(e) { + var rawE = e.event; + rawE.preventDefault && rawE.preventDefault(); +} + +function mainShapeContain(cover, x, y) { + return cover.childOfName('main').contain(x, y); +} + +function updateCoverByMouse(controller, e, localCursorPoint, isEnd) { + var creatingCover = controller._creatingCover; + var panel = controller._creatingPanel; + var thisBrushOption = controller._brushOption; + var eventParams; + + controller._track.push(localCursorPoint.slice()); + + if (shouldShowCover(controller) || creatingCover) { + + if (panel && !creatingCover) { + thisBrushOption.brushMode === 'single' && clearCovers(controller); + var brushOption = clone(thisBrushOption); + brushOption.brushType = determineBrushType(brushOption.brushType, panel); + brushOption.panelId = panel === true ? null : panel.panelId; + creatingCover = controller._creatingCover = createCover(controller, brushOption); + controller._covers.push(creatingCover); + } + + if (creatingCover) { + var coverRenderer = coverRenderers[determineBrushType(controller._brushType, panel)]; + var coverBrushOption = creatingCover.__brushOption; + + coverBrushOption.range = coverRenderer.getCreatingRange( + clipByPanel(controller, creatingCover, controller._track) + ); + + if (isEnd) { + endCreating(controller, creatingCover); + coverRenderer.updateCommon(controller, creatingCover); + } + + updateCoverShape(controller, creatingCover); + + eventParams = {isEnd: isEnd}; + } + } + else if ( + isEnd + && thisBrushOption.brushMode === 'single' + && thisBrushOption.removeOnClick + ) { + // Help user to remove covers easily, only by a tiny drag, in 'single' mode. + // But a single click do not clear covers, because user may have casual + // clicks (for example, click on other component and do not expect covers + // disappear). + // Only some cover removed, trigger action, but not every click trigger action. + if (getPanelByPoint(controller, e, localCursorPoint) && clearCovers(controller)) { + eventParams = {isEnd: isEnd, removeOnClick: true}; + } + } + + return eventParams; +} + +function determineBrushType(brushType, panel) { + if (brushType === 'auto') { + if (__DEV__) { + assert$1( + panel && panel.defaultBrushType, + 'MUST have defaultBrushType when brushType is "atuo"' + ); + } + return panel.defaultBrushType; + } + return brushType; +} + +var mouseHandlers = { + + mousedown: function (e) { + if (this._dragging) { + // In case some browser do not support globalOut, + // and release mose out side the browser. + handleDragEnd.call(this, e); + } + else if (!e.target || !e.target.draggable) { + + preventDefault(e); + + var localCursorPoint = this.group.transformCoordToLocal(e.offsetX, e.offsetY); + + this._creatingCover = null; + var panel = this._creatingPanel = getPanelByPoint(this, e, localCursorPoint); + + if (panel) { + this._dragging = true; + this._track = [localCursorPoint.slice()]; + } + } + }, + + mousemove: function (e) { + var localCursorPoint = this.group.transformCoordToLocal(e.offsetX, e.offsetY); + + resetCursor(this, e, localCursorPoint); + + if (this._dragging) { + + preventDefault(e); + + var eventParams = updateCoverByMouse(this, e, localCursorPoint, false); + + eventParams && trigger(this, eventParams); + } + }, + + mouseup: handleDragEnd //, + + // FIXME + // in tooltip, globalout should not be triggered. + // globalout: handleDragEnd +}; + +function handleDragEnd(e) { + if (this._dragging) { + + preventDefault(e); + + var localCursorPoint = this.group.transformCoordToLocal(e.offsetX, e.offsetY); + var eventParams = updateCoverByMouse(this, e, localCursorPoint, true); + + this._dragging = false; + this._track = []; + this._creatingCover = null; + + // trigger event shoule be at final, after procedure will be nested. + eventParams && trigger(this, eventParams); + } +} + +/** + * key: brushType + * @type {Object} + */ +var coverRenderers = { + + lineX: getLineRenderer(0), + + lineY: getLineRenderer(1), + + rect: { + createCover: function (controller, brushOption) { + return createBaseRectCover( + curry$2( + driftRect, + function (range) { + return range; + }, + function (range) { + return range; + } + ), + controller, + brushOption, + ['w', 'e', 'n', 's', 'se', 'sw', 'ne', 'nw'] + ); + }, + getCreatingRange: function (localTrack) { + var ends = getTrackEnds(localTrack); + return formatRectRange(ends[1][0], ends[1][1], ends[0][0], ends[0][1]); + }, + updateCoverShape: function (controller, cover, localRange, brushOption) { + updateBaseRect(controller, cover, localRange, brushOption); + }, + updateCommon: updateCommon, + contain: mainShapeContain + }, + + polygon: { + createCover: function (controller, brushOption) { + var cover = new Group(); + + // Do not use graphic.Polygon because graphic.Polyline do not close the + // border of the shape when drawing, which is a better experience for user. + cover.add(new Polyline({ + name: 'main', + style: makeStyle(brushOption), + silent: true + })); + + return cover; + }, + getCreatingRange: function (localTrack) { + return localTrack; + }, + endCreating: function (controller, cover) { + cover.remove(cover.childAt(0)); + // Use graphic.Polygon close the shape. + cover.add(new Polygon({ + name: 'main', + draggable: true, + drift: curry$2(driftPolygon, controller, cover), + ondragend: curry$2(trigger, controller, {isEnd: true}) + })); + }, + updateCoverShape: function (controller, cover, localRange, brushOption) { + cover.childAt(0).setShape({ + points: clipByPanel(controller, cover, localRange) + }); + }, + updateCommon: updateCommon, + contain: mainShapeContain + } +}; + +function getLineRenderer(xyIndex) { + return { + createCover: function (controller, brushOption) { + return createBaseRectCover( + curry$2( + driftRect, + function (range) { + var rectRange = [range, [0, 100]]; + xyIndex && rectRange.reverse(); + return rectRange; + }, + function (rectRange) { + return rectRange[xyIndex]; + } + ), + controller, + brushOption, + [['w', 'e'], ['n', 's']][xyIndex] + ); + }, + getCreatingRange: function (localTrack) { + var ends = getTrackEnds(localTrack); + var min = mathMin$6(ends[0][xyIndex], ends[1][xyIndex]); + var max = mathMax$6(ends[0][xyIndex], ends[1][xyIndex]); + + return [min, max]; + }, + updateCoverShape: function (controller, cover, localRange, brushOption) { + var otherExtent; + // If brushWidth not specified, fit the panel. + var panel = getPanelByCover(controller, cover); + if (panel !== true && panel.getLinearBrushOtherExtent) { + otherExtent = panel.getLinearBrushOtherExtent( + xyIndex, controller._transform + ); + } + else { + var zr = controller._zr; + otherExtent = [0, [zr.getWidth(), zr.getHeight()][1 - xyIndex]]; + } + var rectRange = [localRange, otherExtent]; + xyIndex && rectRange.reverse(); + + updateBaseRect(controller, cover, rectRange, brushOption); + }, + updateCommon: updateCommon, + contain: mainShapeContain + }; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +function makeRectPanelClipPath(rect) { + rect = normalizeRect(rect); + return function (localPoints, transform) { + return clipPointsByRect(localPoints, rect); + }; +} + +function makeLinearBrushOtherExtent(rect, specifiedXYIndex) { + rect = normalizeRect(rect); + return function (xyIndex) { + var idx = specifiedXYIndex != null ? specifiedXYIndex : xyIndex; + var brushWidth = idx ? rect.width : rect.height; + var base = idx ? rect.x : rect.y; + return [base, base + (brushWidth || 0)]; + }; +} + +function makeRectIsTargetByCursor(rect, api, targetModel) { + rect = normalizeRect(rect); + return function (e, localCursorPoint, transform) { + return rect.contain(localCursorPoint[0], localCursorPoint[1]) + && !onIrrelevantElement(e, api, targetModel); + }; +} + +// Consider width/height is negative. +function normalizeRect(rect) { + return BoundingRect.create(rect); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var elementList = ['axisLine', 'axisTickLabel', 'axisName']; + +var AxisView$2 = extendComponentView({ + + type: 'parallelAxis', + + /** + * @override + */ + init: function (ecModel, api) { + AxisView$2.superApply(this, 'init', arguments); + + /** + * @type {module:echarts/component/helper/BrushController} + */ + (this._brushController = new BrushController(api.getZr())) + .on('brush', bind(this._onBrush, this)); + }, + + /** + * @override + */ + render: function (axisModel, ecModel, api, payload) { + if (fromAxisAreaSelect(axisModel, ecModel, payload)) { + return; + } + + this.axisModel = axisModel; + this.api = api; + + this.group.removeAll(); + + var oldAxisGroup = this._axisGroup; + this._axisGroup = new Group(); + this.group.add(this._axisGroup); + + if (!axisModel.get('show')) { + return; + } + + var coordSysModel = getCoordSysModel(axisModel, ecModel); + var coordSys = coordSysModel.coordinateSystem; + + var areaSelectStyle = axisModel.getAreaSelectStyle(); + var areaWidth = areaSelectStyle.width; + + var dim = axisModel.axis.dim; + var axisLayout = coordSys.getAxisLayout(dim); + + var builderOpt = extend( + {strokeContainThreshold: areaWidth}, + axisLayout + ); + + var axisBuilder = new AxisBuilder(axisModel, builderOpt); + + each$1(elementList, axisBuilder.add, axisBuilder); + + this._axisGroup.add(axisBuilder.getGroup()); + + this._refreshBrushController( + builderOpt, areaSelectStyle, axisModel, coordSysModel, areaWidth, api + ); + + var animationModel = (payload && payload.animation === false) ? null : axisModel; + groupTransition(oldAxisGroup, this._axisGroup, animationModel); + }, + + // /** + // * @override + // */ + // updateVisual: function (axisModel, ecModel, api, payload) { + // this._brushController && this._brushController + // .updateCovers(getCoverInfoList(axisModel)); + // }, + + _refreshBrushController: function ( + builderOpt, areaSelectStyle, axisModel, coordSysModel, areaWidth, api + ) { + // After filtering, axis may change, select area needs to be update. + var extent = axisModel.axis.getExtent(); + var extentLen = extent[1] - extent[0]; + var extra = Math.min(30, Math.abs(extentLen) * 0.1); // Arbitrary value. + + // width/height might be negative, which will be + // normalized in BoundingRect. + var rect = BoundingRect.create({ + x: extent[0], + y: -areaWidth / 2, + width: extentLen, + height: areaWidth + }); + rect.x -= extra; + rect.width += 2 * extra; + + this._brushController + .mount({ + enableGlobalPan: true, + rotation: builderOpt.rotation, + position: builderOpt.position + }) + .setPanels([{ + panelId: 'pl', + clipPath: makeRectPanelClipPath(rect), + isTargetByCursor: makeRectIsTargetByCursor(rect, api, coordSysModel), + getLinearBrushOtherExtent: makeLinearBrushOtherExtent(rect, 0) + }]) + .enableBrush({ + brushType: 'lineX', + brushStyle: areaSelectStyle, + removeOnClick: true + }) + .updateCovers(getCoverInfoList(axisModel)); + }, + + _onBrush: function (coverInfoList, opt) { + // Do not cache these object, because the mey be changed. + var axisModel = this.axisModel; + var axis = axisModel.axis; + var intervals = map(coverInfoList, function (coverInfo) { + return [ + axis.coordToData(coverInfo.range[0], true), + axis.coordToData(coverInfo.range[1], true) + ]; + }); + + // If realtime is true, action is not dispatched on drag end, because + // the drag end emits the same params with the last drag move event, + // and may have some delay when using touch pad. + if (!axisModel.option.realtime === opt.isEnd || opt.removeOnClick) { // jshint ignore:line + this.api.dispatchAction({ + type: 'axisAreaSelect', + parallelAxisId: axisModel.id, + intervals: intervals + }); + } + }, + + /** + * @override + */ + dispose: function () { + this._brushController.dispose(); + } +}); + +function fromAxisAreaSelect(axisModel, ecModel, payload) { + return payload + && payload.type === 'axisAreaSelect' + && ecModel.findComponents( + {mainType: 'parallelAxis', query: payload} + )[0] === axisModel; +} + +function getCoverInfoList(axisModel) { + var axis = axisModel.axis; + return map(axisModel.activeIntervals, function (interval) { + return { + brushType: 'lineX', + panelId: 'pl', + range: [ + axis.dataToCoord(interval[0], true), + axis.dataToCoord(interval[1], true) + ] + }; + }); +} + +function getCoordSysModel(axisModel, ecModel) { + return ecModel.getComponent( + 'parallel', axisModel.get('parallelIndex') + ); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var CLICK_THRESHOLD = 5; // > 4 + +// Parallel view +extendComponentView({ + type: 'parallel', + + render: function (parallelModel, ecModel, api) { + this._model = parallelModel; + this._api = api; + + if (!this._handlers) { + this._handlers = {}; + each$1(handlers, function (handler, eventName) { + api.getZr().on(eventName, this._handlers[eventName] = bind(handler, this)); + }, this); + } + + createOrUpdate( + this, + '_throttledDispatchExpand', + parallelModel.get('axisExpandRate'), + 'fixRate' + ); + }, + + dispose: function (ecModel, api) { + each$1(this._handlers, function (handler, eventName) { + api.getZr().off(eventName, handler); + }); + this._handlers = null; + }, + + /** + * @param {Object} [opt] If null, cancle the last action triggering for debounce. + */ + _throttledDispatchExpand: function (opt) { + this._dispatchExpand(opt); + }, + + _dispatchExpand: function (opt) { + opt && this._api.dispatchAction( + extend({type: 'parallelAxisExpand'}, opt) + ); + } + +}); + +var handlers = { + + mousedown: function (e) { + if (checkTrigger(this, 'click')) { + this._mouseDownPoint = [e.offsetX, e.offsetY]; + } + }, + + mouseup: function (e) { + var mouseDownPoint = this._mouseDownPoint; + + if (checkTrigger(this, 'click') && mouseDownPoint) { + var point = [e.offsetX, e.offsetY]; + var dist = Math.pow(mouseDownPoint[0] - point[0], 2) + + Math.pow(mouseDownPoint[1] - point[1], 2); + + if (dist > CLICK_THRESHOLD) { + return; + } + + var result = this._model.coordinateSystem.getSlidedAxisExpandWindow( + [e.offsetX, e.offsetY] + ); + + result.behavior !== 'none' && this._dispatchExpand({ + axisExpandWindow: result.axisExpandWindow + }); + } + + this._mouseDownPoint = null; + }, + + mousemove: function (e) { + // Should do nothing when brushing. + if (this._mouseDownPoint || !checkTrigger(this, 'mousemove')) { + return; + } + var model = this._model; + var result = model.coordinateSystem.getSlidedAxisExpandWindow( + [e.offsetX, e.offsetY] + ); + + var behavior = result.behavior; + behavior === 'jump' && this._throttledDispatchExpand.debounceNextCall(model.get('axisExpandDebounce')); + this._throttledDispatchExpand( + behavior === 'none' + ? null // Cancle the last trigger, in case that mouse slide out of the area quickly. + : { + axisExpandWindow: result.axisExpandWindow, + // Jumping uses animation, and sliding suppresses animation. + animation: behavior === 'jump' ? null : false + } + ); + } +}; + +function checkTrigger(view, triggerOn) { + var model = view._model; + return model.get('axisExpandable') && model.get('axisExpandTriggerOn') === triggerOn; +} + +registerPreprocessor(parallelPreprocessor); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +SeriesModel.extend({ + + type: 'series.parallel', + + dependencies: ['parallel'], + + visualColorAccessPath: 'lineStyle.color', + + getInitialData: function (option, ecModel) { + var source = this.getSource(); + + setEncodeAndDimensions(source, this); + + return createListFromArray(source, this); + }, + + /** + * User can get data raw indices on 'axisAreaSelected' event received. + * + * @public + * @param {string} activeState 'active' or 'inactive' or 'normal' + * @return {Array.<number>} Raw indices + */ + getRawIndicesByActiveState: function (activeState) { + var coordSys = this.coordinateSystem; + var data = this.getData(); + var indices = []; + + coordSys.eachActiveState(data, function (theActiveState, dataIndex) { + if (activeState === theActiveState) { + indices.push(data.getRawIndex(dataIndex)); + } + }); + + return indices; + }, + + defaultOption: { + zlevel: 0, // 一级层叠 + z: 2, // 二级层叠 + + coordinateSystem: 'parallel', + parallelIndex: 0, + + label: { + show: false + }, + + inactiveOpacity: 0.05, + activeOpacity: 1, + + lineStyle: { + width: 1, + opacity: 0.45, + type: 'solid' + }, + emphasis: { + label: { + show: false + } + }, + + progressive: 500, + smooth: false, // true | false | number + + animationEasing: 'linear' + } +}); + +function setEncodeAndDimensions(source, seriesModel) { + // The mapping of parallelAxis dimension to data dimension can + // be specified in parallelAxis.option.dim. For example, if + // parallelAxis.option.dim is 'dim3', it mapping to the third + // dimension of data. But `data.encode` has higher priority. + // Moreover, parallelModel.dimension should not be regarded as data + // dimensions. Consider dimensions = ['dim4', 'dim2', 'dim6']; + + if (source.encodeDefine) { + return; + } + + var parallelModel = seriesModel.ecModel.getComponent( + 'parallel', seriesModel.get('parallelIndex') + ); + if (!parallelModel) { + return; + } + + var encodeDefine = source.encodeDefine = createHashMap(); + each$1(parallelModel.dimensions, function (axisDim) { + var dataDimIndex = convertDimNameToNumber(axisDim); + encodeDefine.set(axisDim, dataDimIndex); + }); +} + +function convertDimNameToNumber(dimName) { + return +dimName.replace('dim', ''); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var DEFAULT_SMOOTH = 0.3; + +var ParallelView = Chart.extend({ + + type: 'parallel', + + init: function () { + + /** + * @type {module:zrender/container/Group} + * @private + */ + this._dataGroup = new Group(); + + this.group.add(this._dataGroup); + + /** + * @type {module:echarts/data/List} + */ + this._data; + + /** + * @type {boolean} + */ + this._initialized; + }, + + /** + * @override + */ + render: function (seriesModel, ecModel, api, payload) { + var dataGroup = this._dataGroup; + var data = seriesModel.getData(); + var oldData = this._data; + var coordSys = seriesModel.coordinateSystem; + var dimensions = coordSys.dimensions; + var seriesScope = makeSeriesScope$2(seriesModel); + + data.diff(oldData) + .add(add) + .update(update) + .remove(remove) + .execute(); + + function add(newDataIndex) { + var line = addEl(data, dataGroup, newDataIndex, dimensions, coordSys); + updateElCommon(line, data, newDataIndex, seriesScope); + } + + function update(newDataIndex, oldDataIndex) { + var line = oldData.getItemGraphicEl(oldDataIndex); + var points = createLinePoints(data, newDataIndex, dimensions, coordSys); + data.setItemGraphicEl(newDataIndex, line); + var animationModel = (payload && payload.animation === false) ? null : seriesModel; + updateProps(line, {shape: {points: points}}, animationModel, newDataIndex); + + updateElCommon(line, data, newDataIndex, seriesScope); + } + + function remove(oldDataIndex) { + var line = oldData.getItemGraphicEl(oldDataIndex); + dataGroup.remove(line); + } + + // First create + if (!this._initialized) { + this._initialized = true; + var clipPath = createGridClipShape$1( + coordSys, seriesModel, function () { + // Callback will be invoked immediately if there is no animation + setTimeout(function () { + dataGroup.removeClipPath(); + }); + } + ); + dataGroup.setClipPath(clipPath); + } + + this._data = data; + }, + + incrementalPrepareRender: function (seriesModel, ecModel, api) { + this._initialized = true; + this._data = null; + this._dataGroup.removeAll(); + }, + + incrementalRender: function (taskParams, seriesModel, ecModel) { + var data = seriesModel.getData(); + var coordSys = seriesModel.coordinateSystem; + var dimensions = coordSys.dimensions; + var seriesScope = makeSeriesScope$2(seriesModel); + + for (var dataIndex = taskParams.start; dataIndex < taskParams.end; dataIndex++) { + var line = addEl(data, this._dataGroup, dataIndex, dimensions, coordSys); + line.incremental = true; + updateElCommon(line, data, dataIndex, seriesScope); + } + }, + + dispose: function () {}, + + // _renderForProgressive: function (seriesModel) { + // var dataGroup = this._dataGroup; + // var data = seriesModel.getData(); + // var oldData = this._data; + // var coordSys = seriesModel.coordinateSystem; + // var dimensions = coordSys.dimensions; + // var option = seriesModel.option; + // var progressive = option.progressive; + // var smooth = option.smooth ? SMOOTH : null; + + // // In progressive animation is disabled, so use simple data diff, + // // which effects performance less. + // // (Typically performance for data with length 7000+ like: + // // simpleDiff: 60ms, addEl: 184ms, + // // in RMBP 2.4GHz intel i7, OSX 10.9 chrome 50.0.2661.102 (64-bit)) + // if (simpleDiff(oldData, data, dimensions)) { + // dataGroup.removeAll(); + // data.each(function (dataIndex) { + // addEl(data, dataGroup, dataIndex, dimensions, coordSys); + // }); + // } + + // updateElCommon(data, progressive, smooth); + + // // Consider switch between progressive and not. + // data.__plProgressive = true; + // this._data = data; + // }, + + /** + * @override + */ + remove: function () { + this._dataGroup && this._dataGroup.removeAll(); + this._data = null; + } +}); + +function createGridClipShape$1(coordSys, seriesModel, cb) { + var parallelModel = coordSys.model; + var rect = coordSys.getRect(); + var rectEl = new Rect({ + shape: { + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height + } + }); + + var dim = parallelModel.get('layout') === 'horizontal' ? 'width' : 'height'; + rectEl.setShape(dim, 0); + initProps(rectEl, { + shape: { + width: rect.width, + height: rect.height + } + }, seriesModel, cb); + return rectEl; +} + +function createLinePoints(data, dataIndex, dimensions, coordSys) { + var points = []; + for (var i = 0; i < dimensions.length; i++) { + var dimName = dimensions[i]; + var value = data.get(data.mapDimension(dimName), dataIndex); + if (!isEmptyValue(value, coordSys.getAxis(dimName).type)) { + points.push(coordSys.dataToPoint(value, dimName)); + } + } + return points; +} + +function addEl(data, dataGroup, dataIndex, dimensions, coordSys) { + var points = createLinePoints(data, dataIndex, dimensions, coordSys); + var line = new Polyline({ + shape: {points: points}, + silent: true, + z2: 10 + }); + dataGroup.add(line); + data.setItemGraphicEl(dataIndex, line); + return line; +} + +function makeSeriesScope$2(seriesModel) { + var smooth = seriesModel.get('smooth', true); + smooth === true && (smooth = DEFAULT_SMOOTH); + return { + lineStyle: seriesModel.getModel('lineStyle').getLineStyle(), + smooth: smooth != null ? smooth : DEFAULT_SMOOTH + }; +} + +function updateElCommon(el, data, dataIndex, seriesScope) { + var lineStyle = seriesScope.lineStyle; + + if (data.hasItemOption) { + var lineStyleModel = data.getItemModel(dataIndex).getModel('lineStyle'); + lineStyle = lineStyleModel.getLineStyle(); + } + + el.useStyle(lineStyle); + + var elStyle = el.style; + elStyle.fill = null; + // lineStyle.color have been set to itemVisual in module:echarts/visual/seriesColor. + elStyle.stroke = data.getItemVisual(dataIndex, 'color'); + // lineStyle.opacity have been set to itemVisual in parallelVisual. + elStyle.opacity = data.getItemVisual(dataIndex, 'opacity'); + + seriesScope.smooth && (el.shape.smooth = seriesScope.smooth); +} + +// function simpleDiff(oldData, newData, dimensions) { +// var oldLen; +// if (!oldData +// || !oldData.__plProgressive +// || (oldLen = oldData.count()) !== newData.count() +// ) { +// return true; +// } + +// var dimLen = dimensions.length; +// for (var i = 0; i < oldLen; i++) { +// for (var j = 0; j < dimLen; j++) { +// if (oldData.get(dimensions[j], i) !== newData.get(dimensions[j], i)) { +// return true; +// } +// } +// } + +// return false; +// } + +// FIXME +// 公用方法? +function isEmptyValue(val, axisType) { + return axisType === 'category' + ? val == null + : (val == null || isNaN(val)); // axisType === 'value' +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +var opacityAccessPath$1 = ['lineStyle', 'normal', 'opacity']; + +var parallelVisual = { + + seriesType: 'parallel', + + reset: function (seriesModel, ecModel, api) { + + var itemStyleModel = seriesModel.getModel('itemStyle'); + var lineStyleModel = seriesModel.getModel('lineStyle'); + var globalColors = ecModel.get('color'); + + var color = lineStyleModel.get('color') + || itemStyleModel.get('color') + || globalColors[seriesModel.seriesIndex % globalColors.length]; + var inactiveOpacity = seriesModel.get('inactiveOpacity'); + var activeOpacity = seriesModel.get('activeOpacity'); + var lineStyle = seriesModel.getModel('lineStyle').getLineStyle(); + + var coordSys = seriesModel.coordinateSystem; + var data = seriesModel.getData(); + + var opacityMap = { + normal: lineStyle.opacity, + active: activeOpacity, + inactive: inactiveOpacity + }; + + data.setVisual('color', color); + + function progress(params, data) { + coordSys.eachActiveState(data, function (activeState, dataIndex) { + var opacity = opacityMap[activeState]; + if (activeState === 'normal' && data.hasItemOption) { + var itemOpacity = data.getItemModel(dataIndex).get(opacityAccessPath$1, true); + itemOpacity != null && (opacity = itemOpacity); + } + data.setItemVisual(dataIndex, 'opacity', opacity); + }, params.start, params.end); + } + + return {progress: progress}; + } +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +registerVisual(parallelVisual); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @file Get initial data and define sankey view's series model + * @author Deqing Li(annong035@gmail.com) + */ + +var SankeySeries = SeriesModel.extend({ + + type: 'series.sankey', + + layoutInfo: null, + + /** + * Init a graph data structure from data in option series + * + * @param {Object} option the object used to config echarts view + * @return {module:echarts/data/List} storage initial data + */ + getInitialData: function (option) { + var links = option.edges || option.links; + var nodes = option.data || option.nodes; + if (nodes && links) { + var graph = createGraphFromNodeEdge(nodes, links, this, true); + return graph.data; + } + }, + + setNodePosition: function (dataIndex, localPosition) { + var dataItem = this.option.data[dataIndex]; + dataItem.localX = localPosition[0]; + dataItem.localY = localPosition[1]; + }, + + /** + * Return the graphic data structure + * + * @return {module:echarts/data/Graph} graphic data structure + */ + getGraph: function () { + return this.getData().graph; + }, + + /** + * Get edge data of graphic data structure + * + * @return {module:echarts/data/List} data structure of list + */ + getEdgeData: function () { + return this.getGraph().edgeData; + }, + + /** + * @override + */ + formatTooltip: function (dataIndex, multipleSeries, dataType) { + // dataType === 'node' or empty do not show tooltip by default + if (dataType === 'edge') { + var params = this.getDataParams(dataIndex, dataType); + var rawDataOpt = params.data; + var html = rawDataOpt.source + ' -- ' + rawDataOpt.target; + if (params.value) { + html += ' : ' + params.value; + } + return encodeHTML(html); + } + + return SankeySeries.superCall(this, 'formatTooltip', dataIndex, multipleSeries); + }, + + defaultOption: { + zlevel: 0, + z: 2, + + coordinateSystem: 'view', + + layout: null, + + // the position of the whole view + left: '5%', + top: '5%', + right: '20%', + bottom: '5%', + + // the dx of the node + nodeWidth: 20, + + // the vertical distance between two nodes + nodeGap: 8, + + // control if the node can move or not + draggable: true, + + // the number of iterations to change the position of the node + layoutIterations: 32, + + label: { + show: true, + position: 'right', + color: '#000', + fontSize: 12 + }, + + itemStyle: { + borderWidth: 1, + borderColor: '#333' + }, + + lineStyle: { + color: '#314656', + opacity: 0.2, + curveness: 0.5 + }, + + emphasis: { + label: { + show: true + }, + lineStyle: { + opacity: 0.6 + } + }, + + animationEasing: 'linear', + + animationDuration: 1000 + } + +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @file The file used to draw sankey view + * @author Deqing Li(annong035@gmail.com) + */ + +var SankeyShape = extendShape({ + shape: { + x1: 0, y1: 0, + x2: 0, y2: 0, + cpx1: 0, cpy1: 0, + cpx2: 0, cpy2: 0, + + extent: 0 + }, + + buildPath: function (ctx, shape) { + var halfExtent = shape.extent / 2; + ctx.moveTo(shape.x1, shape.y1 - halfExtent); + ctx.bezierCurveTo( + shape.cpx1, shape.cpy1 - halfExtent, + shape.cpx2, shape.cpy2 - halfExtent, + shape.x2, shape.y2 - halfExtent + ); + ctx.lineTo(shape.x2, shape.y2 + halfExtent); + ctx.bezierCurveTo( + shape.cpx2, shape.cpy2 + halfExtent, + shape.cpx1, shape.cpy1 + halfExtent, + shape.x1, shape.y1 + halfExtent + ); + ctx.closePath(); + } +}); + +extendChartView({ + + type: 'sankey', + + /** + * @private + * @type {module:echarts/chart/sankey/SankeySeries} + */ + _model: null, + + render: function (seriesModel, ecModel, api) { + var graph = seriesModel.getGraph(); + var group = this.group; + var layoutInfo = seriesModel.layoutInfo; + // view width + var width = layoutInfo.width; + // view height + var height = layoutInfo.height; + + var nodeData = seriesModel.getData(); + var edgeData = seriesModel.getData('edge'); + + this._model = seriesModel; + + group.removeAll(); + + group.attr('position', [layoutInfo.x, layoutInfo.y]); + + // generate a bezire Curve for each edge + graph.eachEdge(function (edge) { + var curve = new SankeyShape(); + curve.dataIndex = edge.dataIndex; + curve.seriesIndex = seriesModel.seriesIndex; + curve.dataType = 'edge'; + var lineStyleModel = edge.getModel('lineStyle'); + var curvature = lineStyleModel.get('curveness'); + var n1Layout = edge.node1.getLayout(); + var node1Model =edge.node1.getModel(); + var dragX1 = node1Model.get('localX'); + var dragY1 = node1Model.get('localY'); + var n2Layout = edge.node2.getLayout(); + var node2Model = edge.node2.getModel(); + var dragX2 = node2Model.get('localX'); + var dragY2 = node2Model.get('localY'); + var edgeLayout = edge.getLayout(); + + curve.shape.extent = Math.max(1, edgeLayout.dy); + + var x1 = (dragX1 != null ? dragX1 * width : n1Layout.x) + n1Layout.dx; + var y1 = (dragY1 != null ? dragY1 * height : n1Layout.y) + edgeLayout.sy + edgeLayout.dy / 2; + var x2 = dragX2 != null ? dragX2 * width : n2Layout.x; + var y2 = (dragY2 != null ? dragY2 * height : n2Layout.y) + edgeLayout.ty + edgeLayout.dy / 2; + var cpx1 = x1 * (1 - curvature) + x2 * curvature; + var cpy1 = y1; + var cpx2 = x1 * curvature + x2 * (1 - curvature); + var cpy2 = y2; + + curve.setShape({ + x1: x1, + y1: y1, + x2: x2, + y2: y2, + cpx1: cpx1, + cpy1: cpy1, + cpx2: cpx2, + cpy2: cpy2 + }); + + curve.setStyle(lineStyleModel.getItemStyle()); + // Special color, use source node color or target node color + switch (curve.style.fill) { + case 'source': + curve.style.fill = edge.node1.getVisual('color'); + break; + case 'target': + curve.style.fill = edge.node2.getVisual('color'); + break; + } + + setHoverStyle(curve, edge.getModel('emphasis.lineStyle').getItemStyle()); + + group.add(curve); + + edgeData.setItemGraphicEl(edge.dataIndex, curve); + }); + + // generate a rect for each node + graph.eachNode(function (node) { + var layout = node.getLayout(); + var itemModel = node.getModel(); + var dragX = itemModel.get('localX'); + var dragY = itemModel.get('localY'); + var labelModel = itemModel.getModel('label'); + var labelHoverModel = itemModel.getModel('emphasis.label'); + + var rect = new Rect({ + shape: { + x: dragX != null ? dragX * width : layout.x, + y: dragY != null ? dragY * height : layout.y, + width: layout.dx, + height: layout.dy + }, + style: itemModel.getModel('itemStyle').getItemStyle() + }); + + var hoverStyle = node.getModel('emphasis.itemStyle').getItemStyle(); + + setLabelStyle( + rect.style, hoverStyle, labelModel, labelHoverModel, + { + labelFetcher: seriesModel, + labelDataIndex: node.dataIndex, + defaultText: node.id, + isRectText: true + } + ); + + rect.setStyle('fill', node.getVisual('color')); + + setHoverStyle(rect, hoverStyle); + + group.add(rect); + + nodeData.setItemGraphicEl(node.dataIndex, rect); + + rect.dataType = 'node'; + }); + + var draggable = seriesModel.get('draggable'); + if (draggable) { + nodeData.eachItemGraphicEl(function (el, dataIndex) { + el.drift = function (dx, dy) { + this.shape.x += dx; + this.shape.y += dy; + this.dirty(); + api.dispatchAction({ + type: 'dragNode', + seriesId: seriesModel.id, + dataIndex: nodeData.getRawIndex(dataIndex), + localX: this.shape.x / width, + localY: this.shape.y / height + }); + }; + + el.draggable = true; + el.cursor = 'move'; + }); + } + + if (!this._data && seriesModel.get('animation')) { + group.setClipPath(createGridClipShape$2(group.getBoundingRect(), seriesModel, function () { + group.removeClipPath(); + })); + } + + this._data = seriesModel.getData(); + }, + + dispose: function () {} +}); + +// add animation to the view +function createGridClipShape$2(rect, seriesModel, cb) { + var rectEl = new Rect({ + shape: { + x: rect.x - 10, + y: rect.y - 10, + width: 0, + height: rect.height + 20 + } + }); + initProps(rectEl, { + shape: { + width: rect.width + 20, + height: rect.height + 20 + } + }, seriesModel, cb); + + return rectEl; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +registerAction({ + type: 'dragNode', + event: 'dragNode', + // here can only use 'update' now, other value is not support in echarts. + update: 'update' +}, function (payload, ecModel) { + ecModel.eachComponent({mainType: 'series', subType: 'sankey', query: payload}, function (seriesModel) { + seriesModel.setNodePosition(payload.dataIndex, [payload.localX, payload.localY]); + }); +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/* +* The implementation references to d3.js. The use of the source +* code of this file is also subject to the terms and consitions +* of its license (BSD-3Clause, see <echarts/src/licenses/LICENSE-d3>). +*/ + + +/** + * nest helper used to group by the array. + * can specified the keys and sort the keys. + */ +function nest() { + + var keysFunction = []; + var sortKeysFunction = []; + + /** + * map an Array into the mapObject. + * @param {Array} array + * @param {number} depth + */ + function map$$1(array, depth) { + if (depth >= keysFunction.length) { + return array; + } + var i = -1; + var n = array.length; + var keyFunction = keysFunction[depth++]; + var mapObject = {}; + var valuesByKey = {}; + + while (++i < n) { + var keyValue = keyFunction(array[i]); + var values = valuesByKey[keyValue]; + + if (values) { + values.push(array[i]); + } + else { + valuesByKey[keyValue] = [array[i]]; + } + } + + each$1(valuesByKey, function (value, key) { + mapObject[key] = map$$1(value, depth); + }); + + return mapObject; + } + + /** + * transform the Map Object to multidimensional Array + * @param {Object} map + * @param {number} depth + */ + function entriesMap(mapObject, depth) { + if (depth >= keysFunction.length) { + return mapObject; + } + var array = []; + var sortKeyFunction = sortKeysFunction[depth++]; + + each$1(mapObject, function (value, key) { + array.push({ + key: key, values: entriesMap(value, depth) + }); + }); + + if (sortKeyFunction) { + return array.sort(function (a, b) { + return sortKeyFunction(a.key, b.key); + }); + } + else { + return array; + } + } + + return { + /** + * specified the key to groupby the arrays. + * users can specified one more keys. + * @param {Function} d + */ + key: function (d) { + keysFunction.push(d); + return this; + }, + + /** + * specified the comparator to sort the keys + * @param {Function} order + */ + sortKeys: function (order) { + sortKeysFunction[keysFunction.length - 1] = order; + return this; + }, + + /** + * the array to be grouped by. + * @param {Array} array + */ + entries: function (array) { + return entriesMap(map$$1(array, 0), 0); + } + }; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @file The layout algorithm of sankey view + * @author Deqing Li(annong035@gmail.com) + */ + +var sankeyLayout = function (ecModel, api, payload) { + + ecModel.eachSeriesByType('sankey', function (seriesModel) { + + var nodeWidth = seriesModel.get('nodeWidth'); + var nodeGap = seriesModel.get('nodeGap'); + + var layoutInfo = getViewRect$3(seriesModel, api); + + seriesModel.layoutInfo = layoutInfo; + + var width = layoutInfo.width; + var height = layoutInfo.height; + + var graph = seriesModel.getGraph(); + + var nodes = graph.nodes; + var edges = graph.edges; + + computeNodeValues(nodes); + + var filteredNodes = filter(nodes, function (node) { + return node.getLayout().value === 0; + }); + + var iterations = filteredNodes.length !== 0 + ? 0 : seriesModel.get('layoutIterations'); + + layoutSankey(nodes, edges, nodeWidth, nodeGap, width, height, iterations); + }); +}; + +/** + * Get the layout position of the whole view + * + * @param {module:echarts/model/Series} seriesModel the model object of sankey series + * @param {module:echarts/ExtensionAPI} api provide the API list that the developer can call + * @return {module:zrender/core/BoundingRect} size of rect to draw the sankey view + */ +function getViewRect$3(seriesModel, api) { + return getLayoutRect( + seriesModel.getBoxLayoutParams(), { + width: api.getWidth(), + height: api.getHeight() + } + ); +} + +function layoutSankey(nodes, edges, nodeWidth, nodeGap, width, height, iterations) { + computeNodeBreadths(nodes, edges, nodeWidth, width); + computeNodeDepths(nodes, edges, height, nodeGap, iterations); + computeEdgeDepths(nodes); +} + +/** + * Compute the value of each node by summing the associated edge's value + * + * @param {module:echarts/data/Graph~Node} nodes node of sankey view + */ +function computeNodeValues(nodes) { + each$1(nodes, function (node) { + var value1 = sum(node.outEdges, getEdgeValue); + var value2 = sum(node.inEdges, getEdgeValue); + var value = Math.max(value1, value2); + node.setLayout({value: value}, true); + }); +} + +/** + * Compute the x-position for each node. + * + * Here we use Kahn algorithm to detect cycle when we traverse + * the node to computer the initial x position. + * + * @param {module:echarts/data/Graph~Node} nodes node of sankey view + * @param {number} nodeWidth the dx of the node + * @param {number} width the whole width of the area to draw the view + */ +function computeNodeBreadths(nodes, edges, nodeWidth, width) { + // Used to mark whether the edge is deleted. if it is deleted, + // the value is 0, otherwise it is 1. + var remainEdges = []; + // Storage each node's indegree. + var indegreeArr = []; + //Used to storage the node with indegree is equal to 0. + var zeroIndegrees = []; + var nextNode = []; + var x = 0; + var kx = 0; + + for (var i = 0; i < edges.length; i++) { + remainEdges[i] = 1; + } + + for (var i = 0; i < nodes.length; i++) { + indegreeArr[i] = nodes[i].inEdges.length; + if (indegreeArr[i] === 0) { + zeroIndegrees.push(nodes[i]); + } + } + + while (zeroIndegrees.length) { + each$1(zeroIndegrees, function (node) { + node.setLayout({x: x}, true); + node.setLayout({dx: nodeWidth}, true); + each$1(node.outEdges, function (edge) { + var indexEdge = edges.indexOf(edge); + remainEdges[indexEdge] = 0; + var targetNode = edge.node2; + var nodeIndex = nodes.indexOf(targetNode); + if (--indegreeArr[nodeIndex] === 0) { + nextNode.push(targetNode); + } + }); + }); + + ++x; + zeroIndegrees = nextNode; + nextNode = []; + } + + for (var i = 0; i < remainEdges.length; i++) { + if (__DEV__) { + if (remainEdges[i] === 1) { + throw new Error('Sankey is a DAG, the original data has cycle!'); + } + } + } + + moveSinksRight(nodes, x); + kx = (width - nodeWidth) / (x - 1); + + scaleNodeBreadths(nodes, kx); +} + +/** + * All the node without outEgdes are assigned maximum x-position and + * be aligned in the last column. + * + * @param {module:echarts/data/Graph~Node} nodes node of sankey view + * @param {number} x value (x-1) use to assign to node without outEdges + * as x-position + */ +function moveSinksRight(nodes, x) { + each$1(nodes, function (node) { + if (!node.outEdges.length) { + node.setLayout({x: x - 1}, true); + } + }); +} + +/** + * Scale node x-position to the width + * + * @param {module:echarts/data/Graph~Node} nodes node of sankey view + * @param {number} kx multiple used to scale nodes + */ +function scaleNodeBreadths(nodes, kx) { + each$1(nodes, function (node) { + var nodeX = node.getLayout().x * kx; + node.setLayout({x: nodeX}, true); + }); +} + +/** + * Using Gauss-Seidel iterations method to compute the node depth(y-position) + * + * @param {module:echarts/data/Graph~Node} nodes node of sankey view + * @param {module:echarts/data/Graph~Edge} edges edge of sankey view + * @param {number} height the whole height of the area to draw the view + * @param {number} nodeGap the vertical distance between two nodes + * in the same column. + * @param {number} iterations the number of iterations for the algorithm + */ +function computeNodeDepths(nodes, edges, height, nodeGap, iterations) { + var nodesByBreadth = nest() + .key(function (d) { + return d.getLayout().x; + }) + .sortKeys(ascending) + .entries(nodes) + .map(function (d) { + return d.values; + }); + + initializeNodeDepth(nodes, nodesByBreadth, edges, height, nodeGap); + resolveCollisions(nodesByBreadth, nodeGap, height); + + for (var alpha = 1; iterations > 0; iterations--) { + // 0.99 is a experience parameter, ensure that each iterations of + // changes as small as possible. + alpha *= 0.99; + relaxRightToLeft(nodesByBreadth, alpha); + resolveCollisions(nodesByBreadth, nodeGap, height); + relaxLeftToRight(nodesByBreadth, alpha); + resolveCollisions(nodesByBreadth, nodeGap, height); + } +} + +/** + * Compute the original y-position for each node + * + * @param {module:echarts/data/Graph~Node} nodes node of sankey view + * @param {Array.<Array.<module:echarts/data/Graph~Node>>} nodesByBreadth + * group by the array of all sankey nodes based on the nodes x-position. + * @param {module:echarts/data/Graph~Edge} edges edge of sankey view + * @param {number} height the whole height of the area to draw the view + * @param {number} nodeGap the vertical distance between two nodes + */ +function initializeNodeDepth(nodes, nodesByBreadth, edges, height, nodeGap) { + var kyArray = []; + each$1(nodesByBreadth, function (nodes) { + var n = nodes.length; + var sum = 0; + each$1(nodes, function (node) { + sum += node.getLayout().value; + }); + var ky = (height - (n - 1) * nodeGap) / sum; + kyArray.push(ky); + }); + + kyArray.sort(function (a, b) { + return a - b; + }); + var ky0 = kyArray[0]; + + each$1(nodesByBreadth, function (nodes) { + each$1(nodes, function (node, i) { + node.setLayout({y: i}, true); + var nodeDy = node.getLayout().value * ky0; + node.setLayout({dy: nodeDy}, true); + }); + }); + + each$1(edges, function (edge) { + var edgeDy = +edge.getValue() * ky0; + edge.setLayout({dy: edgeDy}, true); + }); +} + +/** + * Resolve the collision of initialized depth (y-position) + * + * @param {Array.<Array.<module:echarts/data/Graph~Node>>} nodesByBreadth + * group by the array of all sankey nodes based on the nodes x-position. + * @param {number} nodeGap the vertical distance between two nodes + * @param {number} height the whole height of the area to draw the view + */ +function resolveCollisions(nodesByBreadth, nodeGap, height) { + each$1(nodesByBreadth, function (nodes) { + var node; + var dy; + var y0 = 0; + var n = nodes.length; + var i; + + nodes.sort(ascendingDepth); + + for (i = 0; i < n; i++) { + node = nodes[i]; + dy = y0 - node.getLayout().y; + if (dy > 0) { + var nodeY = node.getLayout().y + dy; + node.setLayout({y: nodeY}, true); + } + y0 = node.getLayout().y + node.getLayout().dy + nodeGap; + } + + // If the bottommost node goes outside the bounds, push it back up + dy = y0 - nodeGap - height; + if (dy > 0) { + var nodeY = node.getLayout().y - dy; + node.setLayout({y: nodeY}, true); + y0 = node.getLayout().y; + for (i = n - 2; i >= 0; --i) { + node = nodes[i]; + dy = node.getLayout().y + node.getLayout().dy + nodeGap - y0; + if (dy > 0) { + nodeY = node.getLayout().y - dy; + node.setLayout({y: nodeY}, true); + } + y0 = node.getLayout().y; + } + } + }); +} + +/** + * Change the y-position of the nodes, except most the right side nodes + * + * @param {Array.<Array.<module:echarts/data/Graph~Node>>} nodesByBreadth + * group by the array of all sankey nodes based on the node x-position. + * @param {number} alpha parameter used to adjust the nodes y-position + */ +function relaxRightToLeft(nodesByBreadth, alpha) { + each$1(nodesByBreadth.slice().reverse(), function (nodes) { + each$1(nodes, function (node) { + if (node.outEdges.length) { + var y = sum(node.outEdges, weightedTarget) / sum(node.outEdges, getEdgeValue); + var nodeY = node.getLayout().y + (y - center$1(node)) * alpha; + node.setLayout({y: nodeY}, true); + } + }); + }); +} + +function weightedTarget(edge) { + return center$1(edge.node2) * edge.getValue(); +} + +/** + * Change the y-position of the nodes, except most the left side nodes + * + * @param {Array.<Array.<module:echarts/data/Graph~Node>>} nodesByBreadth + * group by the array of all sankey nodes based on the node x-position. + * @param {number} alpha parameter used to adjust the nodes y-position + */ +function relaxLeftToRight(nodesByBreadth, alpha) { + each$1(nodesByBreadth, function (nodes) { + each$1(nodes, function (node) { + if (node.inEdges.length) { + var y = sum(node.inEdges, weightedSource) / sum(node.inEdges, getEdgeValue); + var nodeY = node.getLayout().y + (y - center$1(node)) * alpha; + node.setLayout({y: nodeY}, true); + } + }); + }); +} + +function weightedSource(edge) { + return center$1(edge.node1) * edge.getValue(); +} + +/** + * Compute the depth(y-position) of each edge + * + * @param {module:echarts/data/Graph~Node} nodes node of sankey view + */ +function computeEdgeDepths(nodes) { + each$1(nodes, function (node) { + node.outEdges.sort(ascendingTargetDepth); + node.inEdges.sort(ascendingSourceDepth); + }); + each$1(nodes, function (node) { + var sy = 0; + var ty = 0; + each$1(node.outEdges, function (edge) { + edge.setLayout({sy: sy}, true); + sy += edge.getLayout().dy; + }); + each$1(node.inEdges, function (edge) { + edge.setLayout({ty: ty}, true); + ty += edge.getLayout().dy; + }); + }); +} + +function ascendingTargetDepth(a, b) { + return a.node2.getLayout().y - b.node2.getLayout().y; +} + +function ascendingSourceDepth(a, b) { + return a.node1.getLayout().y - b.node1.getLayout().y; +} + +function sum(array, f) { + var sum = 0; + var len = array.length; + var i = -1; + while (++i < len) { + var value = +f.call(array, array[i], i); + if (!isNaN(value)) { + sum += value; + } + } + return sum; +} + +function center$1(node) { + return node.getLayout().y + node.getLayout().dy / 2; +} + +function ascendingDepth(a, b) { + return a.getLayout().y - b.getLayout().y; +} + +function ascending(a, b) { + return a - b; +} + +function getEdgeValue(edge) { + return edge.getValue(); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @file Visual encoding for sankey view + * @author Deqing Li(annong035@gmail.com) + */ + +var sankeyVisual = function (ecModel, payload) { + ecModel.eachSeriesByType('sankey', function (seriesModel) { + var graph = seriesModel.getGraph(); + var nodes = graph.nodes; + if (nodes.length) { + var minValue = Infinity; + var maxValue = -Infinity; + each$1(nodes, function (node) { + var nodeValue = node.getLayout().value; + if (nodeValue < minValue) { + minValue = nodeValue; + } + if (nodeValue > maxValue) { + maxValue = nodeValue; + } + }); + + each$1(nodes, function (node) { + var mapping = new VisualMapping({ + type: 'color', + mappingMethod: 'linear', + dataExtent: [minValue, maxValue], + visual: seriesModel.get('color') + }); + + var mapValueToColor = mapping.mapValueToVisual(node.getLayout().value); + node.setVisual('color', mapValueToColor); + // If set itemStyle.normal.color + var itemModel = node.getModel(); + var customColor = itemModel.get('itemStyle.color'); + if (customColor != null) { + node.setVisual('color', customColor); + } + }); + } + }); +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +registerLayout(sankeyLayout); +registerVisual(sankeyVisual); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +var seriesModelMixin = { + + /** + * @private + * @type {string} + */ + _baseAxisDim: null, + + /** + * @override + */ + getInitialData: function (option, ecModel) { + // When both types of xAxis and yAxis are 'value', layout is + // needed to be specified by user. Otherwise, layout can be + // judged by which axis is category. + + var ordinalMeta; + + var xAxisModel = ecModel.getComponent('xAxis', this.get('xAxisIndex')); + var yAxisModel = ecModel.getComponent('yAxis', this.get('yAxisIndex')); + var xAxisType = xAxisModel.get('type'); + var yAxisType = yAxisModel.get('type'); + var addOrdinal; + + // FIXME + // 考虑时间轴 + + if (xAxisType === 'category') { + option.layout = 'horizontal'; + ordinalMeta = xAxisModel.getOrdinalMeta(); + addOrdinal = true; + } + else if (yAxisType === 'category') { + option.layout = 'vertical'; + ordinalMeta = yAxisModel.getOrdinalMeta(); + addOrdinal = true; + } + else { + option.layout = option.layout || 'horizontal'; + } + + var coordDims = ['x', 'y']; + var baseAxisDimIndex = option.layout === 'horizontal' ? 0 : 1; + var baseAxisDim = this._baseAxisDim = coordDims[baseAxisDimIndex]; + var otherAxisDim = coordDims[1 - baseAxisDimIndex]; + var axisModels = [xAxisModel, yAxisModel]; + var baseAxisType = axisModels[baseAxisDimIndex].get('type'); + var otherAxisType = axisModels[1 - baseAxisDimIndex].get('type'); + var data = option.data; + + // ??? FIXME make a stage to perform data transfrom. + // MUST create a new data, consider setOption({}) again. + if (data && addOrdinal) { + var newOptionData = []; + each$1(data, function (item, index) { + var newItem; + if (item.value && isArray(item.value)) { + newItem = item.value.slice(); + item.value.unshift(index); + } + else if (isArray(item)) { + newItem = item.slice(); + item.unshift(index); + } + else { + newItem = item; + } + newOptionData.push(newItem); + }); + option.data = newOptionData; + } + + var defaultValueDimensions = this.defaultValueDimensions; + + return createListSimply( + this, + { + coordDimensions: [{ + name: baseAxisDim, + type: getDimensionTypeByAxis(baseAxisType), + ordinalMeta: ordinalMeta, + otherDims: { + tooltip: false, + itemName: 0 + }, + dimsDef: ['base'] + }, { + name: otherAxisDim, + type: getDimensionTypeByAxis(otherAxisType), + dimsDef: defaultValueDimensions.slice() + }], + dimensionsCount: defaultValueDimensions.length + 1 + } + ); + }, + + /** + * If horizontal, base axis is x, otherwise y. + * @override + */ + getBaseAxis: function () { + var dim = this._baseAxisDim; + return this.ecModel.getComponent(dim + 'Axis', this.get(dim + 'AxisIndex')).axis; + } + +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var BoxplotSeries = SeriesModel.extend({ + + type: 'series.boxplot', + + dependencies: ['xAxis', 'yAxis', 'grid'], + + // TODO + // box width represents group size, so dimension should have 'size'. + + /** + * @see <https://en.wikipedia.org/wiki/Box_plot> + * The meanings of 'min' and 'max' depend on user, + * and echarts do not need to know it. + * @readOnly + */ + defaultValueDimensions: [ + {name: 'min', defaultTooltip: true}, + {name: 'Q1', defaultTooltip: true}, + {name: 'median', defaultTooltip: true}, + {name: 'Q3', defaultTooltip: true}, + {name: 'max', defaultTooltip: true} + ], + + /** + * @type {Array.<string>} + * @readOnly + */ + dimensions: null, + + /** + * @override + */ + defaultOption: { + zlevel: 0, // 一级层叠 + z: 2, // 二级层叠 + coordinateSystem: 'cartesian2d', + legendHoverLink: true, + + hoverAnimation: true, + + // xAxisIndex: 0, + // yAxisIndex: 0, + + layout: null, // 'horizontal' or 'vertical' + boxWidth: [7, 50], // [min, max] can be percent of band width. + + itemStyle: { + color: '#fff', + borderWidth: 1 + }, + + emphasis: { + itemStyle: { + borderWidth: 2, + shadowBlur: 5, + shadowOffsetX: 2, + shadowOffsetY: 2, + shadowColor: 'rgba(0,0,0,0.4)' + } + }, + + animationEasing: 'elasticOut', + animationDuration: 800 + } +}); + +mixin(BoxplotSeries, seriesModelMixin, true); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// Update common properties +var NORMAL_ITEM_STYLE_PATH = ['itemStyle']; +var EMPHASIS_ITEM_STYLE_PATH = ['emphasis', 'itemStyle']; + +var BoxplotView = Chart.extend({ + + type: 'boxplot', + + render: function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var group = this.group; + var oldData = this._data; + + // There is no old data only when first rendering or switching from + // stream mode to normal mode, where previous elements should be removed. + if (!this._data) { + group.removeAll(); + } + + var constDim = seriesModel.get('layout') === 'horizontal' ? 1 : 0; + + data.diff(oldData) + .add(function (newIdx) { + if (data.hasValue(newIdx)) { + var itemLayout = data.getItemLayout(newIdx); + var symbolEl = createNormalBox(itemLayout, data, newIdx, constDim, true); + data.setItemGraphicEl(newIdx, symbolEl); + group.add(symbolEl); + } + }) + .update(function (newIdx, oldIdx) { + var symbolEl = oldData.getItemGraphicEl(oldIdx); + + // Empty data + if (!data.hasValue(newIdx)) { + group.remove(symbolEl); + return; + } + + var itemLayout = data.getItemLayout(newIdx); + if (!symbolEl) { + symbolEl = createNormalBox(itemLayout, data, newIdx, constDim); + } + else { + updateNormalBoxData(itemLayout, symbolEl, data, newIdx); + } + + group.add(symbolEl); + + data.setItemGraphicEl(newIdx, symbolEl); + }) + .remove(function (oldIdx) { + var el = oldData.getItemGraphicEl(oldIdx); + el && group.remove(el); + }) + .execute(); + + this._data = data; + }, + + remove: function (ecModel) { + var group = this.group; + var data = this._data; + this._data = null; + data && data.eachItemGraphicEl(function (el) { + el && group.remove(el); + }); + }, + + dispose: noop + +}); + + +var BoxPath = Path.extend({ + + type: 'boxplotBoxPath', + + shape: {}, + + buildPath: function (ctx, shape) { + var ends = shape.points; + + var i = 0; + ctx.moveTo(ends[i][0], ends[i][1]); + i++; + for (; i < 4; i++) { + ctx.lineTo(ends[i][0], ends[i][1]); + } + ctx.closePath(); + + for (; i < ends.length; i++) { + ctx.moveTo(ends[i][0], ends[i][1]); + i++; + ctx.lineTo(ends[i][0], ends[i][1]); + } + } +}); + + +function createNormalBox(itemLayout, data, dataIndex, constDim, isInit) { + var ends = itemLayout.ends; + + var el = new BoxPath({ + shape: { + points: isInit + ? transInit(ends, constDim, itemLayout) + : ends + } + }); + + updateNormalBoxData(itemLayout, el, data, dataIndex, isInit); + + return el; +} + +function updateNormalBoxData(itemLayout, el, data, dataIndex, isInit) { + var seriesModel = data.hostModel; + var updateMethod = graphic[isInit ? 'initProps' : 'updateProps']; + + updateMethod( + el, + {shape: {points: itemLayout.ends}}, + seriesModel, + dataIndex + ); + + var itemModel = data.getItemModel(dataIndex); + var normalItemStyleModel = itemModel.getModel(NORMAL_ITEM_STYLE_PATH); + var borderColor = data.getItemVisual(dataIndex, 'color'); + + // Exclude borderColor. + var itemStyle = normalItemStyleModel.getItemStyle(['borderColor']); + itemStyle.stroke = borderColor; + itemStyle.strokeNoScale = true; + el.useStyle(itemStyle); + + el.z2 = 100; + + var hoverStyle = itemModel.getModel(EMPHASIS_ITEM_STYLE_PATH).getItemStyle(); + setHoverStyle(el, hoverStyle); +} + +function transInit(points, dim, itemLayout) { + return map(points, function (point) { + point = point.slice(); + point[dim] = itemLayout.initBaseline; + return point; + }); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +var borderColorQuery = ['itemStyle', 'borderColor']; + +var boxplotVisual = function (ecModel, api) { + + var globalColors = ecModel.get('color'); + + ecModel.eachRawSeriesByType('boxplot', function (seriesModel) { + + var defaulColor = globalColors[seriesModel.seriesIndex % globalColors.length]; + var data = seriesModel.getData(); + + data.setVisual({ + legendSymbol: 'roundRect', + // Use name 'color' but not 'borderColor' for legend usage and + // visual coding from other component like dataRange. + color: seriesModel.get(borderColorQuery) || defaulColor + }); + + // Only visible series has each data be visual encoded + if (!ecModel.isSeriesFiltered(seriesModel)) { + data.each(function (idx) { + var itemModel = data.getItemModel(idx); + data.setItemVisual( + idx, + {color: itemModel.get(borderColorQuery, true)} + ); + }); + } + }); + +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var each$13 = each$1; + +var boxplotLayout = function (ecModel) { + + var groupResult = groupSeriesByAxis(ecModel); + + each$13(groupResult, function (groupItem) { + var seriesModels = groupItem.seriesModels; + + if (!seriesModels.length) { + return; + } + + calculateBase(groupItem); + + each$13(seriesModels, function (seriesModel, idx) { + layoutSingleSeries( + seriesModel, + groupItem.boxOffsetList[idx], + groupItem.boxWidthList[idx] + ); + }); + }); +}; + +/** + * Group series by axis. + */ +function groupSeriesByAxis(ecModel) { + var result = []; + var axisList = []; + + ecModel.eachSeriesByType('boxplot', function (seriesModel) { + var baseAxis = seriesModel.getBaseAxis(); + var idx = indexOf(axisList, baseAxis); + + if (idx < 0) { + idx = axisList.length; + axisList[idx] = baseAxis; + result[idx] = {axis: baseAxis, seriesModels: []}; + } + + result[idx].seriesModels.push(seriesModel); + }); + + return result; +} + +/** + * Calculate offset and box width for each series. + */ +function calculateBase(groupItem) { + var extent; + var baseAxis = groupItem.axis; + var seriesModels = groupItem.seriesModels; + var seriesCount = seriesModels.length; + + var boxWidthList = groupItem.boxWidthList = []; + var boxOffsetList = groupItem.boxOffsetList = []; + var boundList = []; + + var bandWidth; + if (baseAxis.type === 'category') { + bandWidth = baseAxis.getBandWidth(); + } + else { + var maxDataCount = 0; + each$13(seriesModels, function (seriesModel) { + maxDataCount = Math.max(maxDataCount, seriesModel.getData().count()); + }); + extent = baseAxis.getExtent(), + Math.abs(extent[1] - extent[0]) / maxDataCount; + } + + each$13(seriesModels, function (seriesModel) { + var boxWidthBound = seriesModel.get('boxWidth'); + if (!isArray(boxWidthBound)) { + boxWidthBound = [boxWidthBound, boxWidthBound]; + } + boundList.push([ + parsePercent$1(boxWidthBound[0], bandWidth) || 0, + parsePercent$1(boxWidthBound[1], bandWidth) || 0 + ]); + }); + + var availableWidth = bandWidth * 0.8 - 2; + var boxGap = availableWidth / seriesCount * 0.3; + var boxWidth = (availableWidth - boxGap * (seriesCount - 1)) / seriesCount; + var base = boxWidth / 2 - availableWidth / 2; + + each$13(seriesModels, function (seriesModel, idx) { + boxOffsetList.push(base); + base += boxGap + boxWidth; + + boxWidthList.push( + Math.min(Math.max(boxWidth, boundList[idx][0]), boundList[idx][1]) + ); + }); +} + +/** + * Calculate points location for each series. + */ +function layoutSingleSeries(seriesModel, offset, boxWidth) { + var coordSys = seriesModel.coordinateSystem; + var data = seriesModel.getData(); + var halfWidth = boxWidth / 2; + var cDimIdx = seriesModel.get('layout') === 'horizontal' ? 0 : 1; + var vDimIdx = 1 - cDimIdx; + var coordDims = ['x', 'y']; + var cDim = data.mapDimension(coordDims[cDimIdx]); + var vDims = data.mapDimension(coordDims[vDimIdx], true); + + if (cDim == null || vDims.length < 5) { + return; + } + + for (var dataIndex = 0; dataIndex < data.count(); dataIndex++) { + var axisDimVal = data.get(cDim, dataIndex); + + var median = getPoint(axisDimVal, vDims[2], dataIndex); + var end1 = getPoint(axisDimVal, vDims[0], dataIndex); + var end2 = getPoint(axisDimVal, vDims[1], dataIndex); + var end4 = getPoint(axisDimVal, vDims[3], dataIndex); + var end5 = getPoint(axisDimVal, vDims[4], dataIndex); + + var ends = []; + addBodyEnd(ends, end2, 0); + addBodyEnd(ends, end4, 1); + + ends.push(end1, end2, end5, end4); + layEndLine(ends, end1); + layEndLine(ends, end5); + layEndLine(ends, median); + + data.setItemLayout(dataIndex, { + initBaseline: median[vDimIdx], + ends: ends + }); + } + + function getPoint(axisDimVal, dimIdx, dataIndex) { + var val = data.get(dimIdx, dataIndex); + var p = []; + p[cDimIdx] = axisDimVal; + p[vDimIdx] = val; + var point; + if (isNaN(axisDimVal) || isNaN(val)) { + point = [NaN, NaN]; + } + else { + point = coordSys.dataToPoint(p); + point[cDimIdx] += offset; + } + return point; + } + + function addBodyEnd(ends, point, start) { + var point1 = point.slice(); + var point2 = point.slice(); + point1[cDimIdx] += halfWidth; + point2[cDimIdx] -= halfWidth; + start + ? ends.push(point1, point2) + : ends.push(point2, point1); + } + + function layEndLine(ends, endCenter) { + var from = endCenter.slice(); + var to = endCenter.slice(); + from[cDimIdx] -= halfWidth; + to[cDimIdx] += halfWidth; + ends.push(from, to); + } +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +registerVisual(boxplotVisual); +registerLayout(boxplotLayout); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var CandlestickSeries = SeriesModel.extend({ + + type: 'series.candlestick', + + dependencies: ['xAxis', 'yAxis', 'grid'], + + /** + * @readOnly + */ + defaultValueDimensions: [ + {name: 'open', defaultTooltip: true}, + {name: 'close', defaultTooltip: true}, + {name: 'lowest', defaultTooltip: true}, + {name: 'highest', defaultTooltip: true} + ], + + /** + * @type {Array.<string>} + * @readOnly + */ + dimensions: null, + + /** + * @override + */ + defaultOption: { + zlevel: 0, + z: 2, + coordinateSystem: 'cartesian2d', + legendHoverLink: true, + + hoverAnimation: true, + + // xAxisIndex: 0, + // yAxisIndex: 0, + + layout: null, // 'horizontal' or 'vertical' + + itemStyle: { + color: '#c23531', // 阳线 positive + color0: '#314656', // 阴线 negative '#c23531', '#314656' + borderWidth: 1, + // FIXME + // ec2中使用的是lineStyle.color 和 lineStyle.color0 + borderColor: '#c23531', + borderColor0: '#314656' + }, + + emphasis: { + itemStyle: { + borderWidth: 2 + } + }, + + barMaxWidth: null, + barMinWidth: null, + barWidth: null, + + large: true, + largeThreshold: 600, + + progressive: 3e3, + progressiveThreshold: 1e4, + progressiveChunkMode: 'mod', + + animationUpdate: false, + animationEasing: 'linear', + animationDuration: 300 + }, + + /** + * Get dimension for shadow in dataZoom + * @return {string} dimension name + */ + getShadowDim: function () { + return 'open'; + }, + + brushSelector: function (dataIndex, data, selectors) { + var itemLayout = data.getItemLayout(dataIndex); + return itemLayout && selectors.rect(itemLayout.brushRect); + } + +}); + +mixin(CandlestickSeries, seriesModelMixin, true); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var NORMAL_ITEM_STYLE_PATH$1 = ['itemStyle']; +var EMPHASIS_ITEM_STYLE_PATH$1 = ['emphasis', 'itemStyle']; +var SKIP_PROPS = ['color', 'color0', 'borderColor', 'borderColor0']; + + +var CandlestickView = Chart.extend({ + + type: 'candlestick', + + render: function (seriesModel, ecModel, api) { + this._updateDrawMode(seriesModel); + + this._isLargeDraw + ? this._renderLarge(seriesModel) + : this._renderNormal(seriesModel); + }, + + incrementalPrepareRender: function (seriesModel, ecModel, api) { + this._clear(); + this._updateDrawMode(seriesModel); + }, + + incrementalRender: function (params, seriesModel, ecModel, api) { + this._isLargeDraw + ? this._incrementalRenderLarge(params, seriesModel) + : this._incrementalRenderNormal(params, seriesModel); + }, + + _updateDrawMode: function (seriesModel) { + var isLargeDraw = seriesModel.pipelineContext.large; + if (this._isLargeDraw == null || isLargeDraw ^ this._isLargeDraw) { + this._isLargeDraw = isLargeDraw; + this._clear(); + } + }, + + _renderNormal: function (seriesModel) { + var data = seriesModel.getData(); + var oldData = this._data; + var group = this.group; + var isSimpleBox = data.getLayout('isSimpleBox'); + + // There is no old data only when first rendering or switching from + // stream mode to normal mode, where previous elements should be removed. + if (!this._data) { + group.removeAll(); + } + + data.diff(oldData) + .add(function (newIdx) { + if (data.hasValue(newIdx)) { + var el; + + var itemLayout = data.getItemLayout(newIdx); + el = createNormalBox$1(itemLayout, newIdx, true); + initProps(el, {shape: {points: itemLayout.ends}}, seriesModel, newIdx); + + setBoxCommon(el, data, newIdx, isSimpleBox); + + group.add(el); + data.setItemGraphicEl(newIdx, el); + } + }) + .update(function (newIdx, oldIdx) { + var el = oldData.getItemGraphicEl(oldIdx); + + // Empty data + if (!data.hasValue(newIdx)) { + group.remove(el); + return; + } + + var itemLayout = data.getItemLayout(newIdx); + if (!el) { + el = createNormalBox$1(itemLayout, newIdx); + } + else { + updateProps(el, {shape: {points: itemLayout.ends}}, seriesModel, newIdx); + } + + setBoxCommon(el, data, newIdx, isSimpleBox); + + group.add(el); + data.setItemGraphicEl(newIdx, el); + }) + .remove(function (oldIdx) { + var el = oldData.getItemGraphicEl(oldIdx); + el && group.remove(el); + }) + .execute(); + + this._data = data; + }, + + _renderLarge: function (seriesModel) { + this._clear(); + createLarge$1(seriesModel, this.group); + }, + + _incrementalRenderNormal: function (params, seriesModel) { + var data = seriesModel.getData(); + var isSimpleBox = data.getLayout('isSimpleBox'); + + var dataIndex; + while ((dataIndex = params.next()) != null) { + var el; + + var itemLayout = data.getItemLayout(dataIndex); + el = createNormalBox$1(itemLayout, dataIndex); + setBoxCommon(el, data, dataIndex, isSimpleBox); + + el.incremental = true; + this.group.add(el); + } + }, + + _incrementalRenderLarge: function (params, seriesModel) { + createLarge$1(seriesModel, this.group, true); + }, + + remove: function (ecModel) { + this._clear(); + }, + + _clear: function () { + this.group.removeAll(); + this._data = null; + }, + + dispose: noop + +}); + + +var NormalBoxPath = Path.extend({ + + type: 'normalCandlestickBox', + + shape: {}, + + buildPath: function (ctx, shape) { + var ends = shape.points; + + if (this.__simpleBox) { + ctx.moveTo(ends[4][0], ends[4][1]); + ctx.lineTo(ends[6][0], ends[6][1]); + } + else { + ctx.moveTo(ends[0][0], ends[0][1]); + ctx.lineTo(ends[1][0], ends[1][1]); + ctx.lineTo(ends[2][0], ends[2][1]); + ctx.lineTo(ends[3][0], ends[3][1]); + ctx.closePath(); + + ctx.moveTo(ends[4][0], ends[4][1]); + ctx.lineTo(ends[5][0], ends[5][1]); + ctx.moveTo(ends[6][0], ends[6][1]); + ctx.lineTo(ends[7][0], ends[7][1]); + } + } +}); + +function createNormalBox$1(itemLayout, dataIndex, isInit) { + var ends = itemLayout.ends; + return new NormalBoxPath({ + shape: { + points: isInit + ? transInit$1(ends, itemLayout) + : ends + }, + z2: 100 + }); +} + +function setBoxCommon(el, data, dataIndex, isSimpleBox) { + var itemModel = data.getItemModel(dataIndex); + var normalItemStyleModel = itemModel.getModel(NORMAL_ITEM_STYLE_PATH$1); + var color = data.getItemVisual(dataIndex, 'color'); + var borderColor = data.getItemVisual(dataIndex, 'borderColor') || color; + + // Color must be excluded. + // Because symbol provide setColor individually to set fill and stroke + var itemStyle = normalItemStyleModel.getItemStyle(SKIP_PROPS); + + el.useStyle(itemStyle); + el.style.strokeNoScale = true; + el.style.fill = color; + el.style.stroke = borderColor; + + el.__simpleBox = isSimpleBox; + + var hoverStyle = itemModel.getModel(EMPHASIS_ITEM_STYLE_PATH$1).getItemStyle(); + setHoverStyle(el, hoverStyle); +} + +function transInit$1(points, itemLayout) { + return map(points, function (point) { + point = point.slice(); + point[1] = itemLayout.initBaseline; + return point; + }); +} + + + +var LargeBoxPath = Path.extend({ + + type: 'largeCandlestickBox', + + shape: {}, + + buildPath: function (ctx, shape) { + // Drawing lines is more efficient than drawing + // a whole line or drawing rects. + var points = shape.points; + for (var i = 0; i < points.length;) { + if (this.__sign === points[i++]) { + var x = points[i++]; + ctx.moveTo(x, points[i++]); + ctx.lineTo(x, points[i++]); + } + else { + i += 3; + } + } + } +}); + +function createLarge$1(seriesModel, group, incremental) { + var data = seriesModel.getData(); + var largePoints = data.getLayout('largePoints'); + + var elP = new LargeBoxPath({ + shape: {points: largePoints}, + __sign: 1 + }); + group.add(elP); + var elN = new LargeBoxPath({ + shape: {points: largePoints}, + __sign: -1 + }); + group.add(elN); + + setLargeStyle$1(1, elP, seriesModel, data); + setLargeStyle$1(-1, elN, seriesModel, data); + + if (incremental) { + elP.incremental = true; + elN.incremental = true; + } +} + +function setLargeStyle$1(sign, el, seriesModel, data) { + var suffix = sign > 0 ? 'P' : 'N'; + var borderColor = data.getVisual('borderColor' + suffix) + || data.getVisual('color' + suffix); + + // Color must be excluded. + // Because symbol provide setColor individually to set fill and stroke + var itemStyle = seriesModel.getModel(NORMAL_ITEM_STYLE_PATH$1).getItemStyle(SKIP_PROPS); + + el.useStyle(itemStyle); + el.style.fill = null; + el.style.stroke = borderColor; + // No different + // el.style.lineWidth = .5; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var preprocessor = function (option) { + if (!option || !isArray(option.series)) { + return; + } + + // Translate 'k' to 'candlestick'. + each$1(option.series, function (seriesItem) { + if (isObject$1(seriesItem) && seriesItem.type === 'k') { + seriesItem.type = 'candlestick'; + } + }); +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var positiveBorderColorQuery = ['itemStyle', 'borderColor']; +var negativeBorderColorQuery = ['itemStyle', 'borderColor0']; +var positiveColorQuery = ['itemStyle', 'color']; +var negativeColorQuery = ['itemStyle', 'color0']; + +var candlestickVisual = { + + seriesType: 'candlestick', + + plan: createRenderPlanner(), + + // For legend. + performRawSeries: true, + + reset: function (seriesModel, ecModel) { + + var data = seriesModel.getData(); + var isLargeRender = seriesModel.pipelineContext.large; + + data.setVisual({ + legendSymbol: 'roundRect', + colorP: getColor(1, seriesModel), + colorN: getColor(-1, seriesModel), + borderColorP: getBorderColor(1, seriesModel), + borderColorN: getBorderColor(-1, seriesModel) + }); + + // Only visible series has each data be visual encoded + if (ecModel.isSeriesFiltered(seriesModel)) { + return; + } + + return !isLargeRender && {progress: progress}; + + + function progress(params, data) { + var dataIndex; + while ((dataIndex = params.next()) != null) { + var itemModel = data.getItemModel(dataIndex); + var sign = data.getItemLayout(dataIndex).sign; + + data.setItemVisual( + dataIndex, + { + color: getColor(sign, itemModel), + borderColor: getBorderColor(sign, itemModel) + } + ); + } + } + + function getColor(sign, model) { + return model.get( + sign > 0 ? positiveColorQuery : negativeColorQuery + ); + } + + function getBorderColor(sign, model) { + return model.get( + sign > 0 ? positiveBorderColorQuery : negativeBorderColorQuery + ); + } + + } + +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var LargeArr$1 = typeof Float32Array !== 'undefined' ? Float32Array : Array; + +var candlestickLayout = { + + seriesType: 'candlestick', + + plan: createRenderPlanner(), + + reset: function (seriesModel) { + + var coordSys = seriesModel.coordinateSystem; + var data = seriesModel.getData(); + var candleWidth = calculateCandleWidth(seriesModel, data); + var cDimIdx = 0; + var vDimIdx = 1; + var coordDims = ['x', 'y']; + var cDim = data.mapDimension(coordDims[cDimIdx]); + var vDims = data.mapDimension(coordDims[vDimIdx], true); + var openDim = vDims[0]; + var closeDim = vDims[1]; + var lowestDim = vDims[2]; + var highestDim = vDims[3]; + + data.setLayout({ + candleWidth: candleWidth, + // The value is experimented visually. + isSimpleBox: candleWidth <= 1.3 + }); + + if (cDim == null || vDims.length < 4) { + return; + } + + return { + progress: seriesModel.pipelineContext.large + ? largeProgress : normalProgress + }; + + function normalProgress(params, data) { + var dataIndex; + while ((dataIndex = params.next()) != null) { + + var axisDimVal = data.get(cDim, dataIndex); + var openVal = data.get(openDim, dataIndex); + var closeVal = data.get(closeDim, dataIndex); + var lowestVal = data.get(lowestDim, dataIndex); + var highestVal = data.get(highestDim, dataIndex); + + var ocLow = Math.min(openVal, closeVal); + var ocHigh = Math.max(openVal, closeVal); + + var ocLowPoint = getPoint(ocLow, axisDimVal); + var ocHighPoint = getPoint(ocHigh, axisDimVal); + var lowestPoint = getPoint(lowestVal, axisDimVal); + var highestPoint = getPoint(highestVal, axisDimVal); + + var ends = []; + addBodyEnd(ends, ocHighPoint, 0); + addBodyEnd(ends, ocLowPoint, 1); + + ends.push( + subPixelOptimizePoint(highestPoint), + subPixelOptimizePoint(ocHighPoint), + subPixelOptimizePoint(lowestPoint), + subPixelOptimizePoint(ocLowPoint) + ); + + data.setItemLayout(dataIndex, { + sign: getSign(data, dataIndex, openVal, closeVal, closeDim), + initBaseline: openVal > closeVal + ? ocHighPoint[vDimIdx] : ocLowPoint[vDimIdx], // open point. + ends: ends, + brushRect: makeBrushRect(lowestVal, highestVal, axisDimVal) + }); + } + + function getPoint(val, axisDimVal) { + var p = []; + p[cDimIdx] = axisDimVal; + p[vDimIdx] = val; + return (isNaN(axisDimVal) || isNaN(val)) + ? [NaN, NaN] + : coordSys.dataToPoint(p); + } + + function addBodyEnd(ends, point, start) { + var point1 = point.slice(); + var point2 = point.slice(); + + point1[cDimIdx] = subPixelOptimize( + point1[cDimIdx] + candleWidth / 2, 1, false + ); + point2[cDimIdx] = subPixelOptimize( + point2[cDimIdx] - candleWidth / 2, 1, true + ); + + start + ? ends.push(point1, point2) + : ends.push(point2, point1); + } + + function makeBrushRect(lowestVal, highestVal, axisDimVal) { + var pmin = getPoint(lowestVal, axisDimVal); + var pmax = getPoint(highestVal, axisDimVal); + + pmin[cDimIdx] -= candleWidth / 2; + pmax[cDimIdx] -= candleWidth / 2; + + return { + x: pmin[0], + y: pmin[1], + width: vDimIdx ? candleWidth : pmax[0] - pmin[0], + height: vDimIdx ? pmax[1] - pmin[1] : candleWidth + }; + } + + function subPixelOptimizePoint(point) { + point[cDimIdx] = subPixelOptimize(point[cDimIdx], 1); + return point; + } + } + + function largeProgress(params, data) { + // Structure: [sign, x, yhigh, ylow, sign, x, yhigh, ylow, ...] + var points = new LargeArr$1(params.count * 5); + var offset = 0; + var point; + var tmpIn = []; + var tmpOut = []; + var dataIndex; + + while ((dataIndex = params.next()) != null) { + var axisDimVal = data.get(cDim, dataIndex); + var openVal = data.get(openDim, dataIndex); + var closeVal = data.get(closeDim, dataIndex); + var lowestVal = data.get(lowestDim, dataIndex); + var highestVal = data.get(highestDim, dataIndex); + + if (isNaN(axisDimVal) || isNaN(lowestVal) || isNaN(highestVal)) { + points[offset++] = NaN; + offset += 4; + continue; + } + + points[offset++] = getSign(data, dataIndex, openVal, closeVal, closeDim); + + tmpIn[cDimIdx] = axisDimVal; + + tmpIn[vDimIdx] = lowestVal; + point = coordSys.dataToPoint(tmpIn, null, tmpOut); + points[offset++] = point ? point[0] : NaN; + points[offset++] = point ? point[1] : NaN; + tmpIn[vDimIdx] = highestVal; + point = coordSys.dataToPoint(tmpIn, null, tmpOut); + points[offset++] = point ? point[1] : NaN; + } + + data.setLayout('largePoints', points); + } + } +}; + +function getSign(data, dataIndex, openVal, closeVal, closeDim) { + var sign; + if (openVal > closeVal) { + sign = -1; + } + else if (openVal < closeVal) { + sign = 1; + } + else { + sign = dataIndex > 0 + // If close === open, compare with close of last record + ? (data.get(closeDim, dataIndex - 1) <= closeVal ? 1 : -1) + // No record of previous, set to be positive + : 1; + } + + return sign; +} + +function calculateCandleWidth(seriesModel, data) { + var baseAxis = seriesModel.getBaseAxis(); + var extent; + + var bandWidth = baseAxis.type === 'category' + ? baseAxis.getBandWidth() + : ( + extent = baseAxis.getExtent(), + Math.abs(extent[1] - extent[0]) / data.count() + ); + + var barMaxWidth = parsePercent$1( + retrieve2(seriesModel.get('barMaxWidth'), bandWidth), + bandWidth + ); + var barMinWidth = parsePercent$1( + retrieve2(seriesModel.get('barMinWidth'), 1), + bandWidth + ); + var barWidth = seriesModel.get('barWidth'); + + return barWidth != null + ? parsePercent$1(barWidth, bandWidth) + // Put max outer to ensure bar visible in spite of overlap. + : Math.max(Math.min(bandWidth / 2, barMaxWidth), barMinWidth); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +registerPreprocessor(preprocessor); +registerVisual(candlestickVisual); +registerLayout(candlestickLayout); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +SeriesModel.extend({ + + type: 'series.effectScatter', + + dependencies: ['grid', 'polar'], + + getInitialData: function (option, ecModel) { + return createListFromArray(this.getSource(), this); + }, + + brushSelector: 'point', + + defaultOption: { + coordinateSystem: 'cartesian2d', + zlevel: 0, + z: 2, + legendHoverLink: true, + + effectType: 'ripple', + + progressive: 0, + + // When to show the effect, option: 'render'|'emphasis' + showEffectOn: 'render', + + // Ripple effect config + rippleEffect: { + period: 4, + // Scale of ripple + scale: 2.5, + // Brush type can be fill or stroke + brushType: 'fill' + }, + + // Cartesian coordinate system + // xAxisIndex: 0, + // yAxisIndex: 0, + + // Polar coordinate system + // polarIndex: 0, + + // Geo coordinate system + // geoIndex: 0, + + // symbol: null, // 图形类型 + symbolSize: 10 // 图形大小,半宽(半径)参数,当图形为方向或菱形则总宽度为symbolSize * 2 + // symbolRotate: null, // 图形旋转控制 + + // large: false, + // Available when large is true + // largeThreshold: 2000, + + // itemStyle: { + // opacity: 1 + // } + } + +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Symbol with ripple effect + * @module echarts/chart/helper/EffectSymbol + */ + +var EFFECT_RIPPLE_NUMBER = 3; + +function normalizeSymbolSize$1(symbolSize) { + if (!isArray(symbolSize)) { + symbolSize = [+symbolSize, +symbolSize]; + } + return symbolSize; +} + +function updateRipplePath(rippleGroup, effectCfg) { + rippleGroup.eachChild(function (ripplePath) { + ripplePath.attr({ + z: effectCfg.z, + zlevel: effectCfg.zlevel, + style: { + stroke: effectCfg.brushType === 'stroke' ? effectCfg.color : null, + fill: effectCfg.brushType === 'fill' ? effectCfg.color : null + } + }); + }); +} +/** + * @constructor + * @param {module:echarts/data/List} data + * @param {number} idx + * @extends {module:zrender/graphic/Group} + */ +function EffectSymbol(data, idx) { + Group.call(this); + + var symbol = new SymbolClz$1(data, idx); + var rippleGroup = new Group(); + this.add(symbol); + this.add(rippleGroup); + + rippleGroup.beforeUpdate = function () { + this.attr(symbol.getScale()); + }; + this.updateData(data, idx); +} + +var effectSymbolProto = EffectSymbol.prototype; + +effectSymbolProto.stopEffectAnimation = function () { + this.childAt(1).removeAll(); +}; + +effectSymbolProto.startEffectAnimation = function (effectCfg) { + var symbolType = effectCfg.symbolType; + var color = effectCfg.color; + var rippleGroup = this.childAt(1); + + for (var i = 0; i < EFFECT_RIPPLE_NUMBER; i++) { + // var ripplePath = createSymbol( + // symbolType, -0.5, -0.5, 1, 1, color + // ); + // If width/height are set too small (e.g., set to 1) on ios10 + // and macOS Sierra, a circle stroke become a rect, no matter what + // the scale is set. So we set width/height as 2. See #4136. + var ripplePath = createSymbol( + symbolType, -1, -1, 2, 2, color + ); + ripplePath.attr({ + style: { + strokeNoScale: true + }, + z2: 99, + silent: true, + scale: [0.5, 0.5] + }); + + var delay = -i / EFFECT_RIPPLE_NUMBER * effectCfg.period + effectCfg.effectOffset; + // TODO Configurable effectCfg.period + ripplePath.animate('', true) + .when(effectCfg.period, { + scale: [effectCfg.rippleScale / 2, effectCfg.rippleScale / 2] + }) + .delay(delay) + .start(); + ripplePath.animateStyle(true) + .when(effectCfg.period, { + opacity: 0 + }) + .delay(delay) + .start(); + + rippleGroup.add(ripplePath); + } + + updateRipplePath(rippleGroup, effectCfg); +}; + +/** + * Update effect symbol + */ +effectSymbolProto.updateEffectAnimation = function (effectCfg) { + var oldEffectCfg = this._effectCfg; + var rippleGroup = this.childAt(1); + + // Must reinitialize effect if following configuration changed + var DIFFICULT_PROPS = ['symbolType', 'period', 'rippleScale']; + for (var i = 0; i < DIFFICULT_PROPS.length; i++) { + var propName = DIFFICULT_PROPS[i]; + if (oldEffectCfg[propName] !== effectCfg[propName]) { + this.stopEffectAnimation(); + this.startEffectAnimation(effectCfg); + return; + } + } + + updateRipplePath(rippleGroup, effectCfg); +}; + +/** + * Highlight symbol + */ +effectSymbolProto.highlight = function () { + this.trigger('emphasis'); +}; + +/** + * Downplay symbol + */ +effectSymbolProto.downplay = function () { + this.trigger('normal'); +}; + +/** + * Update symbol properties + * @param {module:echarts/data/List} data + * @param {number} idx + */ +effectSymbolProto.updateData = function (data, idx) { + var seriesModel = data.hostModel; + + this.childAt(0).updateData(data, idx); + + var rippleGroup = this.childAt(1); + var itemModel = data.getItemModel(idx); + var symbolType = data.getItemVisual(idx, 'symbol'); + var symbolSize = normalizeSymbolSize$1(data.getItemVisual(idx, 'symbolSize')); + var color = data.getItemVisual(idx, 'color'); + + rippleGroup.attr('scale', symbolSize); + + rippleGroup.traverse(function (ripplePath) { + ripplePath.attr({ + fill: color + }); + }); + + var symbolOffset = itemModel.getShallow('symbolOffset'); + if (symbolOffset) { + var pos = rippleGroup.position; + pos[0] = parsePercent$1(symbolOffset[0], symbolSize[0]); + pos[1] = parsePercent$1(symbolOffset[1], symbolSize[1]); + } + rippleGroup.rotation = (itemModel.getShallow('symbolRotate') || 0) * Math.PI / 180 || 0; + + var effectCfg = {}; + + effectCfg.showEffectOn = seriesModel.get('showEffectOn'); + effectCfg.rippleScale = itemModel.get('rippleEffect.scale'); + effectCfg.brushType = itemModel.get('rippleEffect.brushType'); + effectCfg.period = itemModel.get('rippleEffect.period') * 1000; + effectCfg.effectOffset = idx / data.count(); + effectCfg.z = itemModel.getShallow('z') || 0; + effectCfg.zlevel = itemModel.getShallow('zlevel') || 0; + effectCfg.symbolType = symbolType; + effectCfg.color = color; + + this.off('mouseover').off('mouseout').off('emphasis').off('normal'); + + if (effectCfg.showEffectOn === 'render') { + this._effectCfg + ? this.updateEffectAnimation(effectCfg) + : this.startEffectAnimation(effectCfg); + + this._effectCfg = effectCfg; + } + else { + // Not keep old effect config + this._effectCfg = null; + + this.stopEffectAnimation(); + var symbol = this.childAt(0); + var onEmphasis = function () { + symbol.highlight(); + if (effectCfg.showEffectOn !== 'render') { + this.startEffectAnimation(effectCfg); + } + }; + var onNormal = function () { + symbol.downplay(); + if (effectCfg.showEffectOn !== 'render') { + this.stopEffectAnimation(); + } + }; + this.on('mouseover', onEmphasis, this) + .on('mouseout', onNormal, this) + .on('emphasis', onEmphasis, this) + .on('normal', onNormal, this); + } + + this._effectCfg = effectCfg; +}; + +effectSymbolProto.fadeOut = function (cb) { + this.off('mouseover').off('mouseout').off('emphasis').off('normal'); + cb && cb(); +}; + +inherits(EffectSymbol, Group); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +extendChartView({ + + type: 'effectScatter', + + init: function () { + this._symbolDraw = new SymbolDraw(EffectSymbol); + }, + + render: function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var effectSymbolDraw = this._symbolDraw; + effectSymbolDraw.updateData(data); + this.group.add(effectSymbolDraw.group); + }, + + updateTransform: function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + + this.group.dirty(); + + var res = pointsLayout().reset(seriesModel); + if (res.progress) { + res.progress({ start: 0, end: data.count() }, data); + } + + this._symbolDraw.updateLayout(data); + }, + + _updateGroupTransform: function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + if (coordSys && coordSys.getRoamTransform) { + this.group.transform = clone$2(coordSys.getRoamTransform()); + this.group.decomposeTransform(); + } + }, + + remove: function (ecModel, api) { + this._symbolDraw && this._symbolDraw.remove(api); + }, + + dispose: function () {} +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +registerVisual(visualSymbol('effectScatter', 'circle')); +registerLayout(pointsLayout('effectScatter')); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var Uint32Arr = typeof Uint32Array === 'undefined' ? Array : Uint32Array; +var Float64Arr = typeof Float64Array === 'undefined' ? Array : Float64Array; + +function compatEc2(seriesOpt) { + var data = seriesOpt.data; + if (data && data[0] && data[0][0] && data[0][0].coord) { + if (__DEV__) { + console.warn('Lines data configuration has been changed to' + + ' { coords:[[1,2],[2,3]] }'); + } + seriesOpt.data = map(data, function (itemOpt) { + var coords = [ + itemOpt[0].coord, itemOpt[1].coord + ]; + var target = { + coords: coords + }; + if (itemOpt[0].name) { + target.fromName = itemOpt[0].name; + } + if (itemOpt[1].name) { + target.toName = itemOpt[1].name; + } + return mergeAll([target, itemOpt[0], itemOpt[1]]); + }); + } +} + +var LinesSeries = SeriesModel.extend({ + + type: 'series.lines', + + dependencies: ['grid', 'polar'], + + visualColorAccessPath: 'lineStyle.color', + + init: function (option) { + // The input data may be null/undefined. + option.data = option.data || []; + + // Not using preprocessor because mergeOption may not have series.type + compatEc2(option); + + var result = this._processFlatCoordsArray(option.data); + this._flatCoords = result.flatCoords; + this._flatCoordsOffset = result.flatCoordsOffset; + if (result.flatCoords) { + option.data = new Float32Array(result.count); + } + + LinesSeries.superApply(this, 'init', arguments); + }, + + mergeOption: function (option) { + // The input data may be null/undefined. + option.data = option.data || []; + + compatEc2(option); + + if (option.data) { + // Only update when have option data to merge. + var result = this._processFlatCoordsArray(option.data); + this._flatCoords = result.flatCoords; + this._flatCoordsOffset = result.flatCoordsOffset; + if (result.flatCoords) { + option.data = new Float32Array(result.count); + } + } + + LinesSeries.superApply(this, 'mergeOption', arguments); + }, + + appendData: function (params) { + var result = this._processFlatCoordsArray(params.data); + if (result.flatCoords) { + if (!this._flatCoords) { + this._flatCoords = result.flatCoords; + this._flatCoordsOffset = result.flatCoordsOffset; + } + else { + this._flatCoords = concatArray(this._flatCoords, result.flatCoords); + this._flatCoordsOffset = concatArray(this._flatCoordsOffset, result.flatCoordsOffset); + } + params.data = new Float32Array(result.count); + } + + this.getRawData().appendData(params.data); + }, + + _getCoordsFromItemModel: function (idx) { + var itemModel = this.getData().getItemModel(idx); + var coords = (itemModel.option instanceof Array) + ? itemModel.option : itemModel.getShallow('coords'); + + if (__DEV__) { + if (!(coords instanceof Array && coords.length > 0 && coords[0] instanceof Array)) { + throw new Error('Invalid coords ' + JSON.stringify(coords) + '. Lines must have 2d coords array in data item.'); + } + } + return coords; + }, + + getLineCoordsCount: function (idx) { + if (this._flatCoordsOffset) { + return this._flatCoordsOffset[idx * 2 + 1]; + } + else { + return this._getCoordsFromItemModel(idx).length; + } + }, + + getLineCoords: function (idx, out) { + if (this._flatCoordsOffset) { + var offset = this._flatCoordsOffset[idx * 2]; + var len = this._flatCoordsOffset[idx * 2 + 1]; + for (var i = 0; i < len; i++) { + out[i] = out[i] || []; + out[i][0] = this._flatCoords[offset + i * 2]; + out[i][1] = this._flatCoords[offset + i * 2 + 1]; + } + return len; + } + else { + var coords = this._getCoordsFromItemModel(idx); + for (var i = 0; i < coords.length; i++) { + out[i] = out[i] || []; + out[i][0] = coords[i][0]; + out[i][1] = coords[i][1]; + } + return coords.length; + } + }, + + _processFlatCoordsArray: function (data) { + var startOffset = 0; + if (this._flatCoords) { + startOffset = this._flatCoords.length; + } + // Stored as a typed array. In format + // Points Count(2) | x | y | x | y | Points Count(3) | x | y | x | y | x | y | + if (typeof data[0] === 'number') { + var len = data.length; + // Store offset and len of each segment + var coordsOffsetAndLenStorage = new Uint32Arr(len); + var coordsStorage = new Float64Arr(len); + var coordsCursor = 0; + var offsetCursor = 0; + var dataCount = 0; + for (var i = 0; i < len;) { + dataCount++; + var count = data[i++]; + // Offset + coordsOffsetAndLenStorage[offsetCursor++] = coordsCursor + startOffset; + // Len + coordsOffsetAndLenStorage[offsetCursor++] = count; + for (var k = 0; k < count; k++) { + var x = data[i++]; + var y = data[i++]; + coordsStorage[coordsCursor++] = x; + coordsStorage[coordsCursor++] = y; + + if (i > len) { + if (__DEV__) { + throw new Error('Invalid data format.'); + } + } + } + } + + return { + flatCoordsOffset: new Uint32Array(coordsOffsetAndLenStorage.buffer, 0, offsetCursor), + flatCoords: coordsStorage, + count: dataCount + }; + } + + return { + flatCoordsOffset: null, + flatCoords: null, + count: data.length + }; + }, + + getInitialData: function (option, ecModel) { + if (__DEV__) { + var CoordSys = CoordinateSystemManager.get(option.coordinateSystem); + if (!CoordSys) { + throw new Error('Unkown coordinate system ' + option.coordinateSystem); + } + } + + var lineData = new List(['value'], this); + lineData.hasItemOption = false; + + lineData.initData(option.data, [], function (dataItem, dimName, dataIndex, dimIndex) { + // dataItem is simply coords + if (dataItem instanceof Array) { + return NaN; + } + else { + lineData.hasItemOption = true; + var value = dataItem.value; + if (value != null) { + return value instanceof Array ? value[dimIndex] : value; + } + } + }); + + return lineData; + }, + + formatTooltip: function (dataIndex) { + var data = this.getData(); + var itemModel = data.getItemModel(dataIndex); + var name = itemModel.get('name'); + if (name) { + return name; + } + var fromName = itemModel.get('fromName'); + var toName = itemModel.get('toName'); + var html = []; + fromName != null && html.push(fromName); + toName != null && html.push(toName); + + return encodeHTML(html.join(' > ')); + }, + + preventIncremental: function () { + return !!this.get('effect.show'); + }, + + getProgressive: function () { + var progressive = this.option.progressive; + if (progressive == null) { + return this.option.large ? 1e4 : this.get('progressive'); + } + return progressive; + }, + + getProgressiveThreshold: function () { + var progressiveThreshold = this.option.progressiveThreshold; + if (progressiveThreshold == null) { + return this.option.large ? 2e4 : this.get('progressiveThreshold'); + } + return progressiveThreshold; + }, + + defaultOption: { + coordinateSystem: 'geo', + zlevel: 0, + z: 2, + legendHoverLink: true, + + hoverAnimation: true, + // Cartesian coordinate system + xAxisIndex: 0, + yAxisIndex: 0, + + symbol: ['none', 'none'], + symbolSize: [10, 10], + // Geo coordinate system + geoIndex: 0, + + effect: { + show: false, + period: 4, + // Animation delay. support callback + // delay: 0, + // If move with constant speed px/sec + // period will be ignored if this property is > 0, + constantSpeed: 0, + symbol: 'circle', + symbolSize: 3, + loop: true, + // Length of trail, 0 - 1 + trailLength: 0.2 + // Same with lineStyle.color + // color + }, + + large: false, + // Available when large is true + largeThreshold: 2000, + + // If lines are polyline + // polyline not support curveness, label, animation + polyline: false, + + label: { + show: false, + position: 'end' + // distance: 5, + // formatter: 标签文本格式器,同Tooltip.formatter,不支持异步回调 + }, + + lineStyle: { + opacity: 0.5 + } + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Provide effect for line + * @module echarts/chart/helper/EffectLine + */ + +/** + * @constructor + * @extends {module:zrender/graphic/Group} + * @alias {module:echarts/chart/helper/Line} + */ +function EffectLine(lineData, idx, seriesScope) { + Group.call(this); + + this.add(this.createLine(lineData, idx, seriesScope)); + + this._updateEffectSymbol(lineData, idx); +} + +var effectLineProto = EffectLine.prototype; + +effectLineProto.createLine = function (lineData, idx, seriesScope) { + return new Line$1(lineData, idx, seriesScope); +}; + +effectLineProto._updateEffectSymbol = function (lineData, idx) { + var itemModel = lineData.getItemModel(idx); + var effectModel = itemModel.getModel('effect'); + var size = effectModel.get('symbolSize'); + var symbolType = effectModel.get('symbol'); + if (!isArray(size)) { + size = [size, size]; + } + var color = effectModel.get('color') || lineData.getItemVisual(idx, 'color'); + var symbol = this.childAt(1); + + if (this._symbolType !== symbolType) { + // Remove previous + this.remove(symbol); + + symbol = createSymbol( + symbolType, -0.5, -0.5, 1, 1, color + ); + symbol.z2 = 100; + symbol.culling = true; + + this.add(symbol); + } + + // Symbol may be removed if loop is false + if (!symbol) { + return; + } + + // Shadow color is same with color in default + symbol.setStyle('shadowColor', color); + symbol.setStyle(effectModel.getItemStyle(['color'])); + + symbol.attr('scale', size); + + symbol.setColor(color); + symbol.attr('scale', size); + + this._symbolType = symbolType; + + this._updateEffectAnimation(lineData, effectModel, idx); +}; + +effectLineProto._updateEffectAnimation = function (lineData, effectModel, idx) { + + var symbol = this.childAt(1); + if (!symbol) { + return; + } + + var self = this; + + var points = lineData.getItemLayout(idx); + + var period = effectModel.get('period') * 1000; + var loop = effectModel.get('loop'); + var constantSpeed = effectModel.get('constantSpeed'); + var delayExpr = retrieve(effectModel.get('delay'), function (idx) { + return idx / lineData.count() * period / 3; + }); + var isDelayFunc = typeof delayExpr === 'function'; + + // Ignore when updating + symbol.ignore = true; + + this.updateAnimationPoints(symbol, points); + + if (constantSpeed > 0) { + period = this.getLineLength(symbol) / constantSpeed * 1000; + } + + if (period !== this._period || loop !== this._loop) { + + symbol.stopAnimation(); + + var delay = delayExpr; + if (isDelayFunc) { + delay = delayExpr(idx); + } + if (symbol.__t > 0) { + delay = -period * symbol.__t; + } + symbol.__t = 0; + var animator = symbol.animate('', loop) + .when(period, { + __t: 1 + }) + .delay(delay) + .during(function () { + self.updateSymbolPosition(symbol); + }); + if (!loop) { + animator.done(function () { + self.remove(symbol); + }); + } + animator.start(); + } + + this._period = period; + this._loop = loop; +}; + +effectLineProto.getLineLength = function (symbol) { + // Not so accurate + return (dist(symbol.__p1, symbol.__cp1) + + dist(symbol.__cp1, symbol.__p2)); +}; + +effectLineProto.updateAnimationPoints = function (symbol, points) { + symbol.__p1 = points[0]; + symbol.__p2 = points[1]; + symbol.__cp1 = points[2] || [ + (points[0][0] + points[1][0]) / 2, + (points[0][1] + points[1][1]) / 2 + ]; +}; + +effectLineProto.updateData = function (lineData, idx, seriesScope) { + this.childAt(0).updateData(lineData, idx, seriesScope); + this._updateEffectSymbol(lineData, idx); +}; + +effectLineProto.updateSymbolPosition = function (symbol) { + var p1 = symbol.__p1; + var p2 = symbol.__p2; + var cp1 = symbol.__cp1; + var t = symbol.__t; + var pos = symbol.position; + var quadraticAt$$1 = quadraticAt; + var quadraticDerivativeAt$$1 = quadraticDerivativeAt; + pos[0] = quadraticAt$$1(p1[0], cp1[0], p2[0], t); + pos[1] = quadraticAt$$1(p1[1], cp1[1], p2[1], t); + + // Tangent + var tx = quadraticDerivativeAt$$1(p1[0], cp1[0], p2[0], t); + var ty = quadraticDerivativeAt$$1(p1[1], cp1[1], p2[1], t); + + symbol.rotation = -Math.atan2(ty, tx) - Math.PI / 2; + + symbol.ignore = false; +}; + + +effectLineProto.updateLayout = function (lineData, idx) { + this.childAt(0).updateLayout(lineData, idx); + + var effectModel = lineData.getItemModel(idx).getModel('effect'); + this._updateEffectAnimation(lineData, effectModel, idx); +}; + +inherits(EffectLine, Group); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @module echarts/chart/helper/Line + */ + +/** + * @constructor + * @extends {module:zrender/graphic/Group} + * @alias {module:echarts/chart/helper/Polyline} + */ +function Polyline$2(lineData, idx, seriesScope) { + Group.call(this); + + this._createPolyline(lineData, idx, seriesScope); +} + +var polylineProto = Polyline$2.prototype; + +polylineProto._createPolyline = function (lineData, idx, seriesScope) { + // var seriesModel = lineData.hostModel; + var points = lineData.getItemLayout(idx); + + var line = new Polyline({ + shape: { + points: points + } + }); + + this.add(line); + + this._updateCommonStl(lineData, idx, seriesScope); +}; + +polylineProto.updateData = function (lineData, idx, seriesScope) { + var seriesModel = lineData.hostModel; + + var line = this.childAt(0); + var target = { + shape: { + points: lineData.getItemLayout(idx) + } + }; + updateProps(line, target, seriesModel, idx); + + this._updateCommonStl(lineData, idx, seriesScope); +}; + +polylineProto._updateCommonStl = function (lineData, idx, seriesScope) { + var line = this.childAt(0); + var itemModel = lineData.getItemModel(idx); + + var visualColor = lineData.getItemVisual(idx, 'color'); + + var lineStyle = seriesScope && seriesScope.lineStyle; + var hoverLineStyle = seriesScope && seriesScope.hoverLineStyle; + + if (!seriesScope || lineData.hasItemOption) { + lineStyle = itemModel.getModel('lineStyle').getLineStyle(); + hoverLineStyle = itemModel.getModel('emphasis.lineStyle').getLineStyle(); + } + line.useStyle(defaults( + { + strokeNoScale: true, + fill: 'none', + stroke: visualColor + }, + lineStyle + )); + line.hoverStyle = hoverLineStyle; + + setHoverStyle(this); +}; + +polylineProto.updateLayout = function (lineData, idx) { + var polyline = this.childAt(0); + polyline.setShape('points', lineData.getItemLayout(idx)); +}; + +inherits(Polyline$2, Group); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Provide effect for line + * @module echarts/chart/helper/EffectLine + */ + +/** + * @constructor + * @extends {module:echarts/chart/helper/EffectLine} + * @alias {module:echarts/chart/helper/Polyline} + */ +function EffectPolyline(lineData, idx, seriesScope) { + EffectLine.call(this, lineData, idx, seriesScope); + this._lastFrame = 0; + this._lastFramePercent = 0; +} + +var effectPolylineProto = EffectPolyline.prototype; + +// Overwrite +effectPolylineProto.createLine = function (lineData, idx, seriesScope) { + return new Polyline$2(lineData, idx, seriesScope); +}; + +// Overwrite +effectPolylineProto.updateAnimationPoints = function (symbol, points) { + this._points = points; + var accLenArr = [0]; + var len$$1 = 0; + for (var i = 1; i < points.length; i++) { + var p1 = points[i - 1]; + var p2 = points[i]; + len$$1 += dist(p1, p2); + accLenArr.push(len$$1); + } + if (len$$1 === 0) { + return; + } + + for (var i = 0; i < accLenArr.length; i++) { + accLenArr[i] /= len$$1; + } + this._offsets = accLenArr; + this._length = len$$1; +}; + +// Overwrite +effectPolylineProto.getLineLength = function (symbol) { + return this._length; +}; + +// Overwrite +effectPolylineProto.updateSymbolPosition = function (symbol) { + var t = symbol.__t; + var points = this._points; + var offsets = this._offsets; + var len$$1 = points.length; + + if (!offsets) { + // Has length 0 + return; + } + + var lastFrame = this._lastFrame; + var frame; + + if (t < this._lastFramePercent) { + // Start from the next frame + // PENDING start from lastFrame ? + var start = Math.min(lastFrame + 1, len$$1 - 1); + for (frame = start; frame >= 0; frame--) { + if (offsets[frame] <= t) { + break; + } + } + // PENDING really need to do this ? + frame = Math.min(frame, len$$1 - 2); + } + else { + for (var frame = lastFrame; frame < len$$1; frame++) { + if (offsets[frame] > t) { + break; + } + } + frame = Math.min(frame - 1, len$$1 - 2); + } + + lerp( + symbol.position, points[frame], points[frame + 1], + (t - offsets[frame]) / (offsets[frame + 1] - offsets[frame]) + ); + + var tx = points[frame + 1][0] - points[frame][0]; + var ty = points[frame + 1][1] - points[frame][1]; + symbol.rotation = -Math.atan2(ty, tx) - Math.PI / 2; + + this._lastFrame = frame; + this._lastFramePercent = t; + + symbol.ignore = false; +}; + +inherits(EffectPolyline, EffectLine); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// TODO Batch by color + +var LargeLineShape = extendShape({ + + shape: { + polyline: false, + curveness: 0, + segs: [] + }, + + buildPath: function (path, shape) { + var segs = shape.segs; + var curveness = shape.curveness; + + if (shape.polyline) { + for (var i = 0; i < segs.length;) { + var count = segs[i++]; + if (count > 0) { + path.moveTo(segs[i++], segs[i++]); + for (var k = 1; k < count; k++) { + path.lineTo(segs[i++], segs[i++]); + } + } + } + } + else { + for (var i = 0; i < segs.length;) { + var x0 = segs[i++]; + var y0 = segs[i++]; + var x1 = segs[i++]; + var y1 = segs[i++]; + path.moveTo(x0, y0); + if (curveness > 0) { + var x2 = (x0 + x1) / 2 - (y0 - y1) * curveness; + var y2 = (y0 + y1) / 2 - (x1 - x0) * curveness; + path.quadraticCurveTo(x2, y2, x1, y1); + } + else { + path.lineTo(x1, y1); + } + } + } + }, + + findDataIndex: function (x, y) { + + var shape = this.shape; + var segs = shape.segs; + var curveness = shape.curveness; + + if (shape.polyline) { + var dataIndex = 0; + for (var i = 0; i < segs.length;) { + var count = segs[i++]; + if (count > 0) { + var x0 = segs[i++]; + var y0 = segs[i++]; + for (var k = 1; k < count; k++) { + var x1 = segs[i++]; + var y1 = segs[i++]; + if (containStroke$1(x0, y0, x1, y1)) { + return dataIndex; + } + } + } + + dataIndex++; + } + } + else { + var dataIndex = 0; + for (var i = 0; i < segs.length;) { + var x0 = segs[i++]; + var y0 = segs[i++]; + var x1 = segs[i++]; + var y1 = segs[i++]; + if (curveness > 0) { + var x2 = (x0 + x1) / 2 - (y0 - y1) * curveness; + var y2 = (y0 + y1) / 2 - (x1 - x0) * curveness; + + if (containStroke$3(x0, y0, x2, y2, x1, y1)) { + return dataIndex; + } + } + else { + if (containStroke$1(x0, y0, x1, y1)) { + return dataIndex; + } + } + + dataIndex++; + } + } + + return -1; + } +}); + +function LargeLineDraw() { + this.group = new Group(); +} + +var largeLineProto = LargeLineDraw.prototype; + +largeLineProto.isPersistent = function () { + return !this._incremental; +}; + +/** + * Update symbols draw by new data + * @param {module:echarts/data/List} data + */ +largeLineProto.updateData = function (data) { + this.group.removeAll(); + + var lineEl = new LargeLineShape({ + rectHover: true, + cursor: 'default' + }); + lineEl.setShape({ + segs: data.getLayout('linesPoints') + }); + + this._setCommon(lineEl, data); + + // Add back + this.group.add(lineEl); + + this._incremental = null; +}; + +/** + * @override + */ +largeLineProto.incrementalPrepareUpdate = function (data) { + this.group.removeAll(); + + this._clearIncremental(); + + if (data.count() > 5e5) { + if (!this._incremental) { + this._incremental = new IncrementalDisplayble({ + silent: true + }); + } + this.group.add(this._incremental); + } + else { + this._incremental = null; + } +}; + +/** + * @override + */ +largeLineProto.incrementalUpdate = function (taskParams, data) { + var lineEl = new LargeLineShape(); + lineEl.setShape({ + segs: data.getLayout('linesPoints') + }); + + this._setCommon(lineEl, data, !!this._incremental); + + if (!this._incremental) { + lineEl.rectHover = true; + lineEl.cursor = 'default'; + lineEl.__startIndex = taskParams.start; + this.group.add(lineEl); + } + else { + this._incremental.addDisplayable(lineEl, true); + } +}; + +/** + * @override + */ +largeLineProto.remove = function () { + this._clearIncremental(); + this._incremental = null; + this.group.removeAll(); +}; + +largeLineProto._setCommon = function (lineEl, data, isIncremental) { + var hostModel = data.hostModel; + + lineEl.setShape({ + polyline: hostModel.get('polyline'), + curveness: hostModel.get('lineStyle.curveness') + }); + + lineEl.useStyle( + hostModel.getModel('lineStyle').getLineStyle() + ); + lineEl.style.strokeNoScale = true; + + var visualColor = data.getVisual('color'); + if (visualColor) { + lineEl.setStyle('stroke', visualColor); + } + lineEl.setStyle('fill'); + + if (!isIncremental) { + // Enable tooltip + // PENDING May have performance issue when path is extremely large + lineEl.seriesIndex = hostModel.seriesIndex; + lineEl.on('mousemove', function (e) { + lineEl.dataIndex = null; + var dataIndex = lineEl.findDataIndex(e.offsetX, e.offsetY); + if (dataIndex > 0) { + // Provide dataIndex for tooltip + lineEl.dataIndex = dataIndex + lineEl.__startIndex; + } + }); + } +}; + +largeLineProto._clearIncremental = function () { + var incremental = this._incremental; + if (incremental) { + incremental.clearDisplaybles(); + } +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var linesLayout = { + seriesType: 'lines', + + plan: createRenderPlanner(), + + reset: function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + var isPolyline = seriesModel.get('polyline'); + var isLarge = seriesModel.pipelineContext.large; + + function progress(params, lineData) { + var lineCoords = []; + if (isLarge) { + var points; + var segCount = params.end - params.start; + if (isPolyline) { + var totalCoordsCount = 0; + for (var i = params.start; i < params.end; i++) { + totalCoordsCount += seriesModel.getLineCoordsCount(i); + } + points = new Float32Array(segCount + totalCoordsCount * 2); + } + else { + points = new Float32Array(segCount * 4); + } + + var offset = 0; + var pt = []; + for (var i = params.start; i < params.end; i++) { + var len = seriesModel.getLineCoords(i, lineCoords); + if (isPolyline) { + points[offset++] = len; + } + for (var k = 0; k < len; k++) { + pt = coordSys.dataToPoint(lineCoords[k], false, pt); + points[offset++] = pt[0]; + points[offset++] = pt[1]; + } + } + + lineData.setLayout('linesPoints', points); + } + else { + for (var i = params.start; i < params.end; i++) { + var itemModel = lineData.getItemModel(i); + var len = seriesModel.getLineCoords(i, lineCoords); + + var pts = []; + if (isPolyline) { + for (var j = 0; j < len; j++) { + pts.push(coordSys.dataToPoint(lineCoords[j])); + } + } + else { + pts[0] = coordSys.dataToPoint(lineCoords[0]); + pts[1] = coordSys.dataToPoint(lineCoords[1]); + + var curveness = itemModel.get('lineStyle.curveness'); + if (+curveness) { + pts[2] = [ + (pts[0][0] + pts[1][0]) / 2 - (pts[0][1] - pts[1][1]) * curveness, + (pts[0][1] + pts[1][1]) / 2 - (pts[1][0] - pts[0][0]) * curveness + ]; + } + } + lineData.setItemLayout(i, pts); + } + } + } + + return { progress: progress }; + } +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +extendChartView({ + + type: 'lines', + + init: function () {}, + + render: function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + + var lineDraw = this._updateLineDraw(data, seriesModel); + + var zlevel = seriesModel.get('zlevel'); + var trailLength = seriesModel.get('effect.trailLength'); + + var zr = api.getZr(); + // Avoid the drag cause ghost shadow + // FIXME Better way ? + // SVG doesn't support + var isSvg = zr.painter.getType() === 'svg'; + if (!isSvg) { + zr.painter.getLayer(zlevel).clear(true); + } + // Config layer with motion blur + if (this._lastZlevel != null && !isSvg) { + zr.configLayer(this._lastZlevel, { + motionBlur: false + }); + } + if (this._showEffect(seriesModel) && trailLength) { + if (__DEV__) { + var notInIndividual = false; + ecModel.eachSeries(function (otherSeriesModel) { + if (otherSeriesModel !== seriesModel && otherSeriesModel.get('zlevel') === zlevel) { + notInIndividual = true; + } + }); + notInIndividual && console.warn('Lines with trail effect should have an individual zlevel'); + } + + if (!isSvg) { + zr.configLayer(zlevel, { + motionBlur: true, + lastFrameAlpha: Math.max(Math.min(trailLength / 10 + 0.9, 1), 0) + }); + } + } + + lineDraw.updateData(data); + + this._lastZlevel = zlevel; + + this._finished = true; + }, + + incrementalPrepareRender: function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + + var lineDraw = this._updateLineDraw(data, seriesModel); + + lineDraw.incrementalPrepareUpdate(data); + + this._clearLayer(api); + + this._finished = false; + }, + + incrementalRender: function (taskParams, seriesModel, ecModel) { + this._lineDraw.incrementalUpdate(taskParams, seriesModel.getData()); + + this._finished = taskParams.end === seriesModel.getData().count(); + }, + + updateTransform: function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + var pipelineContext = seriesModel.pipelineContext; + + if (!this._finished || pipelineContext.large || pipelineContext.progressiveRender) { + // TODO Don't have to do update in large mode. Only do it when there are millions of data. + return { + update: true + }; + } + else { + // TODO Use same logic with ScatterView. + // Manually update layout + var res = linesLayout.reset(seriesModel); + if (res.progress) { + res.progress({ start: 0, end: data.count() }, data); + } + this._lineDraw.updateLayout(); + this._clearLayer(api); + } + }, + + _updateLineDraw: function (data, seriesModel) { + var lineDraw = this._lineDraw; + var hasEffect = this._showEffect(seriesModel); + var isPolyline = !!seriesModel.get('polyline'); + var pipelineContext = seriesModel.pipelineContext; + var isLargeDraw = pipelineContext.large; + + if (__DEV__) { + if (hasEffect && isLargeDraw) { + console.warn('Large lines not support effect'); + } + } + if (!lineDraw + || hasEffect !== this._hasEffet + || isPolyline !== this._isPolyline + || isLargeDraw !== this._isLargeDraw + ) { + if (lineDraw) { + lineDraw.remove(); + } + lineDraw = this._lineDraw = isLargeDraw + ? new LargeLineDraw() + : new LineDraw( + isPolyline + ? (hasEffect ? EffectPolyline : Polyline$2) + : (hasEffect ? EffectLine : Line$1) + ); + this._hasEffet = hasEffect; + this._isPolyline = isPolyline; + this._isLargeDraw = isLargeDraw; + this.group.removeAll(); + } + + this.group.add(lineDraw.group); + + return lineDraw; + }, + + _showEffect: function (seriesModel) { + return !!seriesModel.get('effect.show'); + }, + + _clearLayer: function (api) { + // Not use motion when dragging or zooming + var zr = api.getZr(); + var isSvg = zr.painter.getType() === 'svg'; + if (!isSvg && this._lastZlevel != null) { + zr.painter.getLayer(this._lastZlevel).clear(true); + } + }, + + remove: function (ecModel, api) { + this._lineDraw && this._lineDraw.remove(); + this._lineDraw = null; + // Clear motion when lineDraw is removed + this._clearLayer(api); + }, + + dispose: function () {} +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +function normalize$2(a) { + if (!(a instanceof Array)) { + a = [a, a]; + } + return a; +} + +var opacityQuery = 'lineStyle.opacity'.split('.'); + +var linesVisual = { + seriesType: 'lines', + reset: function (seriesModel, ecModel, api) { + var symbolType = normalize$2(seriesModel.get('symbol')); + var symbolSize = normalize$2(seriesModel.get('symbolSize')); + var data = seriesModel.getData(); + + data.setVisual('fromSymbol', symbolType && symbolType[0]); + data.setVisual('toSymbol', symbolType && symbolType[1]); + data.setVisual('fromSymbolSize', symbolSize && symbolSize[0]); + data.setVisual('toSymbolSize', symbolSize && symbolSize[1]); + data.setVisual('opacity', seriesModel.get(opacityQuery)); + + function dataEach(data, idx) { + var itemModel = data.getItemModel(idx); + var symbolType = normalize$2(itemModel.getShallow('symbol', true)); + var symbolSize = normalize$2(itemModel.getShallow('symbolSize', true)); + var opacity = itemModel.get(opacityQuery); + + symbolType[0] && data.setItemVisual(idx, 'fromSymbol', symbolType[0]); + symbolType[1] && data.setItemVisual(idx, 'toSymbol', symbolType[1]); + symbolSize[0] && data.setItemVisual(idx, 'fromSymbolSize', symbolSize[0]); + symbolSize[1] && data.setItemVisual(idx, 'toSymbolSize', symbolSize[1]); + + data.setItemVisual(idx, 'opacity', opacity); + } + + return {dataEach: data.hasItemOption ? dataEach : null}; + } +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +registerLayout(linesLayout); +registerVisual(linesVisual); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +SeriesModel.extend({ + type: 'series.heatmap', + + getInitialData: function (option, ecModel) { + return createListFromArray(this.getSource(), this, { + generateCoord: 'value' + }); + }, + + preventIncremental: function () { + var coordSysCreator = CoordinateSystemManager.get(this.get('coordinateSystem')); + if (coordSysCreator && coordSysCreator.dimensions) { + return coordSysCreator.dimensions[0] === 'lng' && coordSysCreator.dimensions[1] === 'lat'; + } + }, + + defaultOption: { + + // Cartesian2D or geo + coordinateSystem: 'cartesian2d', + + zlevel: 0, + + z: 2, + + // Cartesian coordinate system + // xAxisIndex: 0, + // yAxisIndex: 0, + + // Geo coordinate system + geoIndex: 0, + + blurSize: 30, + + pointSize: 20, + + maxOpacity: 1, + + minOpacity: 0 + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @file defines echarts Heatmap Chart + * @author Ovilia (me@zhangwenli.com) + * Inspired by https://github.com/mourner/simpleheat + * + * @module + */ + +var GRADIENT_LEVELS = 256; + +/** + * Heatmap Chart + * + * @class + */ +function Heatmap() { + var canvas = createCanvas(); + this.canvas = canvas; + + this.blurSize = 30; + this.pointSize = 20; + + this.maxOpacity = 1; + this.minOpacity = 0; + + this._gradientPixels = {}; +} + +Heatmap.prototype = { + /** + * Renders Heatmap and returns the rendered canvas + * @param {Array} data array of data, each has x, y, value + * @param {number} width canvas width + * @param {number} height canvas height + */ + update: function(data, width, height, normalize, colorFunc, isInRange) { + var brush = this._getBrush(); + var gradientInRange = this._getGradient(data, colorFunc, 'inRange'); + var gradientOutOfRange = this._getGradient(data, colorFunc, 'outOfRange'); + var r = this.pointSize + this.blurSize; + + var canvas = this.canvas; + var ctx = canvas.getContext('2d'); + var len = data.length; + canvas.width = width; + canvas.height = height; + for (var i = 0; i < len; ++i) { + var p = data[i]; + var x = p[0]; + var y = p[1]; + var value = p[2]; + + // calculate alpha using value + var alpha = normalize(value); + + // draw with the circle brush with alpha + ctx.globalAlpha = alpha; + ctx.drawImage(brush, x - r, y - r); + } + + if (!canvas.width || !canvas.height) { + // Avoid "Uncaught DOMException: Failed to execute 'getImageData' on + // 'CanvasRenderingContext2D': The source height is 0." + return canvas; + } + + // colorize the canvas using alpha value and set with gradient + var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); + + var pixels = imageData.data; + var offset = 0; + var pixelLen = pixels.length; + var minOpacity = this.minOpacity; + var maxOpacity = this.maxOpacity; + var diffOpacity = maxOpacity - minOpacity; + + while(offset < pixelLen) { + var alpha = pixels[offset + 3] / 256; + var gradientOffset = Math.floor(alpha * (GRADIENT_LEVELS - 1)) * 4; + // Simple optimize to ignore the empty data + if (alpha > 0) { + var gradient = isInRange(alpha) ? gradientInRange : gradientOutOfRange; + // Any alpha > 0 will be mapped to [minOpacity, maxOpacity] + alpha > 0 && (alpha = alpha * diffOpacity + minOpacity); + pixels[offset++] = gradient[gradientOffset]; + pixels[offset++] = gradient[gradientOffset + 1]; + pixels[offset++] = gradient[gradientOffset + 2]; + pixels[offset++] = gradient[gradientOffset + 3] * alpha * 256; + } + else { + offset += 4; + } + } + ctx.putImageData(imageData, 0, 0); + + return canvas; + }, + + /** + * get canvas of a black circle brush used for canvas to draw later + * @private + * @returns {Object} circle brush canvas + */ + _getBrush: function() { + var brushCanvas = this._brushCanvas || (this._brushCanvas = createCanvas()); + // set brush size + var r = this.pointSize + this.blurSize; + var d = r * 2; + brushCanvas.width = d; + brushCanvas.height = d; + + var ctx = brushCanvas.getContext('2d'); + ctx.clearRect(0, 0, d, d); + + // in order to render shadow without the distinct circle, + // draw the distinct circle in an invisible place, + // and use shadowOffset to draw shadow in the center of the canvas + ctx.shadowOffsetX = d; + ctx.shadowBlur = this.blurSize; + // draw the shadow in black, and use alpha and shadow blur to generate + // color in color map + ctx.shadowColor = '#000'; + + // draw circle in the left to the canvas + ctx.beginPath(); + ctx.arc(-r, r, this.pointSize, 0, Math.PI * 2, true); + ctx.closePath(); + ctx.fill(); + return brushCanvas; + }, + + /** + * get gradient color map + * @private + */ + _getGradient: function (data, colorFunc, state) { + var gradientPixels = this._gradientPixels; + var pixelsSingleState = gradientPixels[state] || (gradientPixels[state] = new Uint8ClampedArray(256 * 4)); + var color = [0, 0, 0, 0]; + var off = 0; + for (var i = 0; i < 256; i++) { + colorFunc[state](i / 255, true, color); + pixelsSingleState[off++] = color[0]; + pixelsSingleState[off++] = color[1]; + pixelsSingleState[off++] = color[2]; + pixelsSingleState[off++] = color[3]; + } + return pixelsSingleState; + } +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +function getIsInPiecewiseRange(dataExtent, pieceList, selected) { + var dataSpan = dataExtent[1] - dataExtent[0]; + pieceList = map(pieceList, function (piece) { + return { + interval: [ + (piece.interval[0] - dataExtent[0]) / dataSpan, + (piece.interval[1] - dataExtent[0]) / dataSpan + ] + }; + }); + var len = pieceList.length; + var lastIndex = 0; + + return function (val) { + // Try to find in the location of the last found + for (var i = lastIndex; i < len; i++) { + var interval = pieceList[i].interval; + if (interval[0] <= val && val <= interval[1]) { + lastIndex = i; + break; + } + } + if (i === len) { // Not found, back interation + for (var i = lastIndex - 1; i >= 0; i--) { + var interval = pieceList[i].interval; + if (interval[0] <= val && val <= interval[1]) { + lastIndex = i; + break; + } + } + } + return i >= 0 && i < len && selected[i]; + }; +} + +function getIsInContinuousRange(dataExtent, range) { + var dataSpan = dataExtent[1] - dataExtent[0]; + range = [ + (range[0] - dataExtent[0]) / dataSpan, + (range[1] - dataExtent[0]) / dataSpan + ]; + return function (val) { + return val >= range[0] && val <= range[1]; + }; +} + +function isGeoCoordSys(coordSys) { + var dimensions = coordSys.dimensions; + // Not use coorSys.type === 'geo' because coordSys maybe extended + return dimensions[0] === 'lng' && dimensions[1] === 'lat'; +} + +extendChartView({ + + type: 'heatmap', + + render: function (seriesModel, ecModel, api) { + var visualMapOfThisSeries; + ecModel.eachComponent('visualMap', function (visualMap) { + visualMap.eachTargetSeries(function (targetSeries) { + if (targetSeries === seriesModel) { + visualMapOfThisSeries = visualMap; + } + }); + }); + + if (__DEV__) { + if (!visualMapOfThisSeries) { + throw new Error('Heatmap must use with visualMap'); + } + } + + this.group.removeAll(); + + this._incrementalDisplayable = null; + + var coordSys = seriesModel.coordinateSystem; + if (coordSys.type === 'cartesian2d' || coordSys.type === 'calendar') { + this._renderOnCartesianAndCalendar(seriesModel, api, 0, seriesModel.getData().count()); + } + else if (isGeoCoordSys(coordSys)) { + this._renderOnGeo( + coordSys, seriesModel, visualMapOfThisSeries, api + ); + } + }, + + incrementalPrepareRender: function (seriesModel, ecModel, api) { + this.group.removeAll(); + }, + + incrementalRender: function (params, seriesModel, ecModel, api) { + var coordSys = seriesModel.coordinateSystem; + if (coordSys) { + this._renderOnCartesianAndCalendar(seriesModel, api, params.start, params.end, true); + } + }, + + _renderOnCartesianAndCalendar: function (seriesModel, api, start, end, incremental) { + + var coordSys = seriesModel.coordinateSystem; + var width; + var height; + + if (coordSys.type === 'cartesian2d') { + var xAxis = coordSys.getAxis('x'); + var yAxis = coordSys.getAxis('y'); + + if (__DEV__) { + if (!(xAxis.type === 'category' && yAxis.type === 'category')) { + throw new Error('Heatmap on cartesian must have two category axes'); + } + if (!(xAxis.onBand && yAxis.onBand)) { + throw new Error('Heatmap on cartesian must have two axes with boundaryGap true'); + } + } + + width = xAxis.getBandWidth(); + height = yAxis.getBandWidth(); + } + + var group = this.group; + var data = seriesModel.getData(); + + var itemStyleQuery = 'itemStyle'; + var hoverItemStyleQuery = 'emphasis.itemStyle'; + var labelQuery = 'label'; + var hoverLabelQuery = 'emphasis.label'; + var style = seriesModel.getModel(itemStyleQuery).getItemStyle(['color']); + var hoverStl = seriesModel.getModel(hoverItemStyleQuery).getItemStyle(); + var labelModel = seriesModel.getModel(labelQuery); + var hoverLabelModel = seriesModel.getModel(hoverLabelQuery); + var coordSysType = coordSys.type; + + + var dataDims = coordSysType === 'cartesian2d' + ? [ + data.mapDimension('x'), + data.mapDimension('y'), + data.mapDimension('value') + ] + : [ + data.mapDimension('time'), + data.mapDimension('value') + ]; + + for (var idx = start; idx < end; idx++) { + var rect; + + if (coordSysType === 'cartesian2d') { + // Ignore empty data + if (isNaN(data.get(dataDims[2], idx))) { + continue; + } + + var point = coordSys.dataToPoint([ + data.get(dataDims[0], idx), + data.get(dataDims[1], idx) + ]); + + rect = new Rect({ + shape: { + x: point[0] - width / 2, + y: point[1] - height / 2, + width: width, + height: height + }, + style: { + fill: data.getItemVisual(idx, 'color'), + opacity: data.getItemVisual(idx, 'opacity') + } + }); + } + else { + // Ignore empty data + if (isNaN(data.get(dataDims[1], idx))) { + continue; + } + + rect = new Rect({ + z2: 1, + shape: coordSys.dataToRect([data.get(dataDims[0], idx)]).contentShape, + style: { + fill: data.getItemVisual(idx, 'color'), + opacity: data.getItemVisual(idx, 'opacity') + } + }); + } + + var itemModel = data.getItemModel(idx); + + // Optimization for large datset + if (data.hasItemOption) { + style = itemModel.getModel(itemStyleQuery).getItemStyle(['color']); + hoverStl = itemModel.getModel(hoverItemStyleQuery).getItemStyle(); + labelModel = itemModel.getModel(labelQuery); + hoverLabelModel = itemModel.getModel(hoverLabelQuery); + } + + var rawValue = seriesModel.getRawValue(idx); + var defaultText = '-'; + if (rawValue && rawValue[2] != null) { + defaultText = rawValue[2]; + } + + setLabelStyle( + style, hoverStl, labelModel, hoverLabelModel, + { + labelFetcher: seriesModel, + labelDataIndex: idx, + defaultText: defaultText, + isRectText: true + } + ); + + rect.setStyle(style); + setHoverStyle(rect, data.hasItemOption ? hoverStl : extend({}, hoverStl)); + + rect.incremental = incremental; + // PENDING + if (incremental) { + // Rect must use hover layer if it's incremental. + rect.useHoverLayer = true; + } + + group.add(rect); + data.setItemGraphicEl(idx, rect); + } + }, + + _renderOnGeo: function (geo, seriesModel, visualMapModel, api) { + var inRangeVisuals = visualMapModel.targetVisuals.inRange; + var outOfRangeVisuals = visualMapModel.targetVisuals.outOfRange; + // if (!visualMapping) { + // throw new Error('Data range must have color visuals'); + // } + + var data = seriesModel.getData(); + var hmLayer = this._hmLayer || (this._hmLayer || new Heatmap()); + hmLayer.blurSize = seriesModel.get('blurSize'); + hmLayer.pointSize = seriesModel.get('pointSize'); + hmLayer.minOpacity = seriesModel.get('minOpacity'); + hmLayer.maxOpacity = seriesModel.get('maxOpacity'); + + var rect = geo.getViewRect().clone(); + var roamTransform = geo.getRoamTransform(); + rect.applyTransform(roamTransform); + + // Clamp on viewport + var x = Math.max(rect.x, 0); + var y = Math.max(rect.y, 0); + var x2 = Math.min(rect.width + rect.x, api.getWidth()); + var y2 = Math.min(rect.height + rect.y, api.getHeight()); + var width = x2 - x; + var height = y2 - y; + + var dims = [ + data.mapDimension('lng'), + data.mapDimension('lat'), + data.mapDimension('value') + ]; + + var points = data.mapArray(dims, function (lng, lat, value) { + var pt = geo.dataToPoint([lng, lat]); + pt[0] -= x; + pt[1] -= y; + pt.push(value); + return pt; + }); + + var dataExtent = visualMapModel.getExtent(); + var isInRange = visualMapModel.type === 'visualMap.continuous' + ? getIsInContinuousRange(dataExtent, visualMapModel.option.range) + : getIsInPiecewiseRange( + dataExtent, visualMapModel.getPieceList(), visualMapModel.option.selected + ); + + hmLayer.update( + points, width, height, + inRangeVisuals.color.getNormalizer(), + { + inRange: inRangeVisuals.color.getColorMapper(), + outOfRange: outOfRangeVisuals.color.getColorMapper() + }, + isInRange + ); + var img = new ZImage({ + style: { + width: width, + height: height, + x: x, + y: y, + image: hmLayer.canvas + }, + silent: true + }); + this.group.add(img); + }, + + dispose: function () {} +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var PictorialBarSeries = BaseBarSeries.extend({ + + type: 'series.pictorialBar', + + dependencies: ['grid'], + + defaultOption: { + symbol: 'circle', // Customized bar shape + symbolSize: null, // Can be ['100%', '100%'], null means auto. + symbolRotate: null, + + symbolPosition: null, // 'start' or 'end' or 'center', null means auto. + symbolOffset: null, + symbolMargin: null, // start margin and end margin. Can be a number or a percent string. + // Auto margin by defualt. + symbolRepeat: false, // false/null/undefined, means no repeat. + // Can be true, means auto calculate repeat times and cut by data. + // Can be a number, specifies repeat times, and do not cut by data. + // Can be 'fixed', means auto calculate repeat times but do not cut by data. + symbolRepeatDirection: 'end', // 'end' means from 'start' to 'end'. + + symbolClip: false, + symbolBoundingData: null, // Can be 60 or -40 or [-40, 60] + symbolPatternSize: 400, // 400 * 400 px + + barGap: '-100%', // In most case, overlap is needed. + + // z can be set in data item, which is z2 actually. + + // Disable progressive + progressive: 0, + hoverAnimation: false // Open only when needed. + }, + + getInitialData: function (option) { + // Disable stack. + option.stack = null; + return PictorialBarSeries.superApply(this, 'getInitialData', arguments); + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var BAR_BORDER_WIDTH_QUERY$1 = ['itemStyle', 'borderWidth']; + +// index: +isHorizontal +var LAYOUT_ATTRS = [ + {xy: 'x', wh: 'width', index: 0, posDesc: ['left', 'right']}, + {xy: 'y', wh: 'height', index: 1, posDesc: ['top', 'bottom']} +]; + +var pathForLineWidth = new Circle(); + +var BarView$1 = extendChartView({ + + type: 'pictorialBar', + + render: function (seriesModel, ecModel, api) { + var group = this.group; + var data = seriesModel.getData(); + var oldData = this._data; + + var cartesian = seriesModel.coordinateSystem; + var baseAxis = cartesian.getBaseAxis(); + var isHorizontal = !!baseAxis.isHorizontal(); + var coordSysRect = cartesian.grid.getRect(); + + var opt = { + ecSize: {width: api.getWidth(), height: api.getHeight()}, + seriesModel: seriesModel, + coordSys: cartesian, + coordSysExtent: [ + [coordSysRect.x, coordSysRect.x + coordSysRect.width], + [coordSysRect.y, coordSysRect.y + coordSysRect.height] + ], + isHorizontal: isHorizontal, + valueDim: LAYOUT_ATTRS[+isHorizontal], + categoryDim: LAYOUT_ATTRS[1 - isHorizontal] + }; + + data.diff(oldData) + .add(function (dataIndex) { + if (!data.hasValue(dataIndex)) { + return; + } + + var itemModel = getItemModel(data, dataIndex); + var symbolMeta = getSymbolMeta(data, dataIndex, itemModel, opt); + + var bar = createBar(data, opt, symbolMeta); + + data.setItemGraphicEl(dataIndex, bar); + group.add(bar); + + updateCommon$1(bar, opt, symbolMeta); + }) + .update(function (newIndex, oldIndex) { + var bar = oldData.getItemGraphicEl(oldIndex); + + if (!data.hasValue(newIndex)) { + group.remove(bar); + return; + } + + var itemModel = getItemModel(data, newIndex); + var symbolMeta = getSymbolMeta(data, newIndex, itemModel, opt); + + var pictorialShapeStr = getShapeStr(data, symbolMeta); + if (bar && pictorialShapeStr !== bar.__pictorialShapeStr) { + group.remove(bar); + data.setItemGraphicEl(newIndex, null); + bar = null; + } + + if (bar) { + updateBar(bar, opt, symbolMeta); + } + else { + bar = createBar(data, opt, symbolMeta, true); + } + + data.setItemGraphicEl(newIndex, bar); + bar.__pictorialSymbolMeta = symbolMeta; + // Add back + group.add(bar); + + updateCommon$1(bar, opt, symbolMeta); + }) + .remove(function (dataIndex) { + var bar = oldData.getItemGraphicEl(dataIndex); + bar && removeBar(oldData, dataIndex, bar.__pictorialSymbolMeta.animationModel, bar); + }) + .execute(); + + this._data = data; + + return this.group; + }, + + dispose: noop, + + remove: function (ecModel, api) { + var group = this.group; + var data = this._data; + if (ecModel.get('animation')) { + if (data) { + data.eachItemGraphicEl(function (bar) { + removeBar(data, bar.dataIndex, ecModel, bar); + }); + } + } + else { + group.removeAll(); + } + } +}); + + +// Set or calculate default value about symbol, and calculate layout info. +function getSymbolMeta(data, dataIndex, itemModel, opt) { + var layout = data.getItemLayout(dataIndex); + var symbolRepeat = itemModel.get('symbolRepeat'); + var symbolClip = itemModel.get('symbolClip'); + var symbolPosition = itemModel.get('symbolPosition') || 'start'; + var symbolRotate = itemModel.get('symbolRotate'); + var rotation = (symbolRotate || 0) * Math.PI / 180 || 0; + var symbolPatternSize = itemModel.get('symbolPatternSize') || 2; + var isAnimationEnabled = itemModel.isAnimationEnabled(); + + var symbolMeta = { + dataIndex: dataIndex, + layout: layout, + itemModel: itemModel, + symbolType: data.getItemVisual(dataIndex, 'symbol') || 'circle', + color: data.getItemVisual(dataIndex, 'color'), + symbolClip: symbolClip, + symbolRepeat: symbolRepeat, + symbolRepeatDirection: itemModel.get('symbolRepeatDirection'), + symbolPatternSize: symbolPatternSize, + rotation: rotation, + animationModel: isAnimationEnabled ? itemModel : null, + hoverAnimation: isAnimationEnabled && itemModel.get('hoverAnimation'), + z2: itemModel.getShallow('z', true) || 0 + }; + + prepareBarLength(itemModel, symbolRepeat, layout, opt, symbolMeta); + + prepareSymbolSize( + data, dataIndex, layout, symbolRepeat, symbolClip, symbolMeta.boundingLength, + symbolMeta.pxSign, symbolPatternSize, opt, symbolMeta + ); + + prepareLineWidth(itemModel, symbolMeta.symbolScale, rotation, opt, symbolMeta); + + var symbolSize = symbolMeta.symbolSize; + var symbolOffset = itemModel.get('symbolOffset'); + if (isArray(symbolOffset)) { + symbolOffset = [ + parsePercent$1(symbolOffset[0], symbolSize[0]), + parsePercent$1(symbolOffset[1], symbolSize[1]) + ]; + } + + prepareLayoutInfo( + itemModel, symbolSize, layout, symbolRepeat, symbolClip, symbolOffset, + symbolPosition, symbolMeta.valueLineWidth, symbolMeta.boundingLength, symbolMeta.repeatCutLength, + opt, symbolMeta + ); + + return symbolMeta; +} + +// bar length can be negative. +function prepareBarLength(itemModel, symbolRepeat, layout, opt, output) { + var valueDim = opt.valueDim; + var symbolBoundingData = itemModel.get('symbolBoundingData'); + var valueAxis = opt.coordSys.getOtherAxis(opt.coordSys.getBaseAxis()); + var zeroPx = valueAxis.toGlobalCoord(valueAxis.dataToCoord(0)); + var pxSignIdx = 1 - +(layout[valueDim.wh] <= 0); + var boundingLength; + + if (isArray(symbolBoundingData)) { + var symbolBoundingExtent = [ + convertToCoordOnAxis(valueAxis, symbolBoundingData[0]) - zeroPx, + convertToCoordOnAxis(valueAxis, symbolBoundingData[1]) - zeroPx + ]; + symbolBoundingExtent[1] < symbolBoundingExtent[0] && (symbolBoundingExtent.reverse()); + boundingLength = symbolBoundingExtent[pxSignIdx]; + } + else if (symbolBoundingData != null) { + boundingLength = convertToCoordOnAxis(valueAxis, symbolBoundingData) - zeroPx; + } + else if (symbolRepeat) { + boundingLength = opt.coordSysExtent[valueDim.index][pxSignIdx] - zeroPx; + } + else { + boundingLength = layout[valueDim.wh]; + } + + output.boundingLength = boundingLength; + + if (symbolRepeat) { + output.repeatCutLength = layout[valueDim.wh]; + } + + output.pxSign = boundingLength > 0 ? 1 : boundingLength < 0 ? -1 : 0; +} + +function convertToCoordOnAxis(axis, value) { + return axis.toGlobalCoord(axis.dataToCoord(axis.scale.parse(value))); +} + +// Support ['100%', '100%'] +function prepareSymbolSize( + data, dataIndex, layout, symbolRepeat, symbolClip, boundingLength, + pxSign, symbolPatternSize, opt, output +) { + var valueDim = opt.valueDim; + var categoryDim = opt.categoryDim; + var categorySize = Math.abs(layout[categoryDim.wh]); + + var symbolSize = data.getItemVisual(dataIndex, 'symbolSize'); + if (isArray(symbolSize)) { + symbolSize = symbolSize.slice(); + } + else { + if (symbolSize == null) { + symbolSize = '100%'; + } + symbolSize = [symbolSize, symbolSize]; + } + + // Note: percentage symbolSize (like '100%') do not consider lineWidth, because it is + // to complicated to calculate real percent value if considering scaled lineWidth. + // So the actual size will bigger than layout size if lineWidth is bigger than zero, + // which can be tolerated in pictorial chart. + + symbolSize[categoryDim.index] = parsePercent$1( + symbolSize[categoryDim.index], + categorySize + ); + symbolSize[valueDim.index] = parsePercent$1( + symbolSize[valueDim.index], + symbolRepeat ? categorySize : Math.abs(boundingLength) + ); + + output.symbolSize = symbolSize; + + // If x or y is less than zero, show reversed shape. + var symbolScale = output.symbolScale = [ + symbolSize[0] / symbolPatternSize, + symbolSize[1] / symbolPatternSize + ]; + // Follow convention, 'right' and 'top' is the normal scale. + symbolScale[valueDim.index] *= (opt.isHorizontal ? -1 : 1) * pxSign; +} + +function prepareLineWidth(itemModel, symbolScale, rotation, opt, output) { + // In symbols are drawn with scale, so do not need to care about the case that width + // or height are too small. But symbol use strokeNoScale, where acture lineWidth should + // be calculated. + var valueLineWidth = itemModel.get(BAR_BORDER_WIDTH_QUERY$1) || 0; + + if (valueLineWidth) { + pathForLineWidth.attr({ + scale: symbolScale.slice(), + rotation: rotation + }); + pathForLineWidth.updateTransform(); + valueLineWidth /= pathForLineWidth.getLineScale(); + valueLineWidth *= symbolScale[opt.valueDim.index]; + } + + output.valueLineWidth = valueLineWidth; +} + +function prepareLayoutInfo( + itemModel, symbolSize, layout, symbolRepeat, symbolClip, symbolOffset, + symbolPosition, valueLineWidth, boundingLength, repeatCutLength, opt, output +) { + var categoryDim = opt.categoryDim; + var valueDim = opt.valueDim; + var pxSign = output.pxSign; + + var unitLength = Math.max(symbolSize[valueDim.index] + valueLineWidth, 0); + var pathLen = unitLength; + + // Note: rotation will not effect the layout of symbols, because user may + // want symbols to rotate on its center, which should not be translated + // when rotating. + + if (symbolRepeat) { + var absBoundingLength = Math.abs(boundingLength); + + var symbolMargin = retrieve(itemModel.get('symbolMargin'), '15%') + ''; + var hasEndGap = false; + if (symbolMargin.lastIndexOf('!') === symbolMargin.length - 1) { + hasEndGap = true; + symbolMargin = symbolMargin.slice(0, symbolMargin.length - 1); + } + symbolMargin = parsePercent$1(symbolMargin, symbolSize[valueDim.index]); + + var uLenWithMargin = Math.max(unitLength + symbolMargin * 2, 0); + + // When symbol margin is less than 0, margin at both ends will be subtracted + // to ensure that all of the symbols will not be overflow the given area. + var endFix = hasEndGap ? 0 : symbolMargin * 2; + + // Both final repeatTimes and final symbolMargin area calculated based on + // boundingLength. + var repeatSpecified = isNumeric(symbolRepeat); + var repeatTimes = repeatSpecified + ? symbolRepeat + : toIntTimes((absBoundingLength + endFix) / uLenWithMargin); + + // Adjust calculate margin, to ensure each symbol is displayed + // entirely in the given layout area. + var mDiff = absBoundingLength - repeatTimes * unitLength; + symbolMargin = mDiff / 2 / (hasEndGap ? repeatTimes : repeatTimes - 1); + uLenWithMargin = unitLength + symbolMargin * 2; + endFix = hasEndGap ? 0 : symbolMargin * 2; + + // Update repeatTimes when not all symbol will be shown. + if (!repeatSpecified && symbolRepeat !== 'fixed') { + repeatTimes = repeatCutLength + ? toIntTimes((Math.abs(repeatCutLength) + endFix) / uLenWithMargin) + : 0; + } + + pathLen = repeatTimes * uLenWithMargin - endFix; + output.repeatTimes = repeatTimes; + output.symbolMargin = symbolMargin; + } + + var sizeFix = pxSign * (pathLen / 2); + var pathPosition = output.pathPosition = []; + pathPosition[categoryDim.index] = layout[categoryDim.wh] / 2; + pathPosition[valueDim.index] = symbolPosition === 'start' + ? sizeFix + : symbolPosition === 'end' + ? boundingLength - sizeFix + : boundingLength / 2; // 'center' + if (symbolOffset) { + pathPosition[0] += symbolOffset[0]; + pathPosition[1] += symbolOffset[1]; + } + + var bundlePosition = output.bundlePosition = []; + bundlePosition[categoryDim.index] = layout[categoryDim.xy]; + bundlePosition[valueDim.index] = layout[valueDim.xy]; + + var barRectShape = output.barRectShape = extend({}, layout); + barRectShape[valueDim.wh] = pxSign * Math.max( + Math.abs(layout[valueDim.wh]), Math.abs(pathPosition[valueDim.index] + sizeFix) + ); + barRectShape[categoryDim.wh] = layout[categoryDim.wh]; + + var clipShape = output.clipShape = {}; + // Consider that symbol may be overflow layout rect. + clipShape[categoryDim.xy] = -layout[categoryDim.xy]; + clipShape[categoryDim.wh] = opt.ecSize[categoryDim.wh]; + clipShape[valueDim.xy] = 0; + clipShape[valueDim.wh] = layout[valueDim.wh]; +} + +function createPath(symbolMeta) { + var symbolPatternSize = symbolMeta.symbolPatternSize; + var path = createSymbol( + // Consider texture img, make a big size. + symbolMeta.symbolType, + -symbolPatternSize / 2, + -symbolPatternSize / 2, + symbolPatternSize, + symbolPatternSize, + symbolMeta.color + ); + path.attr({ + culling: true + }); + path.type !== 'image' && path.setStyle({ + strokeNoScale: true + }); + + return path; +} + +function createOrUpdateRepeatSymbols(bar, opt, symbolMeta, isUpdate) { + var bundle = bar.__pictorialBundle; + var symbolSize = symbolMeta.symbolSize; + var valueLineWidth = symbolMeta.valueLineWidth; + var pathPosition = symbolMeta.pathPosition; + var valueDim = opt.valueDim; + var repeatTimes = symbolMeta.repeatTimes || 0; + + var index = 0; + var unit = symbolSize[opt.valueDim.index] + valueLineWidth + symbolMeta.symbolMargin * 2; + + eachPath(bar, function (path) { + path.__pictorialAnimationIndex = index; + path.__pictorialRepeatTimes = repeatTimes; + if (index < repeatTimes) { + updateAttr(path, null, makeTarget(index), symbolMeta, isUpdate); + } + else { + updateAttr(path, null, {scale: [0, 0]}, symbolMeta, isUpdate, function () { + bundle.remove(path); + }); + } + + updateHoverAnimation(path, symbolMeta); + + index++; + }); + + for (; index < repeatTimes; index++) { + var path = createPath(symbolMeta); + path.__pictorialAnimationIndex = index; + path.__pictorialRepeatTimes = repeatTimes; + bundle.add(path); + + var target = makeTarget(index); + + updateAttr( + path, + { + position: target.position, + scale: [0, 0] + }, + { + scale: target.scale, + rotation: target.rotation + }, + symbolMeta, + isUpdate + ); + + // FIXME + // If all emphasis/normal through action. + path + .on('mouseover', onMouseOver) + .on('mouseout', onMouseOut); + + updateHoverAnimation(path, symbolMeta); + } + + function makeTarget(index) { + var position = pathPosition.slice(); + // (start && pxSign > 0) || (end && pxSign < 0): i = repeatTimes - index + // Otherwise: i = index; + var pxSign = symbolMeta.pxSign; + var i = index; + if (symbolMeta.symbolRepeatDirection === 'start' ? pxSign > 0 : pxSign < 0) { + i = repeatTimes - 1 - index; + } + position[valueDim.index] = unit * (i - repeatTimes / 2 + 0.5) + pathPosition[valueDim.index]; + + return { + position: position, + scale: symbolMeta.symbolScale.slice(), + rotation: symbolMeta.rotation + }; + } + + function onMouseOver() { + eachPath(bar, function (path) { + path.trigger('emphasis'); + }); + } + + function onMouseOut() { + eachPath(bar, function (path) { + path.trigger('normal'); + }); + } +} + +function createOrUpdateSingleSymbol(bar, opt, symbolMeta, isUpdate) { + var bundle = bar.__pictorialBundle; + var mainPath = bar.__pictorialMainPath; + + if (!mainPath) { + mainPath = bar.__pictorialMainPath = createPath(symbolMeta); + bundle.add(mainPath); + + updateAttr( + mainPath, + { + position: symbolMeta.pathPosition.slice(), + scale: [0, 0], + rotation: symbolMeta.rotation + }, + { + scale: symbolMeta.symbolScale.slice() + }, + symbolMeta, + isUpdate + ); + + mainPath + .on('mouseover', onMouseOver) + .on('mouseout', onMouseOut); + } + else { + updateAttr( + mainPath, + null, + { + position: symbolMeta.pathPosition.slice(), + scale: symbolMeta.symbolScale.slice(), + rotation: symbolMeta.rotation + }, + symbolMeta, + isUpdate + ); + } + + updateHoverAnimation(mainPath, symbolMeta); + + function onMouseOver() { + this.trigger('emphasis'); + } + + function onMouseOut() { + this.trigger('normal'); + } +} + +// bar rect is used for label. +function createOrUpdateBarRect(bar, symbolMeta, isUpdate) { + var rectShape = extend({}, symbolMeta.barRectShape); + + var barRect = bar.__pictorialBarRect; + if (!barRect) { + barRect = bar.__pictorialBarRect = new Rect({ + z2: 2, + shape: rectShape, + silent: true, + style: { + stroke: 'transparent', + fill: 'transparent', + lineWidth: 0 + } + }); + + bar.add(barRect); + } + else { + updateAttr(barRect, null, {shape: rectShape}, symbolMeta, isUpdate); + } +} + +function createOrUpdateClip(bar, opt, symbolMeta, isUpdate) { + // If not clip, symbol will be remove and rebuilt. + if (symbolMeta.symbolClip) { + var clipPath = bar.__pictorialClipPath; + var clipShape = extend({}, symbolMeta.clipShape); + var valueDim = opt.valueDim; + var animationModel = symbolMeta.animationModel; + var dataIndex = symbolMeta.dataIndex; + + if (clipPath) { + updateProps( + clipPath, {shape: clipShape}, animationModel, dataIndex + ); + } + else { + clipShape[valueDim.wh] = 0; + clipPath = new Rect({shape: clipShape}); + bar.__pictorialBundle.setClipPath(clipPath); + bar.__pictorialClipPath = clipPath; + + var target = {}; + target[valueDim.wh] = symbolMeta.clipShape[valueDim.wh]; + + graphic[isUpdate ? 'updateProps' : 'initProps']( + clipPath, {shape: target}, animationModel, dataIndex + ); + } + } +} + +function getItemModel(data, dataIndex) { + var itemModel = data.getItemModel(dataIndex); + itemModel.getAnimationDelayParams = getAnimationDelayParams; + itemModel.isAnimationEnabled = isAnimationEnabled; + return itemModel; +} + +function getAnimationDelayParams(path) { + // The order is the same as the z-order, see `symbolRepeatDiretion`. + return { + index: path.__pictorialAnimationIndex, + count: path.__pictorialRepeatTimes + }; +} + +function isAnimationEnabled() { + // `animation` prop can be set on itemModel in pictorial bar chart. + return this.parentModel.isAnimationEnabled() && !!this.getShallow('animation'); +} + +function updateHoverAnimation(path, symbolMeta) { + path.off('emphasis').off('normal'); + + var scale = symbolMeta.symbolScale.slice(); + + symbolMeta.hoverAnimation && path + .on('emphasis', function() { + this.animateTo({ + scale: [scale[0] * 1.1, scale[1] * 1.1] + }, 400, 'elasticOut'); + }) + .on('normal', function() { + this.animateTo({ + scale: scale.slice() + }, 400, 'elasticOut'); + }); +} + +function createBar(data, opt, symbolMeta, isUpdate) { + // bar is the main element for each data. + var bar = new Group(); + // bundle is used for location and clip. + var bundle = new Group(); + bar.add(bundle); + bar.__pictorialBundle = bundle; + bundle.attr('position', symbolMeta.bundlePosition.slice()); + + if (symbolMeta.symbolRepeat) { + createOrUpdateRepeatSymbols(bar, opt, symbolMeta); + } + else { + createOrUpdateSingleSymbol(bar, opt, symbolMeta); + } + + createOrUpdateBarRect(bar, symbolMeta, isUpdate); + + createOrUpdateClip(bar, opt, symbolMeta, isUpdate); + + bar.__pictorialShapeStr = getShapeStr(data, symbolMeta); + bar.__pictorialSymbolMeta = symbolMeta; + + return bar; +} + +function updateBar(bar, opt, symbolMeta) { + var animationModel = symbolMeta.animationModel; + var dataIndex = symbolMeta.dataIndex; + var bundle = bar.__pictorialBundle; + + updateProps( + bundle, {position: symbolMeta.bundlePosition.slice()}, animationModel, dataIndex + ); + + if (symbolMeta.symbolRepeat) { + createOrUpdateRepeatSymbols(bar, opt, symbolMeta, true); + } + else { + createOrUpdateSingleSymbol(bar, opt, symbolMeta, true); + } + + createOrUpdateBarRect(bar, symbolMeta, true); + + createOrUpdateClip(bar, opt, symbolMeta, true); +} + +function removeBar(data, dataIndex, animationModel, bar) { + // Not show text when animating + var labelRect = bar.__pictorialBarRect; + labelRect && (labelRect.style.text = null); + + var pathes = []; + eachPath(bar, function (path) { + pathes.push(path); + }); + bar.__pictorialMainPath && pathes.push(bar.__pictorialMainPath); + + // I do not find proper remove animation for clip yet. + bar.__pictorialClipPath && (animationModel = null); + + each$1(pathes, function (path) { + updateProps( + path, {scale: [0, 0]}, animationModel, dataIndex, + function () { + bar.parent && bar.parent.remove(bar); + } + ); + }); + + data.setItemGraphicEl(dataIndex, null); +} + +function getShapeStr(data, symbolMeta) { + return [ + data.getItemVisual(symbolMeta.dataIndex, 'symbol') || 'none', + !!symbolMeta.symbolRepeat, + !!symbolMeta.symbolClip + ].join(':'); +} + +function eachPath(bar, cb, context) { + // Do not use Group#eachChild, because it do not support remove. + each$1(bar.__pictorialBundle.children(), function (el) { + el !== bar.__pictorialBarRect && cb.call(context, el); + }); +} + +function updateAttr(el, immediateAttrs, animationAttrs, symbolMeta, isUpdate, cb) { + immediateAttrs && el.attr(immediateAttrs); + // when symbolCip used, only clip path has init animation, otherwise it would be weird effect. + if (symbolMeta.symbolClip && !isUpdate) { + animationAttrs && el.attr(animationAttrs); + } + else { + animationAttrs && graphic[isUpdate ? 'updateProps' : 'initProps']( + el, animationAttrs, symbolMeta.animationModel, symbolMeta.dataIndex, cb + ); + } +} + +function updateCommon$1(bar, opt, symbolMeta) { + var color = symbolMeta.color; + var dataIndex = symbolMeta.dataIndex; + var itemModel = symbolMeta.itemModel; + // Color must be excluded. + // Because symbol provide setColor individually to set fill and stroke + var normalStyle = itemModel.getModel('itemStyle').getItemStyle(['color']); + var hoverStyle = itemModel.getModel('emphasis.itemStyle').getItemStyle(); + var cursorStyle = itemModel.getShallow('cursor'); + + eachPath(bar, function (path) { + // PENDING setColor should be before setStyle!!! + path.setColor(color); + path.setStyle(defaults( + { + fill: color, + opacity: symbolMeta.opacity + }, + normalStyle + )); + setHoverStyle(path, hoverStyle); + + cursorStyle && (path.cursor = cursorStyle); + path.z2 = symbolMeta.z2; + }); + + var barRectHoverStyle = {}; + var barPositionOutside = opt.valueDim.posDesc[+(symbolMeta.boundingLength > 0)]; + var barRect = bar.__pictorialBarRect; + + setLabel( + barRect.style, barRectHoverStyle, itemModel, + color, opt.seriesModel, dataIndex, barPositionOutside + ); + + setHoverStyle(barRect, barRectHoverStyle); +} + +function toIntTimes(times) { + var roundedTimes = Math.round(times); + // Escapse accurate error + return Math.abs(times - roundedTimes) < 1e-4 + ? roundedTimes + : Math.ceil(times); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// In case developer forget to include grid component +registerLayout(curry( + layout, 'pictorialBar' +)); +registerVisual(visualSymbol('pictorialBar', 'roundRect')); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @constructor module:echarts/coord/single/SingleAxis + * @extends {module:echarts/coord/Axis} + * @param {string} dim + * @param {*} scale + * @param {Array.<number>} coordExtent + * @param {string} axisType + * @param {string} position + */ +var SingleAxis = function (dim, scale, coordExtent, axisType, position) { + + Axis.call(this, dim, scale, coordExtent); + + /** + * Axis type + * - 'category' + * - 'value' + * - 'time' + * - 'log' + * @type {string} + */ + this.type = axisType || 'value'; + + /** + * Axis position + * - 'top' + * - 'bottom' + * - 'left' + * - 'right' + * @type {string} + */ + this.position = position || 'bottom'; + + /** + * Axis orient + * - 'horizontal' + * - 'vertical' + * @type {[type]} + */ + this.orient = null; + +}; + +SingleAxis.prototype = { + + constructor: SingleAxis, + + /** + * Axis model + * @type {module:echarts/coord/single/AxisModel} + */ + model: null, + + /** + * Judge the orient of the axis. + * @return {boolean} + */ + isHorizontal: function () { + var position = this.position; + return position === 'top' || position === 'bottom'; + + }, + + /** + * @override + */ + pointToData: function (point, clamp) { + return this.coordinateSystem.pointToData(point, clamp)[0]; + }, + + /** + * Convert the local coord(processed by dataToCoord()) + * to global coord(concrete pixel coord). + * designated by module:echarts/coord/single/Single. + * @type {Function} + */ + toGlobalCoord: null, + + /** + * Convert the global coord to local coord. + * designated by module:echarts/coord/single/Single. + * @type {Function} + */ + toLocalCoord: null + +}; + +inherits(SingleAxis, Axis); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Single coordinates system. + */ + +/** + * Create a single coordinates system. + * + * @param {module:echarts/coord/single/AxisModel} axisModel + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + */ +function Single(axisModel, ecModel, api) { + + /** + * @type {string} + * @readOnly + */ + this.dimension = 'single'; + + /** + * Add it just for draw tooltip. + * + * @type {Array.<string>} + * @readOnly + */ + this.dimensions = ['single']; + + /** + * @private + * @type {module:echarts/coord/single/SingleAxis}. + */ + this._axis = null; + + /** + * @private + * @type {module:zrender/core/BoundingRect} + */ + this._rect; + + this._init(axisModel, ecModel, api); + + /** + * @type {module:echarts/coord/single/AxisModel} + */ + this.model = axisModel; +} + +Single.prototype = { + + type: 'singleAxis', + + axisPointerEnabled: true, + + constructor: Single, + + /** + * Initialize single coordinate system. + * + * @param {module:echarts/coord/single/AxisModel} axisModel + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + * @private + */ + _init: function (axisModel, ecModel, api) { + + var dim = this.dimension; + + var axis = new SingleAxis( + dim, + createScaleByModel(axisModel), + [0, 0], + axisModel.get('type'), + axisModel.get('position') + ); + + var isCategory = axis.type === 'category'; + axis.onBand = isCategory && axisModel.get('boundaryGap'); + axis.inverse = axisModel.get('inverse'); + axis.orient = axisModel.get('orient'); + + axisModel.axis = axis; + axis.model = axisModel; + axis.coordinateSystem = this; + this._axis = axis; + }, + + /** + * Update axis scale after data processed + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + */ + update: function (ecModel, api) { + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.coordinateSystem === this) { + var data = seriesModel.getData(); + each$1(data.mapDimension(this.dimension, true), function (dim) { + this._axis.scale.unionExtentFromData(data, dim); + }, this); + niceScaleExtent(this._axis.scale, this._axis.model); + } + }, this); + }, + + /** + * Resize the single coordinate system. + * + * @param {module:echarts/coord/single/AxisModel} axisModel + * @param {module:echarts/ExtensionAPI} api + */ + resize: function (axisModel, api) { + this._rect = getLayoutRect( + { + left: axisModel.get('left'), + top: axisModel.get('top'), + right: axisModel.get('right'), + bottom: axisModel.get('bottom'), + width: axisModel.get('width'), + height: axisModel.get('height') + }, + { + width: api.getWidth(), + height: api.getHeight() + } + ); + + this._adjustAxis(); + }, + + /** + * @return {module:zrender/core/BoundingRect} + */ + getRect: function () { + return this._rect; + }, + + /** + * @private + */ + _adjustAxis: function () { + + var rect = this._rect; + var axis = this._axis; + + var isHorizontal = axis.isHorizontal(); + var extent = isHorizontal ? [0, rect.width] : [0, rect.height]; + var idx = axis.reverse ? 1 : 0; + + axis.setExtent(extent[idx], extent[1 - idx]); + + this._updateAxisTransform(axis, isHorizontal ? rect.x : rect.y); + + }, + + /** + * @param {module:echarts/coord/single/SingleAxis} axis + * @param {number} coordBase + */ + _updateAxisTransform: function (axis, coordBase) { + + var axisExtent = axis.getExtent(); + var extentSum = axisExtent[0] + axisExtent[1]; + var isHorizontal = axis.isHorizontal(); + + axis.toGlobalCoord = isHorizontal + ? function (coord) { + return coord + coordBase; + } + : function (coord) { + return extentSum - coord + coordBase; + }; + + axis.toLocalCoord = isHorizontal + ? function (coord) { + return coord - coordBase; + } + : function (coord) { + return extentSum - coord + coordBase; + }; + }, + + /** + * Get axis. + * + * @return {module:echarts/coord/single/SingleAxis} + */ + getAxis: function () { + return this._axis; + }, + + /** + * Get axis, add it just for draw tooltip. + * + * @return {[type]} [description] + */ + getBaseAxis: function () { + return this._axis; + }, + + /** + * @return {Array.<module:echarts/coord/Axis>} + */ + getAxes: function () { + return [this._axis]; + }, + + /** + * @return {Object} {baseAxes: [], otherAxes: []} + */ + getTooltipAxes: function () { + return {baseAxes: [this.getAxis()]}; + }, + + /** + * If contain point. + * + * @param {Array.<number>} point + * @return {boolean} + */ + containPoint: function (point) { + var rect = this.getRect(); + var axis = this.getAxis(); + var orient = axis.orient; + if (orient === 'horizontal') { + return axis.contain(axis.toLocalCoord(point[0])) + && (point[1] >= rect.y && point[1] <= (rect.y + rect.height)); + } + else { + return axis.contain(axis.toLocalCoord(point[1])) + && (point[0] >= rect.y && point[0] <= (rect.y + rect.height)); + } + }, + + /** + * @param {Array.<number>} point + * @return {Array.<number>} + */ + pointToData: function (point) { + var axis = this.getAxis(); + return [axis.coordToData(axis.toLocalCoord( + point[axis.orient === 'horizontal' ? 0 : 1] + ))]; + }, + + /** + * Convert the series data to concrete point. + * + * @param {number|Array.<number>} val + * @return {Array.<number>} + */ + dataToPoint: function (val) { + var axis = this.getAxis(); + var rect = this.getRect(); + var pt = []; + var idx = axis.orient === 'horizontal' ? 0 : 1; + + if (val instanceof Array) { + val = val[0]; + } + + pt[idx] = axis.toGlobalCoord(axis.dataToCoord(+val)); + pt[1 - idx] = idx === 0 ? (rect.y + rect.height / 2) : (rect.x + rect.width / 2); + return pt; + } + +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Single coordinate system creator. + */ + +/** + * Create single coordinate system and inject it into seriesModel. + * + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + * @return {Array.<module:echarts/coord/single/Single>} + */ +function create$3(ecModel, api) { + var singles = []; + + ecModel.eachComponent('singleAxis', function(axisModel, idx) { + + var single = new Single(axisModel, ecModel, api); + single.name = 'single_' + idx; + single.resize(axisModel, api); + axisModel.coordinateSystem = single; + singles.push(single); + + }); + + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.get('coordinateSystem') === 'singleAxis') { + var singleAxisModel = ecModel.queryComponents({ + mainType: 'singleAxis', + index: seriesModel.get('singleAxisIndex'), + id: seriesModel.get('singleAxisId') + })[0]; + seriesModel.coordinateSystem = singleAxisModel && singleAxisModel.coordinateSystem; + } + }); + + return singles; +} + +CoordinateSystemManager.register('single', { + create: create$3, + dimensions: Single.prototype.dimensions +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @param {Object} opt {labelInside} + * @return {Object} { + * position, rotation, labelDirection, labelOffset, + * tickDirection, labelRotate, z2 + * } + */ +function layout$2(axisModel, opt) { + opt = opt || {}; + var single = axisModel.coordinateSystem; + var axis = axisModel.axis; + var layout = {}; + + var axisPosition = axis.position; + var orient = axis.orient; + + var rect = single.getRect(); + var rectBound = [rect.x, rect.x + rect.width, rect.y, rect.y + rect.height]; + + var positionMap = { + horizontal: {top: rectBound[2], bottom: rectBound[3]}, + vertical: {left: rectBound[0], right: rectBound[1]} + }; + + layout.position = [ + orient === 'vertical' + ? positionMap.vertical[axisPosition] + : rectBound[0], + orient === 'horizontal' + ? positionMap.horizontal[axisPosition] + : rectBound[3] + ]; + + var r = {horizontal: 0, vertical: 1}; + layout.rotation = Math.PI / 2 * r[orient]; + + var directionMap = {top: -1, bottom: 1, right: 1, left: -1}; + + layout.labelDirection = layout.tickDirection + = layout.nameDirection + = directionMap[axisPosition]; + + if (axisModel.get('axisTick.inside')) { + layout.tickDirection = -layout.tickDirection; + } + + if (retrieve(opt.labelInside, axisModel.get('axisLabel.inside'))) { + layout.labelDirection = -layout.labelDirection; + } + + var labelRotation = opt.rotate; + labelRotation == null && (labelRotation = axisModel.get('axisLabel.rotate')); + layout.labelRotation = axisPosition === 'top' ? -labelRotation : labelRotation; + + layout.z2 = 1; + + return layout; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +var axisBuilderAttrs$2 = [ + 'axisLine', 'axisTickLabel', 'axisName' +]; + +var selfBuilderAttr = 'splitLine'; + +var SingleAxisView = AxisView.extend({ + + type: 'singleAxis', + + axisPointerClass: 'SingleAxisPointer', + + render: function (axisModel, ecModel, api, payload) { + + var group = this.group; + + group.removeAll(); + + var layout = layout$2(axisModel); + + var axisBuilder = new AxisBuilder(axisModel, layout); + + each$1(axisBuilderAttrs$2, axisBuilder.add, axisBuilder); + + group.add(axisBuilder.getGroup()); + + if (axisModel.get(selfBuilderAttr + '.show')) { + this['_' + selfBuilderAttr](axisModel); + } + + SingleAxisView.superCall(this, 'render', axisModel, ecModel, api, payload); + }, + + _splitLine: function(axisModel) { + var axis = axisModel.axis; + + if (axis.scale.isBlank()) { + return; + } + + var splitLineModel = axisModel.getModel('splitLine'); + var lineStyleModel = splitLineModel.getModel('lineStyle'); + var lineWidth = lineStyleModel.get('width'); + var lineColors = lineStyleModel.get('color'); + + lineColors = lineColors instanceof Array ? lineColors : [lineColors]; + + var gridRect = axisModel.coordinateSystem.getRect(); + var isHorizontal = axis.isHorizontal(); + + var splitLines = []; + var lineCount = 0; + + var ticksCoords = axis.getTicksCoords({ + tickModel: splitLineModel + }); + + var p1 = []; + var p2 = []; + + for (var i = 0; i < ticksCoords.length; ++i) { + var tickCoord = axis.toGlobalCoord(ticksCoords[i].coord); + if (isHorizontal) { + p1[0] = tickCoord; + p1[1] = gridRect.y; + p2[0] = tickCoord; + p2[1] = gridRect.y + gridRect.height; + } + else { + p1[0] = gridRect.x; + p1[1] = tickCoord; + p2[0] = gridRect.x + gridRect.width; + p2[1] = tickCoord; + } + var colorIndex = (lineCount++) % lineColors.length; + splitLines[colorIndex] = splitLines[colorIndex] || []; + splitLines[colorIndex].push(new Line( + subPixelOptimizeLine({ + shape: { + x1: p1[0], + y1: p1[1], + x2: p2[0], + y2: p2[1] + }, + style: { + lineWidth: lineWidth + }, + silent: true + }))); + } + + for (var i = 0; i < splitLines.length; ++i) { + this.group.add(mergePath(splitLines[i], { + style: { + stroke: lineColors[i % lineColors.length], + lineDash: lineStyleModel.getLineDash(lineWidth), + lineWidth: lineWidth + }, + silent: true + })); + } + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var AxisModel$4 = ComponentModel.extend({ + + type: 'singleAxis', + + layoutMode: 'box', + + /** + * @type {module:echarts/coord/single/SingleAxis} + */ + axis: null, + + /** + * @type {module:echarts/coord/single/Single} + */ + coordinateSystem: null, + + /** + * @override + */ + getCoordSysModel: function () { + return this; + } + +}); + +var defaultOption$2 = { + + left: '5%', + top: '5%', + right: '5%', + bottom: '5%', + + type: 'value', + + position: 'bottom', + + orient: 'horizontal', + + axisLine: { + show: true, + lineStyle: { + width: 2, + type: 'solid' + } + }, + + // Single coordinate system and single axis is the, + // which is used as the parent tooltip model. + // same model, so we set default tooltip show as true. + tooltip: { + show: true + }, + + axisTick: { + show: true, + length: 6, + lineStyle: { + width: 2 + } + }, + + axisLabel: { + show: true, + interval: 'auto' + }, + + splitLine: { + show: true, + lineStyle: { + type: 'dashed', + opacity: 0.2 + } + } +}; + +function getAxisType$2(axisName, option) { + return option.type || (option.data ? 'category' : 'value'); +} + +merge(AxisModel$4.prototype, axisModelCommonMixin); + +axisModelCreator('single', AxisModel$4, getAxisType$2, defaultOption$2); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @param {Object} finder contains {seriesIndex, dataIndex, dataIndexInside} + * @param {module:echarts/model/Global} ecModel + * @return {Object} {point: [x, y], el: ...} point Will not be null. + */ +var findPointFromSeries = function (finder, ecModel) { + var point = []; + var seriesIndex = finder.seriesIndex; + var seriesModel; + if (seriesIndex == null || !( + seriesModel = ecModel.getSeriesByIndex(seriesIndex) + )) { + return {point: []}; + } + + var data = seriesModel.getData(); + var dataIndex = queryDataIndex(data, finder); + if (dataIndex == null || dataIndex < 0 || isArray(dataIndex)) { + return {point: []}; + } + + var el = data.getItemGraphicEl(dataIndex); + var coordSys = seriesModel.coordinateSystem; + + if (seriesModel.getTooltipPosition) { + point = seriesModel.getTooltipPosition(dataIndex) || []; + } + else if (coordSys && coordSys.dataToPoint) { + point = coordSys.dataToPoint( + data.getValues( + map(coordSys.dimensions, function (dim) { + return data.mapDimension(dim); + }), dataIndex, true + ) + ) || []; + } + else if (el) { + // Use graphic bounding rect + var rect = el.getBoundingRect().clone(); + rect.applyTransform(el.transform); + point = [ + rect.x + rect.width / 2, + rect.y + rect.height / 2 + ]; + } + + return {point: point, el: el}; +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var each$14 = each$1; +var curry$3 = curry; +var inner$7 = makeInner(); + +/** + * Basic logic: check all axis, if they do not demand show/highlight, + * then hide/downplay them. + * + * @param {Object} coordSysAxesInfo + * @param {Object} payload + * @param {string} [payload.currTrigger] 'click' | 'mousemove' | 'leave' + * @param {Array.<number>} [payload.x] x and y, which are mandatory, specify a point to + * trigger axisPointer and tooltip. + * @param {Array.<number>} [payload.y] x and y, which are mandatory, specify a point to + * trigger axisPointer and tooltip. + * @param {Object} [payload.seriesIndex] finder, optional, restrict target axes. + * @param {Object} [payload.dataIndex] finder, restrict target axes. + * @param {Object} [payload.axesInfo] finder, restrict target axes. + * [{ + * axisDim: 'x'|'y'|'angle'|..., + * axisIndex: ..., + * value: ... + * }, ...] + * @param {Function} [payload.dispatchAction] + * @param {Object} [payload.tooltipOption] + * @param {Object|Array.<number>|Function} [payload.position] Tooltip position, + * which can be specified in dispatchAction + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + * @return {Object} content of event obj for echarts.connect. + */ +var axisTrigger = function (payload, ecModel, api) { + var currTrigger = payload.currTrigger; + var point = [payload.x, payload.y]; + var finder = payload; + var dispatchAction = payload.dispatchAction || bind(api.dispatchAction, api); + var coordSysAxesInfo = ecModel.getComponent('axisPointer').coordSysAxesInfo; + + // Pending + // See #6121. But we are not able to reproduce it yet. + if (!coordSysAxesInfo) { + return; + } + + if (illegalPoint(point)) { + // Used in the default behavior of `connection`: use the sample seriesIndex + // and dataIndex. And also used in the tooltipView trigger. + point = findPointFromSeries({ + seriesIndex: finder.seriesIndex, + // Do not use dataIndexInside from other ec instance. + // FIXME: auto detect it? + dataIndex: finder.dataIndex + }, ecModel).point; + } + var isIllegalPoint = illegalPoint(point); + + // Axis and value can be specified when calling dispatchAction({type: 'updateAxisPointer'}). + // Notice: In this case, it is difficult to get the `point` (which is necessary to show + // tooltip, so if point is not given, we just use the point found by sample seriesIndex + // and dataIndex. + var inputAxesInfo = finder.axesInfo; + + var axesInfo = coordSysAxesInfo.axesInfo; + var shouldHide = currTrigger === 'leave' || illegalPoint(point); + var outputFinder = {}; + + var showValueMap = {}; + var dataByCoordSys = {list: [], map: {}}; + var updaters = { + showPointer: curry$3(showPointer, showValueMap), + showTooltip: curry$3(showTooltip, dataByCoordSys) + }; + + // Process for triggered axes. + each$14(coordSysAxesInfo.coordSysMap, function (coordSys, coordSysKey) { + // If a point given, it must be contained by the coordinate system. + var coordSysContainsPoint = isIllegalPoint || coordSys.containPoint(point); + + each$14(coordSysAxesInfo.coordSysAxesInfo[coordSysKey], function (axisInfo, key) { + var axis = axisInfo.axis; + var inputAxisInfo = findInputAxisInfo(inputAxesInfo, axisInfo); + // If no inputAxesInfo, no axis is restricted. + if (!shouldHide && coordSysContainsPoint && (!inputAxesInfo || inputAxisInfo)) { + var val = inputAxisInfo && inputAxisInfo.value; + if (val == null && !isIllegalPoint) { + val = axis.pointToData(point); + } + val != null && processOnAxis(axisInfo, val, updaters, false, outputFinder); + } + }); + }); + + // Process for linked axes. + var linkTriggers = {}; + each$14(axesInfo, function (tarAxisInfo, tarKey) { + var linkGroup = tarAxisInfo.linkGroup; + + // If axis has been triggered in the previous stage, it should not be triggered by link. + if (linkGroup && !showValueMap[tarKey]) { + each$14(linkGroup.axesInfo, function (srcAxisInfo, srcKey) { + var srcValItem = showValueMap[srcKey]; + // If srcValItem exist, source axis is triggered, so link to target axis. + if (srcAxisInfo !== tarAxisInfo && srcValItem) { + var val = srcValItem.value; + linkGroup.mapper && (val = tarAxisInfo.axis.scale.parse(linkGroup.mapper( + val, makeMapperParam(srcAxisInfo), makeMapperParam(tarAxisInfo) + ))); + linkTriggers[tarAxisInfo.key] = val; + } + }); + } + }); + each$14(linkTriggers, function (val, tarKey) { + processOnAxis(axesInfo[tarKey], val, updaters, true, outputFinder); + }); + + updateModelActually(showValueMap, axesInfo, outputFinder); + dispatchTooltipActually(dataByCoordSys, point, payload, dispatchAction); + dispatchHighDownActually(axesInfo, dispatchAction, api); + + return outputFinder; +}; + +function processOnAxis(axisInfo, newValue, updaters, dontSnap, outputFinder) { + var axis = axisInfo.axis; + + if (axis.scale.isBlank() || !axis.containData(newValue)) { + return; + } + + if (!axisInfo.involveSeries) { + updaters.showPointer(axisInfo, newValue); + return; + } + + // Heavy calculation. So put it after axis.containData checking. + var payloadInfo = buildPayloadsBySeries(newValue, axisInfo); + var payloadBatch = payloadInfo.payloadBatch; + var snapToValue = payloadInfo.snapToValue; + + // Fill content of event obj for echarts.connect. + // By defualt use the first involved series data as a sample to connect. + if (payloadBatch[0] && outputFinder.seriesIndex == null) { + extend(outputFinder, payloadBatch[0]); + } + + // If no linkSource input, this process is for collecting link + // target, where snap should not be accepted. + if (!dontSnap && axisInfo.snap) { + if (axis.containData(snapToValue) && snapToValue != null) { + newValue = snapToValue; + } + } + + updaters.showPointer(axisInfo, newValue, payloadBatch, outputFinder); + // Tooltip should always be snapToValue, otherwise there will be + // incorrect "axis value ~ series value" mapping displayed in tooltip. + updaters.showTooltip(axisInfo, payloadInfo, snapToValue); +} + +function buildPayloadsBySeries(value, axisInfo) { + var axis = axisInfo.axis; + var dim = axis.dim; + var snapToValue = value; + var payloadBatch = []; + var minDist = Number.MAX_VALUE; + var minDiff = -1; + + each$14(axisInfo.seriesModels, function (series, idx) { + var dataDim = series.getData().mapDimension(dim, true); + var seriesNestestValue; + var dataIndices; + + if (series.getAxisTooltipData) { + var result = series.getAxisTooltipData(dataDim, value, axis); + dataIndices = result.dataIndices; + seriesNestestValue = result.nestestValue; + } + else { + dataIndices = series.getData().indicesOfNearest( + dataDim[0], + value, + // Add a threshold to avoid find the wrong dataIndex + // when data length is not same. + // false, + axis.type === 'category' ? 0.5 : null + ); + if (!dataIndices.length) { + return; + } + seriesNestestValue = series.getData().get(dataDim[0], dataIndices[0]); + } + + if (seriesNestestValue == null || !isFinite(seriesNestestValue)) { + return; + } + + var diff = value - seriesNestestValue; + var dist = Math.abs(diff); + // Consider category case + if (dist <= minDist) { + if (dist < minDist || (diff >= 0 && minDiff < 0)) { + minDist = dist; + minDiff = diff; + snapToValue = seriesNestestValue; + payloadBatch.length = 0; + } + each$14(dataIndices, function (dataIndex) { + payloadBatch.push({ + seriesIndex: series.seriesIndex, + dataIndexInside: dataIndex, + dataIndex: series.getData().getRawIndex(dataIndex) + }); + }); + } + }); + + return { + payloadBatch: payloadBatch, + snapToValue: snapToValue + }; +} + +function showPointer(showValueMap, axisInfo, value, payloadBatch) { + showValueMap[axisInfo.key] = {value: value, payloadBatch: payloadBatch}; +} + +function showTooltip(dataByCoordSys, axisInfo, payloadInfo, value) { + var payloadBatch = payloadInfo.payloadBatch; + var axis = axisInfo.axis; + var axisModel = axis.model; + var axisPointerModel = axisInfo.axisPointerModel; + + // If no data, do not create anything in dataByCoordSys, + // whose length will be used to judge whether dispatch action. + if (!axisInfo.triggerTooltip || !payloadBatch.length) { + return; + } + + var coordSysModel = axisInfo.coordSys.model; + var coordSysKey = makeKey(coordSysModel); + var coordSysItem = dataByCoordSys.map[coordSysKey]; + if (!coordSysItem) { + coordSysItem = dataByCoordSys.map[coordSysKey] = { + coordSysId: coordSysModel.id, + coordSysIndex: coordSysModel.componentIndex, + coordSysType: coordSysModel.type, + coordSysMainType: coordSysModel.mainType, + dataByAxis: [] + }; + dataByCoordSys.list.push(coordSysItem); + } + + coordSysItem.dataByAxis.push({ + axisDim: axis.dim, + axisIndex: axisModel.componentIndex, + axisType: axisModel.type, + axisId: axisModel.id, + value: value, + // Caustion: viewHelper.getValueLabel is actually on "view stage", which + // depends that all models have been updated. So it should not be performed + // here. Considering axisPointerModel used here is volatile, which is hard + // to be retrieve in TooltipView, we prepare parameters here. + valueLabelOpt: { + precision: axisPointerModel.get('label.precision'), + formatter: axisPointerModel.get('label.formatter') + }, + seriesDataIndices: payloadBatch.slice() + }); +} + +function updateModelActually(showValueMap, axesInfo, outputFinder) { + var outputAxesInfo = outputFinder.axesInfo = []; + // Basic logic: If no 'show' required, 'hide' this axisPointer. + each$14(axesInfo, function (axisInfo, key) { + var option = axisInfo.axisPointerModel.option; + var valItem = showValueMap[key]; + + if (valItem) { + !axisInfo.useHandle && (option.status = 'show'); + option.value = valItem.value; + // For label formatter param and highlight. + option.seriesDataIndices = (valItem.payloadBatch || []).slice(); + } + // When always show (e.g., handle used), remain + // original value and status. + else { + // If hide, value still need to be set, consider + // click legend to toggle axis blank. + !axisInfo.useHandle && (option.status = 'hide'); + } + + // If status is 'hide', should be no info in payload. + option.status === 'show' && outputAxesInfo.push({ + axisDim: axisInfo.axis.dim, + axisIndex: axisInfo.axis.model.componentIndex, + value: option.value + }); + }); +} + +function dispatchTooltipActually(dataByCoordSys, point, payload, dispatchAction) { + // Basic logic: If no showTip required, hideTip will be dispatched. + if (illegalPoint(point) || !dataByCoordSys.list.length) { + dispatchAction({type: 'hideTip'}); + return; + } + + // In most case only one axis (or event one series is used). It is + // convinient to fetch payload.seriesIndex and payload.dataIndex + // dirtectly. So put the first seriesIndex and dataIndex of the first + // axis on the payload. + var sampleItem = ((dataByCoordSys.list[0].dataByAxis[0] || {}).seriesDataIndices || [])[0] || {}; + + dispatchAction({ + type: 'showTip', + escapeConnect: true, + x: point[0], + y: point[1], + tooltipOption: payload.tooltipOption, + position: payload.position, + dataIndexInside: sampleItem.dataIndexInside, + dataIndex: sampleItem.dataIndex, + seriesIndex: sampleItem.seriesIndex, + dataByCoordSys: dataByCoordSys.list + }); +} + +function dispatchHighDownActually(axesInfo, dispatchAction, api) { + // FIXME + // highlight status modification shoule be a stage of main process? + // (Consider confilct (e.g., legend and axisPointer) and setOption) + + var zr = api.getZr(); + var highDownKey = 'axisPointerLastHighlights'; + var lastHighlights = inner$7(zr)[highDownKey] || {}; + var newHighlights = inner$7(zr)[highDownKey] = {}; + + // Update highlight/downplay status according to axisPointer model. + // Build hash map and remove duplicate incidentally. + each$14(axesInfo, function (axisInfo, key) { + var option = axisInfo.axisPointerModel.option; + option.status === 'show' && each$14(option.seriesDataIndices, function (batchItem) { + var key = batchItem.seriesIndex + ' | ' + batchItem.dataIndex; + newHighlights[key] = batchItem; + }); + }); + + // Diff. + var toHighlight = []; + var toDownplay = []; + each$1(lastHighlights, function (batchItem, key) { + !newHighlights[key] && toDownplay.push(batchItem); + }); + each$1(newHighlights, function (batchItem, key) { + !lastHighlights[key] && toHighlight.push(batchItem); + }); + + toDownplay.length && api.dispatchAction({ + type: 'downplay', escapeConnect: true, batch: toDownplay + }); + toHighlight.length && api.dispatchAction({ + type: 'highlight', escapeConnect: true, batch: toHighlight + }); +} + +function findInputAxisInfo(inputAxesInfo, axisInfo) { + for (var i = 0; i < (inputAxesInfo || []).length; i++) { + var inputAxisInfo = inputAxesInfo[i]; + if (axisInfo.axis.dim === inputAxisInfo.axisDim + && axisInfo.axis.model.componentIndex === inputAxisInfo.axisIndex + ) { + return inputAxisInfo; + } + } +} + +function makeMapperParam(axisInfo) { + var axisModel = axisInfo.axis.model; + var item = {}; + var dim = item.axisDim = axisInfo.axis.dim; + item.axisIndex = item[dim + 'AxisIndex'] = axisModel.componentIndex; + item.axisName = item[dim + 'AxisName'] = axisModel.name; + item.axisId = item[dim + 'AxisId'] = axisModel.id; + return item; +} + +function illegalPoint(point) { + return !point || point[0] == null || isNaN(point[0]) || point[1] == null || isNaN(point[1]); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var AxisPointerModel = extendComponentModel({ + + type: 'axisPointer', + + coordSysAxesInfo: null, + + defaultOption: { + // 'auto' means that show when triggered by tooltip or handle. + show: 'auto', + // 'click' | 'mousemove' | 'none' + triggerOn: null, // set default in AxisPonterView.js + + zlevel: 0, + z: 50, + + type: 'line', + // axispointer triggered by tootip determine snap automatically, + // see `modelHelper`. + snap: false, + triggerTooltip: true, + + value: null, + status: null, // Init value depends on whether handle is used. + + // [group0, group1, ...] + // Each group can be: { + // mapper: function () {}, + // singleTooltip: 'multiple', // 'multiple' or 'single' + // xAxisId: ..., + // yAxisName: ..., + // angleAxisIndex: ... + // } + // mapper: can be ignored. + // input: {axisInfo, value} + // output: {axisInfo, value} + link: [], + + // Do not set 'auto' here, otherwise global animation: false + // will not effect at this axispointer. + animation: null, + animationDurationUpdate: 200, + + lineStyle: { + color: '#aaa', + width: 1, + type: 'solid' + }, + + shadowStyle: { + color: 'rgba(150,150,150,0.3)' + }, + + label: { + show: true, + formatter: null, // string | Function + precision: 'auto', // Or a number like 0, 1, 2 ... + margin: 3, + color: '#fff', + padding: [5, 7, 5, 7], + backgroundColor: 'auto', // default: axis line color + borderColor: null, + borderWidth: 0, + shadowBlur: 3, + shadowColor: '#aaa' + // Considering applicability, common style should + // better not have shadowOffset. + // shadowOffsetX: 0, + // shadowOffsetY: 2 + }, + + handle: { + show: false, + icon: 'M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z', // jshint ignore:line + size: 45, + // handle margin is from symbol center to axis, which is stable when circular move. + margin: 50, + // color: '#1b8bbd' + // color: '#2f4554' + color: '#333', + shadowBlur: 3, + shadowColor: '#aaa', + shadowOffsetX: 0, + shadowOffsetY: 2, + + // For mobile performance + throttle: 40 + } + } + +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var inner$8 = makeInner(); +var each$15 = each$1; + +/** + * @param {string} key + * @param {module:echarts/ExtensionAPI} api + * @param {Function} handler + * param: {string} currTrigger + * param: {Array.<number>} point + */ +function register(key, api, handler) { + if (env$1.node) { + return; + } + + var zr = api.getZr(); + inner$8(zr).records || (inner$8(zr).records = {}); + + initGlobalListeners(zr, api); + + var record = inner$8(zr).records[key] || (inner$8(zr).records[key] = {}); + record.handler = handler; +} + +function initGlobalListeners(zr, api) { + if (inner$8(zr).initialized) { + return; + } + + inner$8(zr).initialized = true; + + useHandler('click', curry(doEnter, 'click')); + useHandler('mousemove', curry(doEnter, 'mousemove')); + // useHandler('mouseout', onLeave); + useHandler('globalout', onLeave); + + function useHandler(eventType, cb) { + zr.on(eventType, function (e) { + var dis = makeDispatchAction(api); + + each$15(inner$8(zr).records, function (record) { + record && cb(record, e, dis.dispatchAction); + }); + + dispatchTooltipFinally(dis.pendings, api); + }); + } +} + +function dispatchTooltipFinally(pendings, api) { + var showLen = pendings.showTip.length; + var hideLen = pendings.hideTip.length; + + var actuallyPayload; + if (showLen) { + actuallyPayload = pendings.showTip[showLen - 1]; + } + else if (hideLen) { + actuallyPayload = pendings.hideTip[hideLen - 1]; + } + if (actuallyPayload) { + actuallyPayload.dispatchAction = null; + api.dispatchAction(actuallyPayload); + } +} + +function onLeave(record, e, dispatchAction) { + record.handler('leave', null, dispatchAction); +} + +function doEnter(currTrigger, record, e, dispatchAction) { + record.handler(currTrigger, e, dispatchAction); +} + +function makeDispatchAction(api) { + var pendings = { + showTip: [], + hideTip: [] + }; + // FIXME + // better approach? + // 'showTip' and 'hideTip' can be triggered by axisPointer and tooltip, + // which may be conflict, (axisPointer call showTip but tooltip call hideTip); + // So we have to add "final stage" to merge those dispatched actions. + var dispatchAction = function (payload) { + var pendingList = pendings[payload.type]; + if (pendingList) { + pendingList.push(payload); + } + else { + payload.dispatchAction = dispatchAction; + api.dispatchAction(payload); + } + }; + + return { + dispatchAction: dispatchAction, + pendings: pendings + }; +} + +/** + * @param {string} key + * @param {module:echarts/ExtensionAPI} api + */ +function unregister(key, api) { + if (env$1.node) { + return; + } + var zr = api.getZr(); + var record = (inner$8(zr).records || {})[key]; + if (record) { + inner$8(zr).records[key] = null; + } +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var AxisPointerView = extendComponentView({ + + type: 'axisPointer', + + render: function (globalAxisPointerModel, ecModel, api) { + var globalTooltipModel = ecModel.getComponent('tooltip'); + var triggerOn = globalAxisPointerModel.get('triggerOn') + || (globalTooltipModel && globalTooltipModel.get('triggerOn') || 'mousemove|click'); + + // Register global listener in AxisPointerView to enable + // AxisPointerView to be independent to Tooltip. + register( + 'axisPointer', + api, + function (currTrigger, e, dispatchAction) { + // If 'none', it is not controlled by mouse totally. + if (triggerOn !== 'none' + && (currTrigger === 'leave' || triggerOn.indexOf(currTrigger) >= 0) + ) { + dispatchAction({ + type: 'updateAxisPointer', + currTrigger: currTrigger, + x: e && e.offsetX, + y: e && e.offsetY + }); + } + } + ); + }, + + /** + * @override + */ + remove: function (ecModel, api) { + unregister(api.getZr(), 'axisPointer'); + AxisPointerView.superApply(this._model, 'remove', arguments); + }, + + /** + * @override + */ + dispose: function (ecModel, api) { + unregister('axisPointer', api); + AxisPointerView.superApply(this._model, 'dispose', arguments); + } + +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var inner$9 = makeInner(); +var clone$4 = clone; +var bind$2 = bind; + +/** + * Base axis pointer class in 2D. + * Implemenents {module:echarts/component/axis/IAxisPointer}. + */ +function BaseAxisPointer () { +} + +BaseAxisPointer.prototype = { + + /** + * @private + */ + _group: null, + + /** + * @private + */ + _lastGraphicKey: null, + + /** + * @private + */ + _handle: null, + + /** + * @private + */ + _dragging: false, + + /** + * @private + */ + _lastValue: null, + + /** + * @private + */ + _lastStatus: null, + + /** + * @private + */ + _payloadInfo: null, + + /** + * In px, arbitrary value. Do not set too small, + * no animation is ok for most cases. + * @protected + */ + animationThreshold: 15, + + /** + * @implement + */ + render: function (axisModel, axisPointerModel, api, forceRender) { + var value = axisPointerModel.get('value'); + var status = axisPointerModel.get('status'); + + // Bind them to `this`, not in closure, otherwise they will not + // be replaced when user calling setOption in not merge mode. + this._axisModel = axisModel; + this._axisPointerModel = axisPointerModel; + this._api = api; + + // Optimize: `render` will be called repeatly during mouse move. + // So it is power consuming if performing `render` each time, + // especially on mobile device. + if (!forceRender + && this._lastValue === value + && this._lastStatus === status + ) { + return; + } + this._lastValue = value; + this._lastStatus = status; + + var group = this._group; + var handle = this._handle; + + if (!status || status === 'hide') { + // Do not clear here, for animation better. + group && group.hide(); + handle && handle.hide(); + return; + } + group && group.show(); + handle && handle.show(); + + // Otherwise status is 'show' + var elOption = {}; + this.makeElOption(elOption, value, axisModel, axisPointerModel, api); + + // Enable change axis pointer type. + var graphicKey = elOption.graphicKey; + if (graphicKey !== this._lastGraphicKey) { + this.clear(api); + } + this._lastGraphicKey = graphicKey; + + var moveAnimation = this._moveAnimation = + this.determineAnimation(axisModel, axisPointerModel); + + if (!group) { + group = this._group = new Group(); + this.createPointerEl(group, elOption, axisModel, axisPointerModel); + this.createLabelEl(group, elOption, axisModel, axisPointerModel); + api.getZr().add(group); + } + else { + var doUpdateProps = curry(updateProps$1, axisPointerModel, moveAnimation); + this.updatePointerEl(group, elOption, doUpdateProps, axisPointerModel); + this.updateLabelEl(group, elOption, doUpdateProps, axisPointerModel); + } + + updateMandatoryProps(group, axisPointerModel, true); + + this._renderHandle(value); + }, + + /** + * @implement + */ + remove: function (api) { + this.clear(api); + }, + + /** + * @implement + */ + dispose: function (api) { + this.clear(api); + }, + + /** + * @protected + */ + determineAnimation: function (axisModel, axisPointerModel) { + var animation = axisPointerModel.get('animation'); + var axis = axisModel.axis; + var isCategoryAxis = axis.type === 'category'; + var useSnap = axisPointerModel.get('snap'); + + // Value axis without snap always do not snap. + if (!useSnap && !isCategoryAxis) { + return false; + } + + if (animation === 'auto' || animation == null) { + var animationThreshold = this.animationThreshold; + if (isCategoryAxis && axis.getBandWidth() > animationThreshold) { + return true; + } + + // It is important to auto animation when snap used. Consider if there is + // a dataZoom, animation will be disabled when too many points exist, while + // it will be enabled for better visual effect when little points exist. + if (useSnap) { + var seriesDataCount = getAxisInfo(axisModel).seriesDataCount; + var axisExtent = axis.getExtent(); + // Approximate band width + return Math.abs(axisExtent[0] - axisExtent[1]) / seriesDataCount > animationThreshold; + } + + return false; + } + + return animation === true; + }, + + /** + * add {pointer, label, graphicKey} to elOption + * @protected + */ + makeElOption: function (elOption, value, axisModel, axisPointerModel, api) { + // Shoule be implemenented by sub-class. + }, + + /** + * @protected + */ + createPointerEl: function (group, elOption, axisModel, axisPointerModel) { + var pointerOption = elOption.pointer; + if (pointerOption) { + var pointerEl = inner$9(group).pointerEl = new graphic[pointerOption.type]( + clone$4(elOption.pointer) + ); + group.add(pointerEl); + } + }, + + /** + * @protected + */ + createLabelEl: function (group, elOption, axisModel, axisPointerModel) { + if (elOption.label) { + var labelEl = inner$9(group).labelEl = new Rect( + clone$4(elOption.label) + ); + + group.add(labelEl); + updateLabelShowHide(labelEl, axisPointerModel); + } + }, + + /** + * @protected + */ + updatePointerEl: function (group, elOption, updateProps$$1) { + var pointerEl = inner$9(group).pointerEl; + if (pointerEl) { + pointerEl.setStyle(elOption.pointer.style); + updateProps$$1(pointerEl, {shape: elOption.pointer.shape}); + } + }, + + /** + * @protected + */ + updateLabelEl: function (group, elOption, updateProps$$1, axisPointerModel) { + var labelEl = inner$9(group).labelEl; + if (labelEl) { + labelEl.setStyle(elOption.label.style); + updateProps$$1(labelEl, { + // Consider text length change in vertical axis, animation should + // be used on shape, otherwise the effect will be weird. + shape: elOption.label.shape, + position: elOption.label.position + }); + + updateLabelShowHide(labelEl, axisPointerModel); + } + }, + + /** + * @private + */ + _renderHandle: function (value) { + if (this._dragging || !this.updateHandleTransform) { + return; + } + + var axisPointerModel = this._axisPointerModel; + var zr = this._api.getZr(); + var handle = this._handle; + var handleModel = axisPointerModel.getModel('handle'); + + var status = axisPointerModel.get('status'); + if (!handleModel.get('show') || !status || status === 'hide') { + handle && zr.remove(handle); + this._handle = null; + return; + } + + var isInit; + if (!this._handle) { + isInit = true; + handle = this._handle = createIcon( + handleModel.get('icon'), + { + cursor: 'move', + draggable: true, + onmousemove: function (e) { + // Fot mobile devicem, prevent screen slider on the button. + stop(e.event); + }, + onmousedown: bind$2(this._onHandleDragMove, this, 0, 0), + drift: bind$2(this._onHandleDragMove, this), + ondragend: bind$2(this._onHandleDragEnd, this) + } + ); + zr.add(handle); + } + + updateMandatoryProps(handle, axisPointerModel, false); + + // update style + var includeStyles = [ + 'color', 'borderColor', 'borderWidth', 'opacity', + 'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY' + ]; + handle.setStyle(handleModel.getItemStyle(null, includeStyles)); + + // update position + var handleSize = handleModel.get('size'); + if (!isArray(handleSize)) { + handleSize = [handleSize, handleSize]; + } + handle.attr('scale', [handleSize[0] / 2, handleSize[1] / 2]); + + createOrUpdate( + this, + '_doDispatchAxisPointer', + handleModel.get('throttle') || 0, + 'fixRate' + ); + + this._moveHandleToValue(value, isInit); + }, + + /** + * @private + */ + _moveHandleToValue: function (value, isInit) { + updateProps$1( + this._axisPointerModel, + !isInit && this._moveAnimation, + this._handle, + getHandleTransProps(this.getHandleTransform( + value, this._axisModel, this._axisPointerModel + )) + ); + }, + + /** + * @private + */ + _onHandleDragMove: function (dx, dy) { + var handle = this._handle; + if (!handle) { + return; + } + + this._dragging = true; + + // Persistent for throttle. + var trans = this.updateHandleTransform( + getHandleTransProps(handle), + [dx, dy], + this._axisModel, + this._axisPointerModel + ); + this._payloadInfo = trans; + + handle.stopAnimation(); + handle.attr(getHandleTransProps(trans)); + inner$9(handle).lastProp = null; + + this._doDispatchAxisPointer(); + }, + + /** + * Throttled method. + * @private + */ + _doDispatchAxisPointer: function () { + var handle = this._handle; + if (!handle) { + return; + } + + var payloadInfo = this._payloadInfo; + var axisModel = this._axisModel; + this._api.dispatchAction({ + type: 'updateAxisPointer', + x: payloadInfo.cursorPoint[0], + y: payloadInfo.cursorPoint[1], + tooltipOption: payloadInfo.tooltipOption, + axesInfo: [{ + axisDim: axisModel.axis.dim, + axisIndex: axisModel.componentIndex + }] + }); + }, + + /** + * @private + */ + _onHandleDragEnd: function (moveAnimation) { + this._dragging = false; + var handle = this._handle; + if (!handle) { + return; + } + + var value = this._axisPointerModel.get('value'); + // Consider snap or categroy axis, handle may be not consistent with + // axisPointer. So move handle to align the exact value position when + // drag ended. + this._moveHandleToValue(value); + + // For the effect: tooltip will be shown when finger holding on handle + // button, and will be hidden after finger left handle button. + this._api.dispatchAction({ + type: 'hideTip' + }); + }, + + /** + * Should be implemenented by sub-class if support `handle`. + * @protected + * @param {number} value + * @param {module:echarts/model/Model} axisModel + * @param {module:echarts/model/Model} axisPointerModel + * @return {Object} {position: [x, y], rotation: 0} + */ + getHandleTransform: null, + + /** + * * Should be implemenented by sub-class if support `handle`. + * @protected + * @param {Object} transform {position, rotation} + * @param {Array.<number>} delta [dx, dy] + * @param {module:echarts/model/Model} axisModel + * @param {module:echarts/model/Model} axisPointerModel + * @return {Object} {position: [x, y], rotation: 0, cursorPoint: [x, y]} + */ + updateHandleTransform: null, + + /** + * @private + */ + clear: function (api) { + this._lastValue = null; + this._lastStatus = null; + + var zr = api.getZr(); + var group = this._group; + var handle = this._handle; + if (zr && group) { + this._lastGraphicKey = null; + group && zr.remove(group); + handle && zr.remove(handle); + this._group = null; + this._handle = null; + this._payloadInfo = null; + } + }, + + /** + * @protected + */ + doClear: function () { + // Implemented by sub-class if necessary. + }, + + /** + * @protected + * @param {Array.<number>} xy + * @param {Array.<number>} wh + * @param {number} [xDimIndex=0] or 1 + */ + buildLabel: function (xy, wh, xDimIndex) { + xDimIndex = xDimIndex || 0; + return { + x: xy[xDimIndex], + y: xy[1 - xDimIndex], + width: wh[xDimIndex], + height: wh[1 - xDimIndex] + }; + } +}; + +BaseAxisPointer.prototype.constructor = BaseAxisPointer; + + +function updateProps$1(animationModel, moveAnimation, el, props) { + // Animation optimize. + if (!propsEqual(inner$9(el).lastProp, props)) { + inner$9(el).lastProp = props; + moveAnimation + ? updateProps(el, props, animationModel) + : (el.stopAnimation(), el.attr(props)); + } +} + +function propsEqual(lastProps, newProps) { + if (isObject$1(lastProps) && isObject$1(newProps)) { + var equals = true; + each$1(newProps, function (item, key) { + equals = equals && propsEqual(lastProps[key], item); + }); + return !!equals; + } + else { + return lastProps === newProps; + } +} + +function updateLabelShowHide(labelEl, axisPointerModel) { + labelEl[axisPointerModel.get('label.show') ? 'show' : 'hide'](); +} + +function getHandleTransProps(trans) { + return { + position: trans.position.slice(), + rotation: trans.rotation || 0 + }; +} + +function updateMandatoryProps(group, axisPointerModel, silent) { + var z = axisPointerModel.get('z'); + var zlevel = axisPointerModel.get('zlevel'); + + group && group.traverse(function (el) { + if (el.type !== 'group') { + z != null && (el.z = z); + zlevel != null && (el.zlevel = zlevel); + el.silent = silent; + } + }); +} + +enableClassExtend(BaseAxisPointer); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @param {module:echarts/model/Model} axisPointerModel + */ +function buildElStyle(axisPointerModel) { + var axisPointerType = axisPointerModel.get('type'); + var styleModel = axisPointerModel.getModel(axisPointerType + 'Style'); + var style; + if (axisPointerType === 'line') { + style = styleModel.getLineStyle(); + style.fill = null; + } + else if (axisPointerType === 'shadow') { + style = styleModel.getAreaStyle(); + style.stroke = null; + } + return style; +} + +/** + * @param {Function} labelPos {align, verticalAlign, position} + */ +function buildLabelElOption( + elOption, axisModel, axisPointerModel, api, labelPos +) { + var value = axisPointerModel.get('value'); + var text = getValueLabel( + value, axisModel.axis, axisModel.ecModel, + axisPointerModel.get('seriesDataIndices'), + { + precision: axisPointerModel.get('label.precision'), + formatter: axisPointerModel.get('label.formatter') + } + ); + var labelModel = axisPointerModel.getModel('label'); + var paddings = normalizeCssArray$1(labelModel.get('padding') || 0); + + var font = labelModel.getFont(); + var textRect = getBoundingRect(text, font); + + var position = labelPos.position; + var width = textRect.width + paddings[1] + paddings[3]; + var height = textRect.height + paddings[0] + paddings[2]; + + // Adjust by align. + var align = labelPos.align; + align === 'right' && (position[0] -= width); + align === 'center' && (position[0] -= width / 2); + var verticalAlign = labelPos.verticalAlign; + verticalAlign === 'bottom' && (position[1] -= height); + verticalAlign === 'middle' && (position[1] -= height / 2); + + // Not overflow ec container + confineInContainer(position, width, height, api); + + var bgColor = labelModel.get('backgroundColor'); + if (!bgColor || bgColor === 'auto') { + bgColor = axisModel.get('axisLine.lineStyle.color'); + } + + elOption.label = { + shape: {x: 0, y: 0, width: width, height: height, r: labelModel.get('borderRadius')}, + position: position.slice(), + // TODO: rich + style: { + text: text, + textFont: font, + textFill: labelModel.getTextColor(), + textPosition: 'inside', + fill: bgColor, + stroke: labelModel.get('borderColor') || 'transparent', + lineWidth: labelModel.get('borderWidth') || 0, + shadowBlur: labelModel.get('shadowBlur'), + shadowColor: labelModel.get('shadowColor'), + shadowOffsetX: labelModel.get('shadowOffsetX'), + shadowOffsetY: labelModel.get('shadowOffsetY') + }, + // Lable should be over axisPointer. + z2: 10 + }; +} + +// Do not overflow ec container +function confineInContainer(position, width, height, api) { + var viewWidth = api.getWidth(); + var viewHeight = api.getHeight(); + position[0] = Math.min(position[0] + width, viewWidth) - width; + position[1] = Math.min(position[1] + height, viewHeight) - height; + position[0] = Math.max(position[0], 0); + position[1] = Math.max(position[1], 0); +} + +/** + * @param {number} value + * @param {module:echarts/coord/Axis} axis + * @param {module:echarts/model/Global} ecModel + * @param {Object} opt + * @param {Array.<Object>} seriesDataIndices + * @param {number|string} opt.precision 'auto' or a number + * @param {string|Function} opt.formatter label formatter + */ +function getValueLabel(value, axis, ecModel, seriesDataIndices, opt) { + value = axis.scale.parse(value); + var text = axis.scale.getLabel( + // If `precision` is set, width can be fixed (like '12.00500'), which + // helps to debounce when when moving label. + value, {precision: opt.precision} + ); + var formatter = opt.formatter; + + if (formatter) { + var params = { + value: getAxisRawValue(axis, value), + seriesData: [] + }; + each$1(seriesDataIndices, function (idxItem) { + var series = ecModel.getSeriesByIndex(idxItem.seriesIndex); + var dataIndex = idxItem.dataIndexInside; + var dataParams = series && series.getDataParams(dataIndex); + dataParams && params.seriesData.push(dataParams); + }); + + if (isString(formatter)) { + text = formatter.replace('{value}', text); + } + else if (isFunction$1(formatter)) { + text = formatter(params); + } + } + + return text; +} + +/** + * @param {module:echarts/coord/Axis} axis + * @param {number} value + * @param {Object} layoutInfo { + * rotation, position, labelOffset, labelDirection, labelMargin + * } + */ +function getTransformedPosition (axis, value, layoutInfo) { + var transform = create$1(); + rotate(transform, transform, layoutInfo.rotation); + translate(transform, transform, layoutInfo.position); + + return applyTransform$1([ + axis.dataToCoord(value), + (layoutInfo.labelOffset || 0) + + (layoutInfo.labelDirection || 1) * (layoutInfo.labelMargin || 0) + ], transform); +} + +function buildCartesianSingleLabelElOption( + value, elOption, layoutInfo, axisModel, axisPointerModel, api +) { + var textLayout = AxisBuilder.innerTextLayout( + layoutInfo.rotation, 0, layoutInfo.labelDirection + ); + layoutInfo.labelMargin = axisPointerModel.get('label.margin'); + buildLabelElOption(elOption, axisModel, axisPointerModel, api, { + position: getTransformedPosition(axisModel.axis, value, layoutInfo), + align: textLayout.textAlign, + verticalAlign: textLayout.textVerticalAlign + }); +} + +/** + * @param {Array.<number>} p1 + * @param {Array.<number>} p2 + * @param {number} [xDimIndex=0] or 1 + */ +function makeLineShape(p1, p2, xDimIndex) { + xDimIndex = xDimIndex || 0; + return { + x1: p1[xDimIndex], + y1: p1[1 - xDimIndex], + x2: p2[xDimIndex], + y2: p2[1 - xDimIndex] + }; +} + +/** + * @param {Array.<number>} xy + * @param {Array.<number>} wh + * @param {number} [xDimIndex=0] or 1 + */ +function makeRectShape(xy, wh, xDimIndex) { + xDimIndex = xDimIndex || 0; + return { + x: xy[xDimIndex], + y: xy[1 - xDimIndex], + width: wh[xDimIndex], + height: wh[1 - xDimIndex] + }; +} + +function makeSectorShape(cx, cy, r0, r, startAngle, endAngle) { + return { + cx: cx, + cy: cy, + r0: r0, + r: r, + startAngle: startAngle, + endAngle: endAngle, + clockwise: true + }; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var CartesianAxisPointer = BaseAxisPointer.extend({ + + /** + * @override + */ + makeElOption: function (elOption, value, axisModel, axisPointerModel, api) { + var axis = axisModel.axis; + var grid = axis.grid; + var axisPointerType = axisPointerModel.get('type'); + var otherExtent = getCartesian(grid, axis).getOtherAxis(axis).getGlobalExtent(); + var pixelValue = axis.toGlobalCoord(axis.dataToCoord(value, true)); + + if (axisPointerType && axisPointerType !== 'none') { + var elStyle = buildElStyle(axisPointerModel); + var pointerOption = pointerShapeBuilder[axisPointerType]( + axis, pixelValue, otherExtent, elStyle + ); + pointerOption.style = elStyle; + elOption.graphicKey = pointerOption.type; + elOption.pointer = pointerOption; + } + + var layoutInfo = layout$1(grid.model, axisModel); + buildCartesianSingleLabelElOption( + value, elOption, layoutInfo, axisModel, axisPointerModel, api + ); + }, + + /** + * @override + */ + getHandleTransform: function (value, axisModel, axisPointerModel) { + var layoutInfo = layout$1(axisModel.axis.grid.model, axisModel, { + labelInside: false + }); + layoutInfo.labelMargin = axisPointerModel.get('handle.margin'); + return { + position: getTransformedPosition(axisModel.axis, value, layoutInfo), + rotation: layoutInfo.rotation + (layoutInfo.labelDirection < 0 ? Math.PI : 0) + }; + }, + + /** + * @override + */ + updateHandleTransform: function (transform, delta, axisModel, axisPointerModel) { + var axis = axisModel.axis; + var grid = axis.grid; + var axisExtent = axis.getGlobalExtent(true); + var otherExtent = getCartesian(grid, axis).getOtherAxis(axis).getGlobalExtent(); + var dimIndex = axis.dim === 'x' ? 0 : 1; + + var currPosition = transform.position; + currPosition[dimIndex] += delta[dimIndex]; + currPosition[dimIndex] = Math.min(axisExtent[1], currPosition[dimIndex]); + currPosition[dimIndex] = Math.max(axisExtent[0], currPosition[dimIndex]); + + var cursorOtherValue = (otherExtent[1] + otherExtent[0]) / 2; + var cursorPoint = [cursorOtherValue, cursorOtherValue]; + cursorPoint[dimIndex] = currPosition[dimIndex]; + + // Make tooltip do not overlap axisPointer and in the middle of the grid. + var tooltipOptions = [{verticalAlign: 'middle'}, {align: 'center'}]; + + return { + position: currPosition, + rotation: transform.rotation, + cursorPoint: cursorPoint, + tooltipOption: tooltipOptions[dimIndex] + }; + } + +}); + +function getCartesian(grid, axis) { + var opt = {}; + opt[axis.dim + 'AxisIndex'] = axis.index; + return grid.getCartesian(opt); +} + +var pointerShapeBuilder = { + + line: function (axis, pixelValue, otherExtent, elStyle) { + var targetShape = makeLineShape( + [pixelValue, otherExtent[0]], + [pixelValue, otherExtent[1]], + getAxisDimIndex(axis) + ); + subPixelOptimizeLine({ + shape: targetShape, + style: elStyle + }); + return { + type: 'Line', + shape: targetShape + }; + }, + + shadow: function (axis, pixelValue, otherExtent, elStyle) { + var bandWidth = Math.max(1, axis.getBandWidth()); + var span = otherExtent[1] - otherExtent[0]; + return { + type: 'Rect', + shape: makeRectShape( + [pixelValue - bandWidth / 2, otherExtent[0]], + [bandWidth, span], + getAxisDimIndex(axis) + ) + }; + } +}; + +function getAxisDimIndex(axis) { + return axis.dim === 'x' ? 0 : 1; +} + +AxisView.registerAxisPointerClass('CartesianAxisPointer', CartesianAxisPointer); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// CartesianAxisPointer is not supposed to be required here. But consider +// echarts.simple.js and online build tooltip, which only require gridSimple, +// CartesianAxisPointer should be able to required somewhere. +registerPreprocessor(function (option) { + // Always has a global axisPointerModel for default setting. + if (option) { + (!option.axisPointer || option.axisPointer.length === 0) + && (option.axisPointer = {}); + + var link = option.axisPointer.link; + // Normalize to array to avoid object mergin. But if link + // is not set, remain null/undefined, otherwise it will + // override existent link setting. + if (link && !isArray(link)) { + option.axisPointer.link = [link]; + } + } +}); + +// This process should proformed after coordinate systems created +// and series data processed. So put it on statistic processing stage. +registerProcessor(PRIORITY.PROCESSOR.STATISTIC, function (ecModel, api) { + // Build axisPointerModel, mergin tooltip.axisPointer model for each axis. + // allAxesInfo should be updated when setOption performed. + ecModel.getComponent('axisPointer').coordSysAxesInfo + = collect(ecModel, api); +}); + +// Broadcast to all views. +registerAction({ + type: 'updateAxisPointer', + event: 'updateAxisPointer', + update: ':updateAxisPointer' +}, axisTrigger); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var XY = ['x', 'y']; +var WH = ['width', 'height']; + +var SingleAxisPointer = BaseAxisPointer.extend({ + + /** + * @override + */ + makeElOption: function (elOption, value, axisModel, axisPointerModel, api) { + var axis = axisModel.axis; + var coordSys = axis.coordinateSystem; + var otherExtent = getGlobalExtent(coordSys, 1 - getPointDimIndex(axis)); + var pixelValue = coordSys.dataToPoint(value)[0]; + + var axisPointerType = axisPointerModel.get('type'); + if (axisPointerType && axisPointerType !== 'none') { + var elStyle = buildElStyle(axisPointerModel); + var pointerOption = pointerShapeBuilder$1[axisPointerType]( + axis, pixelValue, otherExtent, elStyle + ); + pointerOption.style = elStyle; + + elOption.graphicKey = pointerOption.type; + elOption.pointer = pointerOption; + } + + var layoutInfo = layout$2(axisModel); + buildCartesianSingleLabelElOption( + value, elOption, layoutInfo, axisModel, axisPointerModel, api + ); + }, + + /** + * @override + */ + getHandleTransform: function (value, axisModel, axisPointerModel) { + var layoutInfo = layout$2(axisModel, {labelInside: false}); + layoutInfo.labelMargin = axisPointerModel.get('handle.margin'); + return { + position: getTransformedPosition(axisModel.axis, value, layoutInfo), + rotation: layoutInfo.rotation + (layoutInfo.labelDirection < 0 ? Math.PI : 0) + }; + }, + + /** + * @override + */ + updateHandleTransform: function (transform, delta, axisModel, axisPointerModel) { + var axis = axisModel.axis; + var coordSys = axis.coordinateSystem; + var dimIndex = getPointDimIndex(axis); + var axisExtent = getGlobalExtent(coordSys, dimIndex); + var currPosition = transform.position; + currPosition[dimIndex] += delta[dimIndex]; + currPosition[dimIndex] = Math.min(axisExtent[1], currPosition[dimIndex]); + currPosition[dimIndex] = Math.max(axisExtent[0], currPosition[dimIndex]); + var otherExtent = getGlobalExtent(coordSys, 1 - dimIndex); + var cursorOtherValue = (otherExtent[1] + otherExtent[0]) / 2; + var cursorPoint = [cursorOtherValue, cursorOtherValue]; + cursorPoint[dimIndex] = currPosition[dimIndex]; + + return { + position: currPosition, + rotation: transform.rotation, + cursorPoint: cursorPoint, + tooltipOption: { + verticalAlign: 'middle' + } + }; + } +}); + +var pointerShapeBuilder$1 = { + + line: function (axis, pixelValue, otherExtent, elStyle) { + var targetShape = makeLineShape( + [pixelValue, otherExtent[0]], + [pixelValue, otherExtent[1]], + getPointDimIndex(axis) + ); + subPixelOptimizeLine({ + shape: targetShape, + style: elStyle + }); + return { + type: 'Line', + shape: targetShape + }; + }, + + shadow: function (axis, pixelValue, otherExtent, elStyle) { + var bandWidth = axis.getBandWidth(); + var span = otherExtent[1] - otherExtent[0]; + return { + type: 'Rect', + shape: makeRectShape( + [pixelValue - bandWidth / 2, otherExtent[0]], + [bandWidth, span], + getPointDimIndex(axis) + ) + }; + } +}; + +function getPointDimIndex(axis) { + return axis.isHorizontal() ? 0 : 1; +} + +function getGlobalExtent(coordSys, dimIndex) { + var rect = coordSys.getRect(); + return [rect[XY[dimIndex]], rect[XY[dimIndex]] + rect[WH[dimIndex]]]; +} + +AxisView.registerAxisPointerClass('SingleAxisPointer', SingleAxisPointer); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +extendComponentView({ + type: 'single' +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @file Define the themeRiver view's series model + * @author Deqing Li(annong035@gmail.com) + */ + +var DATA_NAME_INDEX = 2; + +var ThemeRiverSeries = SeriesModel.extend({ + + type: 'series.themeRiver', + + dependencies: ['singleAxis'], + + /** + * @readOnly + * @type {module:zrender/core/util#HashMap} + */ + nameMap: null, + + /** + * @override + */ + init: function (option) { + ThemeRiverSeries.superApply(this, 'init', arguments); + + // Put this function here is for the sake of consistency of code style. + // Enable legend selection for each data item + // Use a function instead of direct access because data reference may changed + this.legendDataProvider = function () { + return this.getRawData(); + }; + }, + + /** + * If there is no value of a certain point in the time for some event,set it value to 0. + * + * @param {Array} data initial data in the option + * @return {Array} + */ + fixData: function (data) { + var rawDataLength = data.length; + + // grouped data by name + var dataByName = nest() + .key(function (dataItem) { + return dataItem[2]; + }) + .entries(data); + + // data group in each layer + var layData = map(dataByName, function (d) { + return { + name: d.key, + dataList: d.values + }; + }); + + var layerNum = layData.length; + var largestLayer = -1; + var index = -1; + for (var i = 0; i < layerNum; ++i) { + var len = layData[i].dataList.length; + if (len > largestLayer) { + largestLayer = len; + index = i; + } + } + + for (var k = 0; k < layerNum; ++k) { + if (k === index) { + continue; + } + var name = layData[k].name; + for (var j = 0; j < largestLayer; ++j) { + var timeValue = layData[index].dataList[j][0]; + var length = layData[k].dataList.length; + var keyIndex = -1; + for (var l = 0; l < length; ++l) { + var value = layData[k].dataList[l][0]; + if (value === timeValue) { + keyIndex = l; + break; + } + } + if (keyIndex === -1) { + data[rawDataLength] = []; + data[rawDataLength][0] = timeValue; + data[rawDataLength][1] = 0; + data[rawDataLength][2] = name; + rawDataLength++; + + } + } + } + return data; + }, + + /** + * @override + * @param {Object} option the initial option that user gived + * @param {module:echarts/model/Model} ecModel the model object for themeRiver option + * @return {module:echarts/data/List} + */ + getInitialData: function (option, ecModel) { + + var singleAxisModel = ecModel.queryComponents({ + mainType: 'singleAxis', + index: this.get('singleAxisIndex'), + id: this.get('singleAxisId') + })[0]; + + var axisType = singleAxisModel.get('type'); + + // filter the data item with the value of label is undefined + var filterData = filter(option.data, function (dataItem) { + return dataItem[2] !== undefined; + }); + + // ??? TODO design a stage to transfer data for themeRiver and lines? + var data = this.fixData(filterData || []); + var nameList = []; + var nameMap = this.nameMap = createHashMap(); + var count = 0; + + for (var i = 0; i < data.length; ++i) { + nameList.push(data[i][DATA_NAME_INDEX]); + if (!nameMap.get(data[i][DATA_NAME_INDEX])) { + nameMap.set(data[i][DATA_NAME_INDEX], count); + count++; + } + } + + var dimensionsInfo = createDimensions(data, { + coordDimensions: ['single'], + dimensionsDefine: [ + { + name: 'time', + type: getDimensionTypeByAxis(axisType) + }, + { + name: 'value', + type: 'float' + }, + { + name: 'name', + type: 'ordinal' + } + ], + encodeDefine: { + single: 0, + value: 1, + itemName: 2 + } + }); + + var list = new List(dimensionsInfo, this); + list.initData(data); + + return list; + }, + + /** + * The raw data is divided into multiple layers and each layer + * has same name. + * + * @return {Array.<Array.<number>>} + */ + getLayerSeries: function () { + var data = this.getData(); + var lenCount = data.count(); + var indexArr = []; + + for (var i = 0; i < lenCount; ++i) { + indexArr[i] = i; + } + // data group by name + var dataByName = nest() + .key(function (index) { + return data.get('name', index); + }) + .entries(indexArr); + + var layerSeries = map(dataByName, function (d) { + return { + name: d.key, + indices: d.values + }; + }); + + var timeDim = data.mapDimension('single'); + + for (var j = 0; j < layerSeries.length; ++j) { + layerSeries[j].indices.sort(comparer); + } + + function comparer(index1, index2) { + return data.get(timeDim, index1) - data.get(timeDim, index2); + } + + return layerSeries; + }, + + /** + * Get data indices for show tooltip content + * + * @param {Array.<string>|string} dim single coordinate dimension + * @param {number} value axis value + * @param {module:echarts/coord/single/SingleAxis} baseAxis single Axis used + * the themeRiver. + * @return {Object} {dataIndices, nestestValue} + */ + getAxisTooltipData: function (dim, value, baseAxis) { + if (!isArray(dim)) { + dim = dim ? [dim] : []; + } + + var data = this.getData(); + var layerSeries = this.getLayerSeries(); + var indices = []; + var layerNum = layerSeries.length; + var nestestValue; + + for (var i = 0; i < layerNum; ++i) { + var minDist = Number.MAX_VALUE; + var nearestIdx = -1; + var pointNum = layerSeries[i].indices.length; + for (var j = 0; j < pointNum; ++j) { + var theValue = data.get(dim[0], layerSeries[i].indices[j]); + var dist = Math.abs(theValue - value); + if (dist <= minDist) { + nestestValue = theValue; + minDist = dist; + nearestIdx = layerSeries[i].indices[j]; + } + } + indices.push(nearestIdx); + } + + return {dataIndices: indices, nestestValue: nestestValue}; + }, + + /** + * @override + * @param {number} dataIndex index of data + */ + formatTooltip: function (dataIndex) { + var data = this.getData(); + var htmlName = data.getName(dataIndex); + var htmlValue = data.get(data.mapDimension('value'), dataIndex); + if (isNaN(htmlValue) || htmlValue == null) { + htmlValue = '-'; + } + return encodeHTML(htmlName + ' : ' + htmlValue); + }, + + defaultOption: { + zlevel: 0, + z: 2, + + coordinateSystem: 'singleAxis', + + // gap in axis's orthogonal orientation + boundaryGap: ['10%', '10%'], + + // legendHoverLink: true, + + singleAxisIndex: 0, + + animationEasing: 'linear', + + label: { + margin: 4, + show: true, + position: 'left', + color: '#000', + fontSize: 11 + }, + + emphasis: { + label: { + show: true + } + } + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @file The file used to draw themeRiver view + * @author Deqing Li(annong035@gmail.com) + */ + +extendChartView({ + + type: 'themeRiver', + + init: function () { + this._layers = []; + }, + + render: function (seriesModel, ecModel, api) { + var data = seriesModel.getData(); + + var group = this.group; + + var layerSeries = seriesModel.getLayerSeries(); + + var layoutInfo = data.getLayout('layoutInfo'); + var rect = layoutInfo.rect; + var boundaryGap = layoutInfo.boundaryGap; + + group.attr('position', [0, rect.y + boundaryGap[0]]); + + function keyGetter(item) { + return item.name; + } + var dataDiffer = new DataDiffer( + this._layersSeries || [], layerSeries, + keyGetter, keyGetter + ); + + var newLayersGroups = {}; + + dataDiffer + .add(bind(process, this, 'add')) + .update(bind(process, this, 'update')) + .remove(bind(process, this, 'remove')) + .execute(); + + function process(status, idx, oldIdx) { + var oldLayersGroups = this._layers; + if (status === 'remove') { + group.remove(oldLayersGroups[idx]); + return; + } + var points0 = []; + var points1 = []; + var color; + var indices = layerSeries[idx].indices; + for (var j = 0; j < indices.length; j++) { + var layout = data.getItemLayout(indices[j]); + var x = layout.x; + var y0 = layout.y0; + var y = layout.y; + + points0.push([x, y0]); + points1.push([x, y0 + y]); + + color = data.getItemVisual(indices[j], 'color'); + } + + var polygon; + var text; + var textLayout = data.getItemLayout(indices[0]); + var itemModel = data.getItemModel(indices[j - 1]); + var labelModel = itemModel.getModel('label'); + var margin = labelModel.get('margin'); + if (status === 'add') { + var layerGroup = newLayersGroups[idx] = new Group(); + polygon = new Polygon$1({ + shape: { + points: points0, + stackedOnPoints: points1, + smooth: 0.4, + stackedOnSmooth: 0.4, + smoothConstraint: false + }, + z2: 0 + }); + text = new Text({ + style: { + x: textLayout.x - margin, + y: textLayout.y0 + textLayout.y / 2 + } + }); + layerGroup.add(polygon); + layerGroup.add(text); + group.add(layerGroup); + + polygon.setClipPath(createGridClipShape$3(polygon.getBoundingRect(), seriesModel, function () { + polygon.removeClipPath(); + })); + } + else { + var layerGroup = oldLayersGroups[oldIdx]; + polygon = layerGroup.childAt(0); + text = layerGroup.childAt(1); + group.add(layerGroup); + + newLayersGroups[idx] = layerGroup; + + updateProps(polygon, { + shape: { + points: points0, + stackedOnPoints: points1 + } + }, seriesModel); + + updateProps(text, { + style: { + x: textLayout.x - margin, + y: textLayout.y0 + textLayout.y / 2 + } + }, seriesModel); + } + + var hoverItemStyleModel = itemModel.getModel('emphasis.itemStyle'); + var itemStyleModel = itemModel.getModel('itemStyle'); + + setTextStyle(text.style, labelModel, { + text: labelModel.get('show') + ? seriesModel.getFormattedLabel(indices[j - 1], 'normal') + || data.getName(indices[j - 1]) + : null, + textVerticalAlign: 'middle' + }); + + polygon.setStyle(extend({ + fill: color + }, itemStyleModel.getItemStyle(['color']))); + + setHoverStyle(polygon, hoverItemStyleModel.getItemStyle()); + } + + this._layersSeries = layerSeries; + this._layers = newLayersGroups; + }, + + dispose: function () {} +}); + +// add animation to the view +function createGridClipShape$3(rect, seriesModel, cb) { + var rectEl = new Rect({ + shape: { + x: rect.x - 10, + y: rect.y - 10, + width: 0, + height: rect.height + 20 + } + }); + initProps(rectEl, { + shape: { + width: rect.width + 20, + height: rect.height + 20 + } + }, seriesModel, cb); + + return rectEl; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @file Using layout algorithm transform the raw data to layout information. + * @author Deqing Li(annong035@gmail.com) + */ + +var themeRiverLayout = function (ecModel, api) { + + ecModel.eachSeriesByType('themeRiver', function (seriesModel) { + + var data = seriesModel.getData(); + + var single = seriesModel.coordinateSystem; + + var layoutInfo = {}; + + // use the axis boundingRect for view + var rect = single.getRect(); + + layoutInfo.rect = rect; + + var boundaryGap = seriesModel.get('boundaryGap'); + + var axis = single.getAxis(); + + layoutInfo.boundaryGap = boundaryGap; + + if (axis.orient === 'horizontal') { + boundaryGap[0] = parsePercent$1(boundaryGap[0], rect.height); + boundaryGap[1] = parsePercent$1(boundaryGap[1], rect.height); + var height = rect.height - boundaryGap[0] - boundaryGap[1]; + themeRiverLayout$1(data, seriesModel, height); + } + else { + boundaryGap[0] = parsePercent$1(boundaryGap[0], rect.width); + boundaryGap[1] = parsePercent$1(boundaryGap[1], rect.width); + var width = rect.width - boundaryGap[0] - boundaryGap[1]; + themeRiverLayout$1(data, seriesModel, width); + } + + data.setLayout('layoutInfo', layoutInfo); + }); +}; + +/** + * The layout information about themeriver + * + * @param {module:echarts/data/List} data data in the series + * @param {module:echarts/model/Series} seriesModel the model object of themeRiver series + * @param {number} height value used to compute every series height + */ +function themeRiverLayout$1(data, seriesModel, height) { + if (!data.count()) { + return; + } + var coordSys = seriesModel.coordinateSystem; + // the data in each layer are organized into a series. + var layerSeries = seriesModel.getLayerSeries(); + + // the points in each layer. + var timeDim = data.mapDimension('single'); + var valueDim = data.mapDimension('value'); + var layerPoints = map(layerSeries, function (singleLayer) { + return map(singleLayer.indices, function (idx) { + var pt = coordSys.dataToPoint(data.get(timeDim, idx)); + pt[1] = data.get(valueDim, idx); + return pt; + }); + }); + + var base = computeBaseline(layerPoints); + var baseLine = base.y0; + var ky = height / base.max; + + // set layout information for each item. + var n = layerSeries.length; + var m = layerSeries[0].indices.length; + var baseY0; + for (var j = 0; j < m; ++j) { + baseY0 = baseLine[j] * ky; + data.setItemLayout(layerSeries[0].indices[j], { + layerIndex: 0, + x: layerPoints[0][j][0], + y0: baseY0, + y: layerPoints[0][j][1] * ky + }); + for (var i = 1; i < n; ++i) { + baseY0 += layerPoints[i - 1][j][1] * ky; + data.setItemLayout(layerSeries[i].indices[j], { + layerIndex: i, + x: layerPoints[i][j][0], + y0: baseY0, + y: layerPoints[i][j][1] * ky + }); + } + } +} + +/** + * Compute the baseLine of the rawdata + * Inspired by Lee Byron's paper Stacked Graphs - Geometry & Aesthetics + * + * @param {Array.<Array>} data the points in each layer + * @return {Object} + */ +function computeBaseline(data) { + var layerNum = data.length; + var pointNum = data[0].length; + var sums = []; + var y0 = []; + var max = 0; + var temp; + var base = {}; + + for (var i = 0; i < pointNum; ++i) { + for (var j = 0, temp = 0; j < layerNum; ++j) { + temp += data[j][i][1]; + } + if (temp > max) { + max = temp; + } + sums.push(temp); + } + + for (var k = 0; k < pointNum; ++k) { + y0[k] = (max - sums[k]) / 2; + } + max = 0; + + for (var l = 0; l < pointNum; ++l) { + var sum = sums[l] + y0[l]; + if (sum > max) { + max = sum; + } + } + base.y0 = y0; + base.max = max; + + return base; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @file Visual encoding for themeRiver view + * @author Deqing Li(annong035@gmail.com) + */ + +var themeRiverVisual = function (ecModel) { + ecModel.eachSeriesByType('themeRiver', function (seriesModel) { + var data = seriesModel.getData(); + var rawData = seriesModel.getRawData(); + var colorList = seriesModel.get('color'); + var idxMap = createHashMap(); + + data.each(function (idx) { + idxMap.set(data.getRawIndex(idx), idx); + }); + + rawData.each(function (rawIndex) { + var name = rawData.getName(rawIndex); + var color = colorList[(seriesModel.nameMap.get(name) - 1) % colorList.length]; + + rawData.setItemVisual(rawIndex, 'color', color); + + var idx = idxMap.get(rawIndex); + + if (idx != null) { + data.setItemVisual(idx, 'color', color); + } + }); + }); +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +registerLayout(themeRiverLayout); +registerVisual(themeRiverVisual); +registerProcessor(dataFilter('themeRiver')); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +SeriesModel.extend({ + + type: 'series.sunburst', + + /** + * @type {module:echarts/data/Tree~Node} + */ + _viewRoot: null, + + getInitialData: function (option, ecModel) { + // Create a virtual root. + var root = { name: option.name, children: option.data }; + + completeTreeValue$1(root); + + var levels = option.levels || []; + + // levels = option.levels = setDefault(levels, ecModel); + + var treeOption = {}; + + treeOption.levels = levels; + + // Make sure always a new tree is created when setOption, + // in TreemapView, we check whether oldTree === newTree + // to choose mappings approach among old shapes and new shapes. + return Tree.createTree(root, this, treeOption).data; + }, + + optionUpdated: function () { + this.resetViewRoot(); + }, + + /* + * @override + */ + getDataParams: function (dataIndex) { + var params = SeriesModel.prototype.getDataParams.apply(this, arguments); + + var node = this.getData().tree.getNodeByDataIndex(dataIndex); + params.treePathInfo = wrapTreePathInfo(node, this); + + return params; + }, + + defaultOption: { + zlevel: 0, + z: 2, + + // 默认全局居中 + center: ['50%', '50%'], + radius: [0, '75%'], + // 默认顺时针 + clockwise: true, + startAngle: 90, + // 最小角度改为0 + minAngle: 0, + + percentPrecision: 2, + + // If still show when all data zero. + stillShowZeroSum: true, + + // Policy of highlighting pieces when hover on one + // Valid values: 'none' (for not downplay others), 'descendant', + // 'ancestor', 'self' + highlightPolicy: 'descendant', + + // 'rootToNode', 'link', or false + nodeClick: 'rootToNode', + + renderLabelForZeroData: false, + + label: { + // could be: 'radial', 'tangential', or 'none' + rotate: 'radial', + show: true, + opacity: 1, + // 'left' is for inner side of inside, and 'right' is for outter + // side for inside + align: 'center', + position: 'inside', + distance: 5, + silent: true, + emphasis: {} + }, + itemStyle: { + borderWidth: 1, + borderColor: 'white', + opacity: 1, + emphasis: {}, + highlight: { + opacity: 1 + }, + downplay: { + opacity: 0.9 + } + }, + + // Animation type canbe expansion, scale + animationType: 'expansion', + animationDuration: 1000, + animationDurationUpdate: 500, + animationEasing: 'cubicOut', + + data: [], + + levels: [], + + /** + * Sort order. + * + * Valid values: 'desc', 'asc', null, or callback function. + * 'desc' and 'asc' for descend and ascendant order; + * null for not sorting; + * example of callback function: + * function(nodeA, nodeB) { + * return nodeA.getValue() - nodeB.getValue(); + * } + */ + sort: 'desc' + }, + + getViewRoot: function () { + return this._viewRoot; + }, + + /** + * @param {module:echarts/data/Tree~Node} [viewRoot] + */ + resetViewRoot: function (viewRoot) { + viewRoot + ? (this._viewRoot = viewRoot) + : (viewRoot = this._viewRoot); + + var root = this.getRawData().tree.root; + + if (!viewRoot + || (viewRoot !== root && !root.contains(viewRoot)) + ) { + this._viewRoot = root; + } + } +}); + + + +/** + * @param {Object} dataNode + */ +function completeTreeValue$1(dataNode) { + // Postorder travel tree. + // If value of none-leaf node is not set, + // calculate it by suming up the value of all children. + var sum = 0; + + each$1(dataNode.children, function (child) { + + completeTreeValue$1(child); + + var childValue = child.value; + isArray(childValue) && (childValue = childValue[0]); + + sum += childValue; + }); + + var thisValue = dataNode.value; + if (isArray(thisValue)) { + thisValue = thisValue[0]; + } + + if (thisValue == null || isNaN(thisValue)) { + thisValue = sum; + } + // Value should not less than 0. + if (thisValue < 0) { + thisValue = 0; + } + + isArray(dataNode.value) + ? (dataNode.value[0] = thisValue) + : (dataNode.value = thisValue); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var NodeHighlightPolicy = { + NONE: 'none', // not downplay others + DESCENDANT: 'descendant', + ANCESTOR: 'ancestor', + SELF: 'self' +}; + +var DEFAULT_SECTOR_Z = 2; +var DEFAULT_TEXT_Z = 4; + +/** + * Sunburstce of Sunburst including Sector, Label, LabelLine + * @constructor + * @extends {module:zrender/graphic/Group} + */ +function SunburstPiece(node, seriesModel, ecModel) { + + Group.call(this); + + var sector = new Sector({ + z2: DEFAULT_SECTOR_Z + }); + sector.seriesIndex = seriesModel.seriesIndex; + + var text = new Text({ + z2: DEFAULT_TEXT_Z, + silent: node.getModel('label').get('silent') + }); + this.add(sector); + this.add(text); + + this.updateData(true, node, 'normal', seriesModel, ecModel); + + // Hover to change label and labelLine + function onEmphasis() { + text.ignore = text.hoverIgnore; + } + function onNormal() { + text.ignore = text.normalIgnore; + } + this.on('emphasis', onEmphasis) + .on('normal', onNormal) + .on('mouseover', onEmphasis) + .on('mouseout', onNormal); +} + +var SunburstPieceProto = SunburstPiece.prototype; + +SunburstPieceProto.updateData = function ( + firstCreate, + node, + state, + seriesModel, + ecModel +) { + this.node = node; + node.piece = this; + + seriesModel = seriesModel || this._seriesModel; + ecModel = ecModel || this._ecModel; + + var sector = this.childAt(0); + sector.dataIndex = node.dataIndex; + + var itemModel = node.getModel(); + var layout = node.getLayout(); + if (!layout) { + console.log(node.getLayout()); + } + var sectorShape = extend({}, layout); + sectorShape.label = null; + + var visualColor = getNodeColor(node, seriesModel, ecModel); + + var normalStyle = itemModel.getModel('itemStyle').getItemStyle(); + var style; + if (state === 'normal') { + style = normalStyle; + } + else { + var stateStyle = itemModel.getModel(state + '.itemStyle') + .getItemStyle(); + style = merge(stateStyle, normalStyle); + } + style = defaults( + { + lineJoin: 'bevel', + fill: style.fill || visualColor + }, + style + ); + + if (firstCreate) { + sector.setShape(sectorShape); + sector.shape.r = layout.r0; + updateProps( + sector, + { + shape: { + r: layout.r + } + }, + seriesModel, + node.dataIndex + ); + sector.useStyle(style); + } + else if (typeof style.fill === 'object' && style.fill.type + || typeof sector.style.fill === 'object' && sector.style.fill.type + ) { + // Disable animation for gradient since no interpolation method + // is supported for gradient + updateProps(sector, { + shape: sectorShape + }, seriesModel); + sector.useStyle(style); + } + else { + updateProps(sector, { + shape: sectorShape, + style: style + }, seriesModel); + } + + this._updateLabel(seriesModel, visualColor, state); + + var cursorStyle = itemModel.getShallow('cursor'); + cursorStyle && sector.attr('cursor', cursorStyle); + + if (firstCreate) { + var highlightPolicy = seriesModel.getShallow('highlightPolicy'); + this._initEvents(sector, node, seriesModel, highlightPolicy); + } + + this._seriesModel = seriesModel || this._seriesModel; + this._ecModel = ecModel || this._ecModel; +}; + +SunburstPieceProto.onEmphasis = function (highlightPolicy) { + var that = this; + this.node.hostTree.root.eachNode(function (n) { + if (n.piece) { + if (that.node === n) { + n.piece.updateData(false, n, 'emphasis'); + } + else if (isNodeHighlighted(n, that.node, highlightPolicy)) { + n.piece.childAt(0).trigger('highlight'); + } + else if (highlightPolicy !== NodeHighlightPolicy.NONE) { + n.piece.childAt(0).trigger('downplay'); + } + } + }); +}; + +SunburstPieceProto.onNormal = function () { + this.node.hostTree.root.eachNode(function (n) { + if (n.piece) { + n.piece.updateData(false, n, 'normal'); + } + }); +}; + +SunburstPieceProto.onHighlight = function () { + this.updateData(false, this.node, 'highlight'); +}; + +SunburstPieceProto.onDownplay = function () { + this.updateData(false, this.node, 'downplay'); +}; + +SunburstPieceProto._updateLabel = function (seriesModel, visualColor, state) { + var itemModel = this.node.getModel(); + var normalModel = itemModel.getModel('label'); + var labelModel = state === 'normal' || state === 'emphasis' + ? normalModel + : itemModel.getModel(state + '.label'); + var labelHoverModel = itemModel.getModel('emphasis.label'); + + var text = retrieve( + seriesModel.getFormattedLabel( + this.node.dataIndex, 'normal', null, null, 'label' + ), + this.node.name + ); + if (getLabelAttr('show') === false) { + text = ''; + } + + var layout = this.node.getLayout(); + var labelMinAngle = labelModel.get('minAngle'); + if (labelMinAngle == null) { + labelMinAngle = normalModel.get('minAngle'); + } + labelMinAngle = labelMinAngle / 180 * Math.PI; + var angle = layout.endAngle - layout.startAngle; + if (labelMinAngle != null && Math.abs(angle) < labelMinAngle) { + // Not displaying text when angle is too small + text = ''; + } + + var label = this.childAt(1); + + setLabelStyle( + label.style, label.hoverStyle || {}, normalModel, labelHoverModel, + { + defaultText: labelModel.getShallow('show') ? text : null, + autoColor: visualColor, + useInsideStyle: true + } + ); + + var midAngle = (layout.startAngle + layout.endAngle) / 2; + var dx = Math.cos(midAngle); + var dy = Math.sin(midAngle); + + var r; + var labelPosition = getLabelAttr('position'); + var labelPadding = getLabelAttr('distance') || 0; + var textAlign = getLabelAttr('align'); + if (labelPosition === 'outside') { + r = layout.r + labelPadding; + textAlign = midAngle > Math.PI / 2 ? 'right' : 'left'; + } + else { + if (!textAlign || textAlign === 'center') { + r = (layout.r + layout.r0) / 2; + textAlign = 'center'; + } + else if (textAlign === 'left') { + r = layout.r0 + labelPadding; + if (midAngle > Math.PI / 2) { + textAlign = 'right'; + } + } + else if (textAlign === 'right') { + r = layout.r - labelPadding; + if (midAngle > Math.PI / 2) { + textAlign = 'left'; + } + } + } + + label.attr('style', { + text: text, + textAlign: textAlign, + textVerticalAlign: getLabelAttr('verticalAlign') || 'middle', + opacity: getLabelAttr('opacity') + }); + + var textX = r * dx + layout.cx; + var textY = r * dy + layout.cy; + label.attr('position', [textX, textY]); + + var rotateType = getLabelAttr('rotate'); + var rotate = 0; + if (rotateType === 'radial') { + rotate = -midAngle; + if (rotate < -Math.PI / 2) { + rotate += Math.PI; + } + } + else if (rotateType === 'tangential') { + rotate = Math.PI / 2 - midAngle; + if (rotate > Math.PI / 2) { + rotate -= Math.PI; + } + else if (rotate < -Math.PI / 2) { + rotate += Math.PI; + } + } else if (typeof rotateType === 'number') { + rotate = rotateType * Math.PI / 180; + } + label.attr('rotation', rotate); + + function getLabelAttr(name) { + var stateAttr = labelModel.get(name); + if (stateAttr == null) { + return normalModel.get(name); + } + else { + return stateAttr; + } + } +}; + +SunburstPieceProto._initEvents = function ( + sector, + node, + seriesModel, + highlightPolicy +) { + sector.off('mouseover').off('mouseout').off('emphasis').off('normal'); + + var that = this; + var onEmphasis = function () { + that.onEmphasis(highlightPolicy); + }; + var onNormal = function () { + that.onNormal(); + }; + var onDownplay = function () { + that.onDownplay(); + }; + var onHighlight = function () { + that.onHighlight(); + }; + + if (seriesModel.isAnimationEnabled()) { + sector + .on('mouseover', onEmphasis) + .on('mouseout', onNormal) + .on('emphasis', onEmphasis) + .on('normal', onNormal) + .on('downplay', onDownplay) + .on('highlight', onHighlight); + } +}; + +inherits(SunburstPiece, Group); + +/** + * Get node color + * + * @param {TreeNode} node the node to get color + * @param {module:echarts/model/Series} seriesModel series + * @param {module:echarts/model/Global} ecModel echarts defaults + */ +function getNodeColor(node, seriesModel, ecModel) { + // Color from visualMap + var visualColor = node.getVisual('color'); + var visualMetaList = node.getVisual('visualMeta'); + if (!visualMetaList || visualMetaList.length === 0) { + // Use first-generation color if has no visualMap + visualColor = null; + } + + // Self color or level color + var color = node.getModel('itemStyle').get('color'); + if (color) { + return color; + } + else if (visualColor) { + // Color mapping + return visualColor; + } + else if (node.depth === 0) { + // Virtual root node + return ecModel.option.color[0]; + } + else { + // First-generation color + var length = ecModel.option.color.length; + color = ecModel.option.color[getRootId(node) % length]; + } + return color; +} + +/** + * Get index of root in sorted order + * + * @param {TreeNode} node current node + * @return {number} index in root + */ +function getRootId(node) { + var ancestor = node; + while (ancestor.depth > 1) { + ancestor = ancestor.parentNode; + } + + var virtualRoot = node.getAncestors()[0]; + return indexOf(virtualRoot.children, ancestor); +} + +function isNodeHighlighted(node, activeNode, policy) { + if (policy === NodeHighlightPolicy.NONE) { + return false; + } + else if (policy === NodeHighlightPolicy.SELF) { + return node === activeNode; + } + else if (policy === NodeHighlightPolicy.ANCESTOR) { + return node === activeNode || node.isAncestorOf(activeNode); + } + else { + return node === activeNode || node.isDescendantOf(activeNode); + } +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var ROOT_TO_NODE_ACTION = 'sunburstRootToNode'; + +var SunburstView = Chart.extend({ + + type: 'sunburst', + + init: function () { + }, + + render: function (seriesModel, ecModel, api, payload) { + var that = this; + + this.seriesModel = seriesModel; + this.api = api; + this.ecModel = ecModel; + + var data = seriesModel.getData(); + var virtualRoot = data.tree.root; + + var newRoot = seriesModel.getViewRoot(); + + var group = this.group; + + var renderLabelForZeroData = seriesModel.get('renderLabelForZeroData'); + + var newChildren = []; + newRoot.eachNode(function (node) { + newChildren.push(node); + }); + var oldChildren = this._oldChildren || []; + + dualTravel(newChildren, oldChildren); + + renderRollUp(virtualRoot, newRoot); + + if (payload && payload.highlight && payload.highlight.piece) { + var highlightPolicy = seriesModel.getShallow('highlightPolicy'); + payload.highlight.piece.onEmphasis(highlightPolicy); + } + else if (payload && payload.unhighlight) { + var piece = this.virtualPiece; + if (!piece && virtualRoot.children.length) { + piece = virtualRoot.children[0].piece; + } + if (piece) { + piece.onNormal(); + } + } + + this._initEvents(); + + this._oldChildren = newChildren; + + function dualTravel(newChildren, oldChildren) { + if (newChildren.length === 0 && oldChildren.length === 0) { + return; + } + + new DataDiffer(oldChildren, newChildren, getKey, getKey) + .add(processNode) + .update(processNode) + .remove(curry(processNode, null)) + .execute(); + + function getKey(node) { + return node.getId(); + } + + function processNode(newId, oldId) { + var newNode = newId == null ? null : newChildren[newId]; + var oldNode = oldId == null ? null : oldChildren[oldId]; + + doRenderNode(newNode, oldNode); + } + } + + function doRenderNode(newNode, oldNode) { + if (!renderLabelForZeroData && newNode && !newNode.getValue()) { + // Not render data with value 0 + newNode = null; + } + + if (newNode !== virtualRoot && oldNode !== virtualRoot) { + if (oldNode && oldNode.piece) { + if (newNode) { + // Update + oldNode.piece.updateData( + false, newNode, 'normal', seriesModel, ecModel); + + // For tooltip + data.setItemGraphicEl(newNode.dataIndex, oldNode.piece); + } + else { + // Remove + removeNode(oldNode); + } + } + else if (newNode) { + // Add + var piece = new SunburstPiece( + newNode, + seriesModel, + ecModel + ); + group.add(piece); + + // For tooltip + data.setItemGraphicEl(newNode.dataIndex, piece); + } + } + } + + function removeNode(node) { + if (!node) { + return; + } + + if (node.piece) { + group.remove(node.piece); + node.piece = null; + } + } + + function renderRollUp(virtualRoot, viewRoot) { + if (viewRoot.depth > 0) { + // Render + if (that.virtualPiece) { + // Update + that.virtualPiece.updateData( + false, virtualRoot, 'normal', seriesModel, ecModel); + } + else { + // Add + that.virtualPiece = new SunburstPiece( + virtualRoot, + seriesModel, + ecModel + ); + group.add(that.virtualPiece); + } + + if (viewRoot.piece._onclickEvent) { + viewRoot.piece.off('click', viewRoot.piece._onclickEvent); + } + var event = function (e) { + that._rootToNode(viewRoot.parentNode); + }; + viewRoot.piece._onclickEvent = event; + that.virtualPiece.on('click', event); + } + else if (that.virtualPiece) { + // Remove + group.remove(that.virtualPiece); + that.virtualPiece = null; + } + } + }, + + dispose: function () { + }, + + /** + * @private + */ + _initEvents: function () { + var that = this; + + var event = function (e) { + var targetFound = false; + var viewRoot = that.seriesModel.getViewRoot(); + viewRoot.eachNode(function (node) { + if (!targetFound + && node.piece && node.piece.childAt(0) === e.target + ) { + var nodeClick = node.getModel().get('nodeClick'); + if (nodeClick === 'rootToNode') { + that._rootToNode(node); + } + else if (nodeClick === 'link') { + var itemModel = node.getModel(); + var link = itemModel.get('link'); + if (link) { + var linkTarget = itemModel.get('target', true) + || '_blank'; + window.open(link, linkTarget); + } + } + targetFound = true; + } + }); + }; + + if (this.group._onclickEvent) { + this.group.off('click', this.group._onclickEvent); + } + this.group.on('click', event); + this.group._onclickEvent = event; + }, + + /** + * @private + */ + _rootToNode: function (node) { + if (node !== this.seriesModel.getViewRoot()) { + this.api.dispatchAction({ + type: ROOT_TO_NODE_ACTION, + from: this.uid, + seriesId: this.seriesModel.id, + targetNode: node + }); + } + }, + + /** + * @implement + */ + containPoint: function (point, seriesModel) { + var treeRoot = seriesModel.getData(); + var itemLayout = treeRoot.getItemLayout(0); + if (itemLayout) { + var dx = point[0] - itemLayout.cx; + var dy = point[1] - itemLayout.cy; + var radius = Math.sqrt(dx * dx + dy * dy); + return radius <= itemLayout.r && radius >= itemLayout.r0; + } + } + +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @file Sunburst action + */ + +var ROOT_TO_NODE_ACTION$1 = 'sunburstRootToNode'; + +registerAction( + {type: ROOT_TO_NODE_ACTION$1, update: 'updateView'}, + function (payload, ecModel) { + + ecModel.eachComponent( + {mainType: 'series', subType: 'sunburst', query: payload}, + handleRootToNode + ); + + function handleRootToNode(model, index) { + var targetInfo = retrieveTargetInfo(payload, [ROOT_TO_NODE_ACTION$1], model); + + if (targetInfo) { + var originViewRoot = model.getViewRoot(); + if (originViewRoot) { + payload.direction = aboveViewRoot(originViewRoot, targetInfo.node) + ? 'rollUp' : 'drillDown'; + } + model.resetViewRoot(targetInfo.node); + } + } + } +); + + +var HIGHLIGHT_ACTION = 'sunburstHighlight'; + +registerAction( + {type: HIGHLIGHT_ACTION, update: 'updateView'}, + function (payload, ecModel) { + + ecModel.eachComponent( + {mainType: 'series', subType: 'sunburst', query: payload}, + handleHighlight + ); + + function handleHighlight(model, index) { + var targetInfo = retrieveTargetInfo(payload, [HIGHLIGHT_ACTION], model); + + if (targetInfo) { + payload.highlight = targetInfo.node; + } + } + } +); + + +var UNHIGHLIGHT_ACTION = 'sunburstUnhighlight'; + +registerAction( + {type: UNHIGHLIGHT_ACTION, update: 'updateView'}, + function (payload, ecModel) { + + ecModel.eachComponent( + {mainType: 'series', subType: 'sunburst', query: payload}, + handleUnhighlight + ); + + function handleUnhighlight(model, index) { + payload.unhighlight = true; + } + } +); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +var RADIAN$1 = Math.PI / 180; + +var sunburstLayout = function (seriesType, ecModel, api, payload) { + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + var center = seriesModel.get('center'); + var radius = seriesModel.get('radius'); + + if (!isArray(radius)) { + radius = [0, radius]; + } + if (!isArray(center)) { + center = [center, center]; + } + + var width = api.getWidth(); + var height = api.getHeight(); + var size = Math.min(width, height); + var cx = parsePercent$1(center[0], width); + var cy = parsePercent$1(center[1], height); + var r0 = parsePercent$1(radius[0], size / 2); + var r = parsePercent$1(radius[1], size / 2); + + var startAngle = -seriesModel.get('startAngle') * RADIAN$1; + var minAngle = seriesModel.get('minAngle') * RADIAN$1; + + var virtualRoot = seriesModel.getData().tree.root; + var treeRoot = seriesModel.getViewRoot(); + var rootDepth = treeRoot.depth; + + var sort = seriesModel.get('sort'); + if (sort != null) { + initChildren$1(treeRoot, sort); + } + + var validDataCount = 0; + each$1(treeRoot.children, function (child) { + !isNaN(child.getValue()) && validDataCount++; + }); + + var sum = treeRoot.getValue(); + // Sum may be 0 + var unitRadian = Math.PI / (sum || validDataCount) * 2; + + var renderRollupNode = treeRoot.depth > 0; + var levels = treeRoot.height - (renderRollupNode ? -1 : 1); + var rPerLevel = (r - r0) / (levels || 1); + + var clockwise = seriesModel.get('clockwise'); + + var stillShowZeroSum = seriesModel.get('stillShowZeroSum'); + + // In the case some sector angle is smaller than minAngle + var dir = clockwise ? 1 : -1; + + /** + * Render a tree + * @return increased angle + */ + var renderNode = function (node, startAngle) { + if (!node) { + return; + } + + var endAngle = startAngle; + + // Render self + if (node !== virtualRoot) { + // Tree node is virtual, so it doesn't need to be drawn + var value = node.getValue(); + + var angle = (sum === 0 && stillShowZeroSum) + ? unitRadian : (value * unitRadian); + if (angle < minAngle) { + angle = minAngle; + + } + else { + + } + + endAngle = startAngle + dir * angle; + + var depth = node.depth - rootDepth + - (renderRollupNode ? -1 : 1); + var rStart = r0 + rPerLevel * depth; + var rEnd = r0 + rPerLevel * (depth + 1); + + var itemModel = node.getModel(); + if (itemModel.get('r0') != null) { + rStart = parsePercent$1(itemModel.get('r0'), size / 2); + } + if (itemModel.get('r') != null) { + rEnd = parsePercent$1(itemModel.get('r'), size / 2); + } + + node.setLayout({ + angle: angle, + startAngle: startAngle, + endAngle: endAngle, + clockwise: clockwise, + cx: cx, + cy: cy, + r0: rStart, + r: rEnd + }); + } + + // Render children + if (node.children && node.children.length) { + // currentAngle = startAngle; + var siblingAngle = 0; + each$1(node.children, function (node) { + siblingAngle += renderNode(node, startAngle + siblingAngle); + }); + } + + return endAngle - startAngle; + }; + + // Virtual root node for roll up + if (renderRollupNode) { + var rStart = r0; + var rEnd = r0 + rPerLevel; + + var angle = Math.PI * 2; + virtualRoot.setLayout({ + angle: angle, + startAngle: startAngle, + endAngle: startAngle + angle, + clockwise: clockwise, + cx: cx, + cy: cy, + r0: rStart, + r: rEnd + }); + } + + renderNode(treeRoot, startAngle); + }); +}; + +/** + * Init node children by order and update visual + * + * @param {TreeNode} node root node + * @param {boolean} isAsc if is in ascendant order + */ +function initChildren$1(node, isAsc) { + var children = node.children || []; + + node.children = sort$2(children, isAsc); + + // Init children recursively + if (children.length) { + each$1(node.children, function (child) { + initChildren$1(child, isAsc); + }); + } +} + +/** + * Sort children nodes + * + * @param {TreeNode[]} children children of node to be sorted + * @param {string | function | null} sort sort method + * See SunburstSeries.js for details. + */ +function sort$2(children, sortOrder) { + if (typeof sortOrder === 'function') { + return children.sort(sortOrder); + } + else { + var isAsc = sortOrder === 'asc'; + return children.sort(function (a, b) { + var diff = (a.getValue() - b.getValue()) * (isAsc ? 1 : -1); + return diff === 0 + ? (a.dataIndex - b.dataIndex) * (isAsc ? -1 : 1) + : diff; + }); + } +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +registerVisual(curry(dataColor, 'sunburst')); +registerLayout(curry(sunburstLayout, 'sunburst')); +registerProcessor(curry(dataFilter, 'sunburst')); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +function dataToCoordSize(dataSize, dataItem) { + // dataItem is necessary in log axis. + dataItem = dataItem || [0, 0]; + return map(['x', 'y'], function (dim, dimIdx) { + var axis = this.getAxis(dim); + var val = dataItem[dimIdx]; + var halfSize = dataSize[dimIdx] / 2; + return axis.type === 'category' + ? axis.getBandWidth() + : Math.abs(axis.dataToCoord(val - halfSize) - axis.dataToCoord(val + halfSize)); + }, this); +} + +var prepareCartesian2d = function (coordSys) { + var rect = coordSys.grid.getRect(); + return { + coordSys: { + // The name exposed to user is always 'cartesian2d' but not 'grid'. + type: 'cartesian2d', + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height + }, + api: { + coord: function (data) { + // do not provide "out" param + return coordSys.dataToPoint(data); + }, + size: bind(dataToCoordSize, coordSys) + } + }; +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +function dataToCoordSize$1(dataSize, dataItem) { + dataItem = dataItem || [0, 0]; + return map([0, 1], function (dimIdx) { + var val = dataItem[dimIdx]; + var halfSize = dataSize[dimIdx] / 2; + var p1 = []; + var p2 = []; + p1[dimIdx] = val - halfSize; + p2[dimIdx] = val + halfSize; + p1[1 - dimIdx] = p2[1 - dimIdx] = dataItem[1 - dimIdx]; + return Math.abs(this.dataToPoint(p1)[dimIdx] - this.dataToPoint(p2)[dimIdx]); + }, this); +} + +var prepareGeo = function (coordSys) { + var rect = coordSys.getBoundingRect(); + return { + coordSys: { + type: 'geo', + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height + }, + api: { + coord: function (data) { + // do not provide "out" and noRoam param, + // Compatible with this usage: + // echarts.util.map(item.points, api.coord) + return coordSys.dataToPoint(data); + }, + size: bind(dataToCoordSize$1, coordSys) + } + }; +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +function dataToCoordSize$2(dataSize, dataItem) { + // dataItem is necessary in log axis. + var axis = this.getAxis(); + var val = dataItem instanceof Array ? dataItem[0] : dataItem; + var halfSize = (dataSize instanceof Array ? dataSize[0] : dataSize) / 2; + return axis.type === 'category' + ? axis.getBandWidth() + : Math.abs(axis.dataToCoord(val - halfSize) - axis.dataToCoord(val + halfSize)); +} + +var prepareSingleAxis = function (coordSys) { + var rect = coordSys.getRect(); + + return { + coordSys: { + type: 'singleAxis', + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height + }, + api: { + coord: function (val) { + // do not provide "out" param + return coordSys.dataToPoint(val); + }, + size: bind(dataToCoordSize$2, coordSys) + } + }; +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +function dataToCoordSize$3(dataSize, dataItem) { + // dataItem is necessary in log axis. + return map(['Radius', 'Angle'], function (dim, dimIdx) { + var axis = this['get' + dim + 'Axis'](); + var val = dataItem[dimIdx]; + var halfSize = dataSize[dimIdx] / 2; + var method = 'dataTo' + dim; + + var result = axis.type === 'category' + ? axis.getBandWidth() + : Math.abs(axis[method](val - halfSize) - axis[method](val + halfSize)); + + if (dim === 'Angle') { + result = result * Math.PI / 180; + } + + return result; + + }, this); +} + +var preparePolar = function (coordSys) { + var radiusAxis = coordSys.getRadiusAxis(); + var angleAxis = coordSys.getAngleAxis(); + var radius = radiusAxis.getExtent(); + radius[0] > radius[1] && radius.reverse(); + + return { + coordSys: { + type: 'polar', + cx: coordSys.cx, + cy: coordSys.cy, + r: radius[1], + r0: radius[0] + }, + api: { + coord: bind(function (data) { + var radius = radiusAxis.dataToRadius(data[0]); + var angle = angleAxis.dataToAngle(data[1]); + var coord = coordSys.coordToPoint([radius, angle]); + coord.push(radius, angle * Math.PI / 180); + return coord; + }), + size: bind(dataToCoordSize$3, coordSys) + } + }; +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var prepareCalendar = function (coordSys) { + var rect = coordSys.getRect(); + var rangeInfo = coordSys.getRangeInfo(); + + return { + coordSys: { + type: 'calendar', + x: rect.x, + y: rect.y, + width: rect.width, + height: rect.height, + cellWidth: coordSys.getCellWidth(), + cellHeight: coordSys.getCellHeight(), + rangeInfo: { + start: rangeInfo.start, + end: rangeInfo.end, + weeks: rangeInfo.weeks, + dayCount: rangeInfo.allDay + } + }, + api: { + coord: function (data, clamp) { + return coordSys.dataToPoint(data, clamp); + } + } + }; +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var ITEM_STYLE_NORMAL_PATH = ['itemStyle']; +var ITEM_STYLE_EMPHASIS_PATH = ['emphasis', 'itemStyle']; +var LABEL_NORMAL = ['label']; +var LABEL_EMPHASIS = ['emphasis', 'label']; +// Use prefix to avoid index to be the same as el.name, +// which will cause weird udpate animation. +var GROUP_DIFF_PREFIX = 'e\0\0'; + +/** + * To reduce total package size of each coordinate systems, the modules `prepareCustom` + * of each coordinate systems are not required by each coordinate systems directly, but + * required by the module `custom`. + * + * prepareInfoForCustomSeries {Function}: optional + * @return {Object} {coordSys: {...}, api: { + * coord: function (data, clamp) {}, // return point in global. + * size: function (dataSize, dataItem) {} // return size of each axis in coordSys. + * }} + */ +var prepareCustoms = { + cartesian2d: prepareCartesian2d, + geo: prepareGeo, + singleAxis: prepareSingleAxis, + polar: preparePolar, + calendar: prepareCalendar +}; + +// ------ +// Model +// ------ + +extendSeriesModel({ + + type: 'series.custom', + + dependencies: ['grid', 'polar', 'geo', 'singleAxis', 'calendar'], + + defaultOption: { + coordinateSystem: 'cartesian2d', // Can be set as 'none' + zlevel: 0, + z: 2, + legendHoverLink: true + + // Cartesian coordinate system + // xAxisIndex: 0, + // yAxisIndex: 0, + + // Polar coordinate system + // polarIndex: 0, + + // Geo coordinate system + // geoIndex: 0, + + // label: {} + // itemStyle: {} + }, + + getInitialData: function (option, ecModel) { + return createListFromArray(this.getSource(), this); + } +}); + +// ----- +// View +// ----- + +extendChartView({ + + type: 'custom', + + /** + * @private + * @type {module:echarts/data/List} + */ + _data: null, + + /** + * @override + */ + render: function (customSeries, ecModel, api) { + var oldData = this._data; + var data = customSeries.getData(); + var group = this.group; + var renderItem = makeRenderItem(customSeries, data, ecModel, api); + + this.group.removeAll(); + + data.diff(oldData) + .add(function (newIdx) { + createOrUpdate$1( + null, newIdx, renderItem(newIdx), customSeries, group, data + ); + }) + .update(function (newIdx, oldIdx) { + var el = oldData.getItemGraphicEl(oldIdx); + createOrUpdate$1( + el, newIdx, renderItem(newIdx), customSeries, group, data + ); + }) + .remove(function (oldIdx) { + var el = oldData.getItemGraphicEl(oldIdx); + el && group.remove(el); + }) + .execute(); + + this._data = data; + }, + + incrementalPrepareRender: function (customSeries, ecModel, api) { + this.group.removeAll(); + this._data = null; + }, + + incrementalRender: function (params, customSeries, ecModel, api) { + var data = customSeries.getData(); + var renderItem = makeRenderItem(customSeries, data, ecModel, api); + function setIncrementalAndHoverLayer(el) { + if (!el.isGroup) { + el.incremental = true; + el.useHoverLayer = true; + } + } + for (var idx = params.start; idx < params.end; idx++) { + var el = createOrUpdate$1(null, idx, renderItem(idx), customSeries, this.group, data); + el.traverse(setIncrementalAndHoverLayer); + } + }, + + /** + * @override + */ + dispose: noop +}); + + +function createEl(elOption) { + var graphicType = elOption.type; + var el; + + if (graphicType === 'path') { + var shape = elOption.shape; + el = makePath( + shape.pathData, + null, + { + x: shape.x || 0, + y: shape.y || 0, + width: shape.width || 0, + height: shape.height || 0 + }, + 'center' + ); + el.__customPathData = elOption.pathData; + } + else if (graphicType === 'image') { + el = new ZImage({ + }); + el.__customImagePath = elOption.style.image; + } + else if (graphicType === 'text') { + el = new Text({ + }); + el.__customText = elOption.style.text; + } + else { + var Clz = graphic[graphicType.charAt(0).toUpperCase() + graphicType.slice(1)]; + + if (__DEV__) { + assert$1(Clz, 'graphic type "' + graphicType + '" can not be found.'); + } + + el = new Clz(); + } + + el.__customGraphicType = graphicType; + el.name = elOption.name; + + return el; +} + +function updateEl(el, dataIndex, elOption, animatableModel, data, isInit) { + var targetProps = {}; + var elOptionStyle = elOption.style || {}; + + elOption.shape && (targetProps.shape = clone(elOption.shape)); + elOption.position && (targetProps.position = elOption.position.slice()); + elOption.scale && (targetProps.scale = elOption.scale.slice()); + elOption.origin && (targetProps.origin = elOption.origin.slice()); + elOption.rotation && (targetProps.rotation = elOption.rotation); + + if (el.type === 'image' && elOption.style) { + var targetStyle = targetProps.style = {}; + each$1(['x', 'y', 'width', 'height'], function (prop) { + prepareStyleTransition(prop, targetStyle, elOptionStyle, el.style, isInit); + }); + } + + if (el.type === 'text' && elOption.style) { + var targetStyle = targetProps.style = {}; + each$1(['x', 'y'], function (prop) { + prepareStyleTransition(prop, targetStyle, elOptionStyle, el.style, isInit); + }); + // Compatible with previous: both support + // textFill and fill, textStroke and stroke in 'text' element. + !elOptionStyle.hasOwnProperty('textFill') && elOptionStyle.fill && ( + elOptionStyle.textFill = elOptionStyle.fill + ); + !elOptionStyle.hasOwnProperty('textStroke') && elOptionStyle.stroke && ( + elOptionStyle.textStroke = elOptionStyle.stroke + ); + } + + if (el.type !== 'group') { + el.useStyle(elOptionStyle); + + // Init animation. + if (isInit) { + el.style.opacity = 0; + var targetOpacity = elOptionStyle.opacity; + targetOpacity == null && (targetOpacity = 1); + initProps(el, {style: {opacity: targetOpacity}}, animatableModel, dataIndex); + } + } + + if (isInit) { + el.attr(targetProps); + } + else { + updateProps(el, targetProps, animatableModel, dataIndex); + } + + // z2 must not be null/undefined, otherwise sort error may occur. + el.attr({z2: elOption.z2 || 0, silent: elOption.silent}); + + elOption.styleEmphasis !== false && setHoverStyle(el, elOption.styleEmphasis); +} + +function prepareStyleTransition(prop, targetStyle, elOptionStyle, oldElStyle, isInit) { + if (elOptionStyle[prop] != null && !isInit) { + targetStyle[prop] = elOptionStyle[prop]; + elOptionStyle[prop] = oldElStyle[prop]; + } +} + +function makeRenderItem(customSeries, data, ecModel, api) { + var renderItem = customSeries.get('renderItem'); + var coordSys = customSeries.coordinateSystem; + var prepareResult = {}; + + if (coordSys) { + if (__DEV__) { + assert$1(renderItem, 'series.render is required.'); + assert$1( + coordSys.prepareCustoms || prepareCustoms[coordSys.type], + 'This coordSys does not support custom series.' + ); + } + + prepareResult = coordSys.prepareCustoms + ? coordSys.prepareCustoms() + : prepareCustoms[coordSys.type](coordSys); + } + + var userAPI = defaults({ + getWidth: api.getWidth, + getHeight: api.getHeight, + getZr: api.getZr, + getDevicePixelRatio: api.getDevicePixelRatio, + value: value, + style: style, + styleEmphasis: styleEmphasis, + visual: visual, + barLayout: barLayout, + currentSeriesIndices: currentSeriesIndices, + font: font + }, prepareResult.api || {}); + + var userParams = { + context: {}, + seriesId: customSeries.id, + seriesName: customSeries.name, + seriesIndex: customSeries.seriesIndex, + coordSys: prepareResult.coordSys, + dataInsideLength: data.count(), + encode: wrapEncodeDef(customSeries.getData()) + }; + + // Do not support call `api` asynchronously without dataIndexInside input. + var currDataIndexInside; + var currDirty = true; + var currItemModel; + var currLabelNormalModel; + var currLabelEmphasisModel; + var currVisualColor; + + return function (dataIndexInside) { + currDataIndexInside = dataIndexInside; + currDirty = true; + return renderItem && renderItem( + defaults({ + dataIndexInside: dataIndexInside, + dataIndex: data.getRawIndex(dataIndexInside) + }, userParams), + userAPI + ) || {}; + }; + + // Do not update cache until api called. + function updateCache(dataIndexInside) { + dataIndexInside == null && (dataIndexInside = currDataIndexInside); + if (currDirty) { + currItemModel = data.getItemModel(dataIndexInside); + currLabelNormalModel = currItemModel.getModel(LABEL_NORMAL); + currLabelEmphasisModel = currItemModel.getModel(LABEL_EMPHASIS); + currVisualColor = data.getItemVisual(dataIndexInside, 'color'); + + currDirty = false; + } + } + + /** + * @public + * @param {number|string} dim + * @param {number} [dataIndexInside=currDataIndexInside] + * @return {number|string} value + */ + function value(dim, dataIndexInside) { + dataIndexInside == null && (dataIndexInside = currDataIndexInside); + return data.get(data.getDimension(dim || 0), dataIndexInside); + } + + /** + * By default, `visual` is applied to style (to support visualMap). + * `visual.color` is applied at `fill`. If user want apply visual.color on `stroke`, + * it can be implemented as: + * `api.style({stroke: api.visual('color'), fill: null})`; + * @public + * @param {Object} [extra] + * @param {number} [dataIndexInside=currDataIndexInside] + */ + function style(extra, dataIndexInside) { + dataIndexInside == null && (dataIndexInside = currDataIndexInside); + updateCache(dataIndexInside); + + var itemStyle = currItemModel.getModel(ITEM_STYLE_NORMAL_PATH).getItemStyle(); + + currVisualColor != null && (itemStyle.fill = currVisualColor); + var opacity = data.getItemVisual(dataIndexInside, 'opacity'); + opacity != null && (itemStyle.opacity = opacity); + + setTextStyle(itemStyle, currLabelNormalModel, null, { + autoColor: currVisualColor, + isRectText: true + }); + + itemStyle.text = currLabelNormalModel.getShallow('show') + ? retrieve2( + customSeries.getFormattedLabel(dataIndexInside, 'normal'), + getDefaultLabel(data, dataIndexInside) + ) + : null; + + extra && extend(itemStyle, extra); + return itemStyle; + } + + /** + * @public + * @param {Object} [extra] + * @param {number} [dataIndexInside=currDataIndexInside] + */ + function styleEmphasis(extra, dataIndexInside) { + dataIndexInside == null && (dataIndexInside = currDataIndexInside); + updateCache(dataIndexInside); + + var itemStyle = currItemModel.getModel(ITEM_STYLE_EMPHASIS_PATH).getItemStyle(); + + setTextStyle(itemStyle, currLabelEmphasisModel, null, { + isRectText: true + }, true); + + itemStyle.text = currLabelEmphasisModel.getShallow('show') + ? retrieve3( + customSeries.getFormattedLabel(dataIndexInside, 'emphasis'), + customSeries.getFormattedLabel(dataIndexInside, 'normal'), + getDefaultLabel(data, dataIndexInside) + ) + : null; + + extra && extend(itemStyle, extra); + return itemStyle; + } + + /** + * @public + * @param {string} visualType + * @param {number} [dataIndexInside=currDataIndexInside] + */ + function visual(visualType, dataIndexInside) { + dataIndexInside == null && (dataIndexInside = currDataIndexInside); + return data.getItemVisual(dataIndexInside, visualType); + } + + /** + * @public + * @param {number} opt.count Positive interger. + * @param {number} [opt.barWidth] + * @param {number} [opt.barMaxWidth] + * @param {number} [opt.barGap] + * @param {number} [opt.barCategoryGap] + * @return {Object} {width, offset, offsetCenter} is not support, return undefined. + */ + function barLayout(opt) { + if (coordSys.getBaseAxis) { + var baseAxis = coordSys.getBaseAxis(); + return getLayoutOnAxis(defaults({axis: baseAxis}, opt), api); + } + } + + /** + * @public + * @return {Array.<number>} + */ + function currentSeriesIndices() { + return ecModel.getCurrentSeriesIndices(); + } + + /** + * @public + * @param {Object} opt + * @param {string} [opt.fontStyle] + * @param {number} [opt.fontWeight] + * @param {number} [opt.fontSize] + * @param {string} [opt.fontFamily] + * @return {string} font string + */ + function font(opt) { + return getFont(opt, ecModel); + } +} + +function wrapEncodeDef(data) { + var encodeDef = {}; + each$1(data.dimensions, function (dimName, dataDimIndex) { + var dimInfo = data.getDimensionInfo(dimName); + if (!dimInfo.isExtraCoord) { + var coordDim = dimInfo.coordDim; + var dataDims = encodeDef[coordDim] = encodeDef[coordDim] || []; + dataDims[dimInfo.coordDimIndex] = dataDimIndex; + } + }); + return encodeDef; +} + +function createOrUpdate$1(el, dataIndex, elOption, animatableModel, group, data) { + el = doCreateOrUpdate(el, dataIndex, elOption, animatableModel, group, data); + el && data.setItemGraphicEl(dataIndex, el); + + return el; +} + +function doCreateOrUpdate(el, dataIndex, elOption, animatableModel, group, data) { + var elOptionType = elOption.type; + if (el + && elOptionType !== el.__customGraphicType + && (elOptionType !== 'path' || elOption.pathData !== el.__customPathData) + && (elOptionType !== 'image' || elOption.style.image !== el.__customImagePath) + && (elOptionType !== 'text' || elOption.style.text !== el.__customText) + ) { + group.remove(el); + el = null; + } + + // `elOption.type` is undefined when `renderItem` returns nothing. + if (elOptionType == null) { + return; + } + + var isInit = !el; + !el && (el = createEl(elOption)); + updateEl(el, dataIndex, elOption, animatableModel, data, isInit); + + if (elOptionType === 'group') { + var oldChildren = el.children() || []; + var newChildren = elOption.children || []; + + if (elOption.diffChildrenByName) { + // lower performance. + diffGroupChildren({ + oldChildren: oldChildren, + newChildren: newChildren, + dataIndex: dataIndex, + animatableModel: animatableModel, + group: el, + data: data + }); + } + else { + // better performance. + var index = 0; + for (; index < newChildren.length; index++) { + doCreateOrUpdate( + el.childAt(index), + dataIndex, + newChildren[index], + animatableModel, + el, + data + ); + } + for (; index < oldChildren.length; index++) { + oldChildren[index] && el.remove(oldChildren[index]); + } + } + } + + group.add(el); + + return el; +} + +function diffGroupChildren(context) { + (new DataDiffer( + context.oldChildren, + context.newChildren, + getKey, + getKey, + context + )) + .add(processAddUpdate) + .update(processAddUpdate) + .remove(processRemove) + .execute(); +} + +function getKey(item, idx) { + var name = item && item.name; + return name != null ? name : GROUP_DIFF_PREFIX + idx; +} + +function processAddUpdate(newIndex, oldIndex) { + var context = this.context; + var childOption = newIndex != null ? context.newChildren[newIndex] : null; + var child = oldIndex != null ? context.oldChildren[oldIndex] : null; + + doCreateOrUpdate( + child, + context.dataIndex, + childOption, + context.animatableModel, + context.group, + context.data + ); +} + +function processRemove(oldIndex) { + var context = this.context; + var child = context.oldChildren[oldIndex]; + child && context.group.remove(child); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// ------------- +// Preprocessor +// ------------- + +registerPreprocessor(function (option) { + var graphicOption = option.graphic; + + // Convert + // {graphic: [{left: 10, type: 'circle'}, ...]} + // or + // {graphic: {left: 10, type: 'circle'}} + // to + // {graphic: [{elements: [{left: 10, type: 'circle'}, ...]}]} + if (isArray(graphicOption)) { + if (!graphicOption[0] || !graphicOption[0].elements) { + option.graphic = [{elements: graphicOption}]; + } + else { + // Only one graphic instance can be instantiated. (We dont + // want that too many views are created in echarts._viewMap) + option.graphic = [option.graphic[0]]; + } + } + else if (graphicOption && !graphicOption.elements) { + option.graphic = [{elements: [graphicOption]}]; + } +}); + +// ------ +// Model +// ------ + +var GraphicModel = extendComponentModel({ + + type: 'graphic', + + defaultOption: { + + // Extra properties for each elements: + // + // left/right/top/bottom: (like 12, '22%', 'center', default undefined) + // If left/rigth is set, shape.x/shape.cx/position will not be used. + // If top/bottom is set, shape.y/shape.cy/position will not be used. + // This mechanism is useful when you want to position a group/element + // against the right side or the center of this container. + // + // width/height: (can only be pixel value, default 0) + // Only be used to specify contianer(group) size, if needed. And + // can not be percentage value (like '33%'). See the reason in the + // layout algorithm below. + // + // bounding: (enum: 'all' (default) | 'raw') + // Specify how to calculate boundingRect when locating. + // 'all': Get uioned and transformed boundingRect + // from both itself and its descendants. + // This mode simplies confining a group of elements in the bounding + // of their ancester container (e.g., using 'right: 0'). + // 'raw': Only use the boundingRect of itself and before transformed. + // This mode is similar to css behavior, which is useful when you + // want an element to be able to overflow its container. (Consider + // a rotated circle needs to be located in a corner.) + + // Note: elements is always behind its ancestors in this elements array. + elements: [], + parentId: null + }, + + /** + * Save el options for the sake of the performance (only update modified graphics). + * The order is the same as those in option. (ancesters -> descendants) + * + * @private + * @type {Array.<Object>} + */ + _elOptionsToUpdate: null, + + /** + * @override + */ + mergeOption: function (option) { + // Prevent default merge to elements + var elements = this.option.elements; + this.option.elements = null; + + GraphicModel.superApply(this, 'mergeOption', arguments); + + this.option.elements = elements; + }, + + /** + * @override + */ + optionUpdated: function (newOption, isInit) { + var thisOption = this.option; + var newList = (isInit ? thisOption : newOption).elements; + var existList = thisOption.elements = isInit ? [] : thisOption.elements; + + var flattenedList = []; + this._flatten(newList, flattenedList); + + var mappingResult = mappingToExists(existList, flattenedList); + makeIdAndName(mappingResult); + + // Clear elOptionsToUpdate + var elOptionsToUpdate = this._elOptionsToUpdate = []; + + each$1(mappingResult, function (resultItem, index) { + var newElOption = resultItem.option; + + if (__DEV__) { + assert$1( + isObject$1(newElOption) || resultItem.exist, + 'Empty graphic option definition' + ); + } + + if (!newElOption) { + return; + } + + elOptionsToUpdate.push(newElOption); + + setKeyInfoToNewElOption(resultItem, newElOption); + + mergeNewElOptionToExist(existList, index, newElOption); + + setLayoutInfoToExist(existList[index], newElOption); + + }, this); + + // Clean + for (var i = existList.length - 1; i >= 0; i--) { + if (existList[i] == null) { + existList.splice(i, 1); + } + else { + // $action should be volatile, otherwise option gotten from + // `getOption` will contain unexpected $action. + delete existList[i].$action; + } + } + }, + + /** + * Convert + * [{ + * type: 'group', + * id: 'xx', + * children: [{type: 'circle'}, {type: 'polygon'}] + * }] + * to + * [ + * {type: 'group', id: 'xx'}, + * {type: 'circle', parentId: 'xx'}, + * {type: 'polygon', parentId: 'xx'} + * ] + * + * @private + * @param {Array.<Object>} optionList option list + * @param {Array.<Object>} result result of flatten + * @param {Object} parentOption parent option + */ + _flatten: function (optionList, result, parentOption) { + each$1(optionList, function (option) { + if (!option) { + return; + } + + if (parentOption) { + option.parentOption = parentOption; + } + + result.push(option); + + var children = option.children; + if (option.type === 'group' && children) { + this._flatten(children, result, option); + } + // Deleting for JSON output, and for not affecting group creation. + delete option.children; + }, this); + }, + + // FIXME + // Pass to view using payload? setOption has a payload? + useElOptionsToUpdate: function () { + var els = this._elOptionsToUpdate; + // Clear to avoid render duplicately when zooming. + this._elOptionsToUpdate = null; + return els; + } +}); + +// ----- +// View +// ----- + +extendComponentView({ + + type: 'graphic', + + /** + * @override + */ + init: function (ecModel, api) { + + /** + * @private + * @type {module:zrender/core/util.HashMap} + */ + this._elMap = createHashMap(); + + /** + * @private + * @type {module:echarts/graphic/GraphicModel} + */ + this._lastGraphicModel; + }, + + /** + * @override + */ + render: function (graphicModel, ecModel, api) { + + // Having leveraged between use cases and algorithm complexity, a very + // simple layout mechanism is used: + // The size(width/height) can be determined by itself or its parent (not + // implemented yet), but can not by its children. (Top-down travel) + // The location(x/y) can be determined by the bounding rect of itself + // (can including its descendants or not) and the size of its parent. + // (Bottom-up travel) + + // When `chart.clear()` or `chart.setOption({...}, true)` with the same id, + // view will be reused. + if (graphicModel !== this._lastGraphicModel) { + this._clear(); + } + this._lastGraphicModel = graphicModel; + + this._updateElements(graphicModel, api); + this._relocate(graphicModel, api); + }, + + /** + * Update graphic elements. + * + * @private + * @param {Object} graphicModel graphic model + * @param {module:echarts/ExtensionAPI} api extension API + */ + _updateElements: function (graphicModel, api) { + var elOptionsToUpdate = graphicModel.useElOptionsToUpdate(); + + if (!elOptionsToUpdate) { + return; + } + + var elMap = this._elMap; + var rootGroup = this.group; + + // Top-down tranverse to assign graphic settings to each elements. + each$1(elOptionsToUpdate, function (elOption) { + var $action = elOption.$action; + var id = elOption.id; + var existEl = elMap.get(id); + var parentId = elOption.parentId; + var targetElParent = parentId != null ? elMap.get(parentId) : rootGroup; + + if (elOption.type === 'text') { + var elOptionStyle = elOption.style; + + // In top/bottom mode, textVerticalAlign should not be used, which cause + // inaccurately locating. + if (elOption.hv && elOption.hv[1]) { + elOptionStyle.textVerticalAlign = elOptionStyle.textBaseline = null; + } + + // Compatible with previous setting: both support fill and textFill, + // stroke and textStroke. + !elOptionStyle.hasOwnProperty('textFill') && elOptionStyle.fill && ( + elOptionStyle.textFill = elOptionStyle.fill + ); + !elOptionStyle.hasOwnProperty('textStroke') && elOptionStyle.stroke && ( + elOptionStyle.textStroke = elOptionStyle.stroke + ); + } + + // Remove unnecessary props to avoid potential problems. + var elOptionCleaned = getCleanedElOption(elOption); + + // For simple, do not support parent change, otherwise reorder is needed. + if (__DEV__) { + existEl && assert$1( + targetElParent === existEl.parent, + 'Changing parent is not supported.' + ); + } + + if (!$action || $action === 'merge') { + existEl + ? existEl.attr(elOptionCleaned) + : createEl$1(id, targetElParent, elOptionCleaned, elMap); + } + else if ($action === 'replace') { + removeEl(existEl, elMap); + createEl$1(id, targetElParent, elOptionCleaned, elMap); + } + else if ($action === 'remove') { + removeEl(existEl, elMap); + } + + var el = elMap.get(id); + if (el) { + el.__ecGraphicWidth = elOption.width; + el.__ecGraphicHeight = elOption.height; + } + }); + }, + + /** + * Locate graphic elements. + * + * @private + * @param {Object} graphicModel graphic model + * @param {module:echarts/ExtensionAPI} api extension API + */ + _relocate: function (graphicModel, api) { + var elOptions = graphicModel.option.elements; + var rootGroup = this.group; + var elMap = this._elMap; + + // Bottom-up tranvese all elements (consider ec resize) to locate elements. + for (var i = elOptions.length - 1; i >= 0; i--) { + var elOption = elOptions[i]; + var el = elMap.get(elOption.id); + + if (!el) { + continue; + } + + var parentEl = el.parent; + var containerInfo = parentEl === rootGroup + ? { + width: api.getWidth(), + height: api.getHeight() + } + : { // Like 'position:absolut' in css, default 0. + width: parentEl.__ecGraphicWidth || 0, + height: parentEl.__ecGraphicHeight || 0 + }; + + positionElement( + el, elOption, containerInfo, null, + {hv: elOption.hv, boundingMode: elOption.bounding} + ); + } + }, + + /** + * Clear all elements. + * + * @private + */ + _clear: function () { + var elMap = this._elMap; + elMap.each(function (el) { + removeEl(el, elMap); + }); + this._elMap = createHashMap(); + }, + + /** + * @override + */ + dispose: function () { + this._clear(); + } +}); + +function createEl$1(id, targetElParent, elOption, elMap) { + var graphicType = elOption.type; + + if (__DEV__) { + assert$1(graphicType, 'graphic type MUST be set'); + } + + var Clz = graphic[graphicType.charAt(0).toUpperCase() + graphicType.slice(1)]; + + if (__DEV__) { + assert$1(Clz, 'graphic type can not be found'); + } + + var el = new Clz(elOption); + targetElParent.add(el); + elMap.set(id, el); + el.__ecGraphicId = id; +} + +function removeEl(existEl, elMap) { + var existElParent = existEl && existEl.parent; + if (existElParent) { + existEl.type === 'group' && existEl.traverse(function (el) { + removeEl(el, elMap); + }); + elMap.removeKey(existEl.__ecGraphicId); + existElParent.remove(existEl); + } +} + +// Remove unnecessary props to avoid potential problems. +function getCleanedElOption(elOption) { + elOption = extend({}, elOption); + each$1( + ['id', 'parentId', '$action', 'hv', 'bounding'].concat(LOCATION_PARAMS), + function (name) { + delete elOption[name]; + } + ); + return elOption; +} + +function isSetLoc(obj, props) { + var isSet; + each$1(props, function (prop) { + obj[prop] != null && obj[prop] !== 'auto' && (isSet = true); + }); + return isSet; +} + +function setKeyInfoToNewElOption(resultItem, newElOption) { + var existElOption = resultItem.exist; + + // Set id and type after id assigned. + newElOption.id = resultItem.keyInfo.id; + !newElOption.type && existElOption && (newElOption.type = existElOption.type); + + // Set parent id if not specified + if (newElOption.parentId == null) { + var newElParentOption = newElOption.parentOption; + if (newElParentOption) { + newElOption.parentId = newElParentOption.id; + } + else if (existElOption) { + newElOption.parentId = existElOption.parentId; + } + } + + // Clear + newElOption.parentOption = null; +} + +function mergeNewElOptionToExist(existList, index, newElOption) { + // Update existing options, for `getOption` feature. + var newElOptCopy = extend({}, newElOption); + var existElOption = existList[index]; + + var $action = newElOption.$action || 'merge'; + if ($action === 'merge') { + if (existElOption) { + + if (__DEV__) { + var newType = newElOption.type; + assert$1( + !newType || existElOption.type === newType, + 'Please set $action: "replace" to change `type`' + ); + } + + // We can ensure that newElOptCopy and existElOption are not + // the same object, so `merge` will not change newElOptCopy. + merge(existElOption, newElOptCopy, true); + // Rigid body, use ignoreSize. + mergeLayoutParam(existElOption, newElOptCopy, {ignoreSize: true}); + // Will be used in render. + copyLayoutParams(newElOption, existElOption); + } + else { + existList[index] = newElOptCopy; + } + } + else if ($action === 'replace') { + existList[index] = newElOptCopy; + } + else if ($action === 'remove') { + // null will be cleaned later. + existElOption && (existList[index] = null); + } +} + +function setLayoutInfoToExist(existItem, newElOption) { + if (!existItem) { + return; + } + existItem.hv = newElOption.hv = [ + // Rigid body, dont care `width`. + isSetLoc(newElOption, ['left', 'right']), + // Rigid body, dont care `height`. + isSetLoc(newElOption, ['top', 'bottom']) + ]; + // Give default group size. Otherwise layout error may occur. + if (existItem.type === 'group') { + existItem.width == null && (existItem.width = newElOption.width = 0); + existItem.height == null && (existItem.height = newElOption.height = 0); + } +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var LegendModel = extendComponentModel({ + + type: 'legend.plain', + + dependencies: ['series'], + + layoutMode: { + type: 'box', + // legend.width/height are maxWidth/maxHeight actually, + // whereas realy width/height is calculated by its content. + // (Setting {left: 10, right: 10} does not make sense). + // So consider the case: + // `setOption({legend: {left: 10});` + // then `setOption({legend: {right: 10});` + // The previous `left` should be cleared by setting `ignoreSize`. + ignoreSize: true + }, + + init: function (option, parentModel, ecModel) { + this.mergeDefaultAndTheme(option, ecModel); + + option.selected = option.selected || {}; + }, + + mergeOption: function (option) { + LegendModel.superCall(this, 'mergeOption', option); + }, + + optionUpdated: function () { + this._updateData(this.ecModel); + + var legendData = this._data; + + // If selectedMode is single, try to select one + if (legendData[0] && this.get('selectedMode') === 'single') { + var hasSelected = false; + // If has any selected in option.selected + for (var i = 0; i < legendData.length; i++) { + var name = legendData[i].get('name'); + if (this.isSelected(name)) { + // Force to unselect others + this.select(name); + hasSelected = true; + break; + } + } + // Try select the first if selectedMode is single + !hasSelected && this.select(legendData[0].get('name')); + } + }, + + _updateData: function (ecModel) { + var potentialData = []; + var availableNames = []; + + ecModel.eachRawSeries(function (seriesModel) { + var seriesName = seriesModel.name; + availableNames.push(seriesName); + var isPotential; + + if (seriesModel.legendDataProvider) { + var data = seriesModel.legendDataProvider(); + var names = data.mapArray(data.getName); + + if (!ecModel.isSeriesFiltered(seriesModel)) { + availableNames = availableNames.concat(names); + } + + if (names.length) { + potentialData = potentialData.concat(names); + } + else { + isPotential = true; + } + } + else { + isPotential = true; + } + + if (isPotential && isNameSpecified(seriesModel)) { + potentialData.push(seriesModel.name); + } + }); + + /** + * @type {Array.<string>} + * @private + */ + this._availableNames = availableNames; + + // If legend.data not specified in option, use availableNames as data, + // which is convinient for user preparing option. + var rawData = this.get('data') || potentialData; + + var legendData = map(rawData, function (dataItem) { + // Can be string or number + if (typeof dataItem === 'string' || typeof dataItem === 'number') { + dataItem = { + name: dataItem + }; + } + return new Model(dataItem, this, this.ecModel); + }, this); + + /** + * @type {Array.<module:echarts/model/Model>} + * @private + */ + this._data = legendData; + }, + + /** + * @return {Array.<module:echarts/model/Model>} + */ + getData: function () { + return this._data; + }, + + /** + * @param {string} name + */ + select: function (name) { + var selected = this.option.selected; + var selectedMode = this.get('selectedMode'); + if (selectedMode === 'single') { + var data = this._data; + each$1(data, function (dataItem) { + selected[dataItem.get('name')] = false; + }); + } + selected[name] = true; + }, + + /** + * @param {string} name + */ + unSelect: function (name) { + if (this.get('selectedMode') !== 'single') { + this.option.selected[name] = false; + } + }, + + /** + * @param {string} name + */ + toggleSelected: function (name) { + var selected = this.option.selected; + // Default is true + if (!selected.hasOwnProperty(name)) { + selected[name] = true; + } + this[selected[name] ? 'unSelect' : 'select'](name); + }, + + /** + * @param {string} name + */ + isSelected: function (name) { + var selected = this.option.selected; + return !(selected.hasOwnProperty(name) && !selected[name]) + && indexOf(this._availableNames, name) >= 0; + }, + + defaultOption: { + // 一级层叠 + zlevel: 0, + // 二级层叠 + z: 4, + show: true, + + // 布局方式,默认为水平布局,可选为: + // 'horizontal' | 'vertical' + orient: 'horizontal', + + left: 'center', + // right: 'center', + + top: 0, + // bottom: null, + + // 水平对齐 + // 'auto' | 'left' | 'right' + // 默认为 'auto', 根据 x 的位置判断是左对齐还是右对齐 + align: 'auto', + + backgroundColor: 'rgba(0,0,0,0)', + // 图例边框颜色 + borderColor: '#ccc', + borderRadius: 0, + // 图例边框线宽,单位px,默认为0(无边框) + borderWidth: 0, + // 图例内边距,单位px,默认各方向内边距为5, + // 接受数组分别设定上右下左边距,同css + padding: 5, + // 各个item之间的间隔,单位px,默认为10, + // 横向布局时为水平间隔,纵向布局时为纵向间隔 + itemGap: 10, + // 图例图形宽度 + itemWidth: 25, + // 图例图形高度 + itemHeight: 14, + + // 图例关闭时候的颜色 + inactiveColor: '#ccc', + + textStyle: { + // 图例文字颜色 + color: '#333' + }, + // formatter: '', + // 选择模式,默认开启图例开关 + selectedMode: true, + // 配置默认选中状态,可配合LEGEND.SELECTED事件做动态数据载入 + // selected: null, + // 图例内容(详见legend.data,数组中每一项代表一个item + // data: [], + + // Tooltip 相关配置 + tooltip: { + show: false + } + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +function legendSelectActionHandler(methodName, payload, ecModel) { + var selectedMap = {}; + var isToggleSelect = methodName === 'toggleSelected'; + var isSelected; + // Update all legend components + ecModel.eachComponent('legend', function (legendModel) { + if (isToggleSelect && isSelected != null) { + // Force other legend has same selected status + // Or the first is toggled to true and other are toggled to false + // In the case one legend has some item unSelected in option. And if other legend + // doesn't has the item, they will assume it is selected. + legendModel[isSelected ? 'select' : 'unSelect'](payload.name); + } + else { + legendModel[methodName](payload.name); + isSelected = legendModel.isSelected(payload.name); + } + var legendData = legendModel.getData(); + each$1(legendData, function (model) { + var name = model.get('name'); + // Wrap element + if (name === '\n' || name === '') { + return; + } + var isItemSelected = legendModel.isSelected(name); + if (selectedMap.hasOwnProperty(name)) { + // Unselected if any legend is unselected + selectedMap[name] = selectedMap[name] && isItemSelected; + } + else { + selectedMap[name] = isItemSelected; + } + }); + }); + // Return the event explicitly + return { + name: payload.name, + selected: selectedMap + }; +} +/** + * @event legendToggleSelect + * @type {Object} + * @property {string} type 'legendToggleSelect' + * @property {string} [from] + * @property {string} name Series name or data item name + */ +registerAction( + 'legendToggleSelect', 'legendselectchanged', + curry(legendSelectActionHandler, 'toggleSelected') +); + +/** + * @event legendSelect + * @type {Object} + * @property {string} type 'legendSelect' + * @property {string} name Series name or data item name + */ +registerAction( + 'legendSelect', 'legendselected', + curry(legendSelectActionHandler, 'select') +); + +/** + * @event legendUnSelect + * @type {Object} + * @property {string} type 'legendUnSelect' + * @property {string} name Series name or data item name + */ +registerAction( + 'legendUnSelect', 'legendunselected', + curry(legendSelectActionHandler, 'unSelect') +); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Layout list like component. + * It will box layout each items in group of component and then position the whole group in the viewport + * @param {module:zrender/group/Group} group + * @param {module:echarts/model/Component} componentModel + * @param {module:echarts/ExtensionAPI} + */ +function layout$3(group, componentModel, api) { + var boxLayoutParams = componentModel.getBoxLayoutParams(); + var padding = componentModel.get('padding'); + var viewportSize = {width: api.getWidth(), height: api.getHeight()}; + + var rect = getLayoutRect( + boxLayoutParams, + viewportSize, + padding + ); + + box( + componentModel.get('orient'), + group, + componentModel.get('itemGap'), + rect.width, + rect.height + ); + + positionElement( + group, + boxLayoutParams, + viewportSize, + padding + ); +} + +function makeBackground(rect, componentModel) { + var padding = normalizeCssArray$1( + componentModel.get('padding') + ); + var style = componentModel.getItemStyle(['color', 'opacity']); + style.fill = componentModel.get('backgroundColor'); + var rect = new Rect({ + shape: { + x: rect.x - padding[3], + y: rect.y - padding[0], + width: rect.width + padding[1] + padding[3], + height: rect.height + padding[0] + padding[2], + r: componentModel.get('borderRadius') + }, + style: style, + silent: true, + z2: -1 + }); + // FIXME + // `subPixelOptimizeRect` may bring some gap between edge of viewpart + // and background rect when setting like `left: 0`, `top: 0`. + // graphic.subPixelOptimizeRect(rect); + + return rect; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var curry$4 = curry; +var each$16 = each$1; +var Group$3 = Group; + +var LegendView = extendComponentView({ + + type: 'legend.plain', + + newlineDisabled: false, + + /** + * @override + */ + init: function () { + + /** + * @private + * @type {module:zrender/container/Group} + */ + this.group.add(this._contentGroup = new Group$3()); + + /** + * @private + * @type {module:zrender/Element} + */ + this._backgroundEl; + }, + + /** + * @protected + */ + getContentGroup: function () { + return this._contentGroup; + }, + + /** + * @override + */ + render: function (legendModel, ecModel, api) { + + this.resetInner(); + + if (!legendModel.get('show', true)) { + return; + } + + var itemAlign = legendModel.get('align'); + if (!itemAlign || itemAlign === 'auto') { + itemAlign = ( + legendModel.get('left') === 'right' + && legendModel.get('orient') === 'vertical' + ) ? 'right' : 'left'; + } + + this.renderInner(itemAlign, legendModel, ecModel, api); + + // Perform layout. + var positionInfo = legendModel.getBoxLayoutParams(); + var viewportSize = {width: api.getWidth(), height: api.getHeight()}; + var padding = legendModel.get('padding'); + + var maxSize = getLayoutRect(positionInfo, viewportSize, padding); + var mainRect = this.layoutInner(legendModel, itemAlign, maxSize); + + // Place mainGroup, based on the calculated `mainRect`. + var layoutRect = getLayoutRect( + defaults({width: mainRect.width, height: mainRect.height}, positionInfo), + viewportSize, + padding + ); + this.group.attr('position', [layoutRect.x - mainRect.x, layoutRect.y - mainRect.y]); + + // Render background after group is layout. + this.group.add( + this._backgroundEl = makeBackground(mainRect, legendModel) + ); + }, + + /** + * @protected + */ + resetInner: function () { + this.getContentGroup().removeAll(); + this._backgroundEl && this.group.remove(this._backgroundEl); + }, + + /** + * @protected + */ + renderInner: function (itemAlign, legendModel, ecModel, api) { + var contentGroup = this.getContentGroup(); + var legendDrawnMap = createHashMap(); + var selectMode = legendModel.get('selectedMode'); + + var excludeSeriesId = []; + ecModel.eachRawSeries(function (seriesModel) { + !seriesModel.get('legendHoverLink') && excludeSeriesId.push(seriesModel.id); + }); + + each$16(legendModel.getData(), function (itemModel, dataIndex) { + var name = itemModel.get('name'); + + // Use empty string or \n as a newline string + if (!this.newlineDisabled && (name === '' || name === '\n')) { + contentGroup.add(new Group$3({ + newline: true + })); + return; + } + + // Representitive series. + var seriesModel = ecModel.getSeriesByName(name)[0]; + + if (legendDrawnMap.get(name)) { + // Have been drawed + return; + } + + // Series legend + if (seriesModel) { + var data = seriesModel.getData(); + var color = data.getVisual('color'); + + // If color is a callback function + if (typeof color === 'function') { + // Use the first data + color = color(seriesModel.getDataParams(0)); + } + + // Using rect symbol defaultly + var legendSymbolType = data.getVisual('legendSymbol') || 'roundRect'; + var symbolType = data.getVisual('symbol'); + + var itemGroup = this._createItem( + name, dataIndex, itemModel, legendModel, + legendSymbolType, symbolType, + itemAlign, color, + selectMode + ); + + itemGroup.on('click', curry$4(dispatchSelectAction, name, api)) + .on('mouseover', curry$4(dispatchHighlightAction, seriesModel, null, api, excludeSeriesId)) + .on('mouseout', curry$4(dispatchDownplayAction, seriesModel, null, api, excludeSeriesId)); + + legendDrawnMap.set(name, true); + } + else { + // Data legend of pie, funnel + ecModel.eachRawSeries(function (seriesModel) { + // In case multiple series has same data name + if (legendDrawnMap.get(name)) { + return; + } + + if (seriesModel.legendDataProvider) { + var data = seriesModel.legendDataProvider(); + var idx = data.indexOfName(name); + if (idx < 0) { + return; + } + + var color = data.getItemVisual(idx, 'color'); + + var legendSymbolType = 'roundRect'; + + var itemGroup = this._createItem( + name, dataIndex, itemModel, legendModel, + legendSymbolType, null, + itemAlign, color, + selectMode + ); + + // FIXME: consider different series has items with the same name. + itemGroup.on('click', curry$4(dispatchSelectAction, name, api)) + // FIXME Should not specify the series name + .on('mouseover', curry$4(dispatchHighlightAction, seriesModel, name, api, excludeSeriesId)) + .on('mouseout', curry$4(dispatchDownplayAction, seriesModel, name, api, excludeSeriesId)); + + legendDrawnMap.set(name, true); + } + + }, this); + } + + if (__DEV__) { + if (!legendDrawnMap.get(name)) { + console.warn(name + ' series not exists. Legend data should be same with series name or data name.'); + } + } + }, this); + }, + + _createItem: function ( + name, dataIndex, itemModel, legendModel, + legendSymbolType, symbolType, + itemAlign, color, selectMode + ) { + var itemWidth = legendModel.get('itemWidth'); + var itemHeight = legendModel.get('itemHeight'); + var inactiveColor = legendModel.get('inactiveColor'); + var symbolKeepAspect = legendModel.get('symbolKeepAspect'); + + var isSelected = legendModel.isSelected(name); + var itemGroup = new Group$3(); + + var textStyleModel = itemModel.getModel('textStyle'); + + var itemIcon = itemModel.get('icon'); + + var tooltipModel = itemModel.getModel('tooltip'); + var legendGlobalTooltipModel = tooltipModel.parentModel; + + // Use user given icon first + legendSymbolType = itemIcon || legendSymbolType; + itemGroup.add(createSymbol( + legendSymbolType, + 0, + 0, + itemWidth, + itemHeight, + isSelected ? color : inactiveColor, + // symbolKeepAspect default true for legend + symbolKeepAspect == null ? true : symbolKeepAspect + )); + + // Compose symbols + // PENDING + if (!itemIcon && symbolType + // At least show one symbol, can't be all none + && ((symbolType !== legendSymbolType) || symbolType == 'none') + ) { + var size = itemHeight * 0.8; + if (symbolType === 'none') { + symbolType = 'circle'; + } + // Put symbol in the center + itemGroup.add(createSymbol( + symbolType, + (itemWidth - size) / 2, + (itemHeight - size) / 2, + size, + size, + isSelected ? color : inactiveColor, + // symbolKeepAspect default true for legend + symbolKeepAspect == null ? true : symbolKeepAspect + )); + } + + var textX = itemAlign === 'left' ? itemWidth + 5 : -5; + var textAlign = itemAlign; + + var formatter = legendModel.get('formatter'); + var content = name; + if (typeof formatter === 'string' && formatter) { + content = formatter.replace('{name}', name != null ? name : ''); + } + else if (typeof formatter === 'function') { + content = formatter(name); + } + + itemGroup.add(new Text({ + style: setTextStyle({}, textStyleModel, { + text: content, + x: textX, + y: itemHeight / 2, + textFill: isSelected ? textStyleModel.getTextColor() : inactiveColor, + textAlign: textAlign, + textVerticalAlign: 'middle' + }) + })); + + // Add a invisible rect to increase the area of mouse hover + var hitRect = new Rect({ + shape: itemGroup.getBoundingRect(), + invisible: true, + tooltip: tooltipModel.get('show') ? extend({ + content: name, + // Defaul formatter + formatter: legendGlobalTooltipModel.get('formatter', true) || function () { + return name; + }, + formatterParams: { + componentType: 'legend', + legendIndex: legendModel.componentIndex, + name: name, + $vars: ['name'] + } + }, tooltipModel.option) : null + }); + itemGroup.add(hitRect); + + itemGroup.eachChild(function (child) { + child.silent = true; + }); + + hitRect.silent = !selectMode; + + this.getContentGroup().add(itemGroup); + + setHoverStyle(itemGroup); + + itemGroup.__legendDataIndex = dataIndex; + + return itemGroup; + }, + + /** + * @protected + */ + layoutInner: function (legendModel, itemAlign, maxSize) { + var contentGroup = this.getContentGroup(); + + // Place items in contentGroup. + box( + legendModel.get('orient'), + contentGroup, + legendModel.get('itemGap'), + maxSize.width, + maxSize.height + ); + + var contentRect = contentGroup.getBoundingRect(); + contentGroup.attr('position', [-contentRect.x, -contentRect.y]); + + return this.group.getBoundingRect(); + } + +}); + +function dispatchSelectAction(name, api) { + api.dispatchAction({ + type: 'legendToggleSelect', + name: name + }); +} + +function dispatchHighlightAction(seriesModel, dataName, api, excludeSeriesId) { + // If element hover will move to a hoverLayer. + var el = api.getZr().storage.getDisplayList()[0]; + if (!(el && el.useHoverLayer)) { + api.dispatchAction({ + type: 'highlight', + seriesName: seriesModel.name, + name: dataName, + excludeSeriesId: excludeSeriesId + }); + } +} + +function dispatchDownplayAction(seriesModel, dataName, api, excludeSeriesId) { + // If element hover will move to a hoverLayer. + var el = api.getZr().storage.getDisplayList()[0]; + if (!(el && el.useHoverLayer)) { + api.dispatchAction({ + type: 'downplay', + seriesName: seriesModel.name, + name: dataName, + excludeSeriesId: excludeSeriesId + }); + } +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var legendFilter = function (ecModel) { + + var legendModels = ecModel.findComponents({ + mainType: 'legend' + }); + if (legendModels && legendModels.length) { + ecModel.filterSeries(function (series) { + // If in any legend component the status is not selected. + // Because in legend series is assumed selected when it is not in the legend data. + for (var i = 0; i < legendModels.length; i++) { + if (!legendModels[i].isSelected(series.name)) { + return false; + } + } + return true; + }); + } + +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +// Do not contain scrollable legend, for sake of file size. + +// Series Filter +registerProcessor(legendFilter); + +ComponentModel.registerSubTypeDefaulter('legend', function () { + // Default 'plain' when no type specified. + return 'plain'; +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var ScrollableLegendModel = LegendModel.extend({ + + type: 'legend.scroll', + + /** + * @param {number} scrollDataIndex + */ + setScrollDataIndex: function (scrollDataIndex) { + this.option.scrollDataIndex = scrollDataIndex; + }, + + defaultOption: { + scrollDataIndex: 0, + pageButtonItemGap: 5, + pageButtonGap: null, + pageButtonPosition: 'end', // 'start' or 'end' + pageFormatter: '{current}/{total}', // If null/undefined, do not show page. + pageIcons: { + horizontal: ['M0,0L12,-10L12,10z', 'M0,0L-12,-10L-12,10z'], + vertical: ['M0,0L20,0L10,-20z', 'M0,0L20,0L10,20z'] + }, + pageIconColor: '#2f4554', + pageIconInactiveColor: '#aaa', + pageIconSize: 15, // Can be [10, 3], which represents [width, height] + pageTextStyle: { + color: '#333' + }, + + animationDurationUpdate: 800 + }, + + /** + * @override + */ + init: function (option, parentModel, ecModel, extraOpt) { + var inputPositionParams = getLayoutParams(option); + + ScrollableLegendModel.superCall(this, 'init', option, parentModel, ecModel, extraOpt); + + mergeAndNormalizeLayoutParams(this, option, inputPositionParams); + }, + + /** + * @override + */ + mergeOption: function (option, extraOpt) { + ScrollableLegendModel.superCall(this, 'mergeOption', option, extraOpt); + + mergeAndNormalizeLayoutParams(this, this.option, option); + }, + + getOrient: function () { + return this.get('orient') === 'vertical' + ? {index: 1, name: 'vertical'} + : {index: 0, name: 'horizontal'}; + } + +}); + +// Do not `ignoreSize` to enable setting {left: 10, right: 10}. +function mergeAndNormalizeLayoutParams(legendModel, target, raw) { + var orient = legendModel.getOrient(); + var ignoreSize = [1, 1]; + ignoreSize[orient.index] = 0; + mergeLayoutParam(target, raw, { + type: 'box', ignoreSize: ignoreSize + }); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Separate legend and scrollable legend to reduce package size. + */ + +var Group$4 = Group; + +var WH$1 = ['width', 'height']; +var XY$1 = ['x', 'y']; + +var ScrollableLegendView = LegendView.extend({ + + type: 'legend.scroll', + + newlineDisabled: true, + + init: function () { + + ScrollableLegendView.superCall(this, 'init'); + + /** + * @private + * @type {number} For `scroll`. + */ + this._currentIndex = 0; + + /** + * @private + * @type {module:zrender/container/Group} + */ + this.group.add(this._containerGroup = new Group$4()); + this._containerGroup.add(this.getContentGroup()); + + /** + * @private + * @type {module:zrender/container/Group} + */ + this.group.add(this._controllerGroup = new Group$4()); + + /** + * + * @private + */ + this._showController; + }, + + /** + * @override + */ + resetInner: function () { + ScrollableLegendView.superCall(this, 'resetInner'); + + this._controllerGroup.removeAll(); + this._containerGroup.removeClipPath(); + this._containerGroup.__rectSize = null; + }, + + /** + * @override + */ + renderInner: function (itemAlign, legendModel, ecModel, api) { + var me = this; + + // Render content items. + ScrollableLegendView.superCall(this, 'renderInner', itemAlign, legendModel, ecModel, api); + + var controllerGroup = this._controllerGroup; + + var pageIconSize = legendModel.get('pageIconSize', true); + if (!isArray(pageIconSize)) { + pageIconSize = [pageIconSize, pageIconSize]; + } + + createPageButton('pagePrev', 0); + + var pageTextStyleModel = legendModel.getModel('pageTextStyle'); + controllerGroup.add(new Text({ + name: 'pageText', + style: { + textFill: pageTextStyleModel.getTextColor(), + font: pageTextStyleModel.getFont(), + textVerticalAlign: 'middle', + textAlign: 'center' + }, + silent: true + })); + + createPageButton('pageNext', 1); + + function createPageButton(name, iconIdx) { + var pageDataIndexName = name + 'DataIndex'; + var icon = createIcon( + legendModel.get('pageIcons', true)[legendModel.getOrient().name][iconIdx], + { + // Buttons will be created in each render, so we do not need + // to worry about avoiding using legendModel kept in scope. + onclick: bind( + me._pageGo, me, pageDataIndexName, legendModel, api + ) + }, + { + x: -pageIconSize[0] / 2, + y: -pageIconSize[1] / 2, + width: pageIconSize[0], + height: pageIconSize[1] + } + ); + icon.name = name; + controllerGroup.add(icon); + } + }, + + /** + * @override + */ + layoutInner: function (legendModel, itemAlign, maxSize) { + var contentGroup = this.getContentGroup(); + var containerGroup = this._containerGroup; + var controllerGroup = this._controllerGroup; + + var orientIdx = legendModel.getOrient().index; + var wh = WH$1[orientIdx]; + var hw = WH$1[1 - orientIdx]; + var yx = XY$1[1 - orientIdx]; + + // Place items in contentGroup. + box( + legendModel.get('orient'), + contentGroup, + legendModel.get('itemGap'), + !orientIdx ? null : maxSize.width, + orientIdx ? null : maxSize.height + ); + + box( + // Buttons in controller are layout always horizontally. + 'horizontal', + controllerGroup, + legendModel.get('pageButtonItemGap', true) + ); + + var contentRect = contentGroup.getBoundingRect(); + var controllerRect = controllerGroup.getBoundingRect(); + var showController = this._showController = contentRect[wh] > maxSize[wh]; + + var contentPos = [-contentRect.x, -contentRect.y]; + // Remain contentPos when scroll animation perfroming. + contentPos[orientIdx] = contentGroup.position[orientIdx]; + + // Layout container group based on 0. + var containerPos = [0, 0]; + var controllerPos = [-controllerRect.x, -controllerRect.y]; + var pageButtonGap = retrieve2( + legendModel.get('pageButtonGap', true), legendModel.get('itemGap', true) + ); + + // Place containerGroup and controllerGroup and contentGroup. + if (showController) { + var pageButtonPosition = legendModel.get('pageButtonPosition', true); + // controller is on the right / bottom. + if (pageButtonPosition === 'end') { + controllerPos[orientIdx] += maxSize[wh] - controllerRect[wh]; + } + // controller is on the left / top. + else { + containerPos[orientIdx] += controllerRect[wh] + pageButtonGap; + } + } + + // Always align controller to content as 'middle'. + controllerPos[1 - orientIdx] += contentRect[hw] / 2 - controllerRect[hw] / 2; + + contentGroup.attr('position', contentPos); + containerGroup.attr('position', containerPos); + controllerGroup.attr('position', controllerPos); + + // Calculate `mainRect` and set `clipPath`. + // mainRect should not be calculated by `this.group.getBoundingRect()` + // for sake of the overflow. + var mainRect = this.group.getBoundingRect(); + var mainRect = {x: 0, y: 0}; + // Consider content may be overflow (should be clipped). + mainRect[wh] = showController ? maxSize[wh] : contentRect[wh]; + mainRect[hw] = Math.max(contentRect[hw], controllerRect[hw]); + // `containerRect[yx] + containerPos[1 - orientIdx]` is 0. + mainRect[yx] = Math.min(0, controllerRect[yx] + controllerPos[1 - orientIdx]); + + containerGroup.__rectSize = maxSize[wh]; + if (showController) { + var clipShape = {x: 0, y: 0}; + clipShape[wh] = Math.max(maxSize[wh] - controllerRect[wh] - pageButtonGap, 0); + clipShape[hw] = mainRect[hw]; + containerGroup.setClipPath(new Rect({shape: clipShape})); + // Consider content may be larger than container, container rect + // can not be obtained from `containerGroup.getBoundingRect()`. + containerGroup.__rectSize = clipShape[wh]; + } + else { + // Do not remove or ignore controller. Keep them set as place holders. + controllerGroup.eachChild(function (child) { + child.attr({invisible: true, silent: true}); + }); + } + + // Content translate animation. + var pageInfo = this._getPageInfo(legendModel); + pageInfo.pageIndex != null && updateProps( + contentGroup, + {position: pageInfo.contentPosition}, + // When switch from "show controller" to "not show controller", view should be + // updated immediately without animation, otherwise causes weird efffect. + showController ? legendModel : false + ); + + this._updatePageInfoView(legendModel, pageInfo); + + return mainRect; + }, + + _pageGo: function (to, legendModel, api) { + var scrollDataIndex = this._getPageInfo(legendModel)[to]; + + scrollDataIndex != null && api.dispatchAction({ + type: 'legendScroll', + scrollDataIndex: scrollDataIndex, + legendId: legendModel.id + }); + }, + + _updatePageInfoView: function (legendModel, pageInfo) { + var controllerGroup = this._controllerGroup; + + each$1(['pagePrev', 'pageNext'], function (name) { + var canJump = pageInfo[name + 'DataIndex'] != null; + var icon = controllerGroup.childOfName(name); + if (icon) { + icon.setStyle( + 'fill', + canJump + ? legendModel.get('pageIconColor', true) + : legendModel.get('pageIconInactiveColor', true) + ); + icon.cursor = canJump ? 'pointer' : 'default'; + } + }); + + var pageText = controllerGroup.childOfName('pageText'); + var pageFormatter = legendModel.get('pageFormatter'); + var pageIndex = pageInfo.pageIndex; + var current = pageIndex != null ? pageIndex + 1 : 0; + var total = pageInfo.pageCount; + + pageText && pageFormatter && pageText.setStyle( + 'text', + isString(pageFormatter) + ? pageFormatter.replace('{current}', current).replace('{total}', total) + : pageFormatter({current: current, total: total}) + ); + }, + + /** + * @param {module:echarts/model/Model} legendModel + * @return {Object} { + * contentPosition: Array.<number>, null when data item not found. + * pageIndex: number, null when data item not found. + * pageCount: number, always be a number, can be 0. + * pagePrevDataIndex: number, null when no next page. + * pageNextDataIndex: number, null when no previous page. + * } + */ + _getPageInfo: function (legendModel) { + // Align left or top by the current dataIndex. + var currDataIndex = legendModel.get('scrollDataIndex', true); + var contentGroup = this.getContentGroup(); + var contentRect = contentGroup.getBoundingRect(); + var containerRectSize = this._containerGroup.__rectSize; + + var orientIdx = legendModel.getOrient().index; + var wh = WH$1[orientIdx]; + var hw = WH$1[1 - orientIdx]; + var xy = XY$1[orientIdx]; + var contentPos = contentGroup.position.slice(); + + var pageIndex; + var pagePrevDataIndex; + var pageNextDataIndex; + + var targetItemGroup; + if (this._showController) { + contentGroup.eachChild(function (child) { + if (child.__legendDataIndex === currDataIndex) { + targetItemGroup = child; + } + }); + } + else { + targetItemGroup = contentGroup.childAt(0); + } + + var pageCount = containerRectSize ? Math.ceil(contentRect[wh] / containerRectSize) : 0; + + if (targetItemGroup) { + var itemRect = targetItemGroup.getBoundingRect(); + var itemLoc = targetItemGroup.position[orientIdx] + itemRect[xy]; + contentPos[orientIdx] = -itemLoc - contentRect[xy]; + pageIndex = Math.floor( + pageCount * (itemLoc + itemRect[xy] + containerRectSize / 2) / contentRect[wh] + ); + pageIndex = (contentRect[wh] && pageCount) + ? Math.max(0, Math.min(pageCount - 1, pageIndex)) + : -1; + + var winRect = {x: 0, y: 0}; + winRect[wh] = containerRectSize; + winRect[hw] = contentRect[hw]; + winRect[xy] = -contentPos[orientIdx] - contentRect[xy]; + + var startIdx; + var children = contentGroup.children(); + + contentGroup.eachChild(function (child, index) { + var itemRect = getItemRect(child); + + if (itemRect.intersect(winRect)) { + startIdx == null && (startIdx = index); + // It is user-friendly that the last item shown in the + // current window is shown at the begining of next window. + pageNextDataIndex = child.__legendDataIndex; + } + + // If the last item is shown entirely, no next page. + if (index === children.length - 1 + && itemRect[xy] + itemRect[wh] <= winRect[xy] + winRect[wh] + ) { + pageNextDataIndex = null; + } + }); + + // Always align based on the left/top most item, so the left/top most + // item in the previous window is needed to be found here. + if (startIdx != null) { + var startItem = children[startIdx]; + var startRect = getItemRect(startItem); + winRect[xy] = startRect[xy] + startRect[wh] - winRect[wh]; + + // If the first item is shown entirely, no previous page. + if (startIdx <= 0 && startRect[xy] >= winRect[xy]) { + pagePrevDataIndex = null; + } + else { + while (startIdx > 0 && getItemRect(children[startIdx - 1]).intersect(winRect)) { + startIdx--; + } + pagePrevDataIndex = children[startIdx].__legendDataIndex; + } + } + } + + return { + contentPosition: contentPos, + pageIndex: pageIndex, + pageCount: pageCount, + pagePrevDataIndex: pagePrevDataIndex, + pageNextDataIndex: pageNextDataIndex + }; + + function getItemRect(el) { + var itemRect = el.getBoundingRect().clone(); + itemRect[xy] += el.position[orientIdx]; + return itemRect; + } + } + +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @event legendScroll + * @type {Object} + * @property {string} type 'legendScroll' + * @property {string} scrollDataIndex + */ +registerAction( + 'legendScroll', 'legendscroll', + function (payload, ecModel) { + var scrollDataIndex = payload.scrollDataIndex; + + scrollDataIndex != null && ecModel.eachComponent( + {mainType: 'legend', subType: 'scroll', query: payload}, + function (legendModel) { + legendModel.setScrollDataIndex(scrollDataIndex); + } + ); + } +); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Legend component entry file8 + */ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +extendComponentModel({ + + type: 'tooltip', + + dependencies: ['axisPointer'], + + defaultOption: { + zlevel: 0, + + z: 8, + + show: true, + + // tooltip主体内容 + showContent: true, + + // 'trigger' only works on coordinate system. + // 'item' | 'axis' | 'none' + trigger: 'item', + + // 'click' | 'mousemove' | 'none' + triggerOn: 'mousemove|click', + + alwaysShowContent: false, + + displayMode: 'single', // 'single' | 'multipleByCoordSys' + + // 位置 {Array} | {Function} + // position: null + // Consider triggered from axisPointer handle, verticalAlign should be 'middle' + // align: null, + // verticalAlign: null, + + // 是否约束 content 在 viewRect 中。默认 false 是为了兼容以前版本。 + confine: false, + + // 内容格式器:{string}(Template) ¦ {Function} + // formatter: null + + showDelay: 0, + + // 隐藏延迟,单位ms + hideDelay: 100, + + // 动画变换时间,单位s + transitionDuration: 0.4, + + enterable: false, + + // 提示背景颜色,默认为透明度为0.7的黑色 + backgroundColor: 'rgba(50,50,50,0.7)', + + // 提示边框颜色 + borderColor: '#333', + + // 提示边框圆角,单位px,默认为4 + borderRadius: 4, + + // 提示边框线宽,单位px,默认为0(无边框) + borderWidth: 0, + + // 提示内边距,单位px,默认各方向内边距为5, + // 接受数组分别设定上右下左边距,同css + padding: 5, + + // Extra css text + extraCssText: '', + + // 坐标轴指示器,坐标轴触发有效 + axisPointer: { + // 默认为直线 + // 可选为:'line' | 'shadow' | 'cross' + type: 'line', + + // type 为 line 的时候有效,指定 tooltip line 所在的轴,可选 + // 可选 'x' | 'y' | 'angle' | 'radius' | 'auto' + // 默认 'auto',会选择类型为 category 的轴,对于双数值轴,笛卡尔坐标系会默认选择 x 轴 + // 极坐标系会默认选择 angle 轴 + axis: 'auto', + + animation: 'auto', + animationDurationUpdate: 200, + animationEasingUpdate: 'exponentialOut', + + crossStyle: { + color: '#999', + width: 1, + type: 'dashed', + + // TODO formatter + textStyle: {} + } + + // lineStyle and shadowStyle should not be specified here, + // otherwise it will always override those styles on option.axisPointer. + }, + textStyle: { + color: '#fff', + fontSize: 14 + } + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var each$18 = each$1; +var toCamelCase$1 = toCamelCase; + +var vendors = ['', '-webkit-', '-moz-', '-o-']; + +var gCssText = 'position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;'; + +/** + * @param {number} duration + * @return {string} + * @inner + */ +function assembleTransition(duration) { + var transitionCurve = 'cubic-bezier(0.23, 1, 0.32, 1)'; + var transitionText = 'left ' + duration + 's ' + transitionCurve + ',' + + 'top ' + duration + 's ' + transitionCurve; + return map(vendors, function (vendorPrefix) { + return vendorPrefix + 'transition:' + transitionText; + }).join(';'); +} + +/** + * @param {Object} textStyle + * @return {string} + * @inner + */ +function assembleFont(textStyleModel) { + var cssText = []; + + var fontSize = textStyleModel.get('fontSize'); + var color = textStyleModel.getTextColor(); + + color && cssText.push('color:' + color); + + cssText.push('font:' + textStyleModel.getFont()); + + fontSize && + cssText.push('line-height:' + Math.round(fontSize * 3 / 2) + 'px'); + + each$18(['decoration', 'align'], function (name) { + var val = textStyleModel.get(name); + val && cssText.push('text-' + name + ':' + val); + }); + + return cssText.join(';'); +} + +/** + * @param {Object} tooltipModel + * @return {string} + * @inner + */ +function assembleCssText(tooltipModel) { + + var cssText = []; + + var transitionDuration = tooltipModel.get('transitionDuration'); + var backgroundColor = tooltipModel.get('backgroundColor'); + var textStyleModel = tooltipModel.getModel('textStyle'); + var padding = tooltipModel.get('padding'); + + // Animation transition. Do not animate when transitionDuration is 0. + transitionDuration && + cssText.push(assembleTransition(transitionDuration)); + + if (backgroundColor) { + if (env$1.canvasSupported) { + cssText.push('background-Color:' + backgroundColor); + } + else { + // for ie + cssText.push( + 'background-Color:#' + toHex(backgroundColor) + ); + cssText.push('filter:alpha(opacity=70)'); + } + } + + // Border style + each$18(['width', 'color', 'radius'], function (name) { + var borderName = 'border-' + name; + var camelCase = toCamelCase$1(borderName); + var val = tooltipModel.get(camelCase); + val != null && + cssText.push(borderName + ':' + val + (name === 'color' ? '' : 'px')); + }); + + // Text style + cssText.push(assembleFont(textStyleModel)); + + // Padding + if (padding != null) { + cssText.push('padding:' + normalizeCssArray$1(padding).join('px ') + 'px'); + } + + return cssText.join(';') + ';'; +} + +/** + * @alias module:echarts/component/tooltip/TooltipContent + * @constructor + */ +function TooltipContent(container, api) { + if (env$1.wxa) { + return null; + } + + var el = document.createElement('div'); + var zr = this._zr = api.getZr(); + + this.el = el; + + this._x = api.getWidth() / 2; + this._y = api.getHeight() / 2; + + container.appendChild(el); + + this._container = container; + + this._show = false; + + /** + * @private + */ + this._hideTimeout; + + var self = this; + el.onmouseenter = function () { + // clear the timeout in hideLater and keep showing tooltip + if (self._enterable) { + clearTimeout(self._hideTimeout); + self._show = true; + } + self._inContent = true; + }; + el.onmousemove = function (e) { + e = e || window.event; + if (!self._enterable) { + // Try trigger zrender event to avoid mouse + // in and out shape too frequently + var handler = zr.handler; + normalizeEvent(container, e, true); + handler.dispatch('mousemove', e); + } + }; + el.onmouseleave = function () { + if (self._enterable) { + if (self._show) { + self.hideLater(self._hideDelay); + } + } + self._inContent = false; + }; +} + +TooltipContent.prototype = { + + constructor: TooltipContent, + + /** + * @private + * @type {boolean} + */ + _enterable: true, + + /** + * Update when tooltip is rendered + */ + update: function () { + // FIXME + // Move this logic to ec main? + var container = this._container; + var stl = container.currentStyle + || document.defaultView.getComputedStyle(container); + var domStyle = container.style; + if (domStyle.position !== 'absolute' && stl.position !== 'absolute') { + domStyle.position = 'relative'; + } + // Hide the tooltip + // PENDING + // this.hide(); + }, + + show: function (tooltipModel) { + clearTimeout(this._hideTimeout); + var el = this.el; + + el.style.cssText = gCssText + assembleCssText(tooltipModel) + // http://stackoverflow.com/questions/21125587/css3-transition-not-working-in-chrome-anymore + + ';left:' + this._x + 'px;top:' + this._y + 'px;' + + (tooltipModel.get('extraCssText') || ''); + + el.style.display = el.innerHTML ? 'block' : 'none'; + + this._show = true; + }, + + setContent: function (content) { + this.el.innerHTML = content == null ? '' : content; + }, + + setEnterable: function (enterable) { + this._enterable = enterable; + }, + + getSize: function () { + var el = this.el; + return [el.clientWidth, el.clientHeight]; + }, + + moveTo: function (x, y) { + // xy should be based on canvas root. But tooltipContent is + // the sibling of canvas root. So padding of ec container + // should be considered here. + var zr = this._zr; + var viewportRootOffset; + if (zr && zr.painter && (viewportRootOffset = zr.painter.getViewportRootOffset())) { + x += viewportRootOffset.offsetLeft; + y += viewportRootOffset.offsetTop; + } + + var style = this.el.style; + style.left = x + 'px'; + style.top = y + 'px'; + + this._x = x; + this._y = y; + }, + + hide: function () { + this.el.style.display = 'none'; + this._show = false; + }, + + hideLater: function (time) { + if (this._show && !(this._inContent && this._enterable)) { + if (time) { + this._hideDelay = time; + // Set show false to avoid invoke hideLater mutiple times + this._show = false; + this._hideTimeout = setTimeout(bind(this.hide, this), time); + } + else { + this.hide(); + } + } + }, + + isShow: function () { + return this._show; + } +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var bind$3 = bind; +var each$17 = each$1; +var parsePercent$2 = parsePercent$1; + +var proxyRect = new Rect({ + shape: {x: -1, y: -1, width: 2, height: 2} +}); + +extendComponentView({ + + type: 'tooltip', + + init: function (ecModel, api) { + if (env$1.node) { + return; + } + var tooltipContent = new TooltipContent(api.getDom(), api); + this._tooltipContent = tooltipContent; + }, + + render: function (tooltipModel, ecModel, api) { + if (env$1.node || env$1.wxa) { + return; + } + + // Reset + this.group.removeAll(); + + /** + * @private + * @type {module:echarts/component/tooltip/TooltipModel} + */ + this._tooltipModel = tooltipModel; + + /** + * @private + * @type {module:echarts/model/Global} + */ + this._ecModel = ecModel; + + /** + * @private + * @type {module:echarts/ExtensionAPI} + */ + this._api = api; + + /** + * Should be cleaned when render. + * @private + * @type {Array.<Array.<Object>>} + */ + this._lastDataByCoordSys = null; + + /** + * @private + * @type {boolean} + */ + this._alwaysShowContent = tooltipModel.get('alwaysShowContent'); + + var tooltipContent = this._tooltipContent; + tooltipContent.update(); + tooltipContent.setEnterable(tooltipModel.get('enterable')); + + this._initGlobalListener(); + + this._keepShow(); + }, + + _initGlobalListener: function () { + var tooltipModel = this._tooltipModel; + var triggerOn = tooltipModel.get('triggerOn'); + + register( + 'itemTooltip', + this._api, + bind$3(function (currTrigger, e, dispatchAction) { + // If 'none', it is not controlled by mouse totally. + if (triggerOn !== 'none') { + if (triggerOn.indexOf(currTrigger) >= 0) { + this._tryShow(e, dispatchAction); + } + else if (currTrigger === 'leave') { + this._hide(dispatchAction); + } + } + }, this) + ); + }, + + _keepShow: function () { + var tooltipModel = this._tooltipModel; + var ecModel = this._ecModel; + var api = this._api; + + // Try to keep the tooltip show when refreshing + if (this._lastX != null + && this._lastY != null + // When user is willing to control tooltip totally using API, + // self.manuallyShowTip({x, y}) might cause tooltip hide, + // which is not expected. + && tooltipModel.get('triggerOn') !== 'none' + ) { + var self = this; + clearTimeout(this._refreshUpdateTimeout); + this._refreshUpdateTimeout = setTimeout(function () { + // Show tip next tick after other charts are rendered + // In case highlight action has wrong result + // FIXME + self.manuallyShowTip(tooltipModel, ecModel, api, { + x: self._lastX, + y: self._lastY + }); + }); + } + }, + + /** + * Show tip manually by + * dispatchAction({ + * type: 'showTip', + * x: 10, + * y: 10 + * }); + * Or + * dispatchAction({ + * type: 'showTip', + * seriesIndex: 0, + * dataIndex or dataIndexInside or name + * }); + * + * TODO Batch + */ + manuallyShowTip: function (tooltipModel, ecModel, api, payload) { + if (payload.from === this.uid || env$1.node) { + return; + } + + var dispatchAction = makeDispatchAction$1(payload, api); + + // Reset ticket + this._ticket = ''; + + // When triggered from axisPointer. + var dataByCoordSys = payload.dataByCoordSys; + + if (payload.tooltip && payload.x != null && payload.y != null) { + var el = proxyRect; + el.position = [payload.x, payload.y]; + el.update(); + el.tooltip = payload.tooltip; + // Manually show tooltip while view is not using zrender elements. + this._tryShow({ + offsetX: payload.x, + offsetY: payload.y, + target: el + }, dispatchAction); + } + else if (dataByCoordSys) { + this._tryShow({ + offsetX: payload.x, + offsetY: payload.y, + position: payload.position, + event: {}, + dataByCoordSys: payload.dataByCoordSys, + tooltipOption: payload.tooltipOption + }, dispatchAction); + } + else if (payload.seriesIndex != null) { + + if (this._manuallyAxisShowTip(tooltipModel, ecModel, api, payload)) { + return; + } + + var pointInfo = findPointFromSeries(payload, ecModel); + var cx = pointInfo.point[0]; + var cy = pointInfo.point[1]; + if (cx != null && cy != null) { + this._tryShow({ + offsetX: cx, + offsetY: cy, + position: payload.position, + target: pointInfo.el, + event: {} + }, dispatchAction); + } + } + else if (payload.x != null && payload.y != null) { + // FIXME + // should wrap dispatchAction like `axisPointer/globalListener` ? + api.dispatchAction({ + type: 'updateAxisPointer', + x: payload.x, + y: payload.y + }); + + this._tryShow({ + offsetX: payload.x, + offsetY: payload.y, + position: payload.position, + target: api.getZr().findHover(payload.x, payload.y).target, + event: {} + }, dispatchAction); + } + }, + + manuallyHideTip: function (tooltipModel, ecModel, api, payload) { + var tooltipContent = this._tooltipContent; + + if (!this._alwaysShowContent && this._tooltipModel) { + tooltipContent.hideLater(this._tooltipModel.get('hideDelay')); + } + + this._lastX = this._lastY = null; + + if (payload.from !== this.uid) { + this._hide(makeDispatchAction$1(payload, api)); + } + }, + + // Be compatible with previous design, that is, when tooltip.type is 'axis' and + // dispatchAction 'showTip' with seriesIndex and dataIndex will trigger axis pointer + // and tooltip. + _manuallyAxisShowTip: function (tooltipModel, ecModel, api, payload) { + var seriesIndex = payload.seriesIndex; + var dataIndex = payload.dataIndex; + var coordSysAxesInfo = ecModel.getComponent('axisPointer').coordSysAxesInfo; + + if (seriesIndex == null || dataIndex == null || coordSysAxesInfo == null) { + return; + } + + var seriesModel = ecModel.getSeriesByIndex(seriesIndex); + if (!seriesModel) { + return; + } + + var data = seriesModel.getData(); + var tooltipModel = buildTooltipModel([ + data.getItemModel(dataIndex), + seriesModel, + (seriesModel.coordinateSystem || {}).model, + tooltipModel + ]); + + if (tooltipModel.get('trigger') !== 'axis') { + return; + } + + api.dispatchAction({ + type: 'updateAxisPointer', + seriesIndex: seriesIndex, + dataIndex: dataIndex, + position: payload.position + }); + + return true; + }, + + _tryShow: function (e, dispatchAction) { + var el = e.target; + var tooltipModel = this._tooltipModel; + + if (!tooltipModel) { + return; + } + + // Save mouse x, mouse y. So we can try to keep showing the tip if chart is refreshed + this._lastX = e.offsetX; + this._lastY = e.offsetY; + + var dataByCoordSys = e.dataByCoordSys; + if (dataByCoordSys && dataByCoordSys.length) { + this._showAxisTooltip(dataByCoordSys, e); + } + // Always show item tooltip if mouse is on the element with dataIndex + else if (el && el.dataIndex != null) { + this._lastDataByCoordSys = null; + this._showSeriesItemTooltip(e, el, dispatchAction); + } + // Tooltip provided directly. Like legend. + else if (el && el.tooltip) { + this._lastDataByCoordSys = null; + this._showComponentItemTooltip(e, el, dispatchAction); + } + else { + this._lastDataByCoordSys = null; + this._hide(dispatchAction); + } + }, + + _showOrMove: function (tooltipModel, cb) { + // showDelay is used in this case: tooltip.enterable is set + // as true. User intent to move mouse into tooltip and click + // something. `showDelay` makes it easyer to enter the content + // but tooltip do not move immediately. + var delay = tooltipModel.get('showDelay'); + cb = bind(cb, this); + clearTimeout(this._showTimout); + delay > 0 + ? (this._showTimout = setTimeout(cb, delay)) + : cb(); + }, + + _showAxisTooltip: function (dataByCoordSys, e) { + var ecModel = this._ecModel; + var globalTooltipModel = this._tooltipModel; + var point = [e.offsetX, e.offsetY]; + var singleDefaultHTML = []; + var singleParamsList = []; + var singleTooltipModel = buildTooltipModel([ + e.tooltipOption, + globalTooltipModel + ]); + + each$17(dataByCoordSys, function (itemCoordSys) { + // var coordParamList = []; + // var coordDefaultHTML = []; + // var coordTooltipModel = buildTooltipModel([ + // e.tooltipOption, + // itemCoordSys.tooltipOption, + // ecModel.getComponent(itemCoordSys.coordSysMainType, itemCoordSys.coordSysIndex), + // globalTooltipModel + // ]); + // var displayMode = coordTooltipModel.get('displayMode'); + // var paramsList = displayMode === 'single' ? singleParamsList : []; + + each$17(itemCoordSys.dataByAxis, function (item) { + var axisModel = ecModel.getComponent(item.axisDim + 'Axis', item.axisIndex); + var axisValue = item.value; + var seriesDefaultHTML = []; + + if (!axisModel || axisValue == null) { + return; + } + + var valueLabel = getValueLabel( + axisValue, axisModel.axis, ecModel, + item.seriesDataIndices, + item.valueLabelOpt + ); + + each$1(item.seriesDataIndices, function (idxItem) { + var series = ecModel.getSeriesByIndex(idxItem.seriesIndex); + var dataIndex = idxItem.dataIndexInside; + var dataParams = series && series.getDataParams(dataIndex); + dataParams.axisDim = item.axisDim; + dataParams.axisIndex = item.axisIndex; + dataParams.axisType = item.axisType; + dataParams.axisId = item.axisId; + dataParams.axisValue = getAxisRawValue(axisModel.axis, axisValue); + dataParams.axisValueLabel = valueLabel; + + if (dataParams) { + singleParamsList.push(dataParams); + seriesDefaultHTML.push(series.formatTooltip(dataIndex, true)); + } + }); + + // Default tooltip content + // FIXME + // (1) shold be the first data which has name? + // (2) themeRiver, firstDataIndex is array, and first line is unnecessary. + var firstLine = valueLabel; + singleDefaultHTML.push( + (firstLine ? encodeHTML(firstLine) + '<br />' : '') + + seriesDefaultHTML.join('<br />') + ); + }); + }, this); + + // In most case, the second axis is shown upper than the first one. + singleDefaultHTML.reverse(); + singleDefaultHTML = singleDefaultHTML.join('<br /><br />'); + + var positionExpr = e.position; + this._showOrMove(singleTooltipModel, function () { + if (this._updateContentNotChangedOnAxis(dataByCoordSys)) { + this._updatePosition( + singleTooltipModel, + positionExpr, + point[0], point[1], + this._tooltipContent, + singleParamsList + ); + } + else { + this._showTooltipContent( + singleTooltipModel, singleDefaultHTML, singleParamsList, Math.random(), + point[0], point[1], positionExpr + ); + } + }); + + // Do not trigger events here, because this branch only be entered + // from dispatchAction. + }, + + _showSeriesItemTooltip: function (e, el, dispatchAction) { + var ecModel = this._ecModel; + // Use dataModel in element if possible + // Used when mouseover on a element like markPoint or edge + // In which case, the data is not main data in series. + var seriesIndex = el.seriesIndex; + var seriesModel = ecModel.getSeriesByIndex(seriesIndex); + + // For example, graph link. + var dataModel = el.dataModel || seriesModel; + var dataIndex = el.dataIndex; + var dataType = el.dataType; + var data = dataModel.getData(); + + var tooltipModel = buildTooltipModel([ + data.getItemModel(dataIndex), + dataModel, + seriesModel && (seriesModel.coordinateSystem || {}).model, + this._tooltipModel + ]); + + var tooltipTrigger = tooltipModel.get('trigger'); + if (tooltipTrigger != null && tooltipTrigger !== 'item') { + return; + } + + var params = dataModel.getDataParams(dataIndex, dataType); + var defaultHtml = dataModel.formatTooltip(dataIndex, false, dataType); + var asyncTicket = 'item_' + dataModel.name + '_' + dataIndex; + + this._showOrMove(tooltipModel, function () { + this._showTooltipContent( + tooltipModel, defaultHtml, params, asyncTicket, + e.offsetX, e.offsetY, e.position, e.target + ); + }); + + // FIXME + // duplicated showtip if manuallyShowTip is called from dispatchAction. + dispatchAction({ + type: 'showTip', + dataIndexInside: dataIndex, + dataIndex: data.getRawIndex(dataIndex), + seriesIndex: seriesIndex, + from: this.uid + }); + }, + + _showComponentItemTooltip: function (e, el, dispatchAction) { + var tooltipOpt = el.tooltip; + if (typeof tooltipOpt === 'string') { + var content = tooltipOpt; + tooltipOpt = { + content: content, + // Fixed formatter + formatter: content + }; + } + var subTooltipModel = new Model(tooltipOpt, this._tooltipModel, this._ecModel); + var defaultHtml = subTooltipModel.get('content'); + var asyncTicket = Math.random(); + + // Do not check whether `trigger` is 'none' here, because `trigger` + // only works on cooridinate system. In fact, we have not found case + // that requires setting `trigger` nothing on component yet. + + this._showOrMove(subTooltipModel, function () { + this._showTooltipContent( + subTooltipModel, defaultHtml, subTooltipModel.get('formatterParams') || {}, + asyncTicket, e.offsetX, e.offsetY, e.position, el + ); + }); + + // If not dispatch showTip, tip may be hide triggered by axis. + dispatchAction({ + type: 'showTip', + from: this.uid + }); + }, + + _showTooltipContent: function ( + tooltipModel, defaultHtml, params, asyncTicket, x, y, positionExpr, el + ) { + // Reset ticket + this._ticket = ''; + + if (!tooltipModel.get('showContent') || !tooltipModel.get('show')) { + return; + } + + var tooltipContent = this._tooltipContent; + + var formatter = tooltipModel.get('formatter'); + positionExpr = positionExpr || tooltipModel.get('position'); + var html = defaultHtml; + + if (formatter && typeof formatter === 'string') { + html = formatTpl(formatter, params, true); + } + else if (typeof formatter === 'function') { + var callback = bind$3(function (cbTicket, html) { + if (cbTicket === this._ticket) { + tooltipContent.setContent(html); + this._updatePosition( + tooltipModel, positionExpr, x, y, tooltipContent, params, el + ); + } + }, this); + this._ticket = asyncTicket; + html = formatter(params, asyncTicket, callback); + } + + tooltipContent.setContent(html); + tooltipContent.show(tooltipModel); + + this._updatePosition( + tooltipModel, positionExpr, x, y, tooltipContent, params, el + ); + }, + + /** + * @param {string|Function|Array.<number>|Object} positionExpr + * @param {number} x Mouse x + * @param {number} y Mouse y + * @param {boolean} confine Whether confine tooltip content in view rect. + * @param {Object|<Array.<Object>} params + * @param {module:zrender/Element} el target element + * @param {module:echarts/ExtensionAPI} api + * @return {Array.<number>} + */ + _updatePosition: function (tooltipModel, positionExpr, x, y, content, params, el) { + var viewWidth = this._api.getWidth(); + var viewHeight = this._api.getHeight(); + positionExpr = positionExpr || tooltipModel.get('position'); + + var contentSize = content.getSize(); + var align = tooltipModel.get('align'); + var vAlign = tooltipModel.get('verticalAlign'); + var rect = el && el.getBoundingRect().clone(); + el && rect.applyTransform(el.transform); + + if (typeof positionExpr === 'function') { + // Callback of position can be an array or a string specify the position + positionExpr = positionExpr([x, y], params, content.el, rect, { + viewSize: [viewWidth, viewHeight], + contentSize: contentSize.slice() + }); + } + + if (isArray(positionExpr)) { + x = parsePercent$2(positionExpr[0], viewWidth); + y = parsePercent$2(positionExpr[1], viewHeight); + } + else if (isObject$1(positionExpr)) { + positionExpr.width = contentSize[0]; + positionExpr.height = contentSize[1]; + var layoutRect = getLayoutRect( + positionExpr, {width: viewWidth, height: viewHeight} + ); + x = layoutRect.x; + y = layoutRect.y; + align = null; + // When positionExpr is left/top/right/bottom, + // align and verticalAlign will not work. + vAlign = null; + } + // Specify tooltip position by string 'top' 'bottom' 'left' 'right' around graphic element + else if (typeof positionExpr === 'string' && el) { + var pos = calcTooltipPosition( + positionExpr, rect, contentSize + ); + x = pos[0]; + y = pos[1]; + } + else { + var pos = refixTooltipPosition( + x, y, content.el, viewWidth, viewHeight, align ? null : 20, vAlign ? null : 20 + ); + x = pos[0]; + y = pos[1]; + } + + align && (x -= isCenterAlign(align) ? contentSize[0] / 2 : align === 'right' ? contentSize[0] : 0); + vAlign && (y -= isCenterAlign(vAlign) ? contentSize[1] / 2 : vAlign === 'bottom' ? contentSize[1] : 0); + + if (tooltipModel.get('confine')) { + var pos = confineTooltipPosition( + x, y, content.el, viewWidth, viewHeight + ); + x = pos[0]; + y = pos[1]; + } + + content.moveTo(x, y); + }, + + // FIXME + // Should we remove this but leave this to user? + _updateContentNotChangedOnAxis: function (dataByCoordSys) { + var lastCoordSys = this._lastDataByCoordSys; + var contentNotChanged = !!lastCoordSys + && lastCoordSys.length === dataByCoordSys.length; + + contentNotChanged && each$17(lastCoordSys, function (lastItemCoordSys, indexCoordSys) { + var lastDataByAxis = lastItemCoordSys.dataByAxis || {}; + var thisItemCoordSys = dataByCoordSys[indexCoordSys] || {}; + var thisDataByAxis = thisItemCoordSys.dataByAxis || []; + contentNotChanged &= lastDataByAxis.length === thisDataByAxis.length; + + contentNotChanged && each$17(lastDataByAxis, function (lastItem, indexAxis) { + var thisItem = thisDataByAxis[indexAxis] || {}; + var lastIndices = lastItem.seriesDataIndices || []; + var newIndices = thisItem.seriesDataIndices || []; + + contentNotChanged &= + lastItem.value === thisItem.value + && lastItem.axisType === thisItem.axisType + && lastItem.axisId === thisItem.axisId + && lastIndices.length === newIndices.length; + + contentNotChanged && each$17(lastIndices, function (lastIdxItem, j) { + var newIdxItem = newIndices[j]; + contentNotChanged &= + lastIdxItem.seriesIndex === newIdxItem.seriesIndex + && lastIdxItem.dataIndex === newIdxItem.dataIndex; + }); + }); + }); + + this._lastDataByCoordSys = dataByCoordSys; + + return !!contentNotChanged; + }, + + _hide: function (dispatchAction) { + // Do not directly hideLater here, because this behavior may be prevented + // in dispatchAction when showTip is dispatched. + + // FIXME + // duplicated hideTip if manuallyHideTip is called from dispatchAction. + this._lastDataByCoordSys = null; + dispatchAction({ + type: 'hideTip', + from: this.uid + }); + }, + + dispose: function (ecModel, api) { + if (env$1.node || env$1.wxa) { + return; + } + this._tooltipContent.hide(); + unregister('itemTooltip', api); + } +}); + + +/** + * @param {Array.<Object|module:echarts/model/Model>} modelCascade + * From top to bottom. (the last one should be globalTooltipModel); + */ +function buildTooltipModel(modelCascade) { + var resultModel = modelCascade.pop(); + while (modelCascade.length) { + var tooltipOpt = modelCascade.pop(); + if (tooltipOpt) { + if (Model.isInstance(tooltipOpt)) { + tooltipOpt = tooltipOpt.get('tooltip', true); + } + // In each data item tooltip can be simply write: + // { + // value: 10, + // tooltip: 'Something you need to know' + // } + if (typeof tooltipOpt === 'string') { + tooltipOpt = {formatter: tooltipOpt}; + } + resultModel = new Model(tooltipOpt, resultModel, resultModel.ecModel); + } + } + return resultModel; +} + +function makeDispatchAction$1(payload, api) { + return payload.dispatchAction || bind(api.dispatchAction, api); +} + +function refixTooltipPosition(x, y, el, viewWidth, viewHeight, gapH, gapV) { + var size = getOuterSize(el); + var width = size.width; + var height = size.height; + + if (gapH != null) { + if (x + width + gapH > viewWidth) { + x -= width + gapH; + } + else { + x += gapH; + } + } + if (gapV != null) { + if (y + height + gapV > viewHeight) { + y -= height + gapV; + } + else { + y += gapV; + } + } + return [x, y]; +} + +function confineTooltipPosition(x, y, el, viewWidth, viewHeight) { + var size = getOuterSize(el); + var width = size.width; + var height = size.height; + + x = Math.min(x + width, viewWidth) - width; + y = Math.min(y + height, viewHeight) - height; + x = Math.max(x, 0); + y = Math.max(y, 0); + + return [x, y]; +} + +function getOuterSize(el) { + var width = el.clientWidth; + var height = el.clientHeight; + + // Consider browser compatibility. + // IE8 does not support getComputedStyle. + if (document.defaultView && document.defaultView.getComputedStyle) { + var stl = document.defaultView.getComputedStyle(el); + if (stl) { + width += parseInt(stl.paddingLeft, 10) + parseInt(stl.paddingRight, 10) + + parseInt(stl.borderLeftWidth, 10) + parseInt(stl.borderRightWidth, 10); + height += parseInt(stl.paddingTop, 10) + parseInt(stl.paddingBottom, 10) + + parseInt(stl.borderTopWidth, 10) + parseInt(stl.borderBottomWidth, 10); + } + } + + return {width: width, height: height}; +} + +function calcTooltipPosition(position, rect, contentSize) { + var domWidth = contentSize[0]; + var domHeight = contentSize[1]; + var gap = 5; + var x = 0; + var y = 0; + var rectWidth = rect.width; + var rectHeight = rect.height; + switch (position) { + case 'inside': + x = rect.x + rectWidth / 2 - domWidth / 2; + y = rect.y + rectHeight / 2 - domHeight / 2; + break; + case 'top': + x = rect.x + rectWidth / 2 - domWidth / 2; + y = rect.y - domHeight - gap; + break; + case 'bottom': + x = rect.x + rectWidth / 2 - domWidth / 2; + y = rect.y + rectHeight + gap; + break; + case 'left': + x = rect.x - domWidth - gap; + y = rect.y + rectHeight / 2 - domHeight / 2; + break; + case 'right': + x = rect.x + rectWidth + gap; + y = rect.y + rectHeight / 2 - domHeight / 2; + } + return [x, y]; +} + +function isCenterAlign(align) { + return align === 'center' || align === 'middle'; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// FIXME Better way to pack data in graphic element + +/** + * @action + * @property {string} type + * @property {number} seriesIndex + * @property {number} dataIndex + * @property {number} [x] + * @property {number} [y] + */ +registerAction( + { + type: 'showTip', + event: 'showTip', + update: 'tooltip:manuallyShowTip' + }, + // noop + function () {} +); + +registerAction( + { + type: 'hideTip', + event: 'hideTip', + update: 'tooltip:manuallyHideTip' + }, + // noop + function () {} +); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +function getSeriesStackId$1(seriesModel) { + return seriesModel.get('stack') + || '__ec_stack_' + seriesModel.seriesIndex; +} + +function getAxisKey$1(axis) { + return axis.dim; +} + +/** + * @param {string} seriesType + * @param {module:echarts/model/Global} ecModel + * @param {module:echarts/ExtensionAPI} api + */ +function barLayoutPolar(seriesType, ecModel, api) { + + var width = api.getWidth(); + var height = api.getHeight(); + + var lastStackCoords = {}; + + var barWidthAndOffset = calRadialBar( + filter( + ecModel.getSeriesByType(seriesType), + function (seriesModel) { + return !ecModel.isSeriesFiltered(seriesModel) + && seriesModel.coordinateSystem + && seriesModel.coordinateSystem.type === 'polar'; + } + ) + ); + + ecModel.eachSeriesByType(seriesType, function (seriesModel) { + // Check series coordinate, do layout for polar only + if (seriesModel.coordinateSystem.type !== 'polar') { + return; + } + + var data = seriesModel.getData(); + var polar = seriesModel.coordinateSystem; + var baseAxis = polar.getBaseAxis(); + + var stackId = getSeriesStackId$1(seriesModel); + var columnLayoutInfo + = barWidthAndOffset[getAxisKey$1(baseAxis)][stackId]; + var columnOffset = columnLayoutInfo.offset; + var columnWidth = columnLayoutInfo.width; + var valueAxis = polar.getOtherAxis(baseAxis); + + var center = seriesModel.get('center') || ['50%', '50%']; + var cx = parsePercent$1(center[0], width); + var cy = parsePercent$1(center[1], height); + + var barMinHeight = seriesModel.get('barMinHeight') || 0; + var barMinAngle = seriesModel.get('barMinAngle') || 0; + + lastStackCoords[stackId] = lastStackCoords[stackId] || []; + + var valueDim = data.mapDimension(valueAxis.dim); + var baseDim = data.mapDimension(baseAxis.dim); + var stacked = isDimensionStacked(data, valueDim /*, baseDim*/); + + var valueAxisStart = valueAxis.getExtent()[0]; + + for (var idx = 0, len = data.count(); idx < len; idx++) { + var value = data.get(valueDim, idx); + var baseValue = data.get(baseDim, idx); + + if (isNaN(value)) { + continue; + } + + var sign = value >= 0 ? 'p' : 'n'; + var baseCoord = valueAxisStart; + + // Because of the barMinHeight, we can not use the value in + // stackResultDimension directly. + // Only ordinal axis can be stacked. + if (stacked) { + if (!lastStackCoords[stackId][baseValue]) { + lastStackCoords[stackId][baseValue] = { + p: valueAxisStart, // Positive stack + n: valueAxisStart // Negative stack + }; + } + // Should also consider #4243 + baseCoord = lastStackCoords[stackId][baseValue][sign]; + } + + var r0; + var r; + var startAngle; + var endAngle; + + // radial sector + if (valueAxis.dim === 'radius') { + var radiusSpan = valueAxis.dataToRadius(value) - valueAxisStart; + var angle = baseAxis.dataToAngle(baseValue); + + if (Math.abs(radiusSpan) < barMinHeight) { + radiusSpan = (radiusSpan < 0 ? -1 : 1) * barMinHeight; + } + + r0 = baseCoord; + r = baseCoord + radiusSpan; + startAngle = angle - columnOffset; + endAngle = startAngle - columnWidth; + + stacked && (lastStackCoords[stackId][baseValue][sign] = r); + } + // tangential sector + else { + // angleAxis must be clamped. + var angleSpan = valueAxis.dataToAngle(value, true) - valueAxisStart; + var radius = baseAxis.dataToRadius(baseValue); + + if (Math.abs(angleSpan) < barMinAngle) { + angleSpan = (angleSpan < 0 ? -1 : 1) * barMinAngle; + } + + r0 = radius + columnOffset; + r = r0 + columnWidth; + startAngle = baseCoord; + endAngle = baseCoord + angleSpan; + + // if the previous stack is at the end of the ring, + // add a round to differentiate it from origin + // var extent = angleAxis.getExtent(); + // var stackCoord = angle; + // if (stackCoord === extent[0] && value > 0) { + // stackCoord = extent[1]; + // } + // else if (stackCoord === extent[1] && value < 0) { + // stackCoord = extent[0]; + // } + stacked && (lastStackCoords[stackId][baseValue][sign] = endAngle); + } + + data.setItemLayout(idx, { + cx: cx, + cy: cy, + r0: r0, + r: r, + // Consider that positive angle is anti-clockwise, + // while positive radian of sector is clockwise + startAngle: -startAngle * Math.PI / 180, + endAngle: -endAngle * Math.PI / 180 + }); + + } + + }, this); + +} + +/** + * Calculate bar width and offset for radial bar charts + */ +function calRadialBar(barSeries, api) { + // Columns info on each category axis. Key is polar name + var columnsMap = {}; + + each$1(barSeries, function (seriesModel, idx) { + var data = seriesModel.getData(); + var polar = seriesModel.coordinateSystem; + + var baseAxis = polar.getBaseAxis(); + + var axisExtent = baseAxis.getExtent(); + var bandWidth = baseAxis.type === 'category' + ? baseAxis.getBandWidth() + : (Math.abs(axisExtent[1] - axisExtent[0]) / data.count()); + + var columnsOnAxis = columnsMap[getAxisKey$1(baseAxis)] || { + bandWidth: bandWidth, + remainedWidth: bandWidth, + autoWidthCount: 0, + categoryGap: '20%', + gap: '30%', + stacks: {} + }; + var stacks = columnsOnAxis.stacks; + columnsMap[getAxisKey$1(baseAxis)] = columnsOnAxis; + + var stackId = getSeriesStackId$1(seriesModel); + + if (!stacks[stackId]) { + columnsOnAxis.autoWidthCount++; + } + stacks[stackId] = stacks[stackId] || { + width: 0, + maxWidth: 0 + }; + + var barWidth = parsePercent$1( + seriesModel.get('barWidth'), + bandWidth + ); + var barMaxWidth = parsePercent$1( + seriesModel.get('barMaxWidth'), + bandWidth + ); + var barGap = seriesModel.get('barGap'); + var barCategoryGap = seriesModel.get('barCategoryGap'); + + if (barWidth && !stacks[stackId].width) { + barWidth = Math.min(columnsOnAxis.remainedWidth, barWidth); + stacks[stackId].width = barWidth; + columnsOnAxis.remainedWidth -= barWidth; + } + + barMaxWidth && (stacks[stackId].maxWidth = barMaxWidth); + (barGap != null) && (columnsOnAxis.gap = barGap); + (barCategoryGap != null) && (columnsOnAxis.categoryGap = barCategoryGap); + }); + + + var result = {}; + + each$1(columnsMap, function (columnsOnAxis, coordSysName) { + + result[coordSysName] = {}; + + var stacks = columnsOnAxis.stacks; + var bandWidth = columnsOnAxis.bandWidth; + var categoryGap = parsePercent$1(columnsOnAxis.categoryGap, bandWidth); + var barGapPercent = parsePercent$1(columnsOnAxis.gap, 1); + + var remainedWidth = columnsOnAxis.remainedWidth; + var autoWidthCount = columnsOnAxis.autoWidthCount; + var autoWidth = (remainedWidth - categoryGap) + / (autoWidthCount + (autoWidthCount - 1) * barGapPercent); + autoWidth = Math.max(autoWidth, 0); + + // Find if any auto calculated bar exceeded maxBarWidth + each$1(stacks, function (column, stack) { + var maxWidth = column.maxWidth; + if (maxWidth && maxWidth < autoWidth) { + maxWidth = Math.min(maxWidth, remainedWidth); + if (column.width) { + maxWidth = Math.min(maxWidth, column.width); + } + remainedWidth -= maxWidth; + column.width = maxWidth; + autoWidthCount--; + } + }); + + // Recalculate width again + autoWidth = (remainedWidth - categoryGap) + / (autoWidthCount + (autoWidthCount - 1) * barGapPercent); + autoWidth = Math.max(autoWidth, 0); + + var widthSum = 0; + var lastColumn; + each$1(stacks, function (column, idx) { + if (!column.width) { + column.width = autoWidth; + } + lastColumn = column; + widthSum += column.width * (1 + barGapPercent); + }); + if (lastColumn) { + widthSum -= lastColumn.width * barGapPercent; + } + + var offset = -widthSum / 2; + each$1(stacks, function (column, stackId) { + result[coordSysName][stackId] = result[coordSysName][stackId] || { + offset: offset, + width: column.width + }; + + offset += column.width * (1 + barGapPercent); + }); + }); + + return result; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +function RadiusAxis(scale, radiusExtent) { + + Axis.call(this, 'radius', scale, radiusExtent); + + /** + * Axis type + * - 'category' + * - 'value' + * - 'time' + * - 'log' + * @type {string} + */ + this.type = 'category'; +} + +RadiusAxis.prototype = { + + constructor: RadiusAxis, + + /** + * @override + */ + pointToData: function (point, clamp) { + return this.polar.pointToData(point, clamp)[this.dim === 'radius' ? 0 : 1]; + }, + + dataToRadius: Axis.prototype.dataToCoord, + + radiusToData: Axis.prototype.coordToData +}; + +inherits(RadiusAxis, Axis); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +function AngleAxis(scale, angleExtent) { + + angleExtent = angleExtent || [0, 360]; + + Axis.call(this, 'angle', scale, angleExtent); + + /** + * Axis type + * - 'category' + * - 'value' + * - 'time' + * - 'log' + * @type {string} + */ + this.type = 'category'; +} + +AngleAxis.prototype = { + + constructor: AngleAxis, + + /** + * @override + */ + pointToData: function (point, clamp) { + return this.polar.pointToData(point, clamp)[this.dim === 'radius' ? 0 : 1]; + }, + + dataToAngle: Axis.prototype.dataToCoord, + + angleToData: Axis.prototype.coordToData +}; + +inherits(AngleAxis, Axis); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @module echarts/coord/polar/Polar + */ + +/** + * @alias {module:echarts/coord/polar/Polar} + * @constructor + * @param {string} name + */ +var Polar = function (name) { + + /** + * @type {string} + */ + this.name = name || ''; + + /** + * x of polar center + * @type {number} + */ + this.cx = 0; + + /** + * y of polar center + * @type {number} + */ + this.cy = 0; + + /** + * @type {module:echarts/coord/polar/RadiusAxis} + * @private + */ + this._radiusAxis = new RadiusAxis(); + + /** + * @type {module:echarts/coord/polar/AngleAxis} + * @private + */ + this._angleAxis = new AngleAxis(); + + this._radiusAxis.polar = this._angleAxis.polar = this; +}; + +Polar.prototype = { + + type: 'polar', + + axisPointerEnabled: true, + + constructor: Polar, + + /** + * @param {Array.<string>} + * @readOnly + */ + dimensions: ['radius', 'angle'], + + /** + * @type {module:echarts/coord/PolarModel} + */ + model: null, + + /** + * If contain coord + * @param {Array.<number>} point + * @return {boolean} + */ + containPoint: function (point) { + var coord = this.pointToCoord(point); + return this._radiusAxis.contain(coord[0]) + && this._angleAxis.contain(coord[1]); + }, + + /** + * If contain data + * @param {Array.<number>} data + * @return {boolean} + */ + containData: function (data) { + return this._radiusAxis.containData(data[0]) + && this._angleAxis.containData(data[1]); + }, + + /** + * @param {string} dim + * @return {module:echarts/coord/polar/AngleAxis|module:echarts/coord/polar/RadiusAxis} + */ + getAxis: function (dim) { + return this['_' + dim + 'Axis']; + }, + + /** + * @return {Array.<module:echarts/coord/Axis>} + */ + getAxes: function () { + return [this._radiusAxis, this._angleAxis]; + }, + + /** + * Get axes by type of scale + * @param {string} scaleType + * @return {module:echarts/coord/polar/AngleAxis|module:echarts/coord/polar/RadiusAxis} + */ + getAxesByScale: function (scaleType) { + var axes = []; + var angleAxis = this._angleAxis; + var radiusAxis = this._radiusAxis; + angleAxis.scale.type === scaleType && axes.push(angleAxis); + radiusAxis.scale.type === scaleType && axes.push(radiusAxis); + + return axes; + }, + + /** + * @return {module:echarts/coord/polar/AngleAxis} + */ + getAngleAxis: function () { + return this._angleAxis; + }, + + /** + * @return {module:echarts/coord/polar/RadiusAxis} + */ + getRadiusAxis: function () { + return this._radiusAxis; + }, + + /** + * @param {module:echarts/coord/polar/Axis} + * @return {module:echarts/coord/polar/Axis} + */ + getOtherAxis: function (axis) { + var angleAxis = this._angleAxis; + return axis === angleAxis ? this._radiusAxis : angleAxis; + }, + + /** + * Base axis will be used on stacking. + * + * @return {module:echarts/coord/polar/Axis} + */ + getBaseAxis: function () { + return this.getAxesByScale('ordinal')[0] + || this.getAxesByScale('time')[0] + || this.getAngleAxis(); + }, + + /** + * @param {string} [dim] 'radius' or 'angle' or 'auto' or null/undefined + * @return {Object} {baseAxes: [], otherAxes: []} + */ + getTooltipAxes: function (dim) { + var baseAxis = (dim != null && dim !== 'auto') + ? this.getAxis(dim) : this.getBaseAxis(); + return { + baseAxes: [baseAxis], + otherAxes: [this.getOtherAxis(baseAxis)] + }; + }, + + /** + * Convert a single data item to (x, y) point. + * Parameter data is an array which the first element is radius and the second is angle + * @param {Array.<number>} data + * @param {boolean} [clamp=false] + * @return {Array.<number>} + */ + dataToPoint: function (data, clamp) { + return this.coordToPoint([ + this._radiusAxis.dataToRadius(data[0], clamp), + this._angleAxis.dataToAngle(data[1], clamp) + ]); + }, + + /** + * Convert a (x, y) point to data + * @param {Array.<number>} point + * @param {boolean} [clamp=false] + * @return {Array.<number>} + */ + pointToData: function (point, clamp) { + var coord = this.pointToCoord(point); + return [ + this._radiusAxis.radiusToData(coord[0], clamp), + this._angleAxis.angleToData(coord[1], clamp) + ]; + }, + + /** + * Convert a (x, y) point to (radius, angle) coord + * @param {Array.<number>} point + * @return {Array.<number>} + */ + pointToCoord: function (point) { + var dx = point[0] - this.cx; + var dy = point[1] - this.cy; + var angleAxis = this.getAngleAxis(); + var extent = angleAxis.getExtent(); + var minAngle = Math.min(extent[0], extent[1]); + var maxAngle = Math.max(extent[0], extent[1]); + // Fix fixed extent in polarCreator + // FIXME + angleAxis.inverse + ? (minAngle = maxAngle - 360) + : (maxAngle = minAngle + 360); + + var radius = Math.sqrt(dx * dx + dy * dy); + dx /= radius; + dy /= radius; + + var radian = Math.atan2(-dy, dx) / Math.PI * 180; + + // move to angleExtent + var dir = radian < minAngle ? 1 : -1; + while (radian < minAngle || radian > maxAngle) { + radian += dir * 360; + } + + return [radius, radian]; + }, + + /** + * Convert a (radius, angle) coord to (x, y) point + * @param {Array.<number>} coord + * @return {Array.<number>} + */ + coordToPoint: function (coord) { + var radius = coord[0]; + var radian = coord[1] / 180 * Math.PI; + var x = Math.cos(radian) * radius + this.cx; + // Inverse the y + var y = -Math.sin(radian) * radius + this.cy; + + return [x, y]; + } + +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var PolarAxisModel = ComponentModel.extend({ + + type: 'polarAxis', + + /** + * @type {module:echarts/coord/polar/AngleAxis|module:echarts/coord/polar/RadiusAxis} + */ + axis: null, + + /** + * @override + */ + getCoordSysModel: function () { + return this.ecModel.queryComponents({ + mainType: 'polar', + index: this.option.polarIndex, + id: this.option.polarId + })[0]; + } + +}); + +merge(PolarAxisModel.prototype, axisModelCommonMixin); + +var polarAxisDefaultExtendedOption = { + angle: { + // polarIndex: 0, + // polarId: '', + + startAngle: 90, + + clockwise: true, + + splitNumber: 12, + + axisLabel: { + rotate: false + } + }, + radius: { + // polarIndex: 0, + // polarId: '', + + splitNumber: 5 + } +}; + +function getAxisType$3(axisDim, option) { + // Default axis with data is category axis + return option.type || (option.data ? 'category' : 'value'); +} + +axisModelCreator('angle', PolarAxisModel, getAxisType$3, polarAxisDefaultExtendedOption.angle); +axisModelCreator('radius', PolarAxisModel, getAxisType$3, polarAxisDefaultExtendedOption.radius); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +extendComponentModel({ + + type: 'polar', + + dependencies: ['polarAxis', 'angleAxis'], + + /** + * @type {module:echarts/coord/polar/Polar} + */ + coordinateSystem: null, + + /** + * @param {string} axisType + * @return {module:echarts/coord/polar/AxisModel} + */ + findAxisModel: function (axisType) { + var foundAxisModel; + var ecModel = this.ecModel; + + ecModel.eachComponent(axisType, function (axisModel) { + if (axisModel.getCoordSysModel() === this) { + foundAxisModel = axisModel; + } + }, this); + return foundAxisModel; + }, + + defaultOption: { + + zlevel: 0, + + z: 0, + + center: ['50%', '50%'], + + radius: '80%' + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// TODO Axis scale + +/** + * Resize method bound to the polar + * @param {module:echarts/coord/polar/PolarModel} polarModel + * @param {module:echarts/ExtensionAPI} api + */ +function resizePolar(polar, polarModel, api) { + var center = polarModel.get('center'); + var width = api.getWidth(); + var height = api.getHeight(); + + polar.cx = parsePercent$1(center[0], width); + polar.cy = parsePercent$1(center[1], height); + + var radiusAxis = polar.getRadiusAxis(); + var size = Math.min(width, height) / 2; + var radius = parsePercent$1(polarModel.get('radius'), size); + radiusAxis.inverse + ? radiusAxis.setExtent(radius, 0) + : radiusAxis.setExtent(0, radius); +} + +/** + * Update polar + */ +function updatePolarScale(ecModel, api) { + var polar = this; + var angleAxis = polar.getAngleAxis(); + var radiusAxis = polar.getRadiusAxis(); + // Reset scale + angleAxis.scale.setExtent(Infinity, -Infinity); + radiusAxis.scale.setExtent(Infinity, -Infinity); + + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.coordinateSystem === polar) { + var data = seriesModel.getData(); + each$1(data.mapDimension('radius', true), function (dim) { + radiusAxis.scale.unionExtentFromData( + data, getStackedDimension(data, dim) + ); + }); + each$1(data.mapDimension('angle', true), function (dim) { + angleAxis.scale.unionExtentFromData( + data, getStackedDimension(data, dim) + ); + }); + } + }); + + niceScaleExtent(angleAxis.scale, angleAxis.model); + niceScaleExtent(radiusAxis.scale, radiusAxis.model); + + // Fix extent of category angle axis + if (angleAxis.type === 'category' && !angleAxis.onBand) { + var extent = angleAxis.getExtent(); + var diff = 360 / angleAxis.scale.count(); + angleAxis.inverse ? (extent[1] += diff) : (extent[1] -= diff); + angleAxis.setExtent(extent[0], extent[1]); + } +} + +/** + * Set common axis properties + * @param {module:echarts/coord/polar/AngleAxis|module:echarts/coord/polar/RadiusAxis} + * @param {module:echarts/coord/polar/AxisModel} + * @inner + */ +function setAxis(axis, axisModel) { + axis.type = axisModel.get('type'); + axis.scale = createScaleByModel(axisModel); + axis.onBand = axisModel.get('boundaryGap') && axis.type === 'category'; + axis.inverse = axisModel.get('inverse'); + + if (axisModel.mainType === 'angleAxis') { + axis.inverse ^= axisModel.get('clockwise'); + var startAngle = axisModel.get('startAngle'); + axis.setExtent(startAngle, startAngle + (axis.inverse ? -360 : 360)); + } + + // Inject axis instance + axisModel.axis = axis; + axis.model = axisModel; +} + + +var polarCreator = { + + dimensions: Polar.prototype.dimensions, + + create: function (ecModel, api) { + var polarList = []; + ecModel.eachComponent('polar', function (polarModel, idx) { + var polar = new Polar(idx); + // Inject resize and update method + polar.update = updatePolarScale; + + var radiusAxis = polar.getRadiusAxis(); + var angleAxis = polar.getAngleAxis(); + + var radiusAxisModel = polarModel.findAxisModel('radiusAxis'); + var angleAxisModel = polarModel.findAxisModel('angleAxis'); + + setAxis(radiusAxis, radiusAxisModel); + setAxis(angleAxis, angleAxisModel); + + resizePolar(polar, polarModel, api); + + polarList.push(polar); + + polarModel.coordinateSystem = polar; + polar.model = polarModel; + }); + // Inject coordinateSystem to series + ecModel.eachSeries(function (seriesModel) { + if (seriesModel.get('coordinateSystem') === 'polar') { + var polarModel = ecModel.queryComponents({ + mainType: 'polar', + index: seriesModel.get('polarIndex'), + id: seriesModel.get('polarId') + })[0]; + + if (__DEV__) { + if (!polarModel) { + throw new Error( + 'Polar "' + retrieve( + seriesModel.get('polarIndex'), + seriesModel.get('polarId'), + 0 + ) + '" not found' + ); + } + } + seriesModel.coordinateSystem = polarModel.coordinateSystem; + } + }); + + return polarList; + } +}; + +CoordinateSystemManager.register('polar', polarCreator); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var elementList$1 = ['axisLine', 'axisLabel', 'axisTick', 'splitLine', 'splitArea']; + +function getAxisLineShape(polar, rExtent, angle) { + rExtent[1] > rExtent[0] && (rExtent = rExtent.slice().reverse()); + var start = polar.coordToPoint([rExtent[0], angle]); + var end = polar.coordToPoint([rExtent[1], angle]); + + return { + x1: start[0], + y1: start[1], + x2: end[0], + y2: end[1] + }; +} + +function getRadiusIdx(polar) { + var radiusAxis = polar.getRadiusAxis(); + return radiusAxis.inverse ? 0 : 1; +} + +// Remove the last tick which will overlap the first tick +function fixAngleOverlap(list) { + var firstItem = list[0]; + var lastItem = list[list.length - 1]; + if (firstItem + && lastItem + && Math.abs(Math.abs(firstItem.coord - lastItem.coord) - 360) < 1e-4 + ) { + list.pop(); + } +} + +AxisView.extend({ + + type: 'angleAxis', + + axisPointerClass: 'PolarAxisPointer', + + render: function (angleAxisModel, ecModel) { + this.group.removeAll(); + if (!angleAxisModel.get('show')) { + return; + } + + var angleAxis = angleAxisModel.axis; + var polar = angleAxis.polar; + var radiusExtent = polar.getRadiusAxis().getExtent(); + + var ticksAngles = angleAxis.getTicksCoords(); + var labels = map(angleAxis.getViewLabels(), function (labelItem) { + var labelItem = clone(labelItem); + labelItem.coord = angleAxis.dataToCoord(labelItem.tickValue); + return labelItem; + }); + + fixAngleOverlap(labels); + fixAngleOverlap(ticksAngles); + + each$1(elementList$1, function (name) { + if (angleAxisModel.get(name +'.show') + && (!angleAxis.scale.isBlank() || name === 'axisLine') + ) { + this['_' + name](angleAxisModel, polar, ticksAngles, radiusExtent, labels); + } + }, this); + }, + + /** + * @private + */ + _axisLine: function (angleAxisModel, polar, ticksAngles, radiusExtent) { + var lineStyleModel = angleAxisModel.getModel('axisLine.lineStyle'); + + var circle = new Circle({ + shape: { + cx: polar.cx, + cy: polar.cy, + r: radiusExtent[getRadiusIdx(polar)] + }, + style: lineStyleModel.getLineStyle(), + z2: 1, + silent: true + }); + circle.style.fill = null; + + this.group.add(circle); + }, + + /** + * @private + */ + _axisTick: function (angleAxisModel, polar, ticksAngles, radiusExtent) { + var tickModel = angleAxisModel.getModel('axisTick'); + + var tickLen = (tickModel.get('inside') ? -1 : 1) * tickModel.get('length'); + var radius = radiusExtent[getRadiusIdx(polar)]; + + var lines = map(ticksAngles, function (tickAngleItem) { + return new Line({ + shape: getAxisLineShape(polar, [radius, radius + tickLen], tickAngleItem.coord) + }); + }); + this.group.add(mergePath( + lines, { + style: defaults( + tickModel.getModel('lineStyle').getLineStyle(), + { + stroke: angleAxisModel.get('axisLine.lineStyle.color') + } + ) + } + )); + }, + + /** + * @private + */ + _axisLabel: function (angleAxisModel, polar, ticksAngles, radiusExtent, labels) { + var rawCategoryData = angleAxisModel.getCategories(true); + + var commonLabelModel = angleAxisModel.getModel('axisLabel'); + + var labelMargin = commonLabelModel.get('margin'); + + // Use length of ticksAngles because it may remove the last tick to avoid overlapping + each$1(labels, function (labelItem, idx) { + var labelModel = commonLabelModel; + var tickValue = labelItem.tickValue; + + var r = radiusExtent[getRadiusIdx(polar)]; + var p = polar.coordToPoint([r + labelMargin, labelItem.coord]); + var cx = polar.cx; + var cy = polar.cy; + + var labelTextAlign = Math.abs(p[0] - cx) / r < 0.3 + ? 'center' : (p[0] > cx ? 'left' : 'right'); + var labelTextVerticalAlign = Math.abs(p[1] - cy) / r < 0.3 + ? 'middle' : (p[1] > cy ? 'top' : 'bottom'); + + if (rawCategoryData && rawCategoryData[tickValue] && rawCategoryData[tickValue].textStyle) { + labelModel = new Model(rawCategoryData[tickValue].textStyle, commonLabelModel, commonLabelModel.ecModel); + } + + var textEl = new Text({silent: true}); + this.group.add(textEl); + setTextStyle(textEl.style, labelModel, { + x: p[0], + y: p[1], + textFill: labelModel.getTextColor() || angleAxisModel.get('axisLine.lineStyle.color'), + text: labelItem.formattedLabel, + textAlign: labelTextAlign, + textVerticalAlign: labelTextVerticalAlign + }); + }, this); + }, + + /** + * @private + */ + _splitLine: function (angleAxisModel, polar, ticksAngles, radiusExtent) { + var splitLineModel = angleAxisModel.getModel('splitLine'); + var lineStyleModel = splitLineModel.getModel('lineStyle'); + var lineColors = lineStyleModel.get('color'); + var lineCount = 0; + + lineColors = lineColors instanceof Array ? lineColors : [lineColors]; + + var splitLines = []; + + for (var i = 0; i < ticksAngles.length; i++) { + var colorIndex = (lineCount++) % lineColors.length; + splitLines[colorIndex] = splitLines[colorIndex] || []; + splitLines[colorIndex].push(new Line({ + shape: getAxisLineShape(polar, radiusExtent, ticksAngles[i].coord) + })); + } + + // Simple optimization + // Batching the lines if color are the same + for (var i = 0; i < splitLines.length; i++) { + this.group.add(mergePath(splitLines[i], { + style: defaults({ + stroke: lineColors[i % lineColors.length] + }, lineStyleModel.getLineStyle()), + silent: true, + z: angleAxisModel.get('z') + })); + } + }, + + /** + * @private + */ + _splitArea: function (angleAxisModel, polar, ticksAngles, radiusExtent) { + if (!ticksAngles.length) { + return; + } + + var splitAreaModel = angleAxisModel.getModel('splitArea'); + var areaStyleModel = splitAreaModel.getModel('areaStyle'); + var areaColors = areaStyleModel.get('color'); + var lineCount = 0; + + areaColors = areaColors instanceof Array ? areaColors : [areaColors]; + + var splitAreas = []; + + var RADIAN = Math.PI / 180; + var prevAngle = -ticksAngles[0].coord * RADIAN; + var r0 = Math.min(radiusExtent[0], radiusExtent[1]); + var r1 = Math.max(radiusExtent[0], radiusExtent[1]); + + var clockwise = angleAxisModel.get('clockwise'); + + for (var i = 1; i < ticksAngles.length; i++) { + var colorIndex = (lineCount++) % areaColors.length; + splitAreas[colorIndex] = splitAreas[colorIndex] || []; + splitAreas[colorIndex].push(new Sector({ + shape: { + cx: polar.cx, + cy: polar.cy, + r0: r0, + r: r1, + startAngle: prevAngle, + endAngle: -ticksAngles[i].coord * RADIAN, + clockwise: clockwise + }, + silent: true + })); + prevAngle = -ticksAngles[i].coord * RADIAN; + } + + // Simple optimization + // Batching the lines if color are the same + for (var i = 0; i < splitAreas.length; i++) { + this.group.add(mergePath(splitAreas[i], { + style: defaults({ + fill: areaColors[i % areaColors.length] + }, areaStyleModel.getAreaStyle()), + silent: true + })); + } + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var axisBuilderAttrs$3 = [ + 'axisLine', 'axisTickLabel', 'axisName' +]; +var selfBuilderAttrs$1 = [ + 'splitLine', 'splitArea' +]; + +AxisView.extend({ + + type: 'radiusAxis', + + axisPointerClass: 'PolarAxisPointer', + + render: function (radiusAxisModel, ecModel) { + this.group.removeAll(); + if (!radiusAxisModel.get('show')) { + return; + } + var radiusAxis = radiusAxisModel.axis; + var polar = radiusAxis.polar; + var angleAxis = polar.getAngleAxis(); + var ticksCoords = radiusAxis.getTicksCoords(); + var axisAngle = angleAxis.getExtent()[0]; + var radiusExtent = radiusAxis.getExtent(); + + var layout = layoutAxis(polar, radiusAxisModel, axisAngle); + var axisBuilder = new AxisBuilder(radiusAxisModel, layout); + each$1(axisBuilderAttrs$3, axisBuilder.add, axisBuilder); + this.group.add(axisBuilder.getGroup()); + + each$1(selfBuilderAttrs$1, function (name) { + if (radiusAxisModel.get(name +'.show') && !radiusAxis.scale.isBlank()) { + this['_' + name](radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords); + } + }, this); + }, + + /** + * @private + */ + _splitLine: function (radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords) { + var splitLineModel = radiusAxisModel.getModel('splitLine'); + var lineStyleModel = splitLineModel.getModel('lineStyle'); + var lineColors = lineStyleModel.get('color'); + var lineCount = 0; + + lineColors = lineColors instanceof Array ? lineColors : [lineColors]; + + var splitLines = []; + + for (var i = 0; i < ticksCoords.length; i++) { + var colorIndex = (lineCount++) % lineColors.length; + splitLines[colorIndex] = splitLines[colorIndex] || []; + splitLines[colorIndex].push(new Circle({ + shape: { + cx: polar.cx, + cy: polar.cy, + r: ticksCoords[i].coord + }, + silent: true + })); + } + + // Simple optimization + // Batching the lines if color are the same + for (var i = 0; i < splitLines.length; i++) { + this.group.add(mergePath(splitLines[i], { + style: defaults({ + stroke: lineColors[i % lineColors.length], + fill: null + }, lineStyleModel.getLineStyle()), + silent: true + })); + } + }, + + /** + * @private + */ + _splitArea: function (radiusAxisModel, polar, axisAngle, radiusExtent, ticksCoords) { + if (!ticksCoords.length) { + return; + } + + var splitAreaModel = radiusAxisModel.getModel('splitArea'); + var areaStyleModel = splitAreaModel.getModel('areaStyle'); + var areaColors = areaStyleModel.get('color'); + var lineCount = 0; + + areaColors = areaColors instanceof Array ? areaColors : [areaColors]; + + var splitAreas = []; + + var prevRadius = ticksCoords[0].coord; + for (var i = 1; i < ticksCoords.length; i++) { + var colorIndex = (lineCount++) % areaColors.length; + splitAreas[colorIndex] = splitAreas[colorIndex] || []; + splitAreas[colorIndex].push(new Sector({ + shape: { + cx: polar.cx, + cy: polar.cy, + r0: prevRadius, + r: ticksCoords[i].coord, + startAngle: 0, + endAngle: Math.PI * 2 + }, + silent: true + })); + prevRadius = ticksCoords[i].coord; + } + + // Simple optimization + // Batching the lines if color are the same + for (var i = 0; i < splitAreas.length; i++) { + this.group.add(mergePath(splitAreas[i], { + style: defaults({ + fill: areaColors[i % areaColors.length] + }, areaStyleModel.getAreaStyle()), + silent: true + })); + } + } +}); + +/** + * @inner + */ +function layoutAxis(polar, radiusAxisModel, axisAngle) { + return { + position: [polar.cx, polar.cy], + rotation: axisAngle / 180 * Math.PI, + labelDirection: -1, + tickDirection: -1, + nameDirection: 1, + labelRotate: radiusAxisModel.getModel('axisLabel').get('rotate'), + // Over splitLine and splitArea + z2: 1 + }; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var PolarAxisPointer = BaseAxisPointer.extend({ + + /** + * @override + */ + makeElOption: function (elOption, value, axisModel, axisPointerModel, api) { + var axis = axisModel.axis; + + if (axis.dim === 'angle') { + this.animationThreshold = Math.PI / 18; + } + + var polar = axis.polar; + var otherAxis = polar.getOtherAxis(axis); + var otherExtent = otherAxis.getExtent(); + + var coordValue; + coordValue = axis['dataTo' + capitalFirst(axis.dim)](value); + + var axisPointerType = axisPointerModel.get('type'); + if (axisPointerType && axisPointerType !== 'none') { + var elStyle = buildElStyle(axisPointerModel); + var pointerOption = pointerShapeBuilder$2[axisPointerType]( + axis, polar, coordValue, otherExtent, elStyle + ); + pointerOption.style = elStyle; + elOption.graphicKey = pointerOption.type; + elOption.pointer = pointerOption; + } + + var labelMargin = axisPointerModel.get('label.margin'); + var labelPos = getLabelPosition(value, axisModel, axisPointerModel, polar, labelMargin); + buildLabelElOption(elOption, axisModel, axisPointerModel, api, labelPos); + } + + // Do not support handle, utill any user requires it. + +}); + +function getLabelPosition(value, axisModel, axisPointerModel, polar, labelMargin) { + var axis = axisModel.axis; + var coord = axis.dataToCoord(value); + var axisAngle = polar.getAngleAxis().getExtent()[0]; + axisAngle = axisAngle / 180 * Math.PI; + var radiusExtent = polar.getRadiusAxis().getExtent(); + var position; + var align; + var verticalAlign; + + if (axis.dim === 'radius') { + var transform = create$1(); + rotate(transform, transform, axisAngle); + translate(transform, transform, [polar.cx, polar.cy]); + position = applyTransform$1([coord, -labelMargin], transform); + + var labelRotation = axisModel.getModel('axisLabel').get('rotate') || 0; + var labelLayout = AxisBuilder.innerTextLayout( + axisAngle, labelRotation * Math.PI / 180, -1 + ); + align = labelLayout.textAlign; + verticalAlign = labelLayout.textVerticalAlign; + } + else { // angle axis + var r = radiusExtent[1]; + position = polar.coordToPoint([r + labelMargin, coord]); + var cx = polar.cx; + var cy = polar.cy; + align = Math.abs(position[0] - cx) / r < 0.3 + ? 'center' : (position[0] > cx ? 'left' : 'right'); + verticalAlign = Math.abs(position[1] - cy) / r < 0.3 + ? 'middle' : (position[1] > cy ? 'top' : 'bottom'); + } + + return { + position: position, + align: align, + verticalAlign: verticalAlign + }; +} + + +var pointerShapeBuilder$2 = { + + line: function (axis, polar, coordValue, otherExtent, elStyle) { + return axis.dim === 'angle' + ? { + type: 'Line', + shape: makeLineShape( + polar.coordToPoint([otherExtent[0], coordValue]), + polar.coordToPoint([otherExtent[1], coordValue]) + ) + } + : { + type: 'Circle', + shape: { + cx: polar.cx, + cy: polar.cy, + r: coordValue + } + }; + }, + + shadow: function (axis, polar, coordValue, otherExtent, elStyle) { + var bandWidth = Math.max(1, axis.getBandWidth()); + var radian = Math.PI / 180; + + return axis.dim === 'angle' + ? { + type: 'Sector', + shape: makeSectorShape( + polar.cx, polar.cy, + otherExtent[0], otherExtent[1], + // In ECharts y is negative if angle is positive + (-coordValue - bandWidth / 2) * radian, + (-coordValue + bandWidth / 2) * radian + ) + } + : { + type: 'Sector', + shape: makeSectorShape( + polar.cx, polar.cy, + coordValue - bandWidth / 2, + coordValue + bandWidth / 2, + 0, Math.PI * 2 + ) + }; + } +}; + +AxisView.registerAxisPointerClass('PolarAxisPointer', PolarAxisPointer); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// For reducing size of echarts.min, barLayoutPolar is required by polar. +registerLayout(curry(barLayoutPolar, 'bar')); + +// Polar view +extendComponentView({ + type: 'polar' +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var GeoModel = ComponentModel.extend({ + + type: 'geo', + + /** + * @type {module:echarts/coord/geo/Geo} + */ + coordinateSystem: null, + + layoutMode: 'box', + + init: function (option) { + ComponentModel.prototype.init.apply(this, arguments); + + // Default label emphasis `show` + defaultEmphasis(option, 'label', ['show']); + }, + + optionUpdated: function () { + var option = this.option; + var self = this; + + option.regions = geoCreator.getFilledRegions(option.regions, option.map, option.nameMap); + + this._optionModelMap = reduce(option.regions || [], function (optionModelMap, regionOpt) { + if (regionOpt.name) { + optionModelMap.set(regionOpt.name, new Model(regionOpt, self)); + } + return optionModelMap; + }, createHashMap()); + + this.updateSelectedMap(option.regions); + }, + + defaultOption: { + + zlevel: 0, + + z: 0, + + show: true, + + left: 'center', + + top: 'center', + + + // width:, + // height:, + // right + // bottom + + // Aspect is width / height. Inited to be geoJson bbox aspect + // This parameter is used for scale this aspect + aspectScale: 0.75, + + ///// Layout with center and size + // If you wan't to put map in a fixed size box with right aspect ratio + // This two properties may more conveninet + // layoutCenter: [50%, 50%] + // layoutSize: 100 + + + silent: false, + + // Map type + map: '', + + // Define left-top, right-bottom coords to control view + // For example, [ [180, 90], [-180, -90] ] + boundingCoords: null, + + // Default on center of map + center: null, + + zoom: 1, + + scaleLimit: null, + + // selectedMode: false + + label: { + show: false, + color: '#000' + }, + + itemStyle: { + // color: 各异, + borderWidth: 0.5, + borderColor: '#444', + color: '#eee' + }, + + emphasis: { + label: { + show: true, + color: 'rgb(100,0,0)' + }, + itemStyle: { + color: 'rgba(255,215,0,0.8)' + } + }, + + regions: [] + }, + + /** + * Get model of region + * @param {string} name + * @return {module:echarts/model/Model} + */ + getRegionModel: function (name) { + return this._optionModelMap.get(name) || new Model(null, this, this.ecModel); + }, + + /** + * Format label + * @param {string} name Region name + * @param {string} [status='normal'] 'normal' or 'emphasis' + * @return {string} + */ + getFormattedLabel: function (name, status) { + var regionModel = this.getRegionModel(name); + var formatter = regionModel.get('label.' + status + '.formatter'); + var params = { + name: name + }; + if (typeof formatter === 'function') { + params.status = status; + return formatter(params); + } + else if (typeof formatter === 'string') { + return formatter.replace('{a}', name != null ? name : ''); + } + }, + + setZoom: function (zoom) { + this.option.zoom = zoom; + }, + + setCenter: function (center) { + this.option.center = center; + } +}); + +mixin(GeoModel, selectableMixin); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +extendComponentView({ + + type: 'geo', + + init: function (ecModel, api) { + var mapDraw = new MapDraw(api, true); + this._mapDraw = mapDraw; + + this.group.add(mapDraw.group); + }, + + render: function (geoModel, ecModel, api, payload) { + // Not render if it is an toggleSelect action from self + if (payload && payload.type === 'geoToggleSelect' + && payload.from === this.uid + ) { + return; + } + + var mapDraw = this._mapDraw; + if (geoModel.get('show')) { + mapDraw.draw(geoModel, ecModel, api, this, payload); + } + else { + this._mapDraw.group.removeAll(); + } + + this.group.silent = geoModel.get('silent'); + }, + + dispose: function () { + this._mapDraw && this._mapDraw.remove(); + } + +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +function makeAction(method, actionInfo) { + actionInfo.update = 'updateView'; + registerAction(actionInfo, function (payload, ecModel) { + var selected = {}; + + ecModel.eachComponent( + { mainType: 'geo', query: payload}, + function (geoModel) { + geoModel[method](payload.name); + var geo = geoModel.coordinateSystem; + each$1(geo.regions, function (region) { + selected[region.name] = geoModel.isSelected(region.name) || false; + }); + } + ); + + return { + selected: selected, + name: payload.name + }; + }); +} + +makeAction('toggleSelected', { + type: 'geoToggleSelect', + event: 'geoselectchanged' +}); +makeAction('select', { + type: 'geoSelect', + event: 'geoselected' +}); +makeAction('unSelect', { + type: 'geoUnSelect', + event: 'geounselected' +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var DEFAULT_TOOLBOX_BTNS = ['rect', 'polygon', 'keep', 'clear']; + +var preprocessor$1 = function (option, isNew) { + var brushComponents = option && option.brush; + if (!isArray(brushComponents)) { + brushComponents = brushComponents ? [brushComponents] : []; + } + + if (!brushComponents.length) { + return; + } + + var brushComponentSpecifiedBtns = []; + + each$1(brushComponents, function (brushOpt) { + var tbs = brushOpt.hasOwnProperty('toolbox') + ? brushOpt.toolbox : []; + + if (tbs instanceof Array) { + brushComponentSpecifiedBtns = brushComponentSpecifiedBtns.concat(tbs); + } + }); + + var toolbox = option && option.toolbox; + + if (isArray(toolbox)) { + toolbox = toolbox[0]; + } + if (!toolbox) { + toolbox = {feature: {}}; + option.toolbox = [toolbox]; + } + + var toolboxFeature = (toolbox.feature || (toolbox.feature = {})); + var toolboxBrush = toolboxFeature.brush || (toolboxFeature.brush = {}); + var brushTypes = toolboxBrush.type || (toolboxBrush.type = []); + + brushTypes.push.apply(brushTypes, brushComponentSpecifiedBtns); + + removeDuplicate(brushTypes); + + if (isNew && !brushTypes.length) { + brushTypes.push.apply(brushTypes, DEFAULT_TOOLBOX_BTNS); + } +}; + +function removeDuplicate(arr) { + var map$$1 = {}; + each$1(arr, function (val) { + map$$1[val] = 1; + }); + arr.length = 0; + each$1(map$$1, function (flag, val) { + arr.push(val); + }); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @file Visual solution, for consistent option specification. + */ + +var each$19 = each$1; + +function hasKeys(obj) { + if (obj) { + for (var name in obj){ + if (obj.hasOwnProperty(name)) { + return true; + } + } + } +} + +/** + * @param {Object} option + * @param {Array.<string>} stateList + * @param {Function} [supplementVisualOption] + * @return {Object} visualMappings <state, <visualType, module:echarts/visual/VisualMapping>> + */ +function createVisualMappings(option, stateList, supplementVisualOption) { + var visualMappings = {}; + + each$19(stateList, function (state) { + var mappings = visualMappings[state] = createMappings(); + + each$19(option[state], function (visualData, visualType) { + if (!VisualMapping.isValidType(visualType)) { + return; + } + var mappingOption = { + type: visualType, + visual: visualData + }; + supplementVisualOption && supplementVisualOption(mappingOption, state); + mappings[visualType] = new VisualMapping(mappingOption); + + // Prepare a alpha for opacity, for some case that opacity + // is not supported, such as rendering using gradient color. + if (visualType === 'opacity') { + mappingOption = clone(mappingOption); + mappingOption.type = 'colorAlpha'; + mappings.__hidden.__alphaForOpacity = new VisualMapping(mappingOption); + } + }); + }); + + return visualMappings; + + function createMappings() { + var Creater = function () {}; + // Make sure hidden fields will not be visited by + // object iteration (with hasOwnProperty checking). + Creater.prototype.__hidden = Creater.prototype; + var obj = new Creater(); + return obj; + } +} + +/** + * @param {Object} thisOption + * @param {Object} newOption + * @param {Array.<string>} keys + */ +function replaceVisualOption(thisOption, newOption, keys) { + // Visual attributes merge is not supported, otherwise it + // brings overcomplicated merge logic. See #2853. So if + // newOption has anyone of these keys, all of these keys + // will be reset. Otherwise, all keys remain. + var has; + each$1(keys, function (key) { + if (newOption.hasOwnProperty(key) && hasKeys(newOption[key])) { + has = true; + } + }); + has && each$1(keys, function (key) { + if (newOption.hasOwnProperty(key) && hasKeys(newOption[key])) { + thisOption[key] = clone(newOption[key]); + } + else { + delete thisOption[key]; + } + }); +} + +/** + * @param {Array.<string>} stateList + * @param {Object} visualMappings <state, Object.<visualType, module:echarts/visual/VisualMapping>> + * @param {module:echarts/data/List} list + * @param {Function} getValueState param: valueOrIndex, return: state. + * @param {object} [scope] Scope for getValueState + * @param {string} [dimension] Concrete dimension, if used. + */ +// ???! handle brush? +function applyVisual(stateList, visualMappings, data, getValueState, scope, dimension) { + var visualTypesMap = {}; + each$1(stateList, function (state) { + var visualTypes = VisualMapping.prepareVisualTypes(visualMappings[state]); + visualTypesMap[state] = visualTypes; + }); + + var dataIndex; + + function getVisual(key) { + return data.getItemVisual(dataIndex, key); + } + + function setVisual(key, value) { + data.setItemVisual(dataIndex, key, value); + } + + if (dimension == null) { + data.each(eachItem); + } + else { + data.each([dimension], eachItem); + } + + function eachItem(valueOrIndex, index) { + dataIndex = dimension == null ? valueOrIndex : index; + + var rawDataItem = data.getRawDataItem(dataIndex); + // Consider performance + if (rawDataItem && rawDataItem.visualMap === false) { + return; + } + + var valueState = getValueState.call(scope, valueOrIndex); + var mappings = visualMappings[valueState]; + var visualTypes = visualTypesMap[valueState]; + + for (var i = 0, len = visualTypes.length; i < len; i++) { + var type = visualTypes[i]; + mappings[type] && mappings[type].applyVisual( + valueOrIndex, getVisual, setVisual + ); + } + } +} + +/** + * @param {module:echarts/data/List} data + * @param {Array.<string>} stateList + * @param {Object} visualMappings <state, Object.<visualType, module:echarts/visual/VisualMapping>> + * @param {Function} getValueState param: valueOrIndex, return: state. + * @param {number} [dim] dimension or dimension index. + */ +function incrementalApplyVisual(stateList, visualMappings, getValueState, dim) { + var visualTypesMap = {}; + each$1(stateList, function (state) { + var visualTypes = VisualMapping.prepareVisualTypes(visualMappings[state]); + visualTypesMap[state] = visualTypes; + }); + + function progress(params, data) { + if (dim != null) { + dim = data.getDimension(dim); + } + + function getVisual(key) { + return data.getItemVisual(dataIndex, key); + } + + function setVisual(key, value) { + data.setItemVisual(dataIndex, key, value); + } + + var dataIndex; + while ((dataIndex = params.next()) != null) { + var rawDataItem = data.getRawDataItem(dataIndex); + + // Consider performance + if (rawDataItem && rawDataItem.visualMap === false) { + return; + } + + var value = dim != null + ? data.get(dim, dataIndex, true) + : dataIndex; + + var valueState = getValueState(value); + var mappings = visualMappings[valueState]; + var visualTypes = visualTypesMap[valueState]; + + for (var i = 0, len = visualTypes.length; i < len; i++) { + var type = visualTypes[i]; + mappings[type] && mappings[type].applyVisual(value, getVisual, setVisual); + } + } + } + + return {progress: progress}; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// Key of the first level is brushType: `line`, `rect`, `polygon`. +// Key of the second level is chart element type: `point`, `rect`. +// See moudule:echarts/component/helper/BrushController +// function param: +// {Object} itemLayout fetch from data.getItemLayout(dataIndex) +// {Object} selectors {point: selector, rect: selector, ...} +// {Object} area {range: [[], [], ..], boudingRect} +// function return: +// {boolean} Whether in the given brush. +var selector = { + lineX: getLineSelectors(0), + lineY: getLineSelectors(1), + rect: { + point: function (itemLayout, selectors, area) { + return itemLayout && area.boundingRect.contain(itemLayout[0], itemLayout[1]); + }, + rect: function (itemLayout, selectors, area) { + return itemLayout && area.boundingRect.intersect(itemLayout); + } + }, + polygon: { + point: function (itemLayout, selectors, area) { + return itemLayout + && area.boundingRect.contain(itemLayout[0], itemLayout[1]) + && contain$1(area.range, itemLayout[0], itemLayout[1]); + }, + rect: function (itemLayout, selectors, area) { + var points = area.range; + + if (!itemLayout || points.length <= 1) { + return false; + } + + var x = itemLayout.x; + var y = itemLayout.y; + var width = itemLayout.width; + var height = itemLayout.height; + var p = points[0]; + + if (contain$1(points, x, y) + || contain$1(points, x + width, y) + || contain$1(points, x, y + height) + || contain$1(points, x + width, y + height) + || BoundingRect.create(itemLayout).contain(p[0], p[1]) + || lineIntersectPolygon(x, y, x + width, y, points) + || lineIntersectPolygon(x, y, x, y + height, points) + || lineIntersectPolygon(x + width, y, x + width, y + height, points) + || lineIntersectPolygon(x, y + height, x + width, y + height, points) + ) { + return true; + } + } + } +}; + +function getLineSelectors(xyIndex) { + var xy = ['x', 'y']; + var wh = ['width', 'height']; + + return { + point: function (itemLayout, selectors, area) { + if (itemLayout) { + var range = area.range; + var p = itemLayout[xyIndex]; + return inLineRange(p, range); + } + }, + rect: function (itemLayout, selectors, area) { + if (itemLayout) { + var range = area.range; + var layoutRange = [ + itemLayout[xy[xyIndex]], + itemLayout[xy[xyIndex]] + itemLayout[wh[xyIndex]] + ]; + layoutRange[1] < layoutRange[0] && layoutRange.reverse(); + return inLineRange(layoutRange[0], range) + || inLineRange(layoutRange[1], range) + || inLineRange(range[0], layoutRange) + || inLineRange(range[1], layoutRange); + } + } + }; +} + +function inLineRange(p, range) { + return range[0] <= p && p <= range[1]; +} + +function lineIntersectPolygon(lx, ly, l2x, l2y, points) { + for (var i = 0, p2 = points[points.length - 1]; i < points.length; i++) { + var p = points[i]; + if (lineIntersect(lx, ly, l2x, l2y, p[0], p[1], p2[0], p2[1])) { + return true; + } + p2 = p; + } +} + +// Code from <http://blog.csdn.net/rickliuxiao/article/details/6259322> with some fix. +// See <https://en.wikipedia.org/wiki/Line%E2%80%93line_intersection> +function lineIntersect(a1x, a1y, a2x, a2y, b1x, b1y, b2x, b2y) { + var delta = determinant(a2x - a1x, b1x - b2x, a2y - a1y, b1y - b2y); + if (nearZero(delta)) { // parallel + return false; + } + var namenda = determinant(b1x - a1x, b1x - b2x, b1y - a1y, b1y - b2y) / delta; + if (namenda < 0 || namenda > 1) { + return false; + } + var miu = determinant(a2x - a1x, b1x - a1x, a2y - a1y, b1y - a1y) / delta; + if (miu < 0 || miu > 1) { + return false; + } + return true; +} + +function nearZero(val) { + return val <= (1e-6) && val >= -(1e-6); +} + +function determinant(v1, v2, v3, v4) { + return v1 * v4 - v2 * v3; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var each$20 = each$1; +var indexOf$1 = indexOf; +var curry$5 = curry; + +var COORD_CONVERTS = ['dataToPoint', 'pointToData']; + +// FIXME +// how to genarialize to more coordinate systems. +var INCLUDE_FINDER_MAIN_TYPES = [ + 'grid', 'xAxis', 'yAxis', 'geo', 'graph', + 'polar', 'radiusAxis', 'angleAxis', 'bmap' +]; + +/** + * [option in constructor]: + * { + * Index/Id/Name of geo, xAxis, yAxis, grid: See util/model#parseFinder. + * } + * + * + * [targetInfo]: + * + * There can be multiple axes in a single targetInfo. Consider the case + * of `grid` component, a targetInfo represents a grid which contains one or more + * cartesian and one or more axes. And consider the case of parallel system, + * which has multiple axes in a coordinate system. + * Can be { + * panelId: ..., + * coordSys: <a representitive cartesian in grid (first cartesian by default)>, + * coordSyses: all cartesians. + * gridModel: <grid component> + * xAxes: correspond to coordSyses on index + * yAxes: correspond to coordSyses on index + * } + * or { + * panelId: ..., + * coordSys: <geo coord sys> + * coordSyses: [<geo coord sys>] + * geoModel: <geo component> + * } + * + * + * [panelOpt]: + * + * Make from targetInfo. Input to BrushController. + * { + * panelId: ..., + * rect: ... + * } + * + * + * [area]: + * + * Generated by BrushController or user input. + * { + * panelId: Used to locate coordInfo directly. If user inpput, no panelId. + * brushType: determine how to convert to/from coord('rect' or 'polygon' or 'lineX/Y'). + * Index/Id/Name of geo, xAxis, yAxis, grid: See util/model#parseFinder. + * range: pixel range. + * coordRange: representitive coord range (the first one of coordRanges). + * coordRanges: <Array> coord ranges, used in multiple cartesian in one grid. + * } + */ + +/** + * @param {Object} option contains Index/Id/Name of xAxis/yAxis/geo/grid + * Each can be {number|Array.<number>}. like: {xAxisIndex: [3, 4]} + * @param {module:echarts/model/Global} ecModel + * @param {Object} [opt] + * @param {Array.<string>} [opt.include] include coordinate system types. + */ +function BrushTargetManager(option, ecModel, opt) { + /** + * @private + * @type {Array.<Object>} + */ + var targetInfoList = this._targetInfoList = []; + var info = {}; + var foundCpts = parseFinder$1(ecModel, option); + + each$20(targetInfoBuilders, function (builder, type) { + if (!opt || !opt.include || indexOf$1(opt.include, type) >= 0) { + builder(foundCpts, targetInfoList, info); + } + }); +} + +var proto$2 = BrushTargetManager.prototype; + +proto$2.setOutputRanges = function (areas, ecModel) { + this.matchOutputRanges(areas, ecModel, function (area, coordRange, coordSys) { + (area.coordRanges || (area.coordRanges = [])).push(coordRange); + // area.coordRange is the first of area.coordRanges + if (!area.coordRange) { + area.coordRange = coordRange; + // In 'category' axis, coord to pixel is not reversible, so we can not + // rebuild range by coordRange accrately, which may bring trouble when + // brushing only one item. So we use __rangeOffset to rebuilding range + // by coordRange. And this it only used in brush component so it is no + // need to be adapted to coordRanges. + var result = coordConvert[area.brushType](0, coordSys, coordRange); + area.__rangeOffset = { + offset: diffProcessor[area.brushType](result.values, area.range, [1, 1]), + xyMinMax: result.xyMinMax + }; + } + }); +}; + +proto$2.matchOutputRanges = function (areas, ecModel, cb) { + each$20(areas, function (area) { + var targetInfo = this.findTargetInfo(area, ecModel); + + if (targetInfo && targetInfo !== true) { + each$1( + targetInfo.coordSyses, + function (coordSys) { + var result = coordConvert[area.brushType](1, coordSys, area.range); + cb(area, result.values, coordSys, ecModel); + } + ); + } + }, this); +}; + +proto$2.setInputRanges = function (areas, ecModel) { + each$20(areas, function (area) { + var targetInfo = this.findTargetInfo(area, ecModel); + + if (__DEV__) { + assert$1( + !targetInfo || targetInfo === true || area.coordRange, + 'coordRange must be specified when coord index specified.' + ); + assert$1( + !targetInfo || targetInfo !== true || area.range, + 'range must be specified in global brush.' + ); + } + + area.range = area.range || []; + + // convert coordRange to global range and set panelId. + if (targetInfo && targetInfo !== true) { + area.panelId = targetInfo.panelId; + // (1) area.range shoule always be calculate from coordRange but does + // not keep its original value, for the sake of the dataZoom scenario, + // where area.coordRange remains unchanged but area.range may be changed. + // (2) Only support converting one coordRange to pixel range in brush + // component. So do not consider `coordRanges`. + // (3) About __rangeOffset, see comment above. + var result = coordConvert[area.brushType](0, targetInfo.coordSys, area.coordRange); + var rangeOffset = area.__rangeOffset; + area.range = rangeOffset + ? diffProcessor[area.brushType]( + result.values, + rangeOffset.offset, + getScales(result.xyMinMax, rangeOffset.xyMinMax) + ) + : result.values; + } + }, this); +}; + +proto$2.makePanelOpts = function (api, getDefaultBrushType) { + return map(this._targetInfoList, function (targetInfo) { + var rect = targetInfo.getPanelRect(); + return { + panelId: targetInfo.panelId, + defaultBrushType: getDefaultBrushType && getDefaultBrushType(targetInfo), + clipPath: makeRectPanelClipPath(rect), + isTargetByCursor: makeRectIsTargetByCursor( + rect, api, targetInfo.coordSysModel + ), + getLinearBrushOtherExtent: makeLinearBrushOtherExtent(rect) + }; + }); +}; + +proto$2.controlSeries = function (area, seriesModel, ecModel) { + // Check whether area is bound in coord, and series do not belong to that coord. + // If do not do this check, some brush (like lineX) will controll all axes. + var targetInfo = this.findTargetInfo(area, ecModel); + return targetInfo === true || ( + targetInfo && indexOf$1(targetInfo.coordSyses, seriesModel.coordinateSystem) >= 0 + ); +}; + +/** + * If return Object, a coord found. + * If reutrn true, global found. + * Otherwise nothing found. + * + * @param {Object} area + * @param {Array} targetInfoList + * @return {Object|boolean} + */ +proto$2.findTargetInfo = function (area, ecModel) { + var targetInfoList = this._targetInfoList; + var foundCpts = parseFinder$1(ecModel, area); + + for (var i = 0; i < targetInfoList.length; i++) { + var targetInfo = targetInfoList[i]; + var areaPanelId = area.panelId; + if (areaPanelId) { + if (targetInfo.panelId === areaPanelId) { + return targetInfo; + } + } + else { + for (var i = 0; i < targetInfoMatchers.length; i++) { + if (targetInfoMatchers[i](foundCpts, targetInfo)) { + return targetInfo; + } + } + } + } + + return true; +}; + +function formatMinMax(minMax) { + minMax[0] > minMax[1] && minMax.reverse(); + return minMax; +} + +function parseFinder$1(ecModel, option) { + return parseFinder( + ecModel, option, {includeMainTypes: INCLUDE_FINDER_MAIN_TYPES} + ); +} + +var targetInfoBuilders = { + + grid: function (foundCpts, targetInfoList) { + var xAxisModels = foundCpts.xAxisModels; + var yAxisModels = foundCpts.yAxisModels; + var gridModels = foundCpts.gridModels; + // Remove duplicated. + var gridModelMap = createHashMap(); + var xAxesHas = {}; + var yAxesHas = {}; + + if (!xAxisModels && !yAxisModels && !gridModels) { + return; + } + + each$20(xAxisModels, function (axisModel) { + var gridModel = axisModel.axis.grid.model; + gridModelMap.set(gridModel.id, gridModel); + xAxesHas[gridModel.id] = true; + }); + each$20(yAxisModels, function (axisModel) { + var gridModel = axisModel.axis.grid.model; + gridModelMap.set(gridModel.id, gridModel); + yAxesHas[gridModel.id] = true; + }); + each$20(gridModels, function (gridModel) { + gridModelMap.set(gridModel.id, gridModel); + xAxesHas[gridModel.id] = true; + yAxesHas[gridModel.id] = true; + }); + + gridModelMap.each(function (gridModel) { + var grid = gridModel.coordinateSystem; + var cartesians = []; + + each$20(grid.getCartesians(), function (cartesian, index) { + if (indexOf$1(xAxisModels, cartesian.getAxis('x').model) >= 0 + || indexOf$1(yAxisModels, cartesian.getAxis('y').model) >= 0 + ) { + cartesians.push(cartesian); + } + }); + targetInfoList.push({ + panelId: 'grid--' + gridModel.id, + gridModel: gridModel, + coordSysModel: gridModel, + // Use the first one as the representitive coordSys. + coordSys: cartesians[0], + coordSyses: cartesians, + getPanelRect: panelRectBuilder.grid, + xAxisDeclared: xAxesHas[gridModel.id], + yAxisDeclared: yAxesHas[gridModel.id] + }); + }); + }, + + geo: function (foundCpts, targetInfoList) { + each$20(foundCpts.geoModels, function (geoModel) { + var coordSys = geoModel.coordinateSystem; + targetInfoList.push({ + panelId: 'geo--' + geoModel.id, + geoModel: geoModel, + coordSysModel: geoModel, + coordSys: coordSys, + coordSyses: [coordSys], + getPanelRect: panelRectBuilder.geo + }); + }); + } +}; + +var targetInfoMatchers = [ + + // grid + function (foundCpts, targetInfo) { + var xAxisModel = foundCpts.xAxisModel; + var yAxisModel = foundCpts.yAxisModel; + var gridModel = foundCpts.gridModel; + + !gridModel && xAxisModel && (gridModel = xAxisModel.axis.grid.model); + !gridModel && yAxisModel && (gridModel = yAxisModel.axis.grid.model); + + return gridModel && gridModel === targetInfo.gridModel; + }, + + // geo + function (foundCpts, targetInfo) { + var geoModel = foundCpts.geoModel; + return geoModel && geoModel === targetInfo.geoModel; + } +]; + +var panelRectBuilder = { + + grid: function () { + // grid is not Transformable. + return this.coordSys.grid.getRect().clone(); + }, + + geo: function () { + var coordSys = this.coordSys; + var rect = coordSys.getBoundingRect().clone(); + // geo roam and zoom transform + rect.applyTransform(getTransform(coordSys)); + return rect; + } +}; + +var coordConvert = { + + lineX: curry$5(axisConvert, 0), + + lineY: curry$5(axisConvert, 1), + + rect: function (to, coordSys, rangeOrCoordRange) { + var xminymin = coordSys[COORD_CONVERTS[to]]([rangeOrCoordRange[0][0], rangeOrCoordRange[1][0]]); + var xmaxymax = coordSys[COORD_CONVERTS[to]]([rangeOrCoordRange[0][1], rangeOrCoordRange[1][1]]); + var values = [ + formatMinMax([xminymin[0], xmaxymax[0]]), + formatMinMax([xminymin[1], xmaxymax[1]]) + ]; + return {values: values, xyMinMax: values}; + }, + + polygon: function (to, coordSys, rangeOrCoordRange) { + var xyMinMax = [[Infinity, -Infinity], [Infinity, -Infinity]]; + var values = map(rangeOrCoordRange, function (item) { + var p = coordSys[COORD_CONVERTS[to]](item); + xyMinMax[0][0] = Math.min(xyMinMax[0][0], p[0]); + xyMinMax[1][0] = Math.min(xyMinMax[1][0], p[1]); + xyMinMax[0][1] = Math.max(xyMinMax[0][1], p[0]); + xyMinMax[1][1] = Math.max(xyMinMax[1][1], p[1]); + return p; + }); + return {values: values, xyMinMax: xyMinMax}; + } +}; + +function axisConvert(axisNameIndex, to, coordSys, rangeOrCoordRange) { + if (__DEV__) { + assert$1( + coordSys.type === 'cartesian2d', + 'lineX/lineY brush is available only in cartesian2d.' + ); + } + + var axis = coordSys.getAxis(['x', 'y'][axisNameIndex]); + var values = formatMinMax(map([0, 1], function (i) { + return to + ? axis.coordToData(axis.toLocalCoord(rangeOrCoordRange[i])) + : axis.toGlobalCoord(axis.dataToCoord(rangeOrCoordRange[i])); + })); + var xyMinMax = []; + xyMinMax[axisNameIndex] = values; + xyMinMax[1 - axisNameIndex] = [NaN, NaN]; + + return {values: values, xyMinMax: xyMinMax}; +} + +var diffProcessor = { + lineX: curry$5(axisDiffProcessor, 0), + + lineY: curry$5(axisDiffProcessor, 1), + + rect: function (values, refer, scales) { + return [ + [values[0][0] - scales[0] * refer[0][0], values[0][1] - scales[0] * refer[0][1]], + [values[1][0] - scales[1] * refer[1][0], values[1][1] - scales[1] * refer[1][1]] + ]; + }, + + polygon: function (values, refer, scales) { + return map(values, function (item, idx) { + return [item[0] - scales[0] * refer[idx][0], item[1] - scales[1] * refer[idx][1]]; + }); + } +}; + +function axisDiffProcessor(axisNameIndex, values, refer, scales) { + return [ + values[0] - scales[axisNameIndex] * refer[0], + values[1] - scales[axisNameIndex] * refer[1] + ]; +} + +// We have to process scale caused by dataZoom manually, +// although it might be not accurate. +function getScales(xyMinMaxCurr, xyMinMaxOrigin) { + var sizeCurr = getSize(xyMinMaxCurr); + var sizeOrigin = getSize(xyMinMaxOrigin); + var scales = [sizeCurr[0] / sizeOrigin[0], sizeCurr[1] / sizeOrigin[1]]; + isNaN(scales[0]) && (scales[0] = 1); + isNaN(scales[1]) && (scales[1] = 1); + return scales; +} + +function getSize(xyMinMax) { + return xyMinMax + ? [xyMinMax[0][1] - xyMinMax[0][0], xyMinMax[1][1] - xyMinMax[1][0]] + : [NaN, NaN]; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var STATE_LIST = ['inBrush', 'outOfBrush']; +var DISPATCH_METHOD = '__ecBrushSelect'; +var DISPATCH_FLAG = '__ecInBrushSelectEvent'; +var PRIORITY_BRUSH = PRIORITY.VISUAL.BRUSH; + +/** + * Layout for visual, the priority higher than other layout, and before brush visual. + */ +registerLayout(PRIORITY_BRUSH, function (ecModel, api, payload) { + ecModel.eachComponent({mainType: 'brush'}, function (brushModel) { + + payload && payload.type === 'takeGlobalCursor' && brushModel.setBrushOption( + payload.key === 'brush' ? payload.brushOption : {brushType: false} + ); + + var brushTargetManager = brushModel.brushTargetManager = new BrushTargetManager(brushModel.option, ecModel); + + brushTargetManager.setInputRanges(brushModel.areas, ecModel); + }); +}); + +/** + * Register the visual encoding if this modules required. + */ +registerVisual(PRIORITY_BRUSH, function (ecModel, api, payload) { + + var brushSelected = []; + var throttleType; + var throttleDelay; + + ecModel.eachComponent({mainType: 'brush'}, function (brushModel, brushIndex) { + + var thisBrushSelected = { + brushId: brushModel.id, + brushIndex: brushIndex, + brushName: brushModel.name, + areas: clone(brushModel.areas), + selected: [] + }; + // Every brush component exists in event params, convenient + // for user to find by index. + brushSelected.push(thisBrushSelected); + + var brushOption = brushModel.option; + var brushLink = brushOption.brushLink; + var linkedSeriesMap = []; + var selectedDataIndexForLink = []; + var rangeInfoBySeries = []; + var hasBrushExists = 0; + + if (!brushIndex) { // Only the first throttle setting works. + throttleType = brushOption.throttleType; + throttleDelay = brushOption.throttleDelay; + } + + // Add boundingRect and selectors to range. + var areas = map(brushModel.areas, function (area) { + return bindSelector( + defaults( + {boundingRect: boundingRectBuilders[area.brushType](area)}, + area + ) + ); + }); + + var visualMappings = createVisualMappings( + brushModel.option, STATE_LIST, function (mappingOption) { + mappingOption.mappingMethod = 'fixed'; + } + ); + + isArray(brushLink) && each$1(brushLink, function (seriesIndex) { + linkedSeriesMap[seriesIndex] = 1; + }); + + function linkOthers(seriesIndex) { + return brushLink === 'all' || linkedSeriesMap[seriesIndex]; + } + + // If no supported brush or no brush on the series, + // all visuals should be in original state. + function brushed(rangeInfoList) { + return !!rangeInfoList.length; + } + + /** + * Logic for each series: (If the logic has to be modified one day, do it carefully!) + * + * ( brushed ┬ && ┬hasBrushExist ┬ && linkOthers ) => StepA: ┬record, ┬ StepB: ┬visualByRecord. + * !brushed┘ ├hasBrushExist ┤ └nothing,┘ ├visualByRecord. + * └!hasBrushExist┘ └nothing. + * ( !brushed && ┬hasBrushExist ┬ && linkOthers ) => StepA: nothing, StepB: ┬visualByRecord. + * └!hasBrushExist┘ └nothing. + * ( brushed ┬ && !linkOthers ) => StepA: nothing, StepB: ┬visualByCheck. + * !brushed┘ └nothing. + * ( !brushed && !linkOthers ) => StepA: nothing, StepB: nothing. + */ + + // Step A + ecModel.eachSeries(function (seriesModel, seriesIndex) { + var rangeInfoList = rangeInfoBySeries[seriesIndex] = []; + + seriesModel.subType === 'parallel' + ? stepAParallel(seriesModel, seriesIndex, rangeInfoList) + : stepAOthers(seriesModel, seriesIndex, rangeInfoList); + }); + + function stepAParallel(seriesModel, seriesIndex) { + var coordSys = seriesModel.coordinateSystem; + hasBrushExists |= coordSys.hasAxisBrushed(); + + linkOthers(seriesIndex) && coordSys.eachActiveState( + seriesModel.getData(), + function (activeState, dataIndex) { + activeState === 'active' && (selectedDataIndexForLink[dataIndex] = 1); + } + ); + } + + function stepAOthers(seriesModel, seriesIndex, rangeInfoList) { + var selectorsByBrushType = getSelectorsByBrushType(seriesModel); + if (!selectorsByBrushType || brushModelNotControll(brushModel, seriesIndex)) { + return; + } + + each$1(areas, function (area) { + selectorsByBrushType[area.brushType] + && brushModel.brushTargetManager.controlSeries(area, seriesModel, ecModel) + && rangeInfoList.push(area); + hasBrushExists |= brushed(rangeInfoList); + }); + + if (linkOthers(seriesIndex) && brushed(rangeInfoList)) { + var data = seriesModel.getData(); + data.each(function (dataIndex) { + if (checkInRange(selectorsByBrushType, rangeInfoList, data, dataIndex)) { + selectedDataIndexForLink[dataIndex] = 1; + } + }); + } + } + + // Step B + ecModel.eachSeries(function (seriesModel, seriesIndex) { + var seriesBrushSelected = { + seriesId: seriesModel.id, + seriesIndex: seriesIndex, + seriesName: seriesModel.name, + dataIndex: [] + }; + // Every series exists in event params, convenient + // for user to find series by seriesIndex. + thisBrushSelected.selected.push(seriesBrushSelected); + + var selectorsByBrushType = getSelectorsByBrushType(seriesModel); + var rangeInfoList = rangeInfoBySeries[seriesIndex]; + + var data = seriesModel.getData(); + var getValueState = linkOthers(seriesIndex) + ? function (dataIndex) { + return selectedDataIndexForLink[dataIndex] + ? (seriesBrushSelected.dataIndex.push(data.getRawIndex(dataIndex)), 'inBrush') + : 'outOfBrush'; + } + : function (dataIndex) { + return checkInRange(selectorsByBrushType, rangeInfoList, data, dataIndex) + ? (seriesBrushSelected.dataIndex.push(data.getRawIndex(dataIndex)), 'inBrush') + : 'outOfBrush'; + }; + + // If no supported brush or no brush, all visuals are in original state. + (linkOthers(seriesIndex) ? hasBrushExists : brushed(rangeInfoList)) + && applyVisual( + STATE_LIST, visualMappings, data, getValueState + ); + }); + + }); + + dispatchAction(api, throttleType, throttleDelay, brushSelected, payload); +}); + +function dispatchAction(api, throttleType, throttleDelay, brushSelected, payload) { + // This event will not be triggered when `setOpion`, otherwise dead lock may + // triggered when do `setOption` in event listener, which we do not find + // satisfactory way to solve yet. Some considered resolutions: + // (a) Diff with prevoius selected data ant only trigger event when changed. + // But store previous data and diff precisely (i.e., not only by dataIndex, but + // also detect value changes in selected data) might bring complexity or fragility. + // (b) Use spectial param like `silent` to suppress event triggering. + // But such kind of volatile param may be weird in `setOption`. + if (!payload) { + return; + } + + var zr = api.getZr(); + if (zr[DISPATCH_FLAG]) { + return; + } + + if (!zr[DISPATCH_METHOD]) { + zr[DISPATCH_METHOD] = doDispatch; + } + + var fn = createOrUpdate(zr, DISPATCH_METHOD, throttleDelay, throttleType); + + fn(api, brushSelected); +} + +function doDispatch(api, brushSelected) { + if (!api.isDisposed()) { + var zr = api.getZr(); + zr[DISPATCH_FLAG] = true; + api.dispatchAction({ + type: 'brushSelect', + batch: brushSelected + }); + zr[DISPATCH_FLAG] = false; + } +} + +function checkInRange(selectorsByBrushType, rangeInfoList, data, dataIndex) { + for (var i = 0, len = rangeInfoList.length; i < len; i++) { + var area = rangeInfoList[i]; + if (selectorsByBrushType[area.brushType]( + dataIndex, data, area.selectors, area + )) { + return true; + } + } +} + +function getSelectorsByBrushType(seriesModel) { + var brushSelector = seriesModel.brushSelector; + if (isString(brushSelector)) { + var sels = []; + each$1(selector, function (selectorsByElementType, brushType) { + sels[brushType] = function (dataIndex, data, selectors, area) { + var itemLayout = data.getItemLayout(dataIndex); + return selectorsByElementType[brushSelector](itemLayout, selectors, area); + }; + }); + return sels; + } + else if (isFunction$1(brushSelector)) { + var bSelector = {}; + each$1(selector, function (sel, brushType) { + bSelector[brushType] = brushSelector; + }); + return bSelector; + } + return brushSelector; +} + +function brushModelNotControll(brushModel, seriesIndex) { + var seriesIndices = brushModel.option.seriesIndex; + return seriesIndices != null + && seriesIndices !== 'all' + && ( + isArray(seriesIndices) + ? indexOf(seriesIndices, seriesIndex) < 0 + : seriesIndex !== seriesIndices + ); +} + +function bindSelector(area) { + var selectors = area.selectors = {}; + each$1(selector[area.brushType], function (selFn, elType) { + // Do not use function binding or curry for performance. + selectors[elType] = function (itemLayout) { + return selFn(itemLayout, selectors, area); + }; + }); + return area; +} + +var boundingRectBuilders = { + + lineX: noop, + + lineY: noop, + + rect: function (area) { + return getBoundingRectFromMinMax(area.range); + }, + + polygon: function (area) { + var minMax; + var range = area.range; + + for (var i = 0, len = range.length; i < len; i++) { + minMax = minMax || [[Infinity, -Infinity], [Infinity, -Infinity]]; + var rg = range[i]; + rg[0] < minMax[0][0] && (minMax[0][0] = rg[0]); + rg[0] > minMax[0][1] && (minMax[0][1] = rg[0]); + rg[1] < minMax[1][0] && (minMax[1][0] = rg[1]); + rg[1] > minMax[1][1] && (minMax[1][1] = rg[1]); + } + + return minMax && getBoundingRectFromMinMax(minMax); + } +}; + +function getBoundingRectFromMinMax(minMax) { + return new BoundingRect( + minMax[0][0], + minMax[1][0], + minMax[0][1] - minMax[0][0], + minMax[1][1] - minMax[1][0] + ); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var DEFAULT_OUT_OF_BRUSH_COLOR = ['#ddd']; + +var BrushModel = extendComponentModel({ + + type: 'brush', + + dependencies: ['geo', 'grid', 'xAxis', 'yAxis', 'parallel', 'series'], + + /** + * @protected + */ + defaultOption: { + // inBrush: null, + // outOfBrush: null, + toolbox: null, // Default value see preprocessor. + brushLink: null, // Series indices array, broadcast using dataIndex. + // or 'all', which means all series. 'none' or null means no series. + seriesIndex: 'all', // seriesIndex array, specify series controlled by this brush component. + geoIndex: null, // + xAxisIndex: null, + yAxisIndex: null, + + brushType: 'rect', // Default brushType, see BrushController. + brushMode: 'single', // Default brushMode, 'single' or 'multiple' + transformable: true, // Default transformable. + brushStyle: { // Default brushStyle + borderWidth: 1, + color: 'rgba(120,140,180,0.3)', + borderColor: 'rgba(120,140,180,0.8)' + }, + + throttleType: 'fixRate',// Throttle in brushSelected event. 'fixRate' or 'debounce'. + // If null, no throttle. Valid only in the first brush component + throttleDelay: 0, // Unit: ms, 0 means every event will be triggered. + + // FIXME + // 试验效果 + removeOnClick: true, + + z: 10000 + }, + + /** + * @readOnly + * @type {Array.<Object>} + */ + areas: [], + + /** + * Current activated brush type. + * If null, brush is inactived. + * see module:echarts/component/helper/BrushController + * @readOnly + * @type {string} + */ + brushType: null, + + /** + * Current brush opt. + * see module:echarts/component/helper/BrushController + * @readOnly + * @type {Object} + */ + brushOption: {}, + + /** + * @readOnly + * @type {Array.<Object>} + */ + coordInfoList: [], + + optionUpdated: function (newOption, isInit) { + var thisOption = this.option; + + !isInit && replaceVisualOption( + thisOption, newOption, ['inBrush', 'outOfBrush'] + ); + + var inBrush = thisOption.inBrush = thisOption.inBrush || {}; + // Always give default visual, consider setOption at the second time. + thisOption.outOfBrush = thisOption.outOfBrush || {color: DEFAULT_OUT_OF_BRUSH_COLOR}; + + if (!inBrush.hasOwnProperty('liftZ')) { + // Bigger than the highlight z lift, otherwise it will + // be effected by the highlight z when brush. + inBrush.liftZ = 5; + } + }, + + /** + * If ranges is null/undefined, range state remain. + * + * @param {Array.<Object>} [ranges] + */ + setAreas: function (areas) { + if (__DEV__) { + assert$1(isArray(areas)); + each$1(areas, function (area) { + assert$1(area.brushType, 'Illegal areas'); + }); + } + + // If ranges is null/undefined, range state remain. + // This helps user to dispatchAction({type: 'brush'}) with no areas + // set but just want to get the current brush select info from a `brush` event. + if (!areas) { + return; + } + + this.areas = map(areas, function (area) { + return generateBrushOption(this.option, area); + }, this); + }, + + /** + * see module:echarts/component/helper/BrushController + * @param {Object} brushOption + */ + setBrushOption: function (brushOption) { + this.brushOption = generateBrushOption(this.option, brushOption); + this.brushType = this.brushOption.brushType; + } + +}); + +function generateBrushOption(option, brushOption) { + return merge( + { + brushType: option.brushType, + brushMode: option.brushMode, + transformable: option.transformable, + brushStyle: new Model(option.brushStyle).getItemStyle(), + removeOnClick: option.removeOnClick, + z: option.z + }, + brushOption, + true + ); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +extendComponentView({ + + type: 'brush', + + init: function (ecModel, api) { + + /** + * @readOnly + * @type {module:echarts/model/Global} + */ + this.ecModel = ecModel; + + /** + * @readOnly + * @type {module:echarts/ExtensionAPI} + */ + this.api = api; + + /** + * @readOnly + * @type {module:echarts/component/brush/BrushModel} + */ + this.model; + + /** + * @private + * @type {module:echarts/component/helper/BrushController} + */ + (this._brushController = new BrushController(api.getZr())) + .on('brush', bind(this._onBrush, this)) + .mount(); + }, + + /** + * @override + */ + render: function (brushModel) { + this.model = brushModel; + return updateController.apply(this, arguments); + }, + + /** + * @override + */ + updateTransform: updateController, + + /** + * @override + */ + updateView: updateController, + + // /** + // * @override + // */ + // updateLayout: updateController, + + // /** + // * @override + // */ + // updateVisual: updateController, + + /** + * @override + */ + dispose: function () { + this._brushController.dispose(); + }, + + /** + * @private + */ + _onBrush: function (areas, opt) { + var modelId = this.model.id; + + this.model.brushTargetManager.setOutputRanges(areas, this.ecModel); + + // Action is not dispatched on drag end, because the drag end + // emits the same params with the last drag move event, and + // may have some delay when using touch pad, which makes + // animation not smooth (when using debounce). + (!opt.isEnd || opt.removeOnClick) && this.api.dispatchAction({ + type: 'brush', + brushId: modelId, + areas: clone(areas), + $from: modelId + }); + } + +}); + +function updateController(brushModel, ecModel, api, payload) { + // Do not update controller when drawing. + (!payload || payload.$from !== brushModel.id) && this._brushController + .setPanels(brushModel.brushTargetManager.makePanelOpts(api)) + .enableBrush(brushModel.brushOption) + .updateCovers(brushModel.areas.slice()); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * payload: { + * brushIndex: number, or, + * brushId: string, or, + * brushName: string, + * globalRanges: Array + * } + */ +registerAction( + {type: 'brush', event: 'brush' /*, update: 'updateView' */}, + function (payload, ecModel) { + ecModel.eachComponent({mainType: 'brush', query: payload}, function (brushModel) { + brushModel.setAreas(payload.areas); + }); + } +); + +/** + * payload: { + * brushComponents: [ + * { + * brushId, + * brushIndex, + * brushName, + * series: [ + * { + * seriesId, + * seriesIndex, + * seriesName, + * rawIndices: [21, 34, ...] + * }, + * ... + * ] + * }, + * ... + * ] + * } + */ +registerAction( + {type: 'brushSelect', event: 'brushSelected', update: 'none'}, + function () {} +); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + + +var features = {}; + +function register$1(name, ctor) { + features[name] = ctor; +} + +function get$1(name) { + return features[name]; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var brushLang = lang.toolbox.brush; + +function Brush(model, ecModel, api) { + this.model = model; + this.ecModel = ecModel; + this.api = api; + + /** + * @private + * @type {string} + */ + this._brushType; + + /** + * @private + * @type {string} + */ + this._brushMode; +} + +Brush.defaultOption = { + show: true, + type: ['rect', 'polygon', 'lineX', 'lineY', 'keep', 'clear'], + icon: { + rect: 'M7.3,34.7 M0.4,10V-0.2h9.8 M89.6,10V-0.2h-9.8 M0.4,60v10.2h9.8 M89.6,60v10.2h-9.8 M12.3,22.4V10.5h13.1 M33.6,10.5h7.8 M49.1,10.5h7.8 M77.5,22.4V10.5h-13 M12.3,31.1v8.2 M77.7,31.1v8.2 M12.3,47.6v11.9h13.1 M33.6,59.5h7.6 M49.1,59.5 h7.7 M77.5,47.6v11.9h-13', // jshint ignore:line + polygon: 'M55.2,34.9c1.7,0,3.1,1.4,3.1,3.1s-1.4,3.1-3.1,3.1 s-3.1-1.4-3.1-3.1S53.5,34.9,55.2,34.9z M50.4,51c1.7,0,3.1,1.4,3.1,3.1c0,1.7-1.4,3.1-3.1,3.1c-1.7,0-3.1-1.4-3.1-3.1 C47.3,52.4,48.7,51,50.4,51z M55.6,37.1l1.5-7.8 M60.1,13.5l1.6-8.7l-7.8,4 M59,19l-1,5.3 M24,16.1l6.4,4.9l6.4-3.3 M48.5,11.6 l-5.9,3.1 M19.1,12.8L9.7,5.1l1.1,7.7 M13.4,29.8l1,7.3l6.6,1.6 M11.6,18.4l1,6.1 M32.8,41.9 M26.6,40.4 M27.3,40.2l6.1,1.6 M49.9,52.1l-5.6-7.6l-4.9-1.2', // jshint ignore:line + lineX: 'M15.2,30 M19.7,15.6V1.9H29 M34.8,1.9H40.4 M55.3,15.6V1.9H45.9 M19.7,44.4V58.1H29 M34.8,58.1H40.4 M55.3,44.4 V58.1H45.9 M12.5,20.3l-9.4,9.6l9.6,9.8 M3.1,29.9h16.5 M62.5,20.3l9.4,9.6L62.3,39.7 M71.9,29.9H55.4', // jshint ignore:line + lineY: 'M38.8,7.7 M52.7,12h13.2v9 M65.9,26.6V32 M52.7,46.3h13.2v-9 M24.9,12H11.8v9 M11.8,26.6V32 M24.9,46.3H11.8v-9 M48.2,5.1l-9.3-9l-9.4,9.2 M38.9-3.9V12 M48.2,53.3l-9.3,9l-9.4-9.2 M38.9,62.3V46.4', // jshint ignore:line + keep: 'M4,10.5V1h10.3 M20.7,1h6.1 M33,1h6.1 M55.4,10.5V1H45.2 M4,17.3v6.6 M55.6,17.3v6.6 M4,30.5V40h10.3 M20.7,40 h6.1 M33,40h6.1 M55.4,30.5V40H45.2 M21,18.9h62.9v48.6H21V18.9z', // jshint ignore:line + clear: 'M22,14.7l30.9,31 M52.9,14.7L22,45.7 M4.7,16.8V4.2h13.1 M26,4.2h7.8 M41.6,4.2h7.8 M70.3,16.8V4.2H57.2 M4.7,25.9v8.6 M70.3,25.9v8.6 M4.7,43.2v12.6h13.1 M26,55.8h7.8 M41.6,55.8h7.8 M70.3,43.2v12.6H57.2' // jshint ignore:line + }, + // `rect`, `polygon`, `lineX`, `lineY`, `keep`, `clear` + title: clone(brushLang.title) +}; + +var proto$3 = Brush.prototype; + +// proto.updateLayout = function (featureModel, ecModel, api) { +proto$3.render = +proto$3.updateView = function (featureModel, ecModel, api) { + var brushType; + var brushMode; + var isBrushed; + + ecModel.eachComponent({mainType: 'brush'}, function (brushModel) { + brushType = brushModel.brushType; + brushMode = brushModel.brushOption.brushMode || 'single'; + isBrushed |= brushModel.areas.length; + }); + this._brushType = brushType; + this._brushMode = brushMode; + + each$1(featureModel.get('type', true), function (type) { + featureModel.setIconStatus( + type, + ( + type === 'keep' + ? brushMode === 'multiple' + : type === 'clear' + ? isBrushed + : type === brushType + ) ? 'emphasis' : 'normal' + ); + }); +}; + +proto$3.getIcons = function () { + var model = this.model; + var availableIcons = model.get('icon', true); + var icons = {}; + each$1(model.get('type', true), function (type) { + if (availableIcons[type]) { + icons[type] = availableIcons[type]; + } + }); + return icons; +}; + +proto$3.onclick = function (ecModel, api, type) { + var brushType = this._brushType; + var brushMode = this._brushMode; + + if (type === 'clear') { + // Trigger parallel action firstly + api.dispatchAction({ + type: 'axisAreaSelect', + intervals: [] + }); + + api.dispatchAction({ + type: 'brush', + command: 'clear', + // Clear all areas of all brush components. + areas: [] + }); + } + else { + api.dispatchAction({ + type: 'takeGlobalCursor', + key: 'brush', + brushOption: { + brushType: type === 'keep' + ? brushType + : (brushType === type ? false : type), + brushMode: type === 'keep' + ? (brushMode === 'multiple' ? 'single' : 'multiple') + : brushMode + } + }); + } +}; + +register$1('brush', Brush); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Brush component entry + */ + +registerPreprocessor(preprocessor$1); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// (24*60*60*1000) +var PROXIMATE_ONE_DAY = 86400000; + +/** + * Calendar + * + * @constructor + * + * @param {Object} calendarModel calendarModel + * @param {Object} ecModel ecModel + * @param {Object} api api + */ +function Calendar(calendarModel, ecModel, api) { + this._model = calendarModel; +} + +Calendar.prototype = { + + constructor: Calendar, + + type: 'calendar', + + dimensions: ['time', 'value'], + + // Required in createListFromData + getDimensionsInfo: function () { + return [{name: 'time', type: 'time'}, 'value']; + }, + + getRangeInfo: function () { + return this._rangeInfo; + }, + + getModel: function () { + return this._model; + }, + + getRect: function () { + return this._rect; + }, + + getCellWidth: function () { + return this._sw; + }, + + getCellHeight: function () { + return this._sh; + }, + + getOrient: function () { + return this._orient; + }, + + /** + * getFirstDayOfWeek + * + * @example + * 0 : start at Sunday + * 1 : start at Monday + * + * @return {number} + */ + getFirstDayOfWeek: function () { + return this._firstDayOfWeek; + }, + + /** + * get date info + * + * @param {string|number} date date + * @return {Object} + * { + * y: string, local full year, eg., '1940', + * m: string, local month, from '01' ot '12', + * d: string, local date, from '01' to '31' (if exists), + * day: It is not date.getDay(). It is the location of the cell in a week, from 0 to 6, + * time: timestamp, + * formatedDate: string, yyyy-MM-dd, + * date: original date object. + * } + */ + getDateInfo: function (date) { + + date = parseDate(date); + + var y = date.getFullYear(); + + var m = date.getMonth() + 1; + m = m < 10 ? '0' + m : m; + + var d = date.getDate(); + d = d < 10 ? '0' + d : d; + + var day = date.getDay(); + + day = Math.abs((day + 7 - this.getFirstDayOfWeek()) % 7); + + return { + y: y, + m: m, + d: d, + day: day, + time: date.getTime(), + formatedDate: y + '-' + m + '-' + d, + date: date + }; + }, + + getNextNDay: function (date, n) { + n = n || 0; + if (n === 0) { + return this.getDateInfo(date); + } + + date = new Date(this.getDateInfo(date).time); + date.setDate(date.getDate() + n); + + return this.getDateInfo(date); + }, + + update: function (ecModel, api) { + + this._firstDayOfWeek = +this._model.getModel('dayLabel').get('firstDay'); + this._orient = this._model.get('orient'); + this._lineWidth = this._model.getModel('itemStyle').getItemStyle().lineWidth || 0; + + + this._rangeInfo = this._getRangeInfo(this._initRangeOption()); + var weeks = this._rangeInfo.weeks || 1; + var whNames = ['width', 'height']; + var cellSize = this._model.get('cellSize').slice(); + var layoutParams = this._model.getBoxLayoutParams(); + var cellNumbers = this._orient === 'horizontal' ? [weeks, 7] : [7, weeks]; + + each$1([0, 1], function (idx) { + if (cellSizeSpecified(cellSize, idx)) { + layoutParams[whNames[idx]] = cellSize[idx] * cellNumbers[idx]; + } + }); + + var whGlobal = { + width: api.getWidth(), + height: api.getHeight() + }; + var calendarRect = this._rect = getLayoutRect(layoutParams, whGlobal); + + each$1([0, 1], function (idx) { + if (!cellSizeSpecified(cellSize, idx)) { + cellSize[idx] = calendarRect[whNames[idx]] / cellNumbers[idx]; + } + }); + + function cellSizeSpecified(cellSize, idx) { + return cellSize[idx] != null && cellSize[idx] !== 'auto'; + } + + this._sw = cellSize[0]; + this._sh = cellSize[1]; + }, + + + /** + * Convert a time data(time, value) item to (x, y) point. + * + * @override + * @param {Array|number} data data + * @param {boolean} [clamp=true] out of range + * @return {Array} point + */ + dataToPoint: function (data, clamp) { + isArray(data) && (data = data[0]); + clamp == null && (clamp = true); + + var dayInfo = this.getDateInfo(data); + var range = this._rangeInfo; + var date = dayInfo.formatedDate; + + // if not in range return [NaN, NaN] + if (clamp && !( + dayInfo.time >= range.start.time + && dayInfo.time < range.end.time + PROXIMATE_ONE_DAY + )) { + return [NaN, NaN]; + } + + var week = dayInfo.day; + var nthWeek = this._getRangeInfo([range.start.time, date]).nthWeek; + + if (this._orient === 'vertical') { + return [ + this._rect.x + week * this._sw + this._sw / 2, + this._rect.y + nthWeek * this._sh + this._sh / 2 + ]; + + } + + return [ + this._rect.x + nthWeek * this._sw + this._sw / 2, + this._rect.y + week * this._sh + this._sh / 2 + ]; + + }, + + /** + * Convert a (x, y) point to time data + * + * @override + * @param {string} point point + * @return {string} data + */ + pointToData: function (point) { + + var date = this.pointToDate(point); + + return date && date.time; + }, + + /** + * Convert a time date item to (x, y) four point. + * + * @param {Array} data date[0] is date + * @param {boolean} [clamp=true] out of range + * @return {Object} point + */ + dataToRect: function (data, clamp) { + var point = this.dataToPoint(data, clamp); + + return { + contentShape: { + x: point[0] - (this._sw - this._lineWidth) / 2, + y: point[1] - (this._sh - this._lineWidth) / 2, + width: this._sw - this._lineWidth, + height: this._sh - this._lineWidth + }, + + center: point, + + tl: [ + point[0] - this._sw / 2, + point[1] - this._sh / 2 + ], + + tr: [ + point[0] + this._sw / 2, + point[1] - this._sh / 2 + ], + + br: [ + point[0] + this._sw / 2, + point[1] + this._sh / 2 + ], + + bl: [ + point[0] - this._sw / 2, + point[1] + this._sh / 2 + ] + + }; + }, + + /** + * Convert a (x, y) point to time date + * + * @param {Array} point point + * @return {Object} date + */ + pointToDate: function (point) { + var nthX = Math.floor((point[0] - this._rect.x) / this._sw) + 1; + var nthY = Math.floor((point[1] - this._rect.y) / this._sh) + 1; + var range = this._rangeInfo.range; + + if (this._orient === 'vertical') { + return this._getDateByWeeksAndDay(nthY, nthX - 1, range); + } + + return this._getDateByWeeksAndDay(nthX, nthY - 1, range); + }, + + /** + * @inheritDoc + */ + convertToPixel: curry(doConvert$2, 'dataToPoint'), + + /** + * @inheritDoc + */ + convertFromPixel: curry(doConvert$2, 'pointToData'), + + /** + * initRange + * + * @private + * @return {Array} [start, end] + */ + _initRangeOption: function () { + var range = this._model.get('range'); + + var rg = range; + + if (isArray(rg) && rg.length === 1) { + rg = rg[0]; + } + + if (/^\d{4}$/.test(rg)) { + range = [rg + '-01-01', rg + '-12-31']; + } + + if (/^\d{4}[\/|-]\d{1,2}$/.test(rg)) { + + var start = this.getDateInfo(rg); + var firstDay = start.date; + firstDay.setMonth(firstDay.getMonth() + 1); + + var end = this.getNextNDay(firstDay, -1); + range = [start.formatedDate, end.formatedDate]; + } + + if (/^\d{4}[\/|-]\d{1,2}[\/|-]\d{1,2}$/.test(rg)) { + range = [rg, rg]; + } + + var tmp = this._getRangeInfo(range); + + if (tmp.start.time > tmp.end.time) { + range.reverse(); + } + + return range; + }, + + /** + * range info + * + * @private + * @param {Array} range range ['2017-01-01', '2017-07-08'] + * If range[0] > range[1], they will not be reversed. + * @return {Object} obj + */ + _getRangeInfo: function (range) { + range = [ + this.getDateInfo(range[0]), + this.getDateInfo(range[1]) + ]; + + var reversed; + if (range[0].time > range[1].time) { + reversed = true; + range.reverse(); + } + + var allDay = Math.floor(range[1].time / PROXIMATE_ONE_DAY) + - Math.floor(range[0].time / PROXIMATE_ONE_DAY) + 1; + + // Consider case: + // Firstly set system timezone as "Time Zone: America/Toronto", + // ``` + // var first = new Date(1478412000000 - 3600 * 1000 * 2.5); + // var second = new Date(1478412000000); + // var allDays = Math.floor(second / ONE_DAY) - Math.floor(first / ONE_DAY) + 1; + // ``` + // will get wrong result because of DST. So we should fix it. + var date = new Date(range[0].time); + var startDateNum = date.getDate(); + var endDateNum = range[1].date.getDate(); + date.setDate(startDateNum + allDay - 1); + // The bias can not over a month, so just compare date. + if (date.getDate() !== endDateNum) { + var sign = date.getTime() - range[1].time > 0 ? 1 : -1; + while (date.getDate() !== endDateNum && (date.getTime() - range[1].time) * sign > 0) { + allDay -= sign; + date.setDate(startDateNum + allDay - 1); + } + } + + var weeks = Math.floor((allDay + range[0].day + 6) / 7); + var nthWeek = reversed ? -weeks + 1: weeks - 1; + + reversed && range.reverse(); + + return { + range: [range[0].formatedDate, range[1].formatedDate], + start: range[0], + end: range[1], + allDay: allDay, + weeks: weeks, + // From 0. + nthWeek: nthWeek, + fweek: range[0].day, + lweek: range[1].day + }; + }, + + /** + * get date by nthWeeks and week day in range + * + * @private + * @param {number} nthWeek the week + * @param {number} day the week day + * @param {Array} range [d1, d2] + * @return {Object} + */ + _getDateByWeeksAndDay: function (nthWeek, day, range) { + var rangeInfo = this._getRangeInfo(range); + + if (nthWeek > rangeInfo.weeks + || (nthWeek === 0 && day < rangeInfo.fweek) + || (nthWeek === rangeInfo.weeks && day > rangeInfo.lweek) + ) { + return false; + } + + var nthDay = (nthWeek - 1) * 7 - rangeInfo.fweek + day; + var date = new Date(rangeInfo.start.time); + date.setDate(rangeInfo.start.d + nthDay); + + return this.getDateInfo(date); + } +}; + +Calendar.dimensions = Calendar.prototype.dimensions; + +Calendar.getDimensionsInfo = Calendar.prototype.getDimensionsInfo; + +Calendar.create = function (ecModel, api) { + var calendarList = []; + + ecModel.eachComponent('calendar', function (calendarModel) { + var calendar = new Calendar(calendarModel, ecModel, api); + calendarList.push(calendar); + calendarModel.coordinateSystem = calendar; + }); + + ecModel.eachSeries(function (calendarSeries) { + if (calendarSeries.get('coordinateSystem') === 'calendar') { + // Inject coordinate system + calendarSeries.coordinateSystem = calendarList[calendarSeries.get('calendarIndex') || 0]; + } + }); + return calendarList; +}; + +function doConvert$2(methodName, ecModel, finder, value) { + var calendarModel = finder.calendarModel; + var seriesModel = finder.seriesModel; + + var coordSys = calendarModel + ? calendarModel.coordinateSystem + : seriesModel + ? seriesModel.coordinateSystem + : null; + + return coordSys === this ? coordSys[methodName](value) : null; +} + +CoordinateSystemManager.register('calendar', Calendar); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var CalendarModel = ComponentModel.extend({ + + type: 'calendar', + + /** + * @type {module:echarts/coord/calendar/Calendar} + */ + coordinateSystem: null, + + defaultOption: { + zlevel: 0, + z: 2, + left: 80, + top: 60, + + cellSize: 20, + + // horizontal vertical + orient: 'horizontal', + + // month separate line style + splitLine: { + show: true, + lineStyle: { + color: '#000', + width: 1, + type: 'solid' + } + }, + + // rect style temporarily unused emphasis + itemStyle: { + color: '#fff', + borderWidth: 1, + borderColor: '#ccc' + }, + + // week text style + dayLabel: { + show: true, + + // a week first day + firstDay: 0, + + // start end + position: 'start', + margin: '50%', // 50% of cellSize + nameMap: 'en', + color: '#000' + }, + + // month text style + monthLabel: { + show: true, + + // start end + position: 'start', + margin: 5, + + // center or left + align: 'center', + + // cn en [] + nameMap: 'en', + formatter: null, + color: '#000' + }, + + // year text style + yearLabel: { + show: true, + + // top bottom left right + position: null, + margin: 30, + formatter: null, + color: '#ccc', + fontFamily: 'sans-serif', + fontWeight: 'bolder', + fontSize: 20 + } + }, + + /** + * @override + */ + init: function (option, parentModel, ecModel, extraOpt) { + var inputPositionParams = getLayoutParams(option); + + CalendarModel.superApply(this, 'init', arguments); + + mergeAndNormalizeLayoutParams$1(option, inputPositionParams); + }, + + /** + * @override + */ + mergeOption: function (option, extraOpt) { + CalendarModel.superApply(this, 'mergeOption', arguments); + + mergeAndNormalizeLayoutParams$1(this.option, option); + } +}); + +function mergeAndNormalizeLayoutParams$1(target, raw) { + // Normalize cellSize + var cellSize = target.cellSize; + + if (!isArray(cellSize)) { + cellSize = target.cellSize = [cellSize, cellSize]; + } + else if (cellSize.length === 1) { + cellSize[1] = cellSize[0]; + } + + var ignoreSize = map([0, 1], function (hvIdx) { + // If user have set `width` or both `left` and `right`, cellSize + // will be automatically set to 'auto', otherwise the default + // setting of cellSize will make `width` setting not work. + if (sizeCalculable(raw, hvIdx)) { + cellSize[hvIdx] = 'auto'; + } + return cellSize[hvIdx] != null && cellSize[hvIdx] !== 'auto'; + }); + + mergeLayoutParam(target, raw, { + type: 'box', ignoreSize: ignoreSize + }); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var MONTH_TEXT = { + EN: [ + 'Jan', 'Feb', 'Mar', + 'Apr', 'May', 'Jun', + 'Jul', 'Aug', 'Sep', + 'Oct', 'Nov', 'Dec' + ], + CN: [ + '一月', '二月', '三月', + '四月', '五月', '六月', + '七月', '八月', '九月', + '十月', '十一月', '十二月' + ] +}; + +var WEEK_TEXT = { + EN: ['S', 'M', 'T', 'W', 'T', 'F', 'S'], + CN: ['日', '一', '二', '三', '四', '五', '六'] +}; + +extendComponentView({ + + type: 'calendar', + + /** + * top/left line points + * @private + */ + _tlpoints: null, + + /** + * bottom/right line points + * @private + */ + _blpoints: null, + + /** + * first day of month + * @private + */ + _firstDayOfMonth: null, + + /** + * first day point of month + * @private + */ + _firstDayPoints: null, + + render: function (calendarModel, ecModel, api) { + + var group = this.group; + + group.removeAll(); + + var coordSys = calendarModel.coordinateSystem; + + // range info + var rangeData = coordSys.getRangeInfo(); + var orient = coordSys.getOrient(); + + this._renderDayRect(calendarModel, rangeData, group); + + // _renderLines must be called prior to following function + this._renderLines(calendarModel, rangeData, orient, group); + + this._renderYearText(calendarModel, rangeData, orient, group); + + this._renderMonthText(calendarModel, orient, group); + + this._renderWeekText(calendarModel, rangeData, orient, group); + }, + + // render day rect + _renderDayRect: function (calendarModel, rangeData, group) { + var coordSys = calendarModel.coordinateSystem; + var itemRectStyleModel = calendarModel.getModel('itemStyle').getItemStyle(); + var sw = coordSys.getCellWidth(); + var sh = coordSys.getCellHeight(); + + for (var i = rangeData.start.time; + i <= rangeData.end.time; + i = coordSys.getNextNDay(i, 1).time + ) { + + var point = coordSys.dataToRect([i], false).tl; + + // every rect + var rect = new Rect({ + shape: { + x: point[0], + y: point[1], + width: sw, + height: sh + }, + cursor: 'default', + style: itemRectStyleModel + }); + + group.add(rect); + } + + }, + + // render separate line + _renderLines: function (calendarModel, rangeData, orient, group) { + + var self = this; + + var coordSys = calendarModel.coordinateSystem; + + var lineStyleModel = calendarModel.getModel('splitLine.lineStyle').getLineStyle(); + var show = calendarModel.get('splitLine.show'); + + var lineWidth = lineStyleModel.lineWidth; + + this._tlpoints = []; + this._blpoints = []; + this._firstDayOfMonth = []; + this._firstDayPoints = []; + + + var firstDay = rangeData.start; + + for (var i = 0; firstDay.time <= rangeData.end.time; i++) { + addPoints(firstDay.formatedDate); + + if (i === 0) { + firstDay = coordSys.getDateInfo(rangeData.start.y + '-' + rangeData.start.m); + } + + var date = firstDay.date; + date.setMonth(date.getMonth() + 1); + firstDay = coordSys.getDateInfo(date); + } + + addPoints(coordSys.getNextNDay(rangeData.end.time, 1).formatedDate); + + function addPoints(date) { + + self._firstDayOfMonth.push(coordSys.getDateInfo(date)); + self._firstDayPoints.push(coordSys.dataToRect([date], false).tl); + + var points = self._getLinePointsOfOneWeek(calendarModel, date, orient); + + self._tlpoints.push(points[0]); + self._blpoints.push(points[points.length - 1]); + + show && self._drawSplitline(points, lineStyleModel, group); + } + + + // render top/left line + show && this._drawSplitline(self._getEdgesPoints(self._tlpoints, lineWidth, orient), lineStyleModel, group); + + // render bottom/right line + show && this._drawSplitline(self._getEdgesPoints(self._blpoints, lineWidth, orient), lineStyleModel, group); + + }, + + // get points at both ends + _getEdgesPoints: function (points, lineWidth, orient) { + var rs = [points[0].slice(), points[points.length - 1].slice()]; + var idx = orient === 'horizontal' ? 0 : 1; + + // both ends of the line are extend half lineWidth + rs[0][idx] = rs[0][idx] - lineWidth / 2; + rs[1][idx] = rs[1][idx] + lineWidth / 2; + + return rs; + }, + + // render split line + _drawSplitline: function (points, lineStyleModel, group) { + + var poyline = new Polyline({ + z2: 20, + shape: { + points: points + }, + style: lineStyleModel + }); + + group.add(poyline); + }, + + // render month line of one week points + _getLinePointsOfOneWeek: function (calendarModel, date, orient) { + + var coordSys = calendarModel.coordinateSystem; + date = coordSys.getDateInfo(date); + + var points = []; + + for (var i = 0; i < 7; i++) { + + var tmpD = coordSys.getNextNDay(date.time, i); + var point = coordSys.dataToRect([tmpD.time], false); + + points[2 * tmpD.day] = point.tl; + points[2 * tmpD.day + 1] = point[orient === 'horizontal' ? 'bl' : 'tr']; + } + + return points; + + }, + + _formatterLabel: function (formatter, params) { + + if (typeof formatter === 'string' && formatter) { + return formatTplSimple(formatter, params); + } + + if (typeof formatter === 'function') { + return formatter(params); + } + + return params.nameMap; + + }, + + _yearTextPositionControl: function (textEl, point, orient, position, margin) { + + point = point.slice(); + var aligns = ['center', 'bottom']; + + if (position === 'bottom') { + point[1] += margin; + aligns = ['center', 'top']; + } + else if (position === 'left') { + point[0] -= margin; + } + else if (position === 'right') { + point[0] += margin; + aligns = ['center', 'top']; + } + else { // top + point[1] -= margin; + } + + var rotate = 0; + if (position === 'left' || position === 'right') { + rotate = Math.PI / 2; + } + + return { + rotation: rotate, + position: point, + style: { + textAlign: aligns[0], + textVerticalAlign: aligns[1] + } + }; + }, + + // render year + _renderYearText: function (calendarModel, rangeData, orient, group) { + var yearLabel = calendarModel.getModel('yearLabel'); + + if (!yearLabel.get('show')) { + return; + } + + var margin = yearLabel.get('margin'); + var pos = yearLabel.get('position'); + + if (!pos) { + pos = orient !== 'horizontal' ? 'top' : 'left'; + } + + var points = [this._tlpoints[this._tlpoints.length - 1], this._blpoints[0]]; + var xc = (points[0][0] + points[1][0]) / 2; + var yc = (points[0][1] + points[1][1]) / 2; + + var idx = orient === 'horizontal' ? 0 : 1; + + var posPoints = { + top: [xc, points[idx][1]], + bottom: [xc, points[1 - idx][1]], + left: [points[1 - idx][0], yc], + right: [points[idx][0], yc] + }; + + var name = rangeData.start.y; + + if (+rangeData.end.y > +rangeData.start.y) { + name = name + '-' + rangeData.end.y; + } + + var formatter = yearLabel.get('formatter'); + + var params = { + start: rangeData.start.y, + end: rangeData.end.y, + nameMap: name + }; + + var content = this._formatterLabel(formatter, params); + + var yearText = new Text({z2: 30}); + setTextStyle(yearText.style, yearLabel, {text: content}), + yearText.attr(this._yearTextPositionControl(yearText, posPoints[pos], orient, pos, margin)); + + group.add(yearText); + }, + + _monthTextPositionControl: function (point, isCenter, orient, position, margin) { + var align = 'left'; + var vAlign = 'top'; + var x = point[0]; + var y = point[1]; + + if (orient === 'horizontal') { + y = y + margin; + + if (isCenter) { + align = 'center'; + } + + if (position === 'start') { + vAlign = 'bottom'; + } + } + else { + x = x + margin; + + if (isCenter) { + vAlign = 'middle'; + } + + if (position === 'start') { + align = 'right'; + } + } + + return { + x: x, + y: y, + textAlign: align, + textVerticalAlign: vAlign + }; + }, + + // render month and year text + _renderMonthText: function (calendarModel, orient, group) { + var monthLabel = calendarModel.getModel('monthLabel'); + + if (!monthLabel.get('show')) { + return; + } + + var nameMap = monthLabel.get('nameMap'); + var margin = monthLabel.get('margin'); + var pos = monthLabel.get('position'); + var align = monthLabel.get('align'); + + var termPoints = [this._tlpoints, this._blpoints]; + + if (isString(nameMap)) { + nameMap = MONTH_TEXT[nameMap.toUpperCase()] || []; + } + + var idx = pos === 'start' ? 0 : 1; + var axis = orient === 'horizontal' ? 0 : 1; + margin = pos === 'start' ? -margin : margin; + var isCenter = (align === 'center'); + + for (var i = 0; i < termPoints[idx].length - 1; i++) { + + var tmp = termPoints[idx][i].slice(); + var firstDay = this._firstDayOfMonth[i]; + + if (isCenter) { + var firstDayPoints = this._firstDayPoints[i]; + tmp[axis] = (firstDayPoints[axis] + termPoints[0][i + 1][axis]) / 2; + } + + var formatter = monthLabel.get('formatter'); + var name = nameMap[+firstDay.m - 1]; + var params = { + yyyy: firstDay.y, + yy: (firstDay.y + '').slice(2), + MM: firstDay.m, + M: +firstDay.m, + nameMap: name + }; + + var content = this._formatterLabel(formatter, params); + + var monthText = new Text({z2: 30}); + extend( + setTextStyle(monthText.style, monthLabel, {text: content}), + this._monthTextPositionControl(tmp, isCenter, orient, pos, margin) + ); + + group.add(monthText); + } + }, + + _weekTextPositionControl: function (point, orient, position, margin, cellSize) { + var align = 'center'; + var vAlign = 'middle'; + var x = point[0]; + var y = point[1]; + var isStart = position === 'start'; + + if (orient === 'horizontal') { + x = x + margin + (isStart ? 1 : -1) * cellSize[0] / 2; + align = isStart ? 'right' : 'left'; + } + else { + y = y + margin + (isStart ? 1 : -1) * cellSize[1] / 2; + vAlign = isStart ? 'bottom' : 'top'; + } + + return { + x: x, + y: y, + textAlign: align, + textVerticalAlign: vAlign + }; + }, + + // render weeks + _renderWeekText: function (calendarModel, rangeData, orient, group) { + var dayLabel = calendarModel.getModel('dayLabel'); + + if (!dayLabel.get('show')) { + return; + } + + var coordSys = calendarModel.coordinateSystem; + var pos = dayLabel.get('position'); + var nameMap = dayLabel.get('nameMap'); + var margin = dayLabel.get('margin'); + var firstDayOfWeek = coordSys.getFirstDayOfWeek(); + + if (isString(nameMap)) { + nameMap = WEEK_TEXT[nameMap.toUpperCase()] || []; + } + + var start = coordSys.getNextNDay( + rangeData.end.time, (7 - rangeData.lweek) + ).time; + + var cellSize = [coordSys.getCellWidth(), coordSys.getCellHeight()]; + margin = parsePercent$1(margin, cellSize[orient === 'horizontal' ? 0 : 1]); + + if (pos === 'start') { + start = coordSys.getNextNDay( + rangeData.start.time, -(7 + rangeData.fweek) + ).time; + margin = -margin; + } + + for (var i = 0; i < 7; i++) { + + var tmpD = coordSys.getNextNDay(start, i); + var point = coordSys.dataToRect([tmpD.time], false).center; + var day = i; + day = Math.abs((i + firstDayOfWeek) % 7); + var weekText = new Text({z2: 30}); + + extend( + setTextStyle(weekText.style, dayLabel, {text: nameMap[day]}), + this._weekTextPositionControl(point, orient, pos, margin, cellSize) + ); + group.add(weekText); + } + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @file calendar.js + * @author dxh + */ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// Model +extendComponentModel({ + + type: 'title', + + layoutMode: {type: 'box', ignoreSize: true}, + + defaultOption: { + // 一级层叠 + zlevel: 0, + // 二级层叠 + z: 6, + show: true, + + text: '', + // 超链接跳转 + // link: null, + // 仅支持self | blank + target: 'blank', + subtext: '', + + // 超链接跳转 + // sublink: null, + // 仅支持self | blank + subtarget: 'blank', + + // 'center' ¦ 'left' ¦ 'right' + // ¦ {number}(x坐标,单位px) + left: 0, + // 'top' ¦ 'bottom' ¦ 'center' + // ¦ {number}(y坐标,单位px) + top: 0, + + // 水平对齐 + // 'auto' | 'left' | 'right' | 'center' + // 默认根据 left 的位置判断是左对齐还是右对齐 + // textAlign: null + // + // 垂直对齐 + // 'auto' | 'top' | 'bottom' | 'middle' + // 默认根据 top 位置判断是上对齐还是下对齐 + // textBaseline: null + + backgroundColor: 'rgba(0,0,0,0)', + + // 标题边框颜色 + borderColor: '#ccc', + + // 标题边框线宽,单位px,默认为0(无边框) + borderWidth: 0, + + // 标题内边距,单位px,默认各方向内边距为5, + // 接受数组分别设定上右下左边距,同css + padding: 5, + + // 主副标题纵向间隔,单位px,默认为10, + itemGap: 10, + textStyle: { + fontSize: 18, + fontWeight: 'bolder', + color: '#333' + }, + subtextStyle: { + color: '#aaa' + } + } +}); + +// View +extendComponentView({ + + type: 'title', + + render: function (titleModel, ecModel, api) { + this.group.removeAll(); + + if (!titleModel.get('show')) { + return; + } + + var group = this.group; + + var textStyleModel = titleModel.getModel('textStyle'); + var subtextStyleModel = titleModel.getModel('subtextStyle'); + + var textAlign = titleModel.get('textAlign'); + var textBaseline = titleModel.get('textBaseline'); + + var textEl = new Text({ + style: setTextStyle({}, textStyleModel, { + text: titleModel.get('text'), + textFill: textStyleModel.getTextColor() + }, {disableBox: true}), + z2: 10 + }); + + var textRect = textEl.getBoundingRect(); + + var subText = titleModel.get('subtext'); + var subTextEl = new Text({ + style: setTextStyle({}, subtextStyleModel, { + text: subText, + textFill: subtextStyleModel.getTextColor(), + y: textRect.height + titleModel.get('itemGap'), + textVerticalAlign: 'top' + }, {disableBox: true}), + z2: 10 + }); + + var link = titleModel.get('link'); + var sublink = titleModel.get('sublink'); + + textEl.silent = !link; + subTextEl.silent = !sublink; + + if (link) { + textEl.on('click', function () { + window.open(link, '_' + titleModel.get('target')); + }); + } + if (sublink) { + subTextEl.on('click', function () { + window.open(sublink, '_' + titleModel.get('subtarget')); + }); + } + + group.add(textEl); + subText && group.add(subTextEl); + // If no subText, but add subTextEl, there will be an empty line. + + var groupRect = group.getBoundingRect(); + var layoutOption = titleModel.getBoxLayoutParams(); + layoutOption.width = groupRect.width; + layoutOption.height = groupRect.height; + var layoutRect = getLayoutRect( + layoutOption, { + width: api.getWidth(), + height: api.getHeight() + }, titleModel.get('padding') + ); + // Adjust text align based on position + if (!textAlign) { + // Align left if title is on the left. center and right is same + textAlign = titleModel.get('left') || titleModel.get('right'); + if (textAlign === 'middle') { + textAlign = 'center'; + } + // Adjust layout by text align + if (textAlign === 'right') { + layoutRect.x += layoutRect.width; + } + else if (textAlign === 'center') { + layoutRect.x += layoutRect.width / 2; + } + } + if (!textBaseline) { + textBaseline = titleModel.get('top') || titleModel.get('bottom'); + if (textBaseline === 'center') { + textBaseline = 'middle'; + } + if (textBaseline === 'bottom') { + layoutRect.y += layoutRect.height; + } + else if (textBaseline === 'middle') { + layoutRect.y += layoutRect.height / 2; + } + + textBaseline = textBaseline || 'top'; + } + + group.attr('position', [layoutRect.x, layoutRect.y]); + var alignStyle = { + textAlign: textAlign, + textVerticalAlign: textBaseline + }; + textEl.setStyle(alignStyle); + subTextEl.setStyle(alignStyle); + + // Render background + // Get groupRect again because textAlign has been changed + groupRect = group.getBoundingRect(); + var padding = layoutRect.margin; + var style = titleModel.getItemStyle(['color', 'opacity']); + style.fill = titleModel.get('backgroundColor'); + var rect = new Rect({ + shape: { + x: groupRect.x - padding[3], + y: groupRect.y - padding[0], + width: groupRect.width + padding[1] + padding[3], + height: groupRect.height + padding[0] + padding[2], + r: titleModel.get('borderRadius') + }, + style: style, + silent: true + }); + subPixelOptimizeRect(rect); + + group.add(rect); + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +ComponentModel.registerSubTypeDefaulter('dataZoom', function () { + // Default 'slider' when no type specified. + return 'slider'; +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var AXIS_DIMS = ['x', 'y', 'z', 'radius', 'angle', 'single']; +// Supported coords. +var COORDS = ['cartesian2d', 'polar', 'singleAxis']; + +/** + * @param {string} coordType + * @return {boolean} + */ +function isCoordSupported(coordType) { + return indexOf(COORDS, coordType) >= 0; +} + +/** + * Create "each" method to iterate names. + * + * @pubilc + * @param {Array.<string>} names + * @param {Array.<string>=} attrs + * @return {Function} + */ +function createNameEach(names, attrs) { + names = names.slice(); + var capitalNames = map(names, capitalFirst); + attrs = (attrs || []).slice(); + var capitalAttrs = map(attrs, capitalFirst); + + return function (callback, context) { + each$1(names, function (name, index) { + var nameObj = {name: name, capital: capitalNames[index]}; + + for (var j = 0; j < attrs.length; j++) { + nameObj[attrs[j]] = name + capitalAttrs[j]; + } + + callback.call(context, nameObj); + }); + }; +} + +/** + * Iterate each dimension name. + * + * @public + * @param {Function} callback The parameter is like: + * { + * name: 'angle', + * capital: 'Angle', + * axis: 'angleAxis', + * axisIndex: 'angleAixs', + * index: 'angleIndex' + * } + * @param {Object} context + */ +var eachAxisDim$1 = createNameEach(AXIS_DIMS, ['axisIndex', 'axis', 'index', 'id']); + +/** + * If tow dataZoomModels has the same axis controlled, we say that they are 'linked'. + * dataZoomModels and 'links' make up one or more graphics. + * This function finds the graphic where the source dataZoomModel is in. + * + * @public + * @param {Function} forEachNode Node iterator. + * @param {Function} forEachEdgeType edgeType iterator + * @param {Function} edgeIdGetter Giving node and edgeType, return an array of edge id. + * @return {Function} Input: sourceNode, Output: Like {nodes: [], dims: {}} + */ +function createLinkedNodesFinder(forEachNode, forEachEdgeType, edgeIdGetter) { + + return function (sourceNode) { + var result = { + nodes: [], + records: {} // key: edgeType.name, value: Object (key: edge id, value: boolean). + }; + + forEachEdgeType(function (edgeType) { + result.records[edgeType.name] = {}; + }); + + if (!sourceNode) { + return result; + } + + absorb(sourceNode, result); + + var existsLink; + do { + existsLink = false; + forEachNode(processSingleNode); + } + while (existsLink); + + function processSingleNode(node) { + if (!isNodeAbsorded(node, result) && isLinked(node, result)) { + absorb(node, result); + existsLink = true; + } + } + + return result; + }; + + function isNodeAbsorded(node, result) { + return indexOf(result.nodes, node) >= 0; + } + + function isLinked(node, result) { + var hasLink = false; + forEachEdgeType(function (edgeType) { + each$1(edgeIdGetter(node, edgeType) || [], function (edgeId) { + result.records[edgeType.name][edgeId] && (hasLink = true); + }); + }); + return hasLink; + } + + function absorb(node, result) { + result.nodes.push(node); + forEachEdgeType(function (edgeType) { + each$1(edgeIdGetter(node, edgeType) || [], function (edgeId) { + result.records[edgeType.name][edgeId] = true; + }); + }); + } +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var each$22 = each$1; +var asc$1 = asc; + +/** + * Operate single axis. + * One axis can only operated by one axis operator. + * Different dataZoomModels may be defined to operate the same axis. + * (i.e. 'inside' data zoom and 'slider' data zoom components) + * So dataZoomModels share one axisProxy in that case. + * + * @class + */ +var AxisProxy = function (dimName, axisIndex, dataZoomModel, ecModel) { + + /** + * @private + * @type {string} + */ + this._dimName = dimName; + + /** + * @private + */ + this._axisIndex = axisIndex; + + /** + * @private + * @type {Array.<number>} + */ + this._valueWindow; + + /** + * @private + * @type {Array.<number>} + */ + this._percentWindow; + + /** + * @private + * @type {Array.<number>} + */ + this._dataExtent; + + /** + * {minSpan, maxSpan, minValueSpan, maxValueSpan} + * @private + * @type {Object} + */ + this._minMaxSpan; + + /** + * @readOnly + * @type {module: echarts/model/Global} + */ + this.ecModel = ecModel; + + /** + * @private + * @type {module: echarts/component/dataZoom/DataZoomModel} + */ + this._dataZoomModel = dataZoomModel; + + // /** + // * @readOnly + // * @private + // */ + // this.hasSeriesStacked; +}; + +AxisProxy.prototype = { + + constructor: AxisProxy, + + /** + * Whether the axisProxy is hosted by dataZoomModel. + * + * @public + * @param {module: echarts/component/dataZoom/DataZoomModel} dataZoomModel + * @return {boolean} + */ + hostedBy: function (dataZoomModel) { + return this._dataZoomModel === dataZoomModel; + }, + + /** + * @return {Array.<number>} Value can only be NaN or finite value. + */ + getDataValueWindow: function () { + return this._valueWindow.slice(); + }, + + /** + * @return {Array.<number>} + */ + getDataPercentWindow: function () { + return this._percentWindow.slice(); + }, + + /** + * @public + * @param {number} axisIndex + * @return {Array} seriesModels + */ + getTargetSeriesModels: function () { + var seriesModels = []; + var ecModel = this.ecModel; + + ecModel.eachSeries(function (seriesModel) { + if (isCoordSupported(seriesModel.get('coordinateSystem'))) { + var dimName = this._dimName; + var axisModel = ecModel.queryComponents({ + mainType: dimName + 'Axis', + index: seriesModel.get(dimName + 'AxisIndex'), + id: seriesModel.get(dimName + 'AxisId') + })[0]; + if (this._axisIndex === (axisModel && axisModel.componentIndex)) { + seriesModels.push(seriesModel); + } + } + }, this); + + return seriesModels; + }, + + getAxisModel: function () { + return this.ecModel.getComponent(this._dimName + 'Axis', this._axisIndex); + }, + + getOtherAxisModel: function () { + var axisDim = this._dimName; + var ecModel = this.ecModel; + var axisModel = this.getAxisModel(); + var isCartesian = axisDim === 'x' || axisDim === 'y'; + var otherAxisDim; + var coordSysIndexName; + if (isCartesian) { + coordSysIndexName = 'gridIndex'; + otherAxisDim = axisDim === 'x' ? 'y' : 'x'; + } + else { + coordSysIndexName = 'polarIndex'; + otherAxisDim = axisDim === 'angle' ? 'radius' : 'angle'; + } + var foundOtherAxisModel; + ecModel.eachComponent(otherAxisDim + 'Axis', function (otherAxisModel) { + if ((otherAxisModel.get(coordSysIndexName) || 0) + === (axisModel.get(coordSysIndexName) || 0) + ) { + foundOtherAxisModel = otherAxisModel; + } + }); + return foundOtherAxisModel; + }, + + getMinMaxSpan: function () { + return clone(this._minMaxSpan); + }, + + /** + * Only calculate by given range and this._dataExtent, do not change anything. + * + * @param {Object} opt + * @param {number} [opt.start] + * @param {number} [opt.end] + * @param {number} [opt.startValue] + * @param {number} [opt.endValue] + */ + calculateDataWindow: function (opt) { + var dataExtent = this._dataExtent; + var axisModel = this.getAxisModel(); + var scale = axisModel.axis.scale; + var rangePropMode = this._dataZoomModel.getRangePropMode(); + var percentExtent = [0, 100]; + var percentWindow = [ + opt.start, + opt.end + ]; + var valueWindow = []; + + each$22(['startValue', 'endValue'], function (prop) { + valueWindow.push(opt[prop] != null ? scale.parse(opt[prop]) : null); + }); + + // Normalize bound. + each$22([0, 1], function (idx) { + var boundValue = valueWindow[idx]; + var boundPercent = percentWindow[idx]; + + // Notice: dataZoom is based either on `percentProp` ('start', 'end') or + // on `valueProp` ('startValue', 'endValue'). The former one is suitable + // for cases that a dataZoom component controls multiple axes with different + // unit or extent, and the latter one is suitable for accurate zoom by pixel + // (e.g., in dataZoomSelect). `valueProp` can be calculated from `percentProp`, + // but it is awkward that `percentProp` can not be obtained from `valueProp` + // accurately (because all of values that are overflow the `dataExtent` will + // be calculated to percent '100%'). So we have to use + // `dataZoom.getRangePropMode()` to mark which prop is used. + // `rangePropMode` is updated only when setOption or dispatchAction, otherwise + // it remains its original value. + + if (rangePropMode[idx] === 'percent') { + if (boundPercent == null) { + boundPercent = percentExtent[idx]; + } + // Use scale.parse to math round for category or time axis. + boundValue = scale.parse(linearMap( + boundPercent, percentExtent, dataExtent, true + )); + } + else { + // Calculating `percent` from `value` may be not accurate, because + // This calculation can not be inversed, because all of values that + // are overflow the `dataExtent` will be calculated to percent '100%' + boundPercent = linearMap( + boundValue, dataExtent, percentExtent, true + ); + } + + // valueWindow[idx] = round(boundValue); + // percentWindow[idx] = round(boundPercent); + valueWindow[idx] = boundValue; + percentWindow[idx] = boundPercent; + }); + + return { + valueWindow: asc$1(valueWindow), + percentWindow: asc$1(percentWindow) + }; + }, + + /** + * Notice: reset should not be called before series.restoreData() called, + * so it is recommanded to be called in "process stage" but not "model init + * stage". + * + * @param {module: echarts/component/dataZoom/DataZoomModel} dataZoomModel + */ + reset: function (dataZoomModel) { + if (dataZoomModel !== this._dataZoomModel) { + return; + } + + var targetSeries = this.getTargetSeriesModels(); + // Culculate data window and data extent, and record them. + this._dataExtent = calculateDataExtent(this, this._dimName, targetSeries); + + // this.hasSeriesStacked = false; + // each(targetSeries, function (series) { + // var data = series.getData(); + // var dataDim = data.mapDimension(this._dimName); + // var stackedDimension = data.getCalculationInfo('stackedDimension'); + // if (stackedDimension && stackedDimension === dataDim) { + // this.hasSeriesStacked = true; + // } + // }, this); + + var dataWindow = this.calculateDataWindow(dataZoomModel.option); + + this._valueWindow = dataWindow.valueWindow; + this._percentWindow = dataWindow.percentWindow; + + setMinMaxSpan(this); + + // Update axis setting then. + setAxisModel(this); + }, + + /** + * @param {module: echarts/component/dataZoom/DataZoomModel} dataZoomModel + */ + restore: function (dataZoomModel) { + if (dataZoomModel !== this._dataZoomModel) { + return; + } + + this._valueWindow = this._percentWindow = null; + setAxisModel(this, true); + }, + + /** + * @param {module: echarts/component/dataZoom/DataZoomModel} dataZoomModel + */ + filterData: function (dataZoomModel, api) { + if (dataZoomModel !== this._dataZoomModel) { + return; + } + + var axisDim = this._dimName; + var seriesModels = this.getTargetSeriesModels(); + var filterMode = dataZoomModel.get('filterMode'); + var valueWindow = this._valueWindow; + + if (filterMode === 'none') { + return; + } + + // FIXME + // Toolbox may has dataZoom injected. And if there are stacked bar chart + // with NaN data, NaN will be filtered and stack will be wrong. + // So we need to force the mode to be set empty. + // In fect, it is not a big deal that do not support filterMode-'filter' + // when using toolbox#dataZoom, utill tooltip#dataZoom support "single axis + // selection" some day, which might need "adapt to data extent on the + // otherAxis", which is disabled by filterMode-'empty'. + // But currently, stack has been fixed to based on value but not index, + // so this is not an issue any more. + // var otherAxisModel = this.getOtherAxisModel(); + // if (dataZoomModel.get('$fromToolbox') + // && otherAxisModel + // && otherAxisModel.hasSeriesStacked + // ) { + // filterMode = 'empty'; + // } + + // TODO + // filterMode 'weakFilter' and 'empty' is not optimized for huge data yet. + + // Process series data + each$22(seriesModels, function (seriesModel) { + var seriesData = seriesModel.getData(); + var dataDims = seriesData.mapDimension(axisDim, true); + + if (filterMode === 'weakFilter') { + seriesData.filterSelf(function (dataIndex) { + var leftOut; + var rightOut; + var hasValue; + for (var i = 0; i < dataDims.length; i++) { + var value = seriesData.get(dataDims[i], dataIndex); + var thisHasValue = !isNaN(value); + var thisLeftOut = value < valueWindow[0]; + var thisRightOut = value > valueWindow[1]; + if (thisHasValue && !thisLeftOut && !thisRightOut) { + return true; + } + thisHasValue && (hasValue = true); + thisLeftOut && (leftOut = true); + thisRightOut && (rightOut = true); + } + // If both left out and right out, do not filter. + return hasValue && leftOut && rightOut; + }); + } + else { + each$22(dataDims, function (dim) { + if (filterMode === 'empty') { + seriesModel.setData( + seriesData.map(dim, function (value) { + return !isInWindow(value) ? NaN : value; + }) + ); + } + else { + var range = {}; + range[dim] = valueWindow; + + // console.time('select'); + seriesData.selectRange(range); + // console.timeEnd('select'); + } + }); + } + + each$22(dataDims, function (dim) { + seriesData.setApproximateExtent(valueWindow, dim); + }); + }); + + function isInWindow(value) { + return value >= valueWindow[0] && value <= valueWindow[1]; + } + } +}; + +function calculateDataExtent(axisProxy, axisDim, seriesModels) { + var dataExtent = [Infinity, -Infinity]; + + each$22(seriesModels, function (seriesModel) { + var seriesData = seriesModel.getData(); + if (seriesData) { + each$22(seriesData.mapDimension(axisDim, true), function (dim) { + var seriesExtent = seriesData.getApproximateExtent(dim); + seriesExtent[0] < dataExtent[0] && (dataExtent[0] = seriesExtent[0]); + seriesExtent[1] > dataExtent[1] && (dataExtent[1] = seriesExtent[1]); + }); + } + }); + + if (dataExtent[1] < dataExtent[0]) { + dataExtent = [NaN, NaN]; + } + + // It is important to get "consistent" extent when more then one axes is + // controlled by a `dataZoom`, otherwise those axes will not be synchronized + // when zooming. But it is difficult to know what is "consistent", considering + // axes have different type or even different meanings (For example, two + // time axes are used to compare data of the same date in different years). + // So basically dataZoom just obtains extent by series.data (in category axis + // extent can be obtained from axis.data). + // Nevertheless, user can set min/max/scale on axes to make extent of axes + // consistent. + fixExtentByAxis(axisProxy, dataExtent); + + return dataExtent; +} + +function fixExtentByAxis(axisProxy, dataExtent) { + var axisModel = axisProxy.getAxisModel(); + var min = axisModel.getMin(true); + + // For category axis, if min/max/scale are not set, extent is determined + // by axis.data by default. + var isCategoryAxis = axisModel.get('type') === 'category'; + var axisDataLen = isCategoryAxis && axisModel.getCategories().length; + + if (min != null && min !== 'dataMin' && typeof min !== 'function') { + dataExtent[0] = min; + } + else if (isCategoryAxis) { + dataExtent[0] = axisDataLen > 0 ? 0 : NaN; + } + + var max = axisModel.getMax(true); + if (max != null && max !== 'dataMax' && typeof max !== 'function') { + dataExtent[1] = max; + } + else if (isCategoryAxis) { + dataExtent[1] = axisDataLen > 0 ? axisDataLen - 1 : NaN; + } + + if (!axisModel.get('scale', true)) { + dataExtent[0] > 0 && (dataExtent[0] = 0); + dataExtent[1] < 0 && (dataExtent[1] = 0); + } + + // For value axis, if min/max/scale are not set, we just use the extent obtained + // by series data, which may be a little different from the extent calculated by + // `axisHelper.getScaleExtent`. But the different just affects the experience a + // little when zooming. So it will not be fixed until some users require it strongly. + + return dataExtent; +} + +function setAxisModel(axisProxy, isRestore) { + var axisModel = axisProxy.getAxisModel(); + + var percentWindow = axisProxy._percentWindow; + var valueWindow = axisProxy._valueWindow; + + if (!percentWindow) { + return; + } + + // [0, 500]: arbitrary value, guess axis extent. + var precision = getPixelPrecision(valueWindow, [0, 500]); + precision = Math.min(precision, 20); + // isRestore or isFull + var useOrigin = isRestore || (percentWindow[0] === 0 && percentWindow[1] === 100); + + axisModel.setRange( + useOrigin ? null : +valueWindow[0].toFixed(precision), + useOrigin ? null : +valueWindow[1].toFixed(precision) + ); +} + +function setMinMaxSpan(axisProxy) { + var minMaxSpan = axisProxy._minMaxSpan = {}; + var dataZoomModel = axisProxy._dataZoomModel; + + each$22(['min', 'max'], function (minMax) { + minMaxSpan[minMax + 'Span'] = dataZoomModel.get(minMax + 'Span'); + + // minValueSpan and maxValueSpan has higher priority than minSpan and maxSpan + var valueSpan = dataZoomModel.get(minMax + 'ValueSpan'); + + if (valueSpan != null) { + minMaxSpan[minMax + 'ValueSpan'] = valueSpan; + valueSpan = axisProxy.getAxisModel().axis.scale.parse(valueSpan); + + if (valueSpan != null) { + var dataExtent = axisProxy._dataExtent; + minMaxSpan[minMax + 'Span'] = linearMap( + dataExtent[0] + valueSpan, dataExtent, [0, 100], true + ); + } + } + }); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var each$21 = each$1; +var eachAxisDim = eachAxisDim$1; + +var DataZoomModel = extendComponentModel({ + + type: 'dataZoom', + + dependencies: [ + 'xAxis', 'yAxis', 'zAxis', 'radiusAxis', 'angleAxis', 'singleAxis', 'series' + ], + + /** + * @protected + */ + defaultOption: { + zlevel: 0, + z: 4, // Higher than normal component (z: 2). + orient: null, // Default auto by axisIndex. Possible value: 'horizontal', 'vertical'. + xAxisIndex: null, // Default the first horizontal category axis. + yAxisIndex: null, // Default the first vertical category axis. + + filterMode: 'filter', // Possible values: 'filter' or 'empty' or 'weakFilter'. + // 'filter': data items which are out of window will be removed. This option is + // applicable when filtering outliers. For each data item, it will be + // filtered if one of the relevant dimensions is out of the window. + // 'weakFilter': data items which are out of window will be removed. This option + // is applicable when filtering outliers. For each data item, it will be + // filtered only if all of the relevant dimensions are out of the same + // side of the window. + // 'empty': data items which are out of window will be set to empty. + // This option is applicable when user should not neglect + // that there are some data items out of window. + // 'none': Do not filter. + // Taking line chart as an example, line will be broken in + // the filtered points when filterModel is set to 'empty', but + // be connected when set to 'filter'. + + throttle: null, // Dispatch action by the fixed rate, avoid frequency. + // default 100. Do not throttle when use null/undefined. + // If animation === true and animationDurationUpdate > 0, + // default value is 100, otherwise 20. + start: 0, // Start percent. 0 ~ 100 + end: 100, // End percent. 0 ~ 100 + startValue: null, // Start value. If startValue specified, start is ignored. + endValue: null, // End value. If endValue specified, end is ignored. + minSpan: null, // 0 ~ 100 + maxSpan: null, // 0 ~ 100 + minValueSpan: null, // The range of dataZoom can not be smaller than that. + maxValueSpan: null, // The range of dataZoom can not be larger than that. + rangeMode: null // Array, can be 'value' or 'percent'. + }, + + /** + * @override + */ + init: function (option, parentModel, ecModel) { + + /** + * key like x_0, y_1 + * @private + * @type {Object} + */ + this._dataIntervalByAxis = {}; + + /** + * @private + */ + this._dataInfo = {}; + + /** + * key like x_0, y_1 + * @private + */ + this._axisProxies = {}; + + /** + * @readOnly + */ + this.textStyleModel; + + /** + * @private + */ + this._autoThrottle = true; + + /** + * 'percent' or 'value' + * @private + */ + this._rangePropMode = ['percent', 'percent']; + + var rawOption = retrieveRaw(option); + + this.mergeDefaultAndTheme(option, ecModel); + + this.doInit(rawOption); + }, + + /** + * @override + */ + mergeOption: function (newOption) { + var rawOption = retrieveRaw(newOption); + + //FIX #2591 + merge(this.option, newOption, true); + + this.doInit(rawOption); + }, + + /** + * @protected + */ + doInit: function (rawOption) { + var thisOption = this.option; + + // Disable realtime view update if canvas is not supported. + if (!env$1.canvasSupported) { + thisOption.realtime = false; + } + + this._setDefaultThrottle(rawOption); + + updateRangeUse(this, rawOption); + + each$21([['start', 'startValue'], ['end', 'endValue']], function (names, index) { + // start/end has higher priority over startValue/endValue if they + // both set, but we should make chart.setOption({endValue: 1000}) + // effective, rather than chart.setOption({endValue: 1000, end: null}). + if (this._rangePropMode[index] === 'value') { + thisOption[names[0]] = null; + } + // Otherwise do nothing and use the merge result. + }, this); + + this.textStyleModel = this.getModel('textStyle'); + + this._resetTarget(); + + this._giveAxisProxies(); + }, + + /** + * @private + */ + _giveAxisProxies: function () { + var axisProxies = this._axisProxies; + + this.eachTargetAxis(function (dimNames, axisIndex, dataZoomModel, ecModel) { + var axisModel = this.dependentModels[dimNames.axis][axisIndex]; + + // If exists, share axisProxy with other dataZoomModels. + var axisProxy = axisModel.__dzAxisProxy || ( + // Use the first dataZoomModel as the main model of axisProxy. + axisModel.__dzAxisProxy = new AxisProxy( + dimNames.name, axisIndex, this, ecModel + ) + ); + // FIXME + // dispose __dzAxisProxy + + axisProxies[dimNames.name + '_' + axisIndex] = axisProxy; + }, this); + }, + + /** + * @private + */ + _resetTarget: function () { + var thisOption = this.option; + + var autoMode = this._judgeAutoMode(); + + eachAxisDim(function (dimNames) { + var axisIndexName = dimNames.axisIndex; + thisOption[axisIndexName] = normalizeToArray( + thisOption[axisIndexName] + ); + }, this); + + if (autoMode === 'axisIndex') { + this._autoSetAxisIndex(); + } + else if (autoMode === 'orient') { + this._autoSetOrient(); + } + }, + + /** + * @private + */ + _judgeAutoMode: function () { + // Auto set only works for setOption at the first time. + // The following is user's reponsibility. So using merged + // option is OK. + var thisOption = this.option; + + var hasIndexSpecified = false; + eachAxisDim(function (dimNames) { + // When user set axisIndex as a empty array, we think that user specify axisIndex + // but do not want use auto mode. Because empty array may be encountered when + // some error occured. + if (thisOption[dimNames.axisIndex] != null) { + hasIndexSpecified = true; + } + }, this); + + var orient = thisOption.orient; + + if (orient == null && hasIndexSpecified) { + return 'orient'; + } + else if (!hasIndexSpecified) { + if (orient == null) { + thisOption.orient = 'horizontal'; + } + return 'axisIndex'; + } + }, + + /** + * @private + */ + _autoSetAxisIndex: function () { + var autoAxisIndex = true; + var orient = this.get('orient', true); + var thisOption = this.option; + var dependentModels = this.dependentModels; + + if (autoAxisIndex) { + // Find axis that parallel to dataZoom as default. + var dimName = orient === 'vertical' ? 'y' : 'x'; + + if (dependentModels[dimName + 'Axis'].length) { + thisOption[dimName + 'AxisIndex'] = [0]; + autoAxisIndex = false; + } + else { + each$21(dependentModels.singleAxis, function (singleAxisModel) { + if (autoAxisIndex && singleAxisModel.get('orient', true) === orient) { + thisOption.singleAxisIndex = [singleAxisModel.componentIndex]; + autoAxisIndex = false; + } + }); + } + } + + if (autoAxisIndex) { + // Find the first category axis as default. (consider polar) + eachAxisDim(function (dimNames) { + if (!autoAxisIndex) { + return; + } + var axisIndices = []; + var axisModels = this.dependentModels[dimNames.axis]; + if (axisModels.length && !axisIndices.length) { + for (var i = 0, len = axisModels.length; i < len; i++) { + if (axisModels[i].get('type') === 'category') { + axisIndices.push(i); + } + } + } + thisOption[dimNames.axisIndex] = axisIndices; + if (axisIndices.length) { + autoAxisIndex = false; + } + }, this); + } + + if (autoAxisIndex) { + // FIXME + // 这里是兼容ec2的写法(没指定xAxisIndex和yAxisIndex时把scatter和双数值轴折柱纳入dataZoom控制), + // 但是实际是否需要Grid.js#getScaleByOption来判断(考虑time,log等axis type)? + + // If both dataZoom.xAxisIndex and dataZoom.yAxisIndex is not specified, + // dataZoom component auto adopts series that reference to + // both xAxis and yAxis which type is 'value'. + this.ecModel.eachSeries(function (seriesModel) { + if (this._isSeriesHasAllAxesTypeOf(seriesModel, 'value')) { + eachAxisDim(function (dimNames) { + var axisIndices = thisOption[dimNames.axisIndex]; + + var axisIndex = seriesModel.get(dimNames.axisIndex); + var axisId = seriesModel.get(dimNames.axisId); + + var axisModel = seriesModel.ecModel.queryComponents({ + mainType: dimNames.axis, + index: axisIndex, + id: axisId + })[0]; + + if (__DEV__) { + if (!axisModel) { + throw new Error( + dimNames.axis + ' "' + retrieve( + axisIndex, + axisId, + 0 + ) + '" not found' + ); + } + } + axisIndex = axisModel.componentIndex; + + if (indexOf(axisIndices, axisIndex) < 0) { + axisIndices.push(axisIndex); + } + }); + } + }, this); + } + }, + + /** + * @private + */ + _autoSetOrient: function () { + var dim; + + // Find the first axis + this.eachTargetAxis(function (dimNames) { + !dim && (dim = dimNames.name); + }, this); + + this.option.orient = dim === 'y' ? 'vertical' : 'horizontal'; + }, + + /** + * @private + */ + _isSeriesHasAllAxesTypeOf: function (seriesModel, axisType) { + // FIXME + // 需要series的xAxisIndex和yAxisIndex都首先自动设置上。 + // 例如series.type === scatter时。 + + var is = true; + eachAxisDim(function (dimNames) { + var seriesAxisIndex = seriesModel.get(dimNames.axisIndex); + var axisModel = this.dependentModels[dimNames.axis][seriesAxisIndex]; + + if (!axisModel || axisModel.get('type') !== axisType) { + is = false; + } + }, this); + return is; + }, + + /** + * @private + */ + _setDefaultThrottle: function (rawOption) { + // When first time user set throttle, auto throttle ends. + if (rawOption.hasOwnProperty('throttle')) { + this._autoThrottle = false; + } + if (this._autoThrottle) { + var globalOption = this.ecModel.option; + this.option.throttle = + (globalOption.animation && globalOption.animationDurationUpdate > 0) + ? 100 : 20; + } + }, + + /** + * @public + */ + getFirstTargetAxisModel: function () { + var firstAxisModel; + eachAxisDim(function (dimNames) { + if (firstAxisModel == null) { + var indices = this.get(dimNames.axisIndex); + if (indices.length) { + firstAxisModel = this.dependentModels[dimNames.axis][indices[0]]; + } + } + }, this); + + return firstAxisModel; + }, + + /** + * @public + * @param {Function} callback param: axisModel, dimNames, axisIndex, dataZoomModel, ecModel + */ + eachTargetAxis: function (callback, context) { + var ecModel = this.ecModel; + eachAxisDim(function (dimNames) { + each$21( + this.get(dimNames.axisIndex), + function (axisIndex) { + callback.call(context, dimNames, axisIndex, this, ecModel); + }, + this + ); + }, this); + }, + + /** + * @param {string} dimName + * @param {number} axisIndex + * @return {module:echarts/component/dataZoom/AxisProxy} If not found, return null/undefined. + */ + getAxisProxy: function (dimName, axisIndex) { + return this._axisProxies[dimName + '_' + axisIndex]; + }, + + /** + * @param {string} dimName + * @param {number} axisIndex + * @return {module:echarts/model/Model} If not found, return null/undefined. + */ + getAxisModel: function (dimName, axisIndex) { + var axisProxy = this.getAxisProxy(dimName, axisIndex); + return axisProxy && axisProxy.getAxisModel(); + }, + + /** + * If not specified, set to undefined. + * + * @public + * @param {Object} opt + * @param {number} [opt.start] + * @param {number} [opt.end] + * @param {number} [opt.startValue] + * @param {number} [opt.endValue] + * @param {boolean} [ignoreUpdateRangeUsg=false] + */ + setRawRange: function (opt, ignoreUpdateRangeUsg) { + var option = this.option; + each$21([['start', 'startValue'], ['end', 'endValue']], function (names) { + // If only one of 'start' and 'startValue' is not null/undefined, the other + // should be cleared, which enable clear the option. + // If both of them are not set, keep option with the original value, which + // enable use only set start but not set end when calling `dispatchAction`. + // The same as 'end' and 'endValue'. + if (opt[names[0]] != null || opt[names[1]] != null) { + option[names[0]] = opt[names[0]]; + option[names[1]] = opt[names[1]]; + } + }, this); + + !ignoreUpdateRangeUsg && updateRangeUse(this, opt); + }, + + /** + * @public + * @return {Array.<number>} [startPercent, endPercent] + */ + getPercentRange: function () { + var axisProxy = this.findRepresentativeAxisProxy(); + if (axisProxy) { + return axisProxy.getDataPercentWindow(); + } + }, + + /** + * @public + * For example, chart.getModel().getComponent('dataZoom').getValueRange('y', 0); + * + * @param {string} [axisDimName] + * @param {number} [axisIndex] + * @return {Array.<number>} [startValue, endValue] value can only be '-' or finite number. + */ + getValueRange: function (axisDimName, axisIndex) { + if (axisDimName == null && axisIndex == null) { + var axisProxy = this.findRepresentativeAxisProxy(); + if (axisProxy) { + return axisProxy.getDataValueWindow(); + } + } + else { + return this.getAxisProxy(axisDimName, axisIndex).getDataValueWindow(); + } + }, + + /** + * @public + * @param {module:echarts/model/Model} [axisModel] If axisModel given, find axisProxy + * corresponding to the axisModel + * @return {module:echarts/component/dataZoom/AxisProxy} + */ + findRepresentativeAxisProxy: function (axisModel) { + if (axisModel) { + return axisModel.__dzAxisProxy; + } + + // Find the first hosted axisProxy + var axisProxies = this._axisProxies; + for (var key in axisProxies) { + if (axisProxies.hasOwnProperty(key) && axisProxies[key].hostedBy(this)) { + return axisProxies[key]; + } + } + + // If no hosted axis find not hosted axisProxy. + // Consider this case: dataZoomModel1 and dataZoomModel2 control the same axis, + // and the option.start or option.end settings are different. The percentRange + // should follow axisProxy. + // (We encounter this problem in toolbox data zoom.) + for (var key in axisProxies) { + if (axisProxies.hasOwnProperty(key) && !axisProxies[key].hostedBy(this)) { + return axisProxies[key]; + } + } + }, + + /** + * @return {Array.<string>} + */ + getRangePropMode: function () { + return this._rangePropMode.slice(); + } + +}); + +function retrieveRaw(option) { + var ret = {}; + each$21( + ['start', 'end', 'startValue', 'endValue', 'throttle'], + function (name) { + option.hasOwnProperty(name) && (ret[name] = option[name]); + } + ); + return ret; +} + +function updateRangeUse(dataZoomModel, rawOption) { + var rangePropMode = dataZoomModel._rangePropMode; + var rangeModeInOption = dataZoomModel.get('rangeMode'); + + each$21([['start', 'startValue'], ['end', 'endValue']], function (names, index) { + var percentSpecified = rawOption[names[0]] != null; + var valueSpecified = rawOption[names[1]] != null; + if (percentSpecified && !valueSpecified) { + rangePropMode[index] = 'percent'; + } + else if (!percentSpecified && valueSpecified) { + rangePropMode[index] = 'value'; + } + else if (rangeModeInOption) { + rangePropMode[index] = rangeModeInOption[index]; + } + else if (percentSpecified) { // percentSpecified && valueSpecified + rangePropMode[index] = 'percent'; + } + // else remain its original setting. + }); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var DataZoomView = Component.extend({ + + type: 'dataZoom', + + render: function (dataZoomModel, ecModel, api, payload) { + this.dataZoomModel = dataZoomModel; + this.ecModel = ecModel; + this.api = api; + }, + + /** + * Find the first target coordinate system. + * + * @protected + * @return {Object} { + * grid: [ + * {model: coord0, axisModels: [axis1, axis3], coordIndex: 1}, + * {model: coord1, axisModels: [axis0, axis2], coordIndex: 0}, + * ... + * ], // cartesians must not be null/undefined. + * polar: [ + * {model: coord0, axisModels: [axis4], coordIndex: 0}, + * ... + * ], // polars must not be null/undefined. + * singleAxis: [ + * {model: coord0, axisModels: [], coordIndex: 0} + * ] + */ + getTargetCoordInfo: function () { + var dataZoomModel = this.dataZoomModel; + var ecModel = this.ecModel; + var coordSysLists = {}; + + dataZoomModel.eachTargetAxis(function (dimNames, axisIndex) { + var axisModel = ecModel.getComponent(dimNames.axis, axisIndex); + if (axisModel) { + var coordModel = axisModel.getCoordSysModel(); + coordModel && save( + coordModel, + axisModel, + coordSysLists[coordModel.mainType] || (coordSysLists[coordModel.mainType] = []), + coordModel.componentIndex + ); + } + }, this); + + function save(coordModel, axisModel, store, coordIndex) { + var item; + for (var i = 0; i < store.length; i++) { + if (store[i].model === coordModel) { + item = store[i]; + break; + } + } + if (!item) { + store.push(item = { + model: coordModel, axisModels: [], coordIndex: coordIndex + }); + } + item.axisModels.push(axisModel); + } + + return coordSysLists; + } + +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var SliderZoomModel = DataZoomModel.extend({ + + type: 'dataZoom.slider', + + layoutMode: 'box', + + /** + * @protected + */ + defaultOption: { + show: true, + + // ph => placeholder. Using placehoder here because + // deault value can only be drived in view stage. + right: 'ph', // Default align to grid rect. + top: 'ph', // Default align to grid rect. + width: 'ph', // Default align to grid rect. + height: 'ph', // Default align to grid rect. + left: null, // Default align to grid rect. + bottom: null, // Default align to grid rect. + + backgroundColor: 'rgba(47,69,84,0)', // Background of slider zoom component. + // dataBackgroundColor: '#ddd', // Background coor of data shadow and border of box, + // highest priority, remain for compatibility of + // previous version, but not recommended any more. + dataBackground: { + lineStyle: { + color: '#2f4554', + width: 0.5, + opacity: 0.3 + }, + areaStyle: { + color: 'rgba(47,69,84,0.3)', + opacity: 0.3 + } + }, + borderColor: '#ddd', // border color of the box. For compatibility, + // if dataBackgroundColor is set, borderColor + // is ignored. + + fillerColor: 'rgba(167,183,204,0.4)', // Color of selected area. + // handleColor: 'rgba(89,170,216,0.95)', // Color of handle. + // handleIcon: 'path://M4.9,17.8c0-1.4,4.5-10.5,5.5-12.4c0-0.1,0.6-1.1,0.9-1.1c0.4,0,0.9,1,0.9,1.1c1.1,2.2,5.4,11,5.4,12.4v17.8c0,1.5-0.6,2.1-1.3,2.1H6.1c-0.7,0-1.3-0.6-1.3-2.1V17.8z', + handleIcon: 'M8.2,13.6V3.9H6.3v9.7H3.1v14.9h3.3v9.7h1.8v-9.7h3.3V13.6H8.2z M9.7,24.4H4.8v-1.4h4.9V24.4z M9.7,19.1H4.8v-1.4h4.9V19.1z', + // Percent of the slider height + handleSize: '100%', + + handleStyle: { + color: '#a7b7cc' + }, + + labelPrecision: null, + labelFormatter: null, + showDetail: true, + showDataShadow: 'auto', // Default auto decision. + realtime: true, + zoomLock: false, // Whether disable zoom. + textStyle: { + color: '#333' + } + } + +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var Rect$2 = Rect; +var linearMap$1 = linearMap; +var asc$2 = asc; +var bind$4 = bind; +var each$23 = each$1; + +// Constants +var DEFAULT_LOCATION_EDGE_GAP = 7; +var DEFAULT_FRAME_BORDER_WIDTH = 1; +var DEFAULT_FILLER_SIZE = 30; +var HORIZONTAL = 'horizontal'; +var VERTICAL = 'vertical'; +var LABEL_GAP = 5; +var SHOW_DATA_SHADOW_SERIES_TYPE = ['line', 'bar', 'candlestick', 'scatter']; + +var SliderZoomView = DataZoomView.extend({ + + type: 'dataZoom.slider', + + init: function (ecModel, api) { + + /** + * @private + * @type {Object} + */ + this._displayables = {}; + + /** + * @private + * @type {string} + */ + this._orient; + + /** + * [0, 100] + * @private + */ + this._range; + + /** + * [coord of the first handle, coord of the second handle] + * @private + */ + this._handleEnds; + + /** + * [length, thick] + * @private + * @type {Array.<number>} + */ + this._size; + + /** + * @private + * @type {number} + */ + this._handleWidth; + + /** + * @private + * @type {number} + */ + this._handleHeight; + + /** + * @private + */ + this._location; + + /** + * @private + */ + this._dragging; + + /** + * @private + */ + this._dataShadowInfo; + + this.api = api; + }, + + /** + * @override + */ + render: function (dataZoomModel, ecModel, api, payload) { + SliderZoomView.superApply(this, 'render', arguments); + + createOrUpdate( + this, + '_dispatchZoomAction', + this.dataZoomModel.get('throttle'), + 'fixRate' + ); + + this._orient = dataZoomModel.get('orient'); + + if (this.dataZoomModel.get('show') === false) { + this.group.removeAll(); + return; + } + + // Notice: this._resetInterval() should not be executed when payload.type + // is 'dataZoom', origin this._range should be maintained, otherwise 'pan' + // or 'zoom' info will be missed because of 'throttle' of this.dispatchAction, + if (!payload || payload.type !== 'dataZoom' || payload.from !== this.uid) { + this._buildView(); + } + + this._updateView(); + }, + + /** + * @override + */ + remove: function () { + SliderZoomView.superApply(this, 'remove', arguments); + clear(this, '_dispatchZoomAction'); + }, + + /** + * @override + */ + dispose: function () { + SliderZoomView.superApply(this, 'dispose', arguments); + clear(this, '_dispatchZoomAction'); + }, + + _buildView: function () { + var thisGroup = this.group; + + thisGroup.removeAll(); + + this._resetLocation(); + this._resetInterval(); + + var barGroup = this._displayables.barGroup = new Group(); + + this._renderBackground(); + + this._renderHandle(); + + this._renderDataShadow(); + + thisGroup.add(barGroup); + + this._positionGroup(); + }, + + /** + * @private + */ + _resetLocation: function () { + var dataZoomModel = this.dataZoomModel; + var api = this.api; + + // If some of x/y/width/height are not specified, + // auto-adapt according to target grid. + var coordRect = this._findCoordRect(); + var ecSize = {width: api.getWidth(), height: api.getHeight()}; + // Default align by coordinate system rect. + var positionInfo = this._orient === HORIZONTAL + ? { + // Why using 'right', because right should be used in vertical, + // and it is better to be consistent for dealing with position param merge. + right: ecSize.width - coordRect.x - coordRect.width, + top: (ecSize.height - DEFAULT_FILLER_SIZE - DEFAULT_LOCATION_EDGE_GAP), + width: coordRect.width, + height: DEFAULT_FILLER_SIZE + } + : { // vertical + right: DEFAULT_LOCATION_EDGE_GAP, + top: coordRect.y, + width: DEFAULT_FILLER_SIZE, + height: coordRect.height + }; + + // Do not write back to option and replace value 'ph', because + // the 'ph' value should be recalculated when resize. + var layoutParams = getLayoutParams(dataZoomModel.option); + + // Replace the placeholder value. + each$1(['right', 'top', 'width', 'height'], function (name) { + if (layoutParams[name] === 'ph') { + layoutParams[name] = positionInfo[name]; + } + }); + + var layoutRect = getLayoutRect( + layoutParams, + ecSize, + dataZoomModel.padding + ); + + this._location = {x: layoutRect.x, y: layoutRect.y}; + this._size = [layoutRect.width, layoutRect.height]; + this._orient === VERTICAL && this._size.reverse(); + }, + + /** + * @private + */ + _positionGroup: function () { + var thisGroup = this.group; + var location = this._location; + var orient = this._orient; + + // Just use the first axis to determine mapping. + var targetAxisModel = this.dataZoomModel.getFirstTargetAxisModel(); + var inverse = targetAxisModel && targetAxisModel.get('inverse'); + + var barGroup = this._displayables.barGroup; + var otherAxisInverse = (this._dataShadowInfo || {}).otherAxisInverse; + + // Transform barGroup. + barGroup.attr( + (orient === HORIZONTAL && !inverse) + ? {scale: otherAxisInverse ? [1, 1] : [1, -1]} + : (orient === HORIZONTAL && inverse) + ? {scale: otherAxisInverse ? [-1, 1] : [-1, -1]} + : (orient === VERTICAL && !inverse) + ? {scale: otherAxisInverse ? [1, -1] : [1, 1], rotation: Math.PI / 2} + // Dont use Math.PI, considering shadow direction. + : {scale: otherAxisInverse ? [-1, -1] : [-1, 1], rotation: Math.PI / 2} + ); + + // Position barGroup + var rect = thisGroup.getBoundingRect([barGroup]); + thisGroup.attr('position', [location.x - rect.x, location.y - rect.y]); + }, + + /** + * @private + */ + _getViewExtent: function () { + return [0, this._size[0]]; + }, + + _renderBackground: function () { + var dataZoomModel = this.dataZoomModel; + var size = this._size; + var barGroup = this._displayables.barGroup; + + barGroup.add(new Rect$2({ + silent: true, + shape: { + x: 0, y: 0, width: size[0], height: size[1] + }, + style: { + fill: dataZoomModel.get('backgroundColor') + }, + z2: -40 + })); + + // Click panel, over shadow, below handles. + barGroup.add(new Rect$2({ + shape: { + x: 0, y: 0, width: size[0], height: size[1] + }, + style: { + fill: 'transparent' + }, + z2: 0, + onclick: bind(this._onClickPanelClick, this) + })); + }, + + _renderDataShadow: function () { + var info = this._dataShadowInfo = this._prepareDataShadowInfo(); + + if (!info) { + return; + } + + var size = this._size; + var seriesModel = info.series; + var data = seriesModel.getRawData(); + + var otherDim = seriesModel.getShadowDim + ? seriesModel.getShadowDim() // @see candlestick + : info.otherDim; + + if (otherDim == null) { + return; + } + + var otherDataExtent = data.getDataExtent(otherDim); + // Nice extent. + var otherOffset = (otherDataExtent[1] - otherDataExtent[0]) * 0.3; + otherDataExtent = [ + otherDataExtent[0] - otherOffset, + otherDataExtent[1] + otherOffset + ]; + var otherShadowExtent = [0, size[1]]; + + var thisShadowExtent = [0, size[0]]; + + var areaPoints = [[size[0], 0], [0, 0]]; + var linePoints = []; + var step = thisShadowExtent[1] / (data.count() - 1); + var thisCoord = 0; + + // Optimize for large data shadow + var stride = Math.round(data.count() / size[0]); + var lastIsEmpty; + data.each([otherDim], function (value, index) { + if (stride > 0 && (index % stride)) { + thisCoord += step; + return; + } + + // FIXME + // Should consider axis.min/axis.max when drawing dataShadow. + + // FIXME + // 应该使用统一的空判断?还是在list里进行空判断? + var isEmpty = value == null || isNaN(value) || value === ''; + // See #4235. + var otherCoord = isEmpty + ? 0 : linearMap$1(value, otherDataExtent, otherShadowExtent, true); + + // Attempt to draw data shadow precisely when there are empty value. + if (isEmpty && !lastIsEmpty && index) { + areaPoints.push([areaPoints[areaPoints.length - 1][0], 0]); + linePoints.push([linePoints[linePoints.length - 1][0], 0]); + } + else if (!isEmpty && lastIsEmpty) { + areaPoints.push([thisCoord, 0]); + linePoints.push([thisCoord, 0]); + } + + areaPoints.push([thisCoord, otherCoord]); + linePoints.push([thisCoord, otherCoord]); + + thisCoord += step; + lastIsEmpty = isEmpty; + }); + + var dataZoomModel = this.dataZoomModel; + // var dataBackgroundModel = dataZoomModel.getModel('dataBackground'); + this._displayables.barGroup.add(new Polygon({ + shape: {points: areaPoints}, + style: defaults( + {fill: dataZoomModel.get('dataBackgroundColor')}, + dataZoomModel.getModel('dataBackground.areaStyle').getAreaStyle() + ), + silent: true, + z2: -20 + })); + this._displayables.barGroup.add(new Polyline({ + shape: {points: linePoints}, + style: dataZoomModel.getModel('dataBackground.lineStyle').getLineStyle(), + silent: true, + z2: -19 + })); + }, + + _prepareDataShadowInfo: function () { + var dataZoomModel = this.dataZoomModel; + var showDataShadow = dataZoomModel.get('showDataShadow'); + + if (showDataShadow === false) { + return; + } + + // Find a representative series. + var result; + var ecModel = this.ecModel; + + dataZoomModel.eachTargetAxis(function (dimNames, axisIndex) { + var seriesModels = dataZoomModel + .getAxisProxy(dimNames.name, axisIndex) + .getTargetSeriesModels(); + + each$1(seriesModels, function (seriesModel) { + if (result) { + return; + } + + if (showDataShadow !== true && indexOf( + SHOW_DATA_SHADOW_SERIES_TYPE, seriesModel.get('type') + ) < 0 + ) { + return; + } + + var thisAxis = ecModel.getComponent(dimNames.axis, axisIndex).axis; + var otherDim = getOtherDim(dimNames.name); + var otherAxisInverse; + var coordSys = seriesModel.coordinateSystem; + + if (otherDim != null && coordSys.getOtherAxis) { + otherAxisInverse = coordSys.getOtherAxis(thisAxis).inverse; + } + + otherDim = seriesModel.getData().mapDimension(otherDim); + + result = { + thisAxis: thisAxis, + series: seriesModel, + thisDim: dimNames.name, + otherDim: otherDim, + otherAxisInverse: otherAxisInverse + }; + + }, this); + + }, this); + + return result; + }, + + _renderHandle: function () { + var displaybles = this._displayables; + var handles = displaybles.handles = []; + var handleLabels = displaybles.handleLabels = []; + var barGroup = this._displayables.barGroup; + var size = this._size; + var dataZoomModel = this.dataZoomModel; + + barGroup.add(displaybles.filler = new Rect$2({ + draggable: true, + cursor: getCursor(this._orient), + drift: bind$4(this._onDragMove, this, 'all'), + onmousemove: function (e) { + // Fot mobile devicem, prevent screen slider on the button. + stop(e.event); + }, + ondragstart: bind$4(this._showDataInfo, this, true), + ondragend: bind$4(this._onDragEnd, this), + onmouseover: bind$4(this._showDataInfo, this, true), + onmouseout: bind$4(this._showDataInfo, this, false), + style: { + fill: dataZoomModel.get('fillerColor'), + textPosition : 'inside' + } + })); + + // Frame border. + barGroup.add(new Rect$2(subPixelOptimizeRect({ + silent: true, + shape: { + x: 0, + y: 0, + width: size[0], + height: size[1] + }, + style: { + stroke: dataZoomModel.get('dataBackgroundColor') + || dataZoomModel.get('borderColor'), + lineWidth: DEFAULT_FRAME_BORDER_WIDTH, + fill: 'rgba(0,0,0,0)' + } + }))); + + each$23([0, 1], function (handleIndex) { + var path = createIcon( + dataZoomModel.get('handleIcon'), + { + cursor: getCursor(this._orient), + draggable: true, + drift: bind$4(this._onDragMove, this, handleIndex), + onmousemove: function (e) { + // Fot mobile devicem, prevent screen slider on the button. + stop(e.event); + }, + ondragend: bind$4(this._onDragEnd, this), + onmouseover: bind$4(this._showDataInfo, this, true), + onmouseout: bind$4(this._showDataInfo, this, false) + }, + {x: -1, y: 0, width: 2, height: 2} + ); + + var bRect = path.getBoundingRect(); + this._handleHeight = parsePercent$1(dataZoomModel.get('handleSize'), this._size[1]); + this._handleWidth = bRect.width / bRect.height * this._handleHeight; + + path.setStyle(dataZoomModel.getModel('handleStyle').getItemStyle()); + var handleColor = dataZoomModel.get('handleColor'); + // Compatitable with previous version + if (handleColor != null) { + path.style.fill = handleColor; + } + + barGroup.add(handles[handleIndex] = path); + + var textStyleModel = dataZoomModel.textStyleModel; + + this.group.add( + handleLabels[handleIndex] = new Text({ + silent: true, + invisible: true, + style: { + x: 0, y: 0, text: '', + textVerticalAlign: 'middle', + textAlign: 'center', + textFill: textStyleModel.getTextColor(), + textFont: textStyleModel.getFont() + }, + z2: 10 + })); + + }, this); + }, + + /** + * @private + */ + _resetInterval: function () { + var range = this._range = this.dataZoomModel.getPercentRange(); + var viewExtent = this._getViewExtent(); + + this._handleEnds = [ + linearMap$1(range[0], [0, 100], viewExtent, true), + linearMap$1(range[1], [0, 100], viewExtent, true) + ]; + }, + + /** + * @private + * @param {(number|string)} handleIndex 0 or 1 or 'all' + * @param {number} delta + * @return {boolean} changed + */ + _updateInterval: function (handleIndex, delta) { + var dataZoomModel = this.dataZoomModel; + var handleEnds = this._handleEnds; + var viewExtend = this._getViewExtent(); + var minMaxSpan = dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan(); + var percentExtent = [0, 100]; + + sliderMove( + delta, + handleEnds, + viewExtend, + dataZoomModel.get('zoomLock') ? 'all' : handleIndex, + minMaxSpan.minSpan != null + ? linearMap$1(minMaxSpan.minSpan, percentExtent, viewExtend, true) : null, + minMaxSpan.maxSpan != null + ? linearMap$1(minMaxSpan.maxSpan, percentExtent, viewExtend, true) : null + ); + + var lastRange = this._range; + var range = this._range = asc$2([ + linearMap$1(handleEnds[0], viewExtend, percentExtent, true), + linearMap$1(handleEnds[1], viewExtend, percentExtent, true) + ]); + + return !lastRange || lastRange[0] !== range[0] || lastRange[1] !== range[1]; + }, + + /** + * @private + */ + _updateView: function (nonRealtime) { + var displaybles = this._displayables; + var handleEnds = this._handleEnds; + var handleInterval = asc$2(handleEnds.slice()); + var size = this._size; + + each$23([0, 1], function (handleIndex) { + // Handles + var handle = displaybles.handles[handleIndex]; + var handleHeight = this._handleHeight; + handle.attr({ + scale: [handleHeight / 2, handleHeight / 2], + position: [handleEnds[handleIndex], size[1] / 2 - handleHeight / 2] + }); + }, this); + + // Filler + displaybles.filler.setShape({ + x: handleInterval[0], + y: 0, + width: handleInterval[1] - handleInterval[0], + height: size[1] + }); + + this._updateDataInfo(nonRealtime); + }, + + /** + * @private + */ + _updateDataInfo: function (nonRealtime) { + var dataZoomModel = this.dataZoomModel; + var displaybles = this._displayables; + var handleLabels = displaybles.handleLabels; + var orient = this._orient; + var labelTexts = ['', '']; + + // FIXME + // date型,支持formatter,autoformatter(ec2 date.getAutoFormatter) + if (dataZoomModel.get('showDetail')) { + var axisProxy = dataZoomModel.findRepresentativeAxisProxy(); + + if (axisProxy) { + var axis = axisProxy.getAxisModel().axis; + var range = this._range; + + var dataInterval = nonRealtime + // See #4434, data and axis are not processed and reset yet in non-realtime mode. + ? axisProxy.calculateDataWindow({ + start: range[0], end: range[1] + }).valueWindow + : axisProxy.getDataValueWindow(); + + labelTexts = [ + this._formatLabel(dataInterval[0], axis), + this._formatLabel(dataInterval[1], axis) + ]; + } + } + + var orderedHandleEnds = asc$2(this._handleEnds.slice()); + + setLabel.call(this, 0); + setLabel.call(this, 1); + + function setLabel(handleIndex) { + // Label + // Text should not transform by barGroup. + // Ignore handlers transform + var barTransform = getTransform( + displaybles.handles[handleIndex].parent, this.group + ); + var direction = transformDirection( + handleIndex === 0 ? 'right' : 'left', barTransform + ); + var offset = this._handleWidth / 2 + LABEL_GAP; + var textPoint = applyTransform$1( + [ + orderedHandleEnds[handleIndex] + (handleIndex === 0 ? -offset : offset), + this._size[1] / 2 + ], + barTransform + ); + handleLabels[handleIndex].setStyle({ + x: textPoint[0], + y: textPoint[1], + textVerticalAlign: orient === HORIZONTAL ? 'middle' : direction, + textAlign: orient === HORIZONTAL ? direction : 'center', + text: labelTexts[handleIndex] + }); + } + }, + + /** + * @private + */ + _formatLabel: function (value, axis) { + var dataZoomModel = this.dataZoomModel; + var labelFormatter = dataZoomModel.get('labelFormatter'); + + var labelPrecision = dataZoomModel.get('labelPrecision'); + if (labelPrecision == null || labelPrecision === 'auto') { + labelPrecision = axis.getPixelPrecision(); + } + + var valueStr = (value == null || isNaN(value)) + ? '' + // FIXME Glue code + : (axis.type === 'category' || axis.type === 'time') + ? axis.scale.getLabel(Math.round(value)) + // param of toFixed should less then 20. + : value.toFixed(Math.min(labelPrecision, 20)); + + return isFunction$1(labelFormatter) + ? labelFormatter(value, valueStr) + : isString(labelFormatter) + ? labelFormatter.replace('{value}', valueStr) + : valueStr; + }, + + /** + * @private + * @param {boolean} showOrHide true: show, false: hide + */ + _showDataInfo: function (showOrHide) { + // Always show when drgging. + showOrHide = this._dragging || showOrHide; + + var handleLabels = this._displayables.handleLabels; + handleLabels[0].attr('invisible', !showOrHide); + handleLabels[1].attr('invisible', !showOrHide); + }, + + _onDragMove: function (handleIndex, dx, dy) { + this._dragging = true; + + // Transform dx, dy to bar coordination. + var barTransform = this._displayables.barGroup.getLocalTransform(); + var vertex = applyTransform$1([dx, dy], barTransform, true); + + var changed = this._updateInterval(handleIndex, vertex[0]); + + var realtime = this.dataZoomModel.get('realtime'); + + this._updateView(!realtime); + + // Avoid dispatch dataZoom repeatly but range not changed, + // which cause bad visual effect when progressive enabled. + changed && realtime && this._dispatchZoomAction(); + }, + + _onDragEnd: function () { + this._dragging = false; + this._showDataInfo(false); + + // While in realtime mode and stream mode, dispatch action when + // drag end will cause the whole view rerender, which is unnecessary. + var realtime = this.dataZoomModel.get('realtime'); + !realtime && this._dispatchZoomAction(); + }, + + _onClickPanelClick: function (e) { + var size = this._size; + var localPoint = this._displayables.barGroup.transformCoordToLocal(e.offsetX, e.offsetY); + + if (localPoint[0] < 0 || localPoint[0] > size[0] + || localPoint[1] < 0 || localPoint[1] > size[1] + ) { + return; + } + + var handleEnds = this._handleEnds; + var center = (handleEnds[0] + handleEnds[1]) / 2; + + var changed = this._updateInterval('all', localPoint[0] - center); + this._updateView(); + changed && this._dispatchZoomAction(); + }, + + /** + * This action will be throttled. + * @private + */ + _dispatchZoomAction: function () { + var range = this._range; + + this.api.dispatchAction({ + type: 'dataZoom', + from: this.uid, + dataZoomId: this.dataZoomModel.id, + start: range[0], + end: range[1] + }); + }, + + /** + * @private + */ + _findCoordRect: function () { + // Find the grid coresponding to the first axis referred by dataZoom. + var rect; + each$23(this.getTargetCoordInfo(), function (coordInfoList) { + if (!rect && coordInfoList.length) { + var coordSys = coordInfoList[0].model.coordinateSystem; + rect = coordSys.getRect && coordSys.getRect(); + } + }); + if (!rect) { + var width = this.api.getWidth(); + var height = this.api.getHeight(); + rect = { + x: width * 0.2, + y: height * 0.2, + width: width * 0.6, + height: height * 0.6 + }; + } + + return rect; + } + +}); + +function getOtherDim(thisDim) { + // FIXME + // 这个逻辑和getOtherAxis里一致,但是写在这里是否不好 + var map$$1 = {x: 'y', y: 'x', radius: 'angle', angle: 'radius'}; + return map$$1[thisDim]; +} + +function getCursor(orient) { + return orient === 'vertical' ? 'ns-resize' : 'ew-resize'; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +DataZoomModel.extend({ + + type: 'dataZoom.inside', + + /** + * @protected + */ + defaultOption: { + disabled: false, // Whether disable this inside zoom. + zoomLock: false, // Whether disable zoom but only pan. + zoomOnMouseWheel: true, // Can be: true / false / 'shift' / 'ctrl' / 'alt'. + moveOnMouseMove: true, // Can be: true / false / 'shift' / 'ctrl' / 'alt'. + preventDefaultMouseMove: true + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// Only create one roam controller for each coordinate system. +// one roam controller might be refered by two inside data zoom +// components (for example, one for x and one for y). When user +// pan or zoom, only dispatch one action for those data zoom +// components. + +var curry$6 = curry; + +var ATTR$1 = '\0_ec_dataZoom_roams'; + + +/** + * @public + * @param {module:echarts/ExtensionAPI} api + * @param {Object} dataZoomInfo + * @param {string} dataZoomInfo.coordId + * @param {Function} dataZoomInfo.containsPoint + * @param {Array.<string>} dataZoomInfo.allCoordIds + * @param {string} dataZoomInfo.dataZoomId + * @param {number} dataZoomInfo.throttleRate + * @param {Function} dataZoomInfo.panGetRange + * @param {Function} dataZoomInfo.zoomGetRange + * @param {boolean} [dataZoomInfo.zoomLock] + * @param {boolean} [dataZoomInfo.disabled] + */ +function register$2(api, dataZoomInfo) { + var store = giveStore(api); + var theDataZoomId = dataZoomInfo.dataZoomId; + var theCoordId = dataZoomInfo.coordId; + + // Do clean when a dataZoom changes its target coordnate system. + // Avoid memory leak, dispose all not-used-registered. + each$1(store, function (record, coordId) { + var dataZoomInfos = record.dataZoomInfos; + if (dataZoomInfos[theDataZoomId] + && indexOf(dataZoomInfo.allCoordIds, theCoordId) < 0 + ) { + delete dataZoomInfos[theDataZoomId]; + record.count--; + } + }); + + cleanStore(store); + + var record = store[theCoordId]; + // Create if needed. + if (!record) { + record = store[theCoordId] = { + coordId: theCoordId, + dataZoomInfos: {}, + count: 0 + }; + record.controller = createController(api, record); + record.dispatchAction = curry(dispatchAction$1, api); + } + + // Update reference of dataZoom. + !(record.dataZoomInfos[theDataZoomId]) && record.count++; + record.dataZoomInfos[theDataZoomId] = dataZoomInfo; + + var controllerParams = mergeControllerParams(record.dataZoomInfos); + record.controller.enable(controllerParams.controlType, controllerParams.opt); + + // Consider resize, area should be always updated. + record.controller.setPointerChecker(dataZoomInfo.containsPoint); + + // Update throttle. + createOrUpdate( + record, + 'dispatchAction', + dataZoomInfo.throttleRate, + 'fixRate' + ); +} + +/** + * @public + * @param {module:echarts/ExtensionAPI} api + * @param {string} dataZoomId + */ +function unregister$1(api, dataZoomId) { + var store = giveStore(api); + + each$1(store, function (record) { + record.controller.dispose(); + var dataZoomInfos = record.dataZoomInfos; + if (dataZoomInfos[dataZoomId]) { + delete dataZoomInfos[dataZoomId]; + record.count--; + } + }); + + cleanStore(store); +} + +/** + * @public + */ +function generateCoordId(coordModel) { + return coordModel.type + '\0_' + coordModel.id; +} + +/** + * Key: coordId, value: {dataZoomInfos: [], count, controller} + * @type {Array.<Object>} + */ +function giveStore(api) { + // Mount store on zrender instance, so that we do not + // need to worry about dispose. + var zr = api.getZr(); + return zr[ATTR$1] || (zr[ATTR$1] = {}); +} + +function createController(api, newRecord) { + var controller = new RoamController(api.getZr()); + controller.on('pan', curry$6(onPan, newRecord)); + controller.on('zoom', curry$6(onZoom, newRecord)); + + return controller; +} + +function cleanStore(store) { + each$1(store, function (record, coordId) { + if (!record.count) { + record.controller.dispose(); + delete store[coordId]; + } + }); +} + +function onPan(record, dx, dy, oldX, oldY, newX, newY) { + wrapAndDispatch(record, function (info) { + return info.panGetRange(record.controller, dx, dy, oldX, oldY, newX, newY); + }); +} + +function onZoom(record, scale, mouseX, mouseY) { + wrapAndDispatch(record, function (info) { + return info.zoomGetRange(record.controller, scale, mouseX, mouseY); + }); +} + +function wrapAndDispatch(record, getRange) { + var batch = []; + + each$1(record.dataZoomInfos, function (info) { + var range = getRange(info); + !info.disabled && range && batch.push({ + dataZoomId: info.dataZoomId, + start: range[0], + end: range[1] + }); + }); + + batch.length && record.dispatchAction(batch); +} + +/** + * This action will be throttled. + */ +function dispatchAction$1(api, batch) { + api.dispatchAction({ + type: 'dataZoom', + batch: batch + }); +} + +/** + * Merge roamController settings when multiple dataZooms share one roamController. + */ +function mergeControllerParams(dataZoomInfos) { + var controlType; + var opt = {}; + // DO NOT use reserved word (true, false, undefined) as key literally. Even if encapsulated + // as string, it is probably revert to reserved word by compress tool. See #7411. + var prefix = 'type_'; + var typePriority = { + 'type_true': 2, + 'type_move': 1, + 'type_false': 0, + 'type_undefined': -1 + }; + each$1(dataZoomInfos, function (dataZoomInfo) { + var oneType = dataZoomInfo.disabled ? false : dataZoomInfo.zoomLock ? 'move' : true; + if (typePriority[prefix + oneType] > typePriority[prefix + controlType]) { + controlType = oneType; + } + // Do not support that different 'shift'/'ctrl'/'alt' setting used in one coord sys. + extend(opt, dataZoomInfo.roamControllerOpt); + }); + + return { + controlType: controlType, + opt: opt + }; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var bind$5 = bind; + +var InsideZoomView = DataZoomView.extend({ + + type: 'dataZoom.inside', + + /** + * @override + */ + init: function (ecModel, api) { + /** + * 'throttle' is used in this.dispatchAction, so we save range + * to avoid missing some 'pan' info. + * @private + * @type {Array.<number>} + */ + this._range; + }, + + /** + * @override + */ + render: function (dataZoomModel, ecModel, api, payload) { + InsideZoomView.superApply(this, 'render', arguments); + + // Hance the `throttle` util ensures to preserve command order, + // here simply updating range all the time will not cause missing + // any of the the roam change. + this._range = dataZoomModel.getPercentRange(); + + // Reset controllers. + each$1(this.getTargetCoordInfo(), function (coordInfoList, coordSysName) { + + var allCoordIds = map(coordInfoList, function (coordInfo) { + return generateCoordId(coordInfo.model); + }); + + each$1(coordInfoList, function (coordInfo) { + var coordModel = coordInfo.model; + var dataZoomOption = dataZoomModel.option; + + register$2( + api, + { + coordId: generateCoordId(coordModel), + allCoordIds: allCoordIds, + containsPoint: function (e, x, y) { + return coordModel.coordinateSystem.containPoint([x, y]); + }, + dataZoomId: dataZoomModel.id, + throttleRate: dataZoomModel.get('throttle', true), + panGetRange: bind$5(this._onPan, this, coordInfo, coordSysName), + zoomGetRange: bind$5(this._onZoom, this, coordInfo, coordSysName), + zoomLock: dataZoomOption.zoomLock, + disabled: dataZoomOption.disabled, + roamControllerOpt: { + zoomOnMouseWheel: dataZoomOption.zoomOnMouseWheel, + moveOnMouseMove: dataZoomOption.moveOnMouseMove, + preventDefaultMouseMove: dataZoomOption.preventDefaultMouseMove + } + } + ); + }, this); + + }, this); + }, + + /** + * @override + */ + dispose: function () { + unregister$1(this.api, this.dataZoomModel.id); + InsideZoomView.superApply(this, 'dispose', arguments); + this._range = null; + }, + + /** + * @private + */ + _onPan: function (coordInfo, coordSysName, controller, dx, dy, oldX, oldY, newX, newY) { + var lastRange = this._range; + var range = lastRange.slice(); + + // Calculate transform by the first axis. + var axisModel = coordInfo.axisModels[0]; + if (!axisModel) { + return; + } + + var directionInfo = getDirectionInfo[coordSysName]( + [oldX, oldY], [newX, newY], axisModel, controller, coordInfo + ); + + var percentDelta = directionInfo.signal + * (range[1] - range[0]) + * directionInfo.pixel / directionInfo.pixelLength; + + sliderMove(percentDelta, range, [0, 100], 'all'); + + this._range = range; + + if (lastRange[0] !== range[0] || lastRange[1] !== range[1]) { + return range; + } + }, + + /** + * @private + */ + _onZoom: function (coordInfo, coordSysName, controller, scale, mouseX, mouseY) { + var lastRange = this._range; + var range = lastRange.slice(); + + // Calculate transform by the first axis. + var axisModel = coordInfo.axisModels[0]; + if (!axisModel) { + return; + } + + var directionInfo = getDirectionInfo[coordSysName]( + null, [mouseX, mouseY], axisModel, controller, coordInfo + ); + var percentPoint = ( + directionInfo.signal > 0 + ? (directionInfo.pixelStart + directionInfo.pixelLength - directionInfo.pixel) + : (directionInfo.pixel - directionInfo.pixelStart) + ) / directionInfo.pixelLength * (range[1] - range[0]) + range[0]; + + scale = Math.max(1 / scale, 0); + range[0] = (range[0] - percentPoint) * scale + percentPoint; + range[1] = (range[1] - percentPoint) * scale + percentPoint; + + // Restrict range. + var minMaxSpan = this.dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan(); + + sliderMove(0, range, [0, 100], 0, minMaxSpan.minSpan, minMaxSpan.maxSpan); + + this._range = range; + + if (lastRange[0] !== range[0] || lastRange[1] !== range[1]) { + return range; + } + } + +}); + +var getDirectionInfo = { + + grid: function (oldPoint, newPoint, axisModel, controller, coordInfo) { + var axis = axisModel.axis; + var ret = {}; + var rect = coordInfo.model.coordinateSystem.getRect(); + oldPoint = oldPoint || [0, 0]; + + if (axis.dim === 'x') { + ret.pixel = newPoint[0] - oldPoint[0]; + ret.pixelLength = rect.width; + ret.pixelStart = rect.x; + ret.signal = axis.inverse ? 1 : -1; + } + else { // axis.dim === 'y' + ret.pixel = newPoint[1] - oldPoint[1]; + ret.pixelLength = rect.height; + ret.pixelStart = rect.y; + ret.signal = axis.inverse ? -1 : 1; + } + + return ret; + }, + + polar: function (oldPoint, newPoint, axisModel, controller, coordInfo) { + var axis = axisModel.axis; + var ret = {}; + var polar = coordInfo.model.coordinateSystem; + var radiusExtent = polar.getRadiusAxis().getExtent(); + var angleExtent = polar.getAngleAxis().getExtent(); + + oldPoint = oldPoint ? polar.pointToCoord(oldPoint) : [0, 0]; + newPoint = polar.pointToCoord(newPoint); + + if (axisModel.mainType === 'radiusAxis') { + ret.pixel = newPoint[0] - oldPoint[0]; + // ret.pixelLength = Math.abs(radiusExtent[1] - radiusExtent[0]); + // ret.pixelStart = Math.min(radiusExtent[0], radiusExtent[1]); + ret.pixelLength = radiusExtent[1] - radiusExtent[0]; + ret.pixelStart = radiusExtent[0]; + ret.signal = axis.inverse ? 1 : -1; + } + else { // 'angleAxis' + ret.pixel = newPoint[1] - oldPoint[1]; + // ret.pixelLength = Math.abs(angleExtent[1] - angleExtent[0]); + // ret.pixelStart = Math.min(angleExtent[0], angleExtent[1]); + ret.pixelLength = angleExtent[1] - angleExtent[0]; + ret.pixelStart = angleExtent[0]; + ret.signal = axis.inverse ? -1 : 1; + } + + return ret; + }, + + singleAxis: function (oldPoint, newPoint, axisModel, controller, coordInfo) { + var axis = axisModel.axis; + var rect = coordInfo.model.coordinateSystem.getRect(); + var ret = {}; + + oldPoint = oldPoint || [0, 0]; + + if (axis.orient === 'horizontal') { + ret.pixel = newPoint[0] - oldPoint[0]; + ret.pixelLength = rect.width; + ret.pixelStart = rect.x; + ret.signal = axis.inverse ? 1 : -1; + } + else { // 'vertical' + ret.pixel = newPoint[1] - oldPoint[1]; + ret.pixelLength = rect.height; + ret.pixelStart = rect.y; + ret.signal = axis.inverse ? -1 : 1; + } + + return ret; + } +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +registerProcessor({ + + // `dataZoomProcessor` will only be performed in needed series. Consider if + // there is a line series and a pie series, it is better not to update the + // line series if only pie series is needed to be updated. + getTargetSeries: function (ecModel) { + var seriesModelMap = createHashMap(); + + ecModel.eachComponent('dataZoom', function (dataZoomModel) { + dataZoomModel.eachTargetAxis(function (dimNames, axisIndex, dataZoomModel) { + var axisProxy = dataZoomModel.getAxisProxy(dimNames.name, axisIndex); + each$1(axisProxy.getTargetSeriesModels(), function (seriesModel) { + seriesModelMap.set(seriesModel.uid, seriesModel); + }); + }); + }); + + return seriesModelMap; + }, + + modifyOutputEnd: true, + + // Consider appendData, where filter should be performed. Because data process is + // in block mode currently, it is not need to worry about that the overallProgress + // execute every frame. + overallReset: function (ecModel, api) { + + ecModel.eachComponent('dataZoom', function (dataZoomModel) { + // We calculate window and reset axis here but not in model + // init stage and not after action dispatch handler, because + // reset should be called after seriesData.restoreData. + dataZoomModel.eachTargetAxis(function (dimNames, axisIndex, dataZoomModel) { + dataZoomModel.getAxisProxy(dimNames.name, axisIndex).reset(dataZoomModel, api); + }); + + // Caution: data zoom filtering is order sensitive when using + // percent range and no min/max/scale set on axis. + // For example, we have dataZoom definition: + // [ + // {xAxisIndex: 0, start: 30, end: 70}, + // {yAxisIndex: 0, start: 20, end: 80} + // ] + // In this case, [20, 80] of y-dataZoom should be based on data + // that have filtered by x-dataZoom using range of [30, 70], + // but should not be based on full raw data. Thus sliding + // x-dataZoom will change both ranges of xAxis and yAxis, + // while sliding y-dataZoom will only change the range of yAxis. + // So we should filter x-axis after reset x-axis immediately, + // and then reset y-axis and filter y-axis. + dataZoomModel.eachTargetAxis(function (dimNames, axisIndex, dataZoomModel) { + dataZoomModel.getAxisProxy(dimNames.name, axisIndex).filterData(dataZoomModel, api); + }); + }); + + ecModel.eachComponent('dataZoom', function (dataZoomModel) { + // Fullfill all of the range props so that user + // is able to get them from chart.getOption(). + var axisProxy = dataZoomModel.findRepresentativeAxisProxy(); + var percentRange = axisProxy.getDataPercentWindow(); + var valueRange = axisProxy.getDataValueWindow(); + + dataZoomModel.setRawRange({ + start: percentRange[0], + end: percentRange[1], + startValue: valueRange[0], + endValue: valueRange[1] + }, true); + }); + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +registerAction('dataZoom', function (payload, ecModel) { + + var linkedNodesFinder = createLinkedNodesFinder( + bind(ecModel.eachComponent, ecModel, 'dataZoom'), + eachAxisDim$1, + function (model, dimNames) { + return model.get(dimNames.axisIndex); + } + ); + + var effectedModels = []; + + ecModel.eachComponent( + {mainType: 'dataZoom', query: payload}, + function (model, index) { + effectedModels.push.apply( + effectedModels, linkedNodesFinder(model).nodes + ); + } + ); + + each$1(effectedModels, function (dataZoomModel, index) { + dataZoomModel.setRawRange({ + start: payload.start, + end: payload.end, + startValue: payload.startValue, + endValue: payload.endValue + }); + }); + +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * DataZoom component entry + */ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var each$24 = each$1; + +var preprocessor$2 = function (option) { + var visualMap = option && option.visualMap; + + if (!isArray(visualMap)) { + visualMap = visualMap ? [visualMap] : []; + } + + each$24(visualMap, function (opt) { + if (!opt) { + return; + } + + // rename splitList to pieces + if (has$1(opt, 'splitList') && !has$1(opt, 'pieces')) { + opt.pieces = opt.splitList; + delete opt.splitList; + } + + var pieces = opt.pieces; + if (pieces && isArray(pieces)) { + each$24(pieces, function (piece) { + if (isObject$1(piece)) { + if (has$1(piece, 'start') && !has$1(piece, 'min')) { + piece.min = piece.start; + } + if (has$1(piece, 'end') && !has$1(piece, 'max')) { + piece.max = piece.end; + } + } + }); + } + }); +}; + +function has$1(obj, name) { + return obj && obj.hasOwnProperty && obj.hasOwnProperty(name); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +ComponentModel.registerSubTypeDefaulter('visualMap', function (option) { + // Compatible with ec2, when splitNumber === 0, continuous visualMap will be used. + return ( + !option.categories + && ( + !( + option.pieces + ? option.pieces.length > 0 + : option.splitNumber > 0 + ) + || option.calculable + ) + ) + ? 'continuous' : 'piecewise'; +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var VISUAL_PRIORITY = PRIORITY.VISUAL.COMPONENT; + +registerVisual(VISUAL_PRIORITY, { + createOnAllSeries: true, + reset: function (seriesModel, ecModel) { + var resetDefines = []; + ecModel.eachComponent('visualMap', function (visualMapModel) { + var pipelineContext = seriesModel.pipelineContext; + if (!visualMapModel.isTargetSeries(seriesModel) + || (pipelineContext && pipelineContext.large) + ) { + return; + } + + resetDefines.push(incrementalApplyVisual( + visualMapModel.stateList, + visualMapModel.targetVisuals, + bind(visualMapModel.getValueState, visualMapModel), + visualMapModel.getDataDimension(seriesModel.getData()) + )); + }); + + return resetDefines; + } +}); + +// Only support color. +registerVisual(VISUAL_PRIORITY, { + createOnAllSeries: true, + reset: function (seriesModel, ecModel) { + var data = seriesModel.getData(); + var visualMetaList = []; + + ecModel.eachComponent('visualMap', function (visualMapModel) { + if (visualMapModel.isTargetSeries(seriesModel)) { + var visualMeta = visualMapModel.getVisualMeta( + bind(getColorVisual, null, seriesModel, visualMapModel) + ) || {stops: [], outerColors: []}; + + var concreteDim = visualMapModel.getDataDimension(data); + var dimInfo = data.getDimensionInfo(concreteDim); + if (dimInfo != null) { + // visualMeta.dimension should be dimension index, but not concrete dimension. + visualMeta.dimension = dimInfo.index; + visualMetaList.push(visualMeta); + } + } + }); + + // console.log(JSON.stringify(visualMetaList.map(a => a.stops))); + seriesModel.getData().setVisual('visualMeta', visualMetaList); + } +}); + +// FIXME +// performance and export for heatmap? +// value can be Infinity or -Infinity +function getColorVisual(seriesModel, visualMapModel, value, valueState) { + var mappings = visualMapModel.targetVisuals[valueState]; + var visualTypes = VisualMapping.prepareVisualTypes(mappings); + var resultVisual = { + color: seriesModel.getData().getVisual('color') // default color. + }; + + for (var i = 0, len = visualTypes.length; i < len; i++) { + var type = visualTypes[i]; + var mapping = mappings[ + type === 'opacity' ? '__alphaForOpacity' : type + ]; + mapping && mapping.applyVisual(value, getVisual, setVisual); + } + + return resultVisual.color; + + function getVisual(key) { + return resultVisual[key]; + } + + function setVisual(key, value) { + resultVisual[key] = value; + } +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @file Visual mapping. + */ + +var visualDefault = { + + /** + * @public + */ + get: function (visualType, key, isCategory) { + var value = clone( + (defaultOption$3[visualType] || {})[key] + ); + + return isCategory + ? (isArray(value) ? value[value.length - 1] : value) + : value; + } + +}; + +var defaultOption$3 = { + + color: { + active: ['#006edd', '#e0ffff'], + inactive: ['rgba(0,0,0,0)'] + }, + + colorHue: { + active: [0, 360], + inactive: [0, 0] + }, + + colorSaturation: { + active: [0.3, 1], + inactive: [0, 0] + }, + + colorLightness: { + active: [0.9, 0.5], + inactive: [0, 0] + }, + + colorAlpha: { + active: [0.3, 1], + inactive: [0, 0] + }, + + opacity: { + active: [0.3, 1], + inactive: [0, 0] + }, + + symbol: { + active: ['circle', 'roundRect', 'diamond'], + inactive: ['none'] + }, + + symbolSize: { + active: [10, 50], + inactive: [0, 0] + } +}; + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var mapVisual$2 = VisualMapping.mapVisual; +var eachVisual = VisualMapping.eachVisual; +var isArray$3 = isArray; +var each$25 = each$1; +var asc$3 = asc; +var linearMap$2 = linearMap; +var noop$2 = noop; + +var VisualMapModel = extendComponentModel({ + + type: 'visualMap', + + dependencies: ['series'], + + /** + * @readOnly + * @type {Array.<string>} + */ + stateList: ['inRange', 'outOfRange'], + + /** + * @readOnly + * @type {Array.<string>} + */ + replacableOptionKeys: [ + 'inRange', 'outOfRange', 'target', 'controller', 'color' + ], + + /** + * [lowerBound, upperBound] + * + * @readOnly + * @type {Array.<number>} + */ + dataBound: [-Infinity, Infinity], + + /** + * @readOnly + * @type {string|Object} + */ + layoutMode: {type: 'box', ignoreSize: true}, + + /** + * @protected + */ + defaultOption: { + show: true, + + zlevel: 0, + z: 4, + + seriesIndex: 'all', // 'all' or null/undefined: all series. + // A number or an array of number: the specified series. + + // set min: 0, max: 200, only for campatible with ec2. + // In fact min max should not have default value. + min: 0, // min value, must specified if pieces is not specified. + max: 200, // max value, must specified if pieces is not specified. + + dimension: null, + inRange: null, // 'color', 'colorHue', 'colorSaturation', 'colorLightness', 'colorAlpha', + // 'symbol', 'symbolSize' + outOfRange: null, // 'color', 'colorHue', 'colorSaturation', + // 'colorLightness', 'colorAlpha', + // 'symbol', 'symbolSize' + + left: 0, // 'center' ¦ 'left' ¦ 'right' ¦ {number} (px) + right: null, // The same as left. + top: null, // 'top' ¦ 'bottom' ¦ 'center' ¦ {number} (px) + bottom: 0, // The same as top. + + itemWidth: null, + itemHeight: null, + inverse: false, + orient: 'vertical', // 'horizontal' ¦ 'vertical' + + backgroundColor: 'rgba(0,0,0,0)', + borderColor: '#ccc', // 值域边框颜色 + contentColor: '#5793f3', + inactiveColor: '#aaa', + borderWidth: 0, // 值域边框线宽,单位px,默认为0(无边框) + padding: 5, // 值域内边距,单位px,默认各方向内边距为5, + // 接受数组分别设定上右下左边距,同css + textGap: 10, // + precision: 0, // 小数精度,默认为0,无小数点 + color: null, //颜色(deprecated,兼容ec2,顺序同pieces,不同于inRange/outOfRange) + + formatter: null, + text: null, // 文本,如['高', '低'],兼容ec2,text[0]对应高值,text[1]对应低值 + textStyle: { + color: '#333' // 值域文字颜色 + } + }, + + /** + * @protected + */ + init: function (option, parentModel, ecModel) { + + /** + * @private + * @type {Array.<number>} + */ + this._dataExtent; + + /** + * @readOnly + */ + this.targetVisuals = {}; + + /** + * @readOnly + */ + this.controllerVisuals = {}; + + /** + * @readOnly + */ + this.textStyleModel; + + /** + * [width, height] + * @readOnly + * @type {Array.<number>} + */ + this.itemSize; + + this.mergeDefaultAndTheme(option, ecModel); + }, + + /** + * @protected + */ + optionUpdated: function (newOption, isInit) { + var thisOption = this.option; + + // FIXME + // necessary? + // Disable realtime view update if canvas is not supported. + if (!env$1.canvasSupported) { + thisOption.realtime = false; + } + + !isInit && replaceVisualOption( + thisOption, newOption, this.replacableOptionKeys + ); + + this.textStyleModel = this.getModel('textStyle'); + + this.resetItemSize(); + + this.completeVisualOption(); + }, + + /** + * @protected + */ + resetVisual: function (supplementVisualOption) { + var stateList = this.stateList; + supplementVisualOption = bind(supplementVisualOption, this); + + this.controllerVisuals = createVisualMappings( + this.option.controller, stateList, supplementVisualOption + ); + this.targetVisuals = createVisualMappings( + this.option.target, stateList, supplementVisualOption + ); + }, + + /** + * @protected + * @return {Array.<number>} An array of series indices. + */ + getTargetSeriesIndices: function () { + var optionSeriesIndex = this.option.seriesIndex; + var seriesIndices = []; + + if (optionSeriesIndex == null || optionSeriesIndex === 'all') { + this.ecModel.eachSeries(function (seriesModel, index) { + seriesIndices.push(index); + }); + } + else { + seriesIndices = normalizeToArray(optionSeriesIndex); + } + + return seriesIndices; + }, + + /** + * @public + */ + eachTargetSeries: function (callback, context) { + each$1(this.getTargetSeriesIndices(), function (seriesIndex) { + callback.call(context, this.ecModel.getSeriesByIndex(seriesIndex)); + }, this); + }, + + /** + * @pubilc + */ + isTargetSeries: function (seriesModel) { + var is = false; + this.eachTargetSeries(function (model) { + model === seriesModel && (is = true); + }); + return is; + }, + + /** + * @example + * this.formatValueText(someVal); // format single numeric value to text. + * this.formatValueText(someVal, true); // format single category value to text. + * this.formatValueText([min, max]); // format numeric min-max to text. + * this.formatValueText([this.dataBound[0], max]); // using data lower bound. + * this.formatValueText([min, this.dataBound[1]]); // using data upper bound. + * + * @param {number|Array.<number>} value Real value, or this.dataBound[0 or 1]. + * @param {boolean} [isCategory=false] Only available when value is number. + * @param {Array.<string>} edgeSymbols Open-close symbol when value is interval. + * @return {string} + * @protected + */ + formatValueText: function(value, isCategory, edgeSymbols) { + var option = this.option; + var precision = option.precision; + var dataBound = this.dataBound; + var formatter = option.formatter; + var isMinMax; + var textValue; + edgeSymbols = edgeSymbols || ['<', '>']; + + if (isArray(value)) { + value = value.slice(); + isMinMax = true; + } + + textValue = isCategory + ? value + : (isMinMax + ? [toFixed(value[0]), toFixed(value[1])] + : toFixed(value) + ); + + if (isString(formatter)) { + return formatter + .replace('{value}', isMinMax ? textValue[0] : textValue) + .replace('{value2}', isMinMax ? textValue[1] : textValue); + } + else if (isFunction$1(formatter)) { + return isMinMax + ? formatter(value[0], value[1]) + : formatter(value); + } + + if (isMinMax) { + if (value[0] === dataBound[0]) { + return edgeSymbols[0] + ' ' + textValue[1]; + } + else if (value[1] === dataBound[1]) { + return edgeSymbols[1] + ' ' + textValue[0]; + } + else { + return textValue[0] + ' - ' + textValue[1]; + } + } + else { // Format single value (includes category case). + return textValue; + } + + function toFixed(val) { + return val === dataBound[0] + ? 'min' + : val === dataBound[1] + ? 'max' + : (+val).toFixed(Math.min(precision, 20)); + } + }, + + /** + * @protected + */ + resetExtent: function () { + var thisOption = this.option; + + // Can not calculate data extent by data here. + // Because series and data may be modified in processing stage. + // So we do not support the feature "auto min/max". + + var extent = asc$3([thisOption.min, thisOption.max]); + + this._dataExtent = extent; + }, + + /** + * @public + * @param {module:echarts/data/List} list + * @return {string} Concrete dimention. If return null/undefined, + * no dimension used. + */ + getDataDimension: function (list) { + var optDim = this.option.dimension; + var listDimensions = list.dimensions; + if (optDim == null && !listDimensions.length) { + return; + } + + if (optDim != null) { + return list.getDimension(optDim); + } + + var dimNames = list.dimensions; + for (var i = dimNames.length - 1; i >= 0; i--) { + var dimName = dimNames[i]; + var dimInfo = list.getDimensionInfo(dimName); + if (!dimInfo.isCalculationCoord) { + return dimName; + } + } + }, + + /** + * @public + * @override + */ + getExtent: function () { + return this._dataExtent.slice(); + }, + + /** + * @protected + */ + completeVisualOption: function () { + var ecModel = this.ecModel; + var thisOption = this.option; + var base = {inRange: thisOption.inRange, outOfRange: thisOption.outOfRange}; + + var target = thisOption.target || (thisOption.target = {}); + var controller = thisOption.controller || (thisOption.controller = {}); + + merge(target, base); // Do not override + merge(controller, base); // Do not override + + var isCategory = this.isCategory(); + + completeSingle.call(this, target); + completeSingle.call(this, controller); + completeInactive.call(this, target, 'inRange', 'outOfRange'); + // completeInactive.call(this, target, 'outOfRange', 'inRange'); + completeController.call(this, controller); + + function completeSingle(base) { + // Compatible with ec2 dataRange.color. + // The mapping order of dataRange.color is: [high value, ..., low value] + // whereas inRange.color and outOfRange.color is [low value, ..., high value] + // Notice: ec2 has no inverse. + if (isArray$3(thisOption.color) + // If there has been inRange: {symbol: ...}, adding color is a mistake. + // So adding color only when no inRange defined. + && !base.inRange + ) { + base.inRange = {color: thisOption.color.slice().reverse()}; + } + + // Compatible with previous logic, always give a defautl color, otherwise + // simple config with no inRange and outOfRange will not work. + // Originally we use visualMap.color as the default color, but setOption at + // the second time the default color will be erased. So we change to use + // constant DEFAULT_COLOR. + // If user do not want the defualt color, set inRange: {color: null}. + base.inRange = base.inRange || {color: ecModel.get('gradientColor')}; + + // If using shortcut like: {inRange: 'symbol'}, complete default value. + each$25(this.stateList, function (state) { + var visualType = base[state]; + + if (isString(visualType)) { + var defa = visualDefault.get(visualType, 'active', isCategory); + if (defa) { + base[state] = {}; + base[state][visualType] = defa; + } + else { + // Mark as not specified. + delete base[state]; + } + } + }, this); + } + + function completeInactive(base, stateExist, stateAbsent) { + var optExist = base[stateExist]; + var optAbsent = base[stateAbsent]; + + if (optExist && !optAbsent) { + optAbsent = base[stateAbsent] = {}; + each$25(optExist, function (visualData, visualType) { + if (!VisualMapping.isValidType(visualType)) { + return; + } + + var defa = visualDefault.get(visualType, 'inactive', isCategory); + + if (defa != null) { + optAbsent[visualType] = defa; + + // Compatibable with ec2: + // Only inactive color to rgba(0,0,0,0) can not + // make label transparent, so use opacity also. + if (visualType === 'color' + && !optAbsent.hasOwnProperty('opacity') + && !optAbsent.hasOwnProperty('colorAlpha') + ) { + optAbsent.opacity = [0, 0]; + } + } + }); + } + } + + function completeController(controller) { + var symbolExists = (controller.inRange || {}).symbol + || (controller.outOfRange || {}).symbol; + var symbolSizeExists = (controller.inRange || {}).symbolSize + || (controller.outOfRange || {}).symbolSize; + var inactiveColor = this.get('inactiveColor'); + + each$25(this.stateList, function (state) { + + var itemSize = this.itemSize; + var visuals = controller[state]; + + // Set inactive color for controller if no other color + // attr (like colorAlpha) specified. + if (!visuals) { + visuals = controller[state] = { + color: isCategory ? inactiveColor : [inactiveColor] + }; + } + + // Consistent symbol and symbolSize if not specified. + if (visuals.symbol == null) { + visuals.symbol = symbolExists + && clone(symbolExists) + || (isCategory ? 'roundRect' : ['roundRect']); + } + if (visuals.symbolSize == null) { + visuals.symbolSize = symbolSizeExists + && clone(symbolSizeExists) + || (isCategory ? itemSize[0] : [itemSize[0], itemSize[0]]); + } + + // Filter square and none. + visuals.symbol = mapVisual$2(visuals.symbol, function (symbol) { + return (symbol === 'none' || symbol === 'square') ? 'roundRect' : symbol; + }); + + // Normalize symbolSize + var symbolSize = visuals.symbolSize; + + if (symbolSize != null) { + var max = -Infinity; + // symbolSize can be object when categories defined. + eachVisual(symbolSize, function (value) { + value > max && (max = value); + }); + visuals.symbolSize = mapVisual$2(symbolSize, function (value) { + return linearMap$2(value, [0, max], [0, itemSize[0]], true); + }); + } + + }, this); + } + }, + + /** + * @protected + */ + resetItemSize: function () { + this.itemSize = [ + parseFloat(this.get('itemWidth')), + parseFloat(this.get('itemHeight')) + ]; + }, + + /** + * @public + */ + isCategory: function () { + return !!this.option.categories; + }, + + /** + * @public + * @abstract + */ + setSelected: noop$2, + + /** + * @public + * @abstract + * @param {*|module:echarts/data/List} valueOrData + * @param {number} dataIndex + * @return {string} state See this.stateList + */ + getValueState: noop$2, + + /** + * FIXME + * Do not publish to thirt-part-dev temporarily + * util the interface is stable. (Should it return + * a function but not visual meta?) + * + * @pubilc + * @abstract + * @param {Function} getColorVisual + * params: value, valueState + * return: color + * @return {Object} visualMeta + * should includes {stops, outerColors} + * outerColor means [colorBeyondMinValue, colorBeyondMaxValue] + */ + getVisualMeta: noop$2 + +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// Constant +var DEFAULT_BAR_BOUND = [20, 140]; + +var ContinuousModel = VisualMapModel.extend({ + + type: 'visualMap.continuous', + + /** + * @protected + */ + defaultOption: { + align: 'auto', // 'auto', 'left', 'right', 'top', 'bottom' + calculable: false, // This prop effect default component type determine, + // See echarts/component/visualMap/typeDefaulter. + range: null, // selected range. In default case `range` is [min, max] + // and can auto change along with modification of min max, + // util use specifid a range. + realtime: true, // Whether realtime update. + itemHeight: null, // The length of the range control edge. + itemWidth: null, // The length of the other side. + hoverLink: true, // Enable hover highlight. + hoverLinkDataSize: null,// The size of hovered data. + hoverLinkOnHandle: null // Whether trigger hoverLink when hover handle. + // If not specified, follow the value of `realtime`. + }, + + /** + * @override + */ + optionUpdated: function (newOption, isInit) { + ContinuousModel.superApply(this, 'optionUpdated', arguments); + + this.resetExtent(); + + this.resetVisual(function (mappingOption) { + mappingOption.mappingMethod = 'linear'; + mappingOption.dataExtent = this.getExtent(); + }); + + this._resetRange(); + }, + + /** + * @protected + * @override + */ + resetItemSize: function () { + ContinuousModel.superApply(this, 'resetItemSize', arguments); + + var itemSize = this.itemSize; + + this._orient === 'horizontal' && itemSize.reverse(); + + (itemSize[0] == null || isNaN(itemSize[0])) && (itemSize[0] = DEFAULT_BAR_BOUND[0]); + (itemSize[1] == null || isNaN(itemSize[1])) && (itemSize[1] = DEFAULT_BAR_BOUND[1]); + }, + + /** + * @private + */ + _resetRange: function () { + var dataExtent = this.getExtent(); + var range = this.option.range; + + if (!range || range.auto) { + // `range` should always be array (so we dont use other + // value like 'auto') for user-friend. (consider getOption). + dataExtent.auto = 1; + this.option.range = dataExtent; + } + else if (isArray(range)) { + if (range[0] > range[1]) { + range.reverse(); + } + range[0] = Math.max(range[0], dataExtent[0]); + range[1] = Math.min(range[1], dataExtent[1]); + } + }, + + /** + * @protected + * @override + */ + completeVisualOption: function () { + VisualMapModel.prototype.completeVisualOption.apply(this, arguments); + + each$1(this.stateList, function (state) { + var symbolSize = this.option.controller[state].symbolSize; + if (symbolSize && symbolSize[0] !== symbolSize[1]) { + symbolSize[0] = 0; // For good looking. + } + }, this); + }, + + /** + * @override + */ + setSelected: function (selected) { + this.option.range = selected.slice(); + this._resetRange(); + }, + + /** + * @public + */ + getSelected: function () { + var dataExtent = this.getExtent(); + + var dataInterval = asc( + (this.get('range') || []).slice() + ); + + // Clamp + dataInterval[0] > dataExtent[1] && (dataInterval[0] = dataExtent[1]); + dataInterval[1] > dataExtent[1] && (dataInterval[1] = dataExtent[1]); + dataInterval[0] < dataExtent[0] && (dataInterval[0] = dataExtent[0]); + dataInterval[1] < dataExtent[0] && (dataInterval[1] = dataExtent[0]); + + return dataInterval; + }, + + /** + * @override + */ + getValueState: function (value) { + var range = this.option.range; + var dataExtent = this.getExtent(); + + // When range[0] === dataExtent[0], any value larger than dataExtent[0] maps to 'inRange'. + // range[1] is processed likewise. + return ( + (range[0] <= dataExtent[0] || range[0] <= value) + && (range[1] >= dataExtent[1] || value <= range[1]) + ) ? 'inRange' : 'outOfRange'; + }, + + /** + * @params {Array.<number>} range target value: range[0] <= value && value <= range[1] + * @return {Array.<Object>} [{seriesId, dataIndices: <Array.<number>>}, ...] + */ + findTargetDataIndices: function (range) { + var result = []; + + this.eachTargetSeries(function (seriesModel) { + var dataIndices = []; + var data = seriesModel.getData(); + + data.each(this.getDataDimension(data), function (value, dataIndex) { + range[0] <= value && value <= range[1] && dataIndices.push(dataIndex); + }, this); + + result.push({seriesId: seriesModel.id, dataIndex: dataIndices}); + }, this); + + return result; + }, + + /** + * @implement + */ + getVisualMeta: function (getColorVisual) { + var oVals = getColorStopValues(this, 'outOfRange', this.getExtent()); + var iVals = getColorStopValues(this, 'inRange', this.option.range.slice()); + var stops = []; + + function setStop(value, valueState) { + stops.push({ + value: value, + color: getColorVisual(value, valueState) + }); + } + + // Format to: outOfRange -- inRange -- outOfRange. + var iIdx = 0; + var oIdx = 0; + var iLen = iVals.length; + var oLen = oVals.length; + + for (; oIdx < oLen && (!iVals.length || oVals[oIdx] <= iVals[0]); oIdx++) { + // If oVal[oIdx] === iVals[iIdx], oVal[oIdx] should be ignored. + if (oVals[oIdx] < iVals[iIdx]) { + setStop(oVals[oIdx], 'outOfRange'); + } + } + for (var first = 1; iIdx < iLen; iIdx++, first = 0) { + // If range is full, value beyond min, max will be clamped. + // make a singularity + first && stops.length && setStop(iVals[iIdx], 'outOfRange'); + setStop(iVals[iIdx], 'inRange'); + } + for (var first = 1; oIdx < oLen; oIdx++) { + if (!iVals.length || iVals[iVals.length - 1] < oVals[oIdx]) { + // make a singularity + if (first) { + stops.length && setStop(stops[stops.length - 1].value, 'outOfRange'); + first = 0; + } + setStop(oVals[oIdx], 'outOfRange'); + } + } + + var stopsLen = stops.length; + + return { + stops: stops, + outerColors: [ + stopsLen ? stops[0].color : 'transparent', + stopsLen ? stops[stopsLen - 1].color : 'transparent' + ] + }; + } + +}); + +function getColorStopValues(visualMapModel, valueState, dataExtent) { + if (dataExtent[0] === dataExtent[1]) { + return dataExtent.slice(); + } + + // When using colorHue mapping, it is not linear color any more. + // Moreover, canvas gradient seems not to be accurate linear. + // FIXME + // Should be arbitrary value 100? or based on pixel size? + var count = 200; + var step = (dataExtent[1] - dataExtent[0]) / count; + + var value = dataExtent[0]; + var stopValues = []; + for (var i = 0; i <= count && value < dataExtent[1]; i++) { + stopValues.push(value); + value += step; + } + stopValues.push(dataExtent[1]); + + return stopValues; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var VisualMapView = extendComponentView({ + + type: 'visualMap', + + /** + * @readOnly + * @type {Object} + */ + autoPositionValues: {left: 1, right: 1, top: 1, bottom: 1}, + + init: function (ecModel, api) { + /** + * @readOnly + * @type {module:echarts/model/Global} + */ + this.ecModel = ecModel; + + /** + * @readOnly + * @type {module:echarts/ExtensionAPI} + */ + this.api = api; + + /** + * @readOnly + * @type {module:echarts/component/visualMap/visualMapModel} + */ + this.visualMapModel; + }, + + /** + * @protected + */ + render: function (visualMapModel, ecModel, api, payload) { + this.visualMapModel = visualMapModel; + + if (visualMapModel.get('show') === false) { + this.group.removeAll(); + return; + } + + this.doRender.apply(this, arguments); + }, + + /** + * @protected + */ + renderBackground: function (group) { + var visualMapModel = this.visualMapModel; + var padding = normalizeCssArray$1(visualMapModel.get('padding') || 0); + var rect = group.getBoundingRect(); + + group.add(new Rect({ + z2: -1, // Lay background rect on the lowest layer. + silent: true, + shape: { + x: rect.x - padding[3], + y: rect.y - padding[0], + width: rect.width + padding[3] + padding[1], + height: rect.height + padding[0] + padding[2] + }, + style: { + fill: visualMapModel.get('backgroundColor'), + stroke: visualMapModel.get('borderColor'), + lineWidth: visualMapModel.get('borderWidth') + } + })); + }, + + /** + * @protected + * @param {number} targetValue can be Infinity or -Infinity + * @param {string=} visualCluster Only can be 'color' 'opacity' 'symbol' 'symbolSize' + * @param {Object} [opts] + * @param {string=} [opts.forceState] Specify state, instead of using getValueState method. + * @param {string=} [opts.convertOpacityToAlpha=false] For color gradient in controller widget. + * @return {*} Visual value. + */ + getControllerVisual: function (targetValue, visualCluster, opts) { + opts = opts || {}; + + var forceState = opts.forceState; + var visualMapModel = this.visualMapModel; + var visualObj = {}; + + // Default values. + if (visualCluster === 'symbol') { + visualObj.symbol = visualMapModel.get('itemSymbol'); + } + if (visualCluster === 'color') { + var defaultColor = visualMapModel.get('contentColor'); + visualObj.color = defaultColor; + } + + function getter(key) { + return visualObj[key]; + } + + function setter(key, value) { + visualObj[key] = value; + } + + var mappings = visualMapModel.controllerVisuals[ + forceState || visualMapModel.getValueState(targetValue) + ]; + var visualTypes = VisualMapping.prepareVisualTypes(mappings); + + each$1(visualTypes, function (type) { + var visualMapping = mappings[type]; + if (opts.convertOpacityToAlpha && type === 'opacity') { + type = 'colorAlpha'; + visualMapping = mappings.__alphaForOpacity; + } + if (VisualMapping.dependsOn(type, visualCluster)) { + visualMapping && visualMapping.applyVisual( + targetValue, getter, setter + ); + } + }); + + return visualObj[visualCluster]; + }, + + /** + * @protected + */ + positionGroup: function (group) { + var model = this.visualMapModel; + var api = this.api; + + positionElement( + group, + model.getBoxLayoutParams(), + {width: api.getWidth(), height: api.getHeight()} + ); + }, + + /** + * @protected + * @abstract + */ + doRender: noop + +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * @param {module:echarts/component/visualMap/VisualMapModel} visualMapModel\ + * @param {module:echarts/ExtensionAPI} api + * @param {Array.<number>} itemSize always [short, long] + * @return {string} 'left' or 'right' or 'top' or 'bottom' + */ +function getItemAlign(visualMapModel, api, itemSize) { + var modelOption = visualMapModel.option; + var itemAlign = modelOption.align; + + if (itemAlign != null && itemAlign !== 'auto') { + return itemAlign; + } + + // Auto decision align. + var ecSize = {width: api.getWidth(), height: api.getHeight()}; + var realIndex = modelOption.orient === 'horizontal' ? 1 : 0; + + var paramsSet = [ + ['left', 'right', 'width'], + ['top', 'bottom', 'height'] + ]; + var reals = paramsSet[realIndex]; + var fakeValue = [0, null, 10]; + + var layoutInput = {}; + for (var i = 0; i < 3; i++) { + layoutInput[paramsSet[1 - realIndex][i]] = fakeValue[i]; + layoutInput[reals[i]] = i === 2 ? itemSize[0] : modelOption[reals[i]]; + } + + var rParam = [['x', 'width', 3], ['y', 'height', 0]][realIndex]; + var rect = getLayoutRect(layoutInput, ecSize, modelOption.padding); + + return reals[ + (rect.margin[rParam[2]] || 0) + rect[rParam[0]] + rect[rParam[1]] * 0.5 + < ecSize[rParam[1]] * 0.5 ? 0 : 1 + ]; +} + +/** + * Prepare dataIndex for outside usage, where dataIndex means rawIndex, and + * dataIndexInside means filtered index. + */ +function convertDataIndex(batch) { + each$1(batch || [], function (batchItem) { + if (batch.dataIndex != null) { + batch.dataIndexInside = batch.dataIndex; + batch.dataIndex = null; + } + }); + return batch; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var linearMap$3 = linearMap; +var each$26 = each$1; +var mathMin$7 = Math.min; +var mathMax$7 = Math.max; + +// Arbitrary value +var HOVER_LINK_SIZE = 12; +var HOVER_LINK_OUT = 6; + +// Notice: +// Any "interval" should be by the order of [low, high]. +// "handle0" (handleIndex === 0) maps to +// low data value: this._dataInterval[0] and has low coord. +// "handle1" (handleIndex === 1) maps to +// high data value: this._dataInterval[1] and has high coord. +// The logic of transform is implemented in this._createBarGroup. + +var ContinuousView = VisualMapView.extend({ + + type: 'visualMap.continuous', + + /** + * @override + */ + init: function () { + + ContinuousView.superApply(this, 'init', arguments); + + /** + * @private + */ + this._shapes = {}; + + /** + * @private + */ + this._dataInterval = []; + + /** + * @private + */ + this._handleEnds = []; + + /** + * @private + */ + this._orient; + + /** + * @private + */ + this._useHandle; + + /** + * @private + */ + this._hoverLinkDataIndices = []; + + /** + * @private + */ + this._dragging; + + /** + * @private + */ + this._hovering; + }, + + /** + * @protected + * @override + */ + doRender: function (visualMapModel, ecModel, api, payload) { + if (!payload || payload.type !== 'selectDataRange' || payload.from !== this.uid) { + this._buildView(); + } + }, + + /** + * @private + */ + _buildView: function () { + this.group.removeAll(); + + var visualMapModel = this.visualMapModel; + var thisGroup = this.group; + + this._orient = visualMapModel.get('orient'); + this._useHandle = visualMapModel.get('calculable'); + + this._resetInterval(); + + this._renderBar(thisGroup); + + var dataRangeText = visualMapModel.get('text'); + this._renderEndsText(thisGroup, dataRangeText, 0); + this._renderEndsText(thisGroup, dataRangeText, 1); + + // Do this for background size calculation. + this._updateView(true); + + // After updating view, inner shapes is built completely, + // and then background can be rendered. + this.renderBackground(thisGroup); + + // Real update view + this._updateView(); + + this._enableHoverLinkToSeries(); + this._enableHoverLinkFromSeries(); + + this.positionGroup(thisGroup); + }, + + /** + * @private + */ + _renderEndsText: function (group, dataRangeText, endsIndex) { + if (!dataRangeText) { + return; + } + + // Compatible with ec2, text[0] map to high value, text[1] map low value. + var text = dataRangeText[1 - endsIndex]; + text = text != null ? text + '' : ''; + + var visualMapModel = this.visualMapModel; + var textGap = visualMapModel.get('textGap'); + var itemSize = visualMapModel.itemSize; + + var barGroup = this._shapes.barGroup; + var position = this._applyTransform( + [ + itemSize[0] / 2, + endsIndex === 0 ? -textGap : itemSize[1] + textGap + ], + barGroup + ); + var align = this._applyTransform( + endsIndex === 0 ? 'bottom' : 'top', + barGroup + ); + var orient = this._orient; + var textStyleModel = this.visualMapModel.textStyleModel; + + this.group.add(new Text({ + style: { + x: position[0], + y: position[1], + textVerticalAlign: orient === 'horizontal' ? 'middle' : align, + textAlign: orient === 'horizontal' ? align : 'center', + text: text, + textFont: textStyleModel.getFont(), + textFill: textStyleModel.getTextColor() + } + })); + }, + + /** + * @private + */ + _renderBar: function (targetGroup) { + var visualMapModel = this.visualMapModel; + var shapes = this._shapes; + var itemSize = visualMapModel.itemSize; + var orient = this._orient; + var useHandle = this._useHandle; + var itemAlign = getItemAlign(visualMapModel, this.api, itemSize); + var barGroup = shapes.barGroup = this._createBarGroup(itemAlign); + + // Bar + barGroup.add(shapes.outOfRange = createPolygon()); + barGroup.add(shapes.inRange = createPolygon( + null, + useHandle ? getCursor$1(this._orient) : null, + bind(this._dragHandle, this, 'all', false), + bind(this._dragHandle, this, 'all', true) + )); + + var textRect = visualMapModel.textStyleModel.getTextRect('国'); + var textSize = mathMax$7(textRect.width, textRect.height); + + // Handle + if (useHandle) { + shapes.handleThumbs = []; + shapes.handleLabels = []; + shapes.handleLabelPoints = []; + + this._createHandle(barGroup, 0, itemSize, textSize, orient, itemAlign); + this._createHandle(barGroup, 1, itemSize, textSize, orient, itemAlign); + } + + this._createIndicator(barGroup, itemSize, textSize, orient); + + targetGroup.add(barGroup); + }, + + /** + * @private + */ + _createHandle: function (barGroup, handleIndex, itemSize, textSize, orient) { + var onDrift = bind(this._dragHandle, this, handleIndex, false); + var onDragEnd = bind(this._dragHandle, this, handleIndex, true); + var handleThumb = createPolygon( + createHandlePoints(handleIndex, textSize), + getCursor$1(this._orient), + onDrift, + onDragEnd + ); + handleThumb.position[0] = itemSize[0]; + barGroup.add(handleThumb); + + // Text is always horizontal layout but should not be effected by + // transform (orient/inverse). So label is built separately but not + // use zrender/graphic/helper/RectText, and is located based on view + // group (according to handleLabelPoint) but not barGroup. + var textStyleModel = this.visualMapModel.textStyleModel; + var handleLabel = new Text({ + draggable: true, + drift: onDrift, + onmousemove: function (e) { + // Fot mobile devicem, prevent screen slider on the button. + stop(e.event); + }, + ondragend: onDragEnd, + style: { + x: 0, y: 0, text: '', + textFont: textStyleModel.getFont(), + textFill: textStyleModel.getTextColor() + } + }); + this.group.add(handleLabel); + + var handleLabelPoint = [ + orient === 'horizontal' + ? textSize / 2 + : textSize * 1.5, + orient === 'horizontal' + ? (handleIndex === 0 ? -(textSize * 1.5) : (textSize * 1.5)) + : (handleIndex === 0 ? -textSize / 2 : textSize / 2) + ]; + + var shapes = this._shapes; + shapes.handleThumbs[handleIndex] = handleThumb; + shapes.handleLabelPoints[handleIndex] = handleLabelPoint; + shapes.handleLabels[handleIndex] = handleLabel; + }, + + /** + * @private + */ + _createIndicator: function (barGroup, itemSize, textSize, orient) { + var indicator = createPolygon([[0, 0]], 'move'); + indicator.position[0] = itemSize[0]; + indicator.attr({invisible: true, silent: true}); + barGroup.add(indicator); + + var textStyleModel = this.visualMapModel.textStyleModel; + var indicatorLabel = new Text({ + silent: true, + invisible: true, + style: { + x: 0, y: 0, text: '', + textFont: textStyleModel.getFont(), + textFill: textStyleModel.getTextColor() + } + }); + this.group.add(indicatorLabel); + + var indicatorLabelPoint = [ + orient === 'horizontal' ? textSize / 2 : HOVER_LINK_OUT + 3, + 0 + ]; + + var shapes = this._shapes; + shapes.indicator = indicator; + shapes.indicatorLabel = indicatorLabel; + shapes.indicatorLabelPoint = indicatorLabelPoint; + }, + + /** + * @private + */ + _dragHandle: function (handleIndex, isEnd, dx, dy) { + if (!this._useHandle) { + return; + } + + this._dragging = !isEnd; + + if (!isEnd) { + // Transform dx, dy to bar coordination. + var vertex = this._applyTransform([dx, dy], this._shapes.barGroup, true); + this._updateInterval(handleIndex, vertex[1]); + + // Considering realtime, update view should be executed + // before dispatch action. + this._updateView(); + } + + // dragEnd do not dispatch action when realtime. + if (isEnd === !this.visualMapModel.get('realtime')) { // jshint ignore:line + this.api.dispatchAction({ + type: 'selectDataRange', + from: this.uid, + visualMapId: this.visualMapModel.id, + selected: this._dataInterval.slice() + }); + } + + if (isEnd) { + !this._hovering && this._clearHoverLinkToSeries(); + } + else if (useHoverLinkOnHandle(this.visualMapModel)) { + this._doHoverLinkToSeries(this._handleEnds[handleIndex], false); + } + }, + + /** + * @private + */ + _resetInterval: function () { + var visualMapModel = this.visualMapModel; + + var dataInterval = this._dataInterval = visualMapModel.getSelected(); + var dataExtent = visualMapModel.getExtent(); + var sizeExtent = [0, visualMapModel.itemSize[1]]; + + this._handleEnds = [ + linearMap$3(dataInterval[0], dataExtent, sizeExtent, true), + linearMap$3(dataInterval[1], dataExtent, sizeExtent, true) + ]; + }, + + /** + * @private + * @param {(number|string)} handleIndex 0 or 1 or 'all' + * @param {number} dx + * @param {number} dy + */ + _updateInterval: function (handleIndex, delta) { + delta = delta || 0; + var visualMapModel = this.visualMapModel; + var handleEnds = this._handleEnds; + var sizeExtent = [0, visualMapModel.itemSize[1]]; + + sliderMove( + delta, + handleEnds, + sizeExtent, + handleIndex, + // cross is forbiden + 0 + ); + + var dataExtent = visualMapModel.getExtent(); + // Update data interval. + this._dataInterval = [ + linearMap$3(handleEnds[0], sizeExtent, dataExtent, true), + linearMap$3(handleEnds[1], sizeExtent, dataExtent, true) + ]; + }, + + /** + * @private + */ + _updateView: function (forSketch) { + var visualMapModel = this.visualMapModel; + var dataExtent = visualMapModel.getExtent(); + var shapes = this._shapes; + + var outOfRangeHandleEnds = [0, visualMapModel.itemSize[1]]; + var inRangeHandleEnds = forSketch ? outOfRangeHandleEnds : this._handleEnds; + + var visualInRange = this._createBarVisual( + this._dataInterval, dataExtent, inRangeHandleEnds, 'inRange' + ); + var visualOutOfRange = this._createBarVisual( + dataExtent, dataExtent, outOfRangeHandleEnds, 'outOfRange' + ); + + shapes.inRange + .setStyle({ + fill: visualInRange.barColor, + opacity: visualInRange.opacity + }) + .setShape('points', visualInRange.barPoints); + shapes.outOfRange + .setStyle({ + fill: visualOutOfRange.barColor, + opacity: visualOutOfRange.opacity + }) + .setShape('points', visualOutOfRange.barPoints); + + this._updateHandle(inRangeHandleEnds, visualInRange); + }, + + /** + * @private + */ + _createBarVisual: function (dataInterval, dataExtent, handleEnds, forceState) { + var opts = { + forceState: forceState, + convertOpacityToAlpha: true + }; + var colorStops = this._makeColorGradient(dataInterval, opts); + + var symbolSizes = [ + this.getControllerVisual(dataInterval[0], 'symbolSize', opts), + this.getControllerVisual(dataInterval[1], 'symbolSize', opts) + ]; + var barPoints = this._createBarPoints(handleEnds, symbolSizes); + + return { + barColor: new LinearGradient(0, 0, 0, 1, colorStops), + barPoints: barPoints, + handlesColor: [ + colorStops[0].color, + colorStops[colorStops.length - 1].color + ] + }; + }, + + /** + * @private + */ + _makeColorGradient: function (dataInterval, opts) { + // Considering colorHue, which is not linear, so we have to sample + // to calculate gradient color stops, but not only caculate head + // and tail. + var sampleNumber = 100; // Arbitrary value. + var colorStops = []; + var step = (dataInterval[1] - dataInterval[0]) / sampleNumber; + + colorStops.push({ + color: this.getControllerVisual(dataInterval[0], 'color', opts), + offset: 0 + }); + + for (var i = 1; i < sampleNumber; i++) { + var currValue = dataInterval[0] + step * i; + if (currValue > dataInterval[1]) { + break; + } + colorStops.push({ + color: this.getControllerVisual(currValue, 'color', opts), + offset: i / sampleNumber + }); + } + + colorStops.push({ + color: this.getControllerVisual(dataInterval[1], 'color', opts), + offset: 1 + }); + + return colorStops; + }, + + /** + * @private + */ + _createBarPoints: function (handleEnds, symbolSizes) { + var itemSize = this.visualMapModel.itemSize; + + return [ + [itemSize[0] - symbolSizes[0], handleEnds[0]], + [itemSize[0], handleEnds[0]], + [itemSize[0], handleEnds[1]], + [itemSize[0] - symbolSizes[1], handleEnds[1]] + ]; + }, + + /** + * @private + */ + _createBarGroup: function (itemAlign) { + var orient = this._orient; + var inverse = this.visualMapModel.get('inverse'); + + return new Group( + (orient === 'horizontal' && !inverse) + ? {scale: itemAlign === 'bottom' ? [1, 1] : [-1, 1], rotation: Math.PI / 2} + : (orient === 'horizontal' && inverse) + ? {scale: itemAlign === 'bottom' ? [-1, 1] : [1, 1], rotation: -Math.PI / 2} + : (orient === 'vertical' && !inverse) + ? {scale: itemAlign === 'left' ? [1, -1] : [-1, -1]} + : {scale: itemAlign === 'left' ? [1, 1] : [-1, 1]} + ); + }, + + /** + * @private + */ + _updateHandle: function (handleEnds, visualInRange) { + if (!this._useHandle) { + return; + } + + var shapes = this._shapes; + var visualMapModel = this.visualMapModel; + var handleThumbs = shapes.handleThumbs; + var handleLabels = shapes.handleLabels; + + each$26([0, 1], function (handleIndex) { + var handleThumb = handleThumbs[handleIndex]; + handleThumb.setStyle('fill', visualInRange.handlesColor[handleIndex]); + handleThumb.position[1] = handleEnds[handleIndex]; + + // Update handle label position. + var textPoint = applyTransform$1( + shapes.handleLabelPoints[handleIndex], + getTransform(handleThumb, this.group) + ); + handleLabels[handleIndex].setStyle({ + x: textPoint[0], + y: textPoint[1], + text: visualMapModel.formatValueText(this._dataInterval[handleIndex]), + textVerticalAlign: 'middle', + textAlign: this._applyTransform( + this._orient === 'horizontal' + ? (handleIndex === 0 ? 'bottom' : 'top') + : 'left', + shapes.barGroup + ) + }); + }, this); + }, + + /** + * @private + * @param {number} cursorValue + * @param {number} textValue + * @param {string} [rangeSymbol] + * @param {number} [halfHoverLinkSize] + */ + _showIndicator: function (cursorValue, textValue, rangeSymbol, halfHoverLinkSize) { + var visualMapModel = this.visualMapModel; + var dataExtent = visualMapModel.getExtent(); + var itemSize = visualMapModel.itemSize; + var sizeExtent = [0, itemSize[1]]; + var pos = linearMap$3(cursorValue, dataExtent, sizeExtent, true); + + var shapes = this._shapes; + var indicator = shapes.indicator; + if (!indicator) { + return; + } + + indicator.position[1] = pos; + indicator.attr('invisible', false); + indicator.setShape('points', createIndicatorPoints( + !!rangeSymbol, halfHoverLinkSize, pos, itemSize[1] + )); + + var opts = {convertOpacityToAlpha: true}; + var color = this.getControllerVisual(cursorValue, 'color', opts); + indicator.setStyle('fill', color); + + // Update handle label position. + var textPoint = applyTransform$1( + shapes.indicatorLabelPoint, + getTransform(indicator, this.group) + ); + + var indicatorLabel = shapes.indicatorLabel; + indicatorLabel.attr('invisible', false); + var align = this._applyTransform('left', shapes.barGroup); + var orient = this._orient; + indicatorLabel.setStyle({ + text: (rangeSymbol ? rangeSymbol : '') + visualMapModel.formatValueText(textValue), + textVerticalAlign: orient === 'horizontal' ? align : 'middle', + textAlign: orient === 'horizontal' ? 'center' : align, + x: textPoint[0], + y: textPoint[1] + }); + }, + + /** + * @private + */ + _enableHoverLinkToSeries: function () { + var self = this; + this._shapes.barGroup + + .on('mousemove', function (e) { + self._hovering = true; + + if (!self._dragging) { + var itemSize = self.visualMapModel.itemSize; + var pos = self._applyTransform( + [e.offsetX, e.offsetY], self._shapes.barGroup, true, true + ); + // For hover link show when hover handle, which might be + // below or upper than sizeExtent. + pos[1] = mathMin$7(mathMax$7(0, pos[1]), itemSize[1]); + self._doHoverLinkToSeries( + pos[1], + 0 <= pos[0] && pos[0] <= itemSize[0] + ); + } + }) + + .on('mouseout', function () { + // When mouse is out of handle, hoverLink still need + // to be displayed when realtime is set as false. + self._hovering = false; + !self._dragging && self._clearHoverLinkToSeries(); + }); + }, + + /** + * @private + */ + _enableHoverLinkFromSeries: function () { + var zr = this.api.getZr(); + + if (this.visualMapModel.option.hoverLink) { + zr.on('mouseover', this._hoverLinkFromSeriesMouseOver, this); + zr.on('mouseout', this._hideIndicator, this); + } + else { + this._clearHoverLinkFromSeries(); + } + }, + + /** + * @private + */ + _doHoverLinkToSeries: function (cursorPos, hoverOnBar) { + var visualMapModel = this.visualMapModel; + var itemSize = visualMapModel.itemSize; + + if (!visualMapModel.option.hoverLink) { + return; + } + + var sizeExtent = [0, itemSize[1]]; + var dataExtent = visualMapModel.getExtent(); + + // For hover link show when hover handle, which might be below or upper than sizeExtent. + cursorPos = mathMin$7(mathMax$7(sizeExtent[0], cursorPos), sizeExtent[1]); + + var halfHoverLinkSize = getHalfHoverLinkSize(visualMapModel, dataExtent, sizeExtent); + var hoverRange = [cursorPos - halfHoverLinkSize, cursorPos + halfHoverLinkSize]; + var cursorValue = linearMap$3(cursorPos, sizeExtent, dataExtent, true); + var valueRange = [ + linearMap$3(hoverRange[0], sizeExtent, dataExtent, true), + linearMap$3(hoverRange[1], sizeExtent, dataExtent, true) + ]; + // Consider data range is out of visualMap range, see test/visualMap-continuous.html, + // where china and india has very large population. + hoverRange[0] < sizeExtent[0] && (valueRange[0] = -Infinity); + hoverRange[1] > sizeExtent[1] && (valueRange[1] = Infinity); + + // Do not show indicator when mouse is over handle, + // otherwise labels overlap, especially when dragging. + if (hoverOnBar) { + if (valueRange[0] === -Infinity) { + this._showIndicator(cursorValue, valueRange[1], '< ', halfHoverLinkSize); + } + else if (valueRange[1] === Infinity) { + this._showIndicator(cursorValue, valueRange[0], '> ', halfHoverLinkSize); + } + else { + this._showIndicator(cursorValue, cursorValue, '≈ ', halfHoverLinkSize); + } + } + + // When realtime is set as false, handles, which are in barGroup, + // also trigger hoverLink, which help user to realize where they + // focus on when dragging. (see test/heatmap-large.html) + // When realtime is set as true, highlight will not show when hover + // handle, because the label on handle, which displays a exact value + // but not range, might mislead users. + var oldBatch = this._hoverLinkDataIndices; + var newBatch = []; + if (hoverOnBar || useHoverLinkOnHandle(visualMapModel)) { + newBatch = this._hoverLinkDataIndices = visualMapModel.findTargetDataIndices(valueRange); + } + + var resultBatches = compressBatches(oldBatch, newBatch); + + this._dispatchHighDown('downplay', convertDataIndex(resultBatches[0])); + this._dispatchHighDown('highlight', convertDataIndex(resultBatches[1])); + }, + + /** + * @private + */ + _hoverLinkFromSeriesMouseOver: function (e) { + var el = e.target; + var visualMapModel = this.visualMapModel; + + if (!el || el.dataIndex == null) { + return; + } + + var dataModel = this.ecModel.getSeriesByIndex(el.seriesIndex); + + if (!visualMapModel.isTargetSeries(dataModel)) { + return; + } + + var data = dataModel.getData(el.dataType); + var value = data.get(visualMapModel.getDataDimension(data), el.dataIndex, true); + + if (!isNaN(value)) { + this._showIndicator(value, value); + } + }, + + /** + * @private + */ + _hideIndicator: function () { + var shapes = this._shapes; + shapes.indicator && shapes.indicator.attr('invisible', true); + shapes.indicatorLabel && shapes.indicatorLabel.attr('invisible', true); + }, + + /** + * @private + */ + _clearHoverLinkToSeries: function () { + this._hideIndicator(); + + var indices = this._hoverLinkDataIndices; + this._dispatchHighDown('downplay', convertDataIndex(indices)); + + indices.length = 0; + }, + + /** + * @private + */ + _clearHoverLinkFromSeries: function () { + this._hideIndicator(); + + var zr = this.api.getZr(); + zr.off('mouseover', this._hoverLinkFromSeriesMouseOver); + zr.off('mouseout', this._hideIndicator); + }, + + /** + * @private + */ + _applyTransform: function (vertex, element, inverse, global) { + var transform = getTransform(element, global ? null : this.group); + + return graphic[ + isArray(vertex) ? 'applyTransform' : 'transformDirection' + ](vertex, transform, inverse); + }, + + /** + * @private + */ + _dispatchHighDown: function (type, batch) { + batch && batch.length && this.api.dispatchAction({ + type: type, + batch: batch + }); + }, + + /** + * @override + */ + dispose: function () { + this._clearHoverLinkFromSeries(); + this._clearHoverLinkToSeries(); + }, + + /** + * @override + */ + remove: function () { + this._clearHoverLinkFromSeries(); + this._clearHoverLinkToSeries(); + } + +}); + +function createPolygon(points, cursor, onDrift, onDragEnd) { + return new Polygon({ + shape: {points: points}, + draggable: !!onDrift, + cursor: cursor, + drift: onDrift, + onmousemove: function (e) { + // Fot mobile devicem, prevent screen slider on the button. + stop(e.event); + }, + ondragend: onDragEnd + }); +} + +function createHandlePoints(handleIndex, textSize) { + return handleIndex === 0 + ? [[0, 0], [textSize, 0], [textSize, -textSize]] + : [[0, 0], [textSize, 0], [textSize, textSize]]; +} + +function createIndicatorPoints(isRange, halfHoverLinkSize, pos, extentMax) { + return isRange + ? [ // indicate range + [0, -mathMin$7(halfHoverLinkSize, mathMax$7(pos, 0))], + [HOVER_LINK_OUT, 0], + [0, mathMin$7(halfHoverLinkSize, mathMax$7(extentMax - pos, 0))] + ] + : [ // indicate single value + [0, 0], [5, -5], [5, 5] + ]; +} + +function getHalfHoverLinkSize(visualMapModel, dataExtent, sizeExtent) { + var halfHoverLinkSize = HOVER_LINK_SIZE / 2; + var hoverLinkDataSize = visualMapModel.get('hoverLinkDataSize'); + if (hoverLinkDataSize) { + halfHoverLinkSize = linearMap$3(hoverLinkDataSize, dataExtent, sizeExtent, true) / 2; + } + return halfHoverLinkSize; +} + +function useHoverLinkOnHandle(visualMapModel) { + var hoverLinkOnHandle = visualMapModel.get('hoverLinkOnHandle'); + return !!(hoverLinkOnHandle == null ? visualMapModel.get('realtime') : hoverLinkOnHandle); +} + +function getCursor$1(orient) { + return orient === 'vertical' ? 'ns-resize' : 'ew-resize'; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var actionInfo$2 = { + type: 'selectDataRange', + event: 'dataRangeSelected', + // FIXME use updateView appears wrong + update: 'update' +}; + +registerAction(actionInfo$2, function (payload, ecModel) { + + ecModel.eachComponent({mainType: 'visualMap', query: payload}, function (model) { + model.setSelected(payload.selected); + }); + +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * DataZoom component entry + */ + +registerPreprocessor(preprocessor$2); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var PiecewiseModel = VisualMapModel.extend({ + + type: 'visualMap.piecewise', + + /** + * Order Rule: + * + * option.categories / option.pieces / option.text / option.selected: + * If !option.inverse, + * Order when vertical: ['top', ..., 'bottom']. + * Order when horizontal: ['left', ..., 'right']. + * If option.inverse, the meaning of + * the order should be reversed. + * + * this._pieceList: + * The order is always [low, ..., high]. + * + * Mapping from location to low-high: + * If !option.inverse + * When vertical, top is high. + * When horizontal, right is high. + * If option.inverse, reverse. + */ + + /** + * @protected + */ + defaultOption: { + selected: null, // Object. If not specified, means selected. + // When pieces and splitNumber: {'0': true, '5': true} + // When categories: {'cate1': false, 'cate3': true} + // When selected === false, means all unselected. + + minOpen: false, // Whether include values that smaller than `min`. + maxOpen: false, // Whether include values that bigger than `max`. + + align: 'auto', // 'auto', 'left', 'right' + itemWidth: 20, // When put the controller vertically, it is the length of + // horizontal side of each item. Otherwise, vertical side. + itemHeight: 14, // When put the controller vertically, it is the length of + // vertical side of each item. Otherwise, horizontal side. + itemSymbol: 'roundRect', + pieceList: null, // Each item is Object, with some of those attrs: + // {min, max, lt, gt, lte, gte, value, + // color, colorSaturation, colorAlpha, opacity, + // symbol, symbolSize}, which customize the range or visual + // coding of the certain piece. Besides, see "Order Rule". + categories: null, // category names, like: ['some1', 'some2', 'some3']. + // Attr min/max are ignored when categories set. See "Order Rule" + splitNumber: 5, // If set to 5, auto split five pieces equally. + // If set to 0 and component type not set, component type will be + // determined as "continuous". (It is less reasonable but for ec2 + // compatibility, see echarts/component/visualMap/typeDefaulter) + selectedMode: 'multiple', // Can be 'multiple' or 'single'. + itemGap: 10, // The gap between two items, in px. + hoverLink: true, // Enable hover highlight. + + showLabel: null // By default, when text is used, label will hide (the logic + // is remained for compatibility reason) + }, + + /** + * @override + */ + optionUpdated: function (newOption, isInit) { + PiecewiseModel.superApply(this, 'optionUpdated', arguments); + + /** + * The order is always [low, ..., high]. + * [{text: string, interval: Array.<number>}, ...] + * @private + * @type {Array.<Object>} + */ + this._pieceList = []; + + this.resetExtent(); + + /** + * 'pieces', 'categories', 'splitNumber' + * @type {string} + */ + var mode = this._mode = this._determineMode(); + + resetMethods[this._mode].call(this); + + this._resetSelected(newOption, isInit); + + var categories = this.option.categories; + + this.resetVisual(function (mappingOption, state) { + if (mode === 'categories') { + mappingOption.mappingMethod = 'category'; + mappingOption.categories = clone(categories); + } + else { + mappingOption.dataExtent = this.getExtent(); + mappingOption.mappingMethod = 'piecewise'; + mappingOption.pieceList = map(this._pieceList, function (piece) { + var piece = clone(piece); + if (state !== 'inRange') { + // FIXME + // outOfRange do not support special visual in pieces. + piece.visual = null; + } + return piece; + }); + } + }); + }, + + /** + * @protected + * @override + */ + completeVisualOption: function () { + // Consider this case: + // visualMap: { + // pieces: [{symbol: 'circle', lt: 0}, {symbol: 'rect', gte: 0}] + // } + // where no inRange/outOfRange set but only pieces. So we should make + // default inRange/outOfRange for this case, otherwise visuals that only + // appear in `pieces` will not be taken into account in visual encoding. + + var option = this.option; + var visualTypesInPieces = {}; + var visualTypes = VisualMapping.listVisualTypes(); + var isCategory = this.isCategory(); + + each$1(option.pieces, function (piece) { + each$1(visualTypes, function (visualType) { + if (piece.hasOwnProperty(visualType)) { + visualTypesInPieces[visualType] = 1; + } + }); + }); + + each$1(visualTypesInPieces, function (v, visualType) { + var exists = 0; + each$1(this.stateList, function (state) { + exists |= has(option, state, visualType) + || has(option.target, state, visualType); + }, this); + + !exists && each$1(this.stateList, function (state) { + (option[state] || (option[state] = {}))[visualType] = visualDefault.get( + visualType, state === 'inRange' ? 'active' : 'inactive', isCategory + ); + }); + }, this); + + function has(obj, state, visualType) { + return obj && obj[state] && ( + isObject$1(obj[state]) + ? obj[state].hasOwnProperty(visualType) + : obj[state] === visualType // e.g., inRange: 'symbol' + ); + } + + VisualMapModel.prototype.completeVisualOption.apply(this, arguments); + }, + + _resetSelected: function (newOption, isInit) { + var thisOption = this.option; + var pieceList = this._pieceList; + + // Selected do not merge but all override. + var selected = (isInit ? thisOption : newOption).selected || {}; + thisOption.selected = selected; + + // Consider 'not specified' means true. + each$1(pieceList, function (piece, index) { + var key = this.getSelectedMapKey(piece); + if (!selected.hasOwnProperty(key)) { + selected[key] = true; + } + }, this); + + if (thisOption.selectedMode === 'single') { + // Ensure there is only one selected. + var hasSel = false; + + each$1(pieceList, function (piece, index) { + var key = this.getSelectedMapKey(piece); + if (selected[key]) { + hasSel + ? (selected[key] = false) + : (hasSel = true); + } + }, this); + } + // thisOption.selectedMode === 'multiple', default: all selected. + }, + + /** + * @public + */ + getSelectedMapKey: function (piece) { + return this._mode === 'categories' + ? piece.value + '' : piece.index + ''; + }, + + /** + * @public + */ + getPieceList: function () { + return this._pieceList; + }, + + /** + * @private + * @return {string} + */ + _determineMode: function () { + var option = this.option; + + return option.pieces && option.pieces.length > 0 + ? 'pieces' + : this.option.categories + ? 'categories' + : 'splitNumber'; + }, + + /** + * @public + * @override + */ + setSelected: function (selected) { + this.option.selected = clone(selected); + }, + + /** + * @public + * @override + */ + getValueState: function (value) { + var index = VisualMapping.findPieceIndex(value, this._pieceList); + + return index != null + ? (this.option.selected[this.getSelectedMapKey(this._pieceList[index])] + ? 'inRange' : 'outOfRange' + ) + : 'outOfRange'; + }, + + /** + * @public + * @params {number} pieceIndex piece index in visualMapModel.getPieceList() + * @return {Array.<Object>} [{seriesId, dataIndices: <Array.<number>>}, ...] + */ + findTargetDataIndices: function (pieceIndex) { + var result = []; + + this.eachTargetSeries(function (seriesModel) { + var dataIndices = []; + var data = seriesModel.getData(); + + data.each(this.getDataDimension(data), function (value, dataIndex) { + // Should always base on model pieceList, because it is order sensitive. + var pIdx = VisualMapping.findPieceIndex(value, this._pieceList); + pIdx === pieceIndex && dataIndices.push(dataIndex); + }, this); + + result.push({seriesId: seriesModel.id, dataIndex: dataIndices}); + }, this); + + return result; + }, + + /** + * @private + * @param {Object} piece piece.value or piece.interval is required. + * @return {number} Can be Infinity or -Infinity + */ + getRepresentValue: function (piece) { + var representValue; + if (this.isCategory()) { + representValue = piece.value; + } + else { + if (piece.value != null) { + representValue = piece.value; + } + else { + var pieceInterval = piece.interval || []; + representValue = (pieceInterval[0] === -Infinity && pieceInterval[1] === Infinity) + ? 0 + : (pieceInterval[0] + pieceInterval[1]) / 2; + } + } + return representValue; + }, + + getVisualMeta: function (getColorVisual) { + // Do not support category. (category axis is ordinal, numerical) + if (this.isCategory()) { + return; + } + + var stops = []; + var outerColors = []; + var visualMapModel = this; + + function setStop(interval, valueState) { + var representValue = visualMapModel.getRepresentValue({interval: interval}); + if (!valueState) { + valueState = visualMapModel.getValueState(representValue); + } + var color = getColorVisual(representValue, valueState); + if (interval[0] === -Infinity) { + outerColors[0] = color; + } + else if (interval[1] === Infinity) { + outerColors[1] = color; + } + else { + stops.push( + {value: interval[0], color: color}, + {value: interval[1], color: color} + ); + } + } + + // Suplement + var pieceList = this._pieceList.slice(); + if (!pieceList.length) { + pieceList.push({interval: [-Infinity, Infinity]}); + } + else { + var edge = pieceList[0].interval[0]; + edge !== -Infinity && pieceList.unshift({interval: [-Infinity, edge]}); + edge = pieceList[pieceList.length - 1].interval[1]; + edge !== Infinity && pieceList.push({interval: [edge, Infinity]}); + } + + var curr = -Infinity; + each$1(pieceList, function (piece) { + var interval = piece.interval; + if (interval) { + // Fulfill gap. + interval[0] > curr && setStop([curr, interval[0]], 'outOfRange'); + setStop(interval.slice()); + curr = interval[1]; + } + }, this); + + return {stops: stops, outerColors: outerColors}; + } + +}); + +/** + * Key is this._mode + * @type {Object} + * @this {module:echarts/component/viusalMap/PiecewiseMode} + */ +var resetMethods = { + + splitNumber: function () { + var thisOption = this.option; + var pieceList = this._pieceList; + var precision = Math.min(thisOption.precision, 20); + var dataExtent = this.getExtent(); + var splitNumber = thisOption.splitNumber; + splitNumber = Math.max(parseInt(splitNumber, 10), 1); + thisOption.splitNumber = splitNumber; + + var splitStep = (dataExtent[1] - dataExtent[0]) / splitNumber; + // Precision auto-adaption + while (+splitStep.toFixed(precision) !== splitStep && precision < 5) { + precision++; + } + thisOption.precision = precision; + splitStep = +splitStep.toFixed(precision); + + var index = 0; + + if (thisOption.minOpen) { + pieceList.push({ + index: index++, + interval: [-Infinity, dataExtent[0]], + close: [0, 0] + }); + } + + for ( + var curr = dataExtent[0], len = index + splitNumber; + index < len; + curr += splitStep + ) { + var max = index === splitNumber - 1 ? dataExtent[1] : (curr + splitStep); + + pieceList.push({ + index: index++, + interval: [curr, max], + close: [1, 1] + }); + } + + if (thisOption.maxOpen) { + pieceList.push({ + index: index++, + interval: [dataExtent[1], Infinity], + close: [0, 0] + }); + } + + reformIntervals(pieceList); + + each$1(pieceList, function (piece) { + piece.text = this.formatValueText(piece.interval); + }, this); + }, + + categories: function () { + var thisOption = this.option; + each$1(thisOption.categories, function (cate) { + // FIXME category模式也使用pieceList,但在visualMapping中不是使用pieceList。 + // 是否改一致。 + this._pieceList.push({ + text: this.formatValueText(cate, true), + value: cate + }); + }, this); + + // See "Order Rule". + normalizeReverse(thisOption, this._pieceList); + }, + + pieces: function () { + var thisOption = this.option; + var pieceList = this._pieceList; + + each$1(thisOption.pieces, function (pieceListItem, index) { + + if (!isObject$1(pieceListItem)) { + pieceListItem = {value: pieceListItem}; + } + + var item = {text: '', index: index}; + + if (pieceListItem.label != null) { + item.text = pieceListItem.label; + } + + if (pieceListItem.hasOwnProperty('value')) { + var value = item.value = pieceListItem.value; + item.interval = [value, value]; + item.close = [1, 1]; + } + else { + // `min` `max` is legacy option. + // `lt` `gt` `lte` `gte` is recommanded. + var interval = item.interval = []; + var close = item.close = [0, 0]; + + var closeList = [1, 0, 1]; + var infinityList = [-Infinity, Infinity]; + + var useMinMax = []; + for (var lg = 0; lg < 2; lg++) { + var names = [['gte', 'gt', 'min'], ['lte', 'lt', 'max']][lg]; + for (var i = 0; i < 3 && interval[lg] == null; i++) { + interval[lg] = pieceListItem[names[i]]; + close[lg] = closeList[i]; + useMinMax[lg] = i === 2; + } + interval[lg] == null && (interval[lg] = infinityList[lg]); + } + useMinMax[0] && interval[1] === Infinity && (close[0] = 0); + useMinMax[1] && interval[0] === -Infinity && (close[1] = 0); + + if (__DEV__) { + if (interval[0] > interval[1]) { + console.warn( + 'Piece ' + index + 'is illegal: ' + interval + + ' lower bound should not greater then uppper bound.' + ); + } + } + + if (interval[0] === interval[1] && close[0] && close[1]) { + // Consider: [{min: 5, max: 5, visual: {...}}, {min: 0, max: 5}], + // we use value to lift the priority when min === max + item.value = interval[0]; + } + } + + item.visual = VisualMapping.retrieveVisuals(pieceListItem); + + pieceList.push(item); + + }, this); + + // See "Order Rule". + normalizeReverse(thisOption, pieceList); + // Only pieces + reformIntervals(pieceList); + + each$1(pieceList, function (piece) { + var close = piece.close; + var edgeSymbols = [['<', '≤'][close[1]], ['>', '≥'][close[0]]]; + piece.text = piece.text || this.formatValueText( + piece.value != null ? piece.value : piece.interval, + false, + edgeSymbols + ); + }, this); + } +}; + +function normalizeReverse(thisOption, pieceList) { + var inverse = thisOption.inverse; + if (thisOption.orient === 'vertical' ? !inverse : inverse) { + pieceList.reverse(); + } +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var PiecewiseVisualMapView = VisualMapView.extend({ + + type: 'visualMap.piecewise', + + /** + * @protected + * @override + */ + doRender: function () { + var thisGroup = this.group; + + thisGroup.removeAll(); + + var visualMapModel = this.visualMapModel; + var textGap = visualMapModel.get('textGap'); + var textStyleModel = visualMapModel.textStyleModel; + var textFont = textStyleModel.getFont(); + var textFill = textStyleModel.getTextColor(); + var itemAlign = this._getItemAlign(); + var itemSize = visualMapModel.itemSize; + var viewData = this._getViewData(); + var endsText = viewData.endsText; + var showLabel = retrieve(visualMapModel.get('showLabel', true), !endsText); + + endsText && this._renderEndsText( + thisGroup, endsText[0], itemSize, showLabel, itemAlign + ); + + each$1(viewData.viewPieceList, renderItem, this); + + endsText && this._renderEndsText( + thisGroup, endsText[1], itemSize, showLabel, itemAlign + ); + + box( + visualMapModel.get('orient'), thisGroup, visualMapModel.get('itemGap') + ); + + this.renderBackground(thisGroup); + + this.positionGroup(thisGroup); + + function renderItem(item) { + var piece = item.piece; + + var itemGroup = new Group(); + itemGroup.onclick = bind(this._onItemClick, this, piece); + + this._enableHoverLink(itemGroup, item.indexInModelPieceList); + + var representValue = visualMapModel.getRepresentValue(piece); + + this._createItemSymbol( + itemGroup, representValue, [0, 0, itemSize[0], itemSize[1]] + ); + + if (showLabel) { + var visualState = this.visualMapModel.getValueState(representValue); + + itemGroup.add(new Text({ + style: { + x: itemAlign === 'right' ? -textGap : itemSize[0] + textGap, + y: itemSize[1] / 2, + text: piece.text, + textVerticalAlign: 'middle', + textAlign: itemAlign, + textFont: textFont, + textFill: textFill, + opacity: visualState === 'outOfRange' ? 0.5 : 1 + } + })); + } + + thisGroup.add(itemGroup); + } + }, + + /** + * @private + */ + _enableHoverLink: function (itemGroup, pieceIndex) { + itemGroup + .on('mouseover', bind(onHoverLink, this, 'highlight')) + .on('mouseout', bind(onHoverLink, this, 'downplay')); + + function onHoverLink(method) { + var visualMapModel = this.visualMapModel; + + visualMapModel.option.hoverLink && this.api.dispatchAction({ + type: method, + batch: convertDataIndex( + visualMapModel.findTargetDataIndices(pieceIndex) + ) + }); + } + }, + + /** + * @private + */ + _getItemAlign: function () { + var visualMapModel = this.visualMapModel; + var modelOption = visualMapModel.option; + + if (modelOption.orient === 'vertical') { + return getItemAlign( + visualMapModel, this.api, visualMapModel.itemSize + ); + } + else { // horizontal, most case left unless specifying right. + var align = modelOption.align; + if (!align || align === 'auto') { + align = 'left'; + } + return align; + } + }, + + /** + * @private + */ + _renderEndsText: function (group, text, itemSize, showLabel, itemAlign) { + if (!text) { + return; + } + + var itemGroup = new Group(); + var textStyleModel = this.visualMapModel.textStyleModel; + + itemGroup.add(new Text({ + style: { + x: showLabel ? (itemAlign === 'right' ? itemSize[0] : 0) : itemSize[0] / 2, + y: itemSize[1] / 2, + textVerticalAlign: 'middle', + textAlign: showLabel ? itemAlign : 'center', + text: text, + textFont: textStyleModel.getFont(), + textFill: textStyleModel.getTextColor() + } + })); + + group.add(itemGroup); + }, + + /** + * @private + * @return {Object} {peiceList, endsText} The order is the same as screen pixel order. + */ + _getViewData: function () { + var visualMapModel = this.visualMapModel; + + var viewPieceList = map(visualMapModel.getPieceList(), function (piece, index) { + return {piece: piece, indexInModelPieceList: index}; + }); + var endsText = visualMapModel.get('text'); + + // Consider orient and inverse. + var orient = visualMapModel.get('orient'); + var inverse = visualMapModel.get('inverse'); + + // Order of model pieceList is always [low, ..., high] + if (orient === 'horizontal' ? inverse : !inverse) { + viewPieceList.reverse(); + } + // Origin order of endsText is [high, low] + else if (endsText) { + endsText = endsText.slice().reverse(); + } + + return {viewPieceList: viewPieceList, endsText: endsText}; + }, + + /** + * @private + */ + _createItemSymbol: function (group, representValue, shapeParam) { + group.add(createSymbol( + this.getControllerVisual(representValue, 'symbol'), + shapeParam[0], shapeParam[1], shapeParam[2], shapeParam[3], + this.getControllerVisual(representValue, 'color') + )); + }, + + /** + * @private + */ + _onItemClick: function (piece) { + var visualMapModel = this.visualMapModel; + var option = visualMapModel.option; + var selected = clone(option.selected); + var newKey = visualMapModel.getSelectedMapKey(piece); + + if (option.selectedMode === 'single') { + selected[newKey] = true; + each$1(selected, function (o, key) { + selected[key] = key === newKey; + }); + } + else { + selected[newKey] = !selected[newKey]; + } + + this.api.dispatchAction({ + type: 'selectDataRange', + from: this.uid, + visualMapId: this.visualMapModel.id, + selected: selected + }); + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * DataZoom component entry + */ + +registerPreprocessor(preprocessor$2); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * visualMap component entry + */ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var addCommas$1 = addCommas; +var encodeHTML$1 = encodeHTML; + +function fillLabel(opt) { + defaultEmphasis(opt, 'label', ['show']); +} +var MarkerModel = extendComponentModel({ + + type: 'marker', + + dependencies: ['series', 'grid', 'polar', 'geo'], + + /** + * @overrite + */ + init: function (option, parentModel, ecModel, extraOpt) { + + if (__DEV__) { + if (this.type === 'marker') { + throw new Error('Marker component is abstract component. Use markLine, markPoint, markArea instead.'); + } + } + this.mergeDefaultAndTheme(option, ecModel); + this.mergeOption(option, ecModel, extraOpt.createdBySelf, true); + }, + + /** + * @return {boolean} + */ + isAnimationEnabled: function () { + if (env$1.node) { + return false; + } + + var hostSeries = this.__hostSeries; + return this.getShallow('animation') && hostSeries && hostSeries.isAnimationEnabled(); + }, + + mergeOption: function (newOpt, ecModel, createdBySelf, isInit) { + var MarkerModel = this.constructor; + var modelPropName = this.mainType + 'Model'; + if (!createdBySelf) { + ecModel.eachSeries(function (seriesModel) { + + var markerOpt = seriesModel.get(this.mainType, true); + + var markerModel = seriesModel[modelPropName]; + if (!markerOpt || !markerOpt.data) { + seriesModel[modelPropName] = null; + return; + } + if (!markerModel) { + if (isInit) { + // Default label emphasis `position` and `show` + fillLabel(markerOpt); + } + each$1(markerOpt.data, function (item) { + // FIXME Overwrite fillLabel method ? + if (item instanceof Array) { + fillLabel(item[0]); + fillLabel(item[1]); + } + else { + fillLabel(item); + } + }); + + markerModel = new MarkerModel( + markerOpt, this, ecModel + ); + + extend(markerModel, { + mainType: this.mainType, + // Use the same series index and name + seriesIndex: seriesModel.seriesIndex, + name: seriesModel.name, + createdBySelf: true + }); + + markerModel.__hostSeries = seriesModel; + } + else { + markerModel.mergeOption(markerOpt, ecModel, true); + } + seriesModel[modelPropName] = markerModel; + }, this); + } + }, + + formatTooltip: function (dataIndex) { + var data = this.getData(); + var value = this.getRawValue(dataIndex); + var formattedValue = isArray(value) + ? map(value, addCommas$1).join(', ') : addCommas$1(value); + var name = data.getName(dataIndex); + var html = encodeHTML$1(this.name); + if (value != null || name) { + html += '<br />'; + } + if (name) { + html += encodeHTML$1(name); + if (value != null) { + html += ' : '; + } + } + if (value != null) { + html += encodeHTML$1(formattedValue); + } + return html; + }, + + getData: function () { + return this._data; + }, + + setData: function (data) { + this._data = data; + } +}); + +mixin(MarkerModel, dataFormatMixin); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +MarkerModel.extend({ + + type: 'markPoint', + + defaultOption: { + zlevel: 0, + z: 5, + symbol: 'pin', + symbolSize: 50, + //symbolRotate: 0, + //symbolOffset: [0, 0] + tooltip: { + trigger: 'item' + }, + label: { + show: true, + position: 'inside' + }, + itemStyle: { + borderWidth: 2 + }, + emphasis: { + label: { + show: true + } + } + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var indexOf$2 = indexOf; + +function hasXOrY(item) { + return !(isNaN(parseFloat(item.x)) && isNaN(parseFloat(item.y))); +} + +function hasXAndY(item) { + return !isNaN(parseFloat(item.x)) && !isNaN(parseFloat(item.y)); +} + +// Make it simple, do not visit all stacked value to count precision. +// function getPrecision(data, valueAxisDim, dataIndex) { +// var precision = -1; +// var stackedDim = data.mapDimension(valueAxisDim); +// do { +// precision = Math.max( +// numberUtil.getPrecision(data.get(stackedDim, dataIndex)), +// precision +// ); +// var stackedOnSeries = data.getCalculationInfo('stackedOnSeries'); +// if (stackedOnSeries) { +// var byValue = data.get(data.getCalculationInfo('stackedByDimension'), dataIndex); +// data = stackedOnSeries.getData(); +// dataIndex = data.indexOf(data.getCalculationInfo('stackedByDimension'), byValue); +// stackedDim = data.getCalculationInfo('stackedDimension'); +// } +// else { +// data = null; +// } +// } while (data); + +// return precision; +// } + +function markerTypeCalculatorWithExtent( + mlType, data, otherDataDim, targetDataDim, otherCoordIndex, targetCoordIndex +) { + var coordArr = []; + + var stacked = isDimensionStacked(data, targetDataDim /*, otherDataDim*/); + var calcDataDim = stacked + ? data.getCalculationInfo('stackResultDimension') + : targetDataDim; + + var value = numCalculate(data, calcDataDim, mlType); + + var dataIndex = data.indicesOfNearest(calcDataDim, value)[0]; + coordArr[otherCoordIndex] = data.get(otherDataDim, dataIndex); + coordArr[targetCoordIndex] = data.get(targetDataDim, dataIndex); + + // Make it simple, do not visit all stacked value to count precision. + var precision = getPrecision(data.get(targetDataDim, dataIndex)); + precision = Math.min(precision, 20); + if (precision >= 0) { + coordArr[targetCoordIndex] = +coordArr[targetCoordIndex].toFixed(precision); + } + + return coordArr; +} + +var curry$7 = curry; +// TODO Specified percent +var markerTypeCalculator = { + /** + * @method + * @param {module:echarts/data/List} data + * @param {string} baseAxisDim + * @param {string} valueAxisDim + */ + min: curry$7(markerTypeCalculatorWithExtent, 'min'), + /** + * @method + * @param {module:echarts/data/List} data + * @param {string} baseAxisDim + * @param {string} valueAxisDim + */ + max: curry$7(markerTypeCalculatorWithExtent, 'max'), + + /** + * @method + * @param {module:echarts/data/List} data + * @param {string} baseAxisDim + * @param {string} valueAxisDim + */ + average: curry$7(markerTypeCalculatorWithExtent, 'average') +}; + +/** + * Transform markPoint data item to format used in List by do the following + * 1. Calculate statistic like `max`, `min`, `average` + * 2. Convert `item.xAxis`, `item.yAxis` to `item.coord` array + * @param {module:echarts/model/Series} seriesModel + * @param {module:echarts/coord/*} [coordSys] + * @param {Object} item + * @return {Object} + */ +function dataTransform(seriesModel, item) { + var data = seriesModel.getData(); + var coordSys = seriesModel.coordinateSystem; + + // 1. If not specify the position with pixel directly + // 2. If `coord` is not a data array. Which uses `xAxis`, + // `yAxis` to specify the coord on each dimension + + // parseFloat first because item.x and item.y can be percent string like '20%' + if (item && !hasXAndY(item) && !isArray(item.coord) && coordSys) { + var dims = coordSys.dimensions; + var axisInfo = getAxisInfo$1(item, data, coordSys, seriesModel); + + // Clone the option + // Transform the properties xAxis, yAxis, radiusAxis, angleAxis, geoCoord to value + item = clone(item); + + if (item.type + && markerTypeCalculator[item.type] + && axisInfo.baseAxis && axisInfo.valueAxis + ) { + var otherCoordIndex = indexOf$2(dims, axisInfo.baseAxis.dim); + var targetCoordIndex = indexOf$2(dims, axisInfo.valueAxis.dim); + + item.coord = markerTypeCalculator[item.type]( + data, axisInfo.baseDataDim, axisInfo.valueDataDim, + otherCoordIndex, targetCoordIndex + ); + // Force to use the value of calculated value. + item.value = item.coord[targetCoordIndex]; + } + else { + // FIXME Only has one of xAxis and yAxis. + var coord = [ + item.xAxis != null ? item.xAxis : item.radiusAxis, + item.yAxis != null ? item.yAxis : item.angleAxis + ]; + // Each coord support max, min, average + for (var i = 0; i < 2; i++) { + if (markerTypeCalculator[coord[i]]) { + coord[i] = numCalculate(data, data.mapDimension(dims[i]), coord[i]); + } + } + item.coord = coord; + } + } + return item; +} + +function getAxisInfo$1(item, data, coordSys, seriesModel) { + var ret = {}; + + if (item.valueIndex != null || item.valueDim != null) { + ret.valueDataDim = item.valueIndex != null + ? data.getDimension(item.valueIndex) : item.valueDim; + ret.valueAxis = coordSys.getAxis(dataDimToCoordDim(seriesModel, ret.valueDataDim)); + ret.baseAxis = coordSys.getOtherAxis(ret.valueAxis); + ret.baseDataDim = data.mapDimension(ret.baseAxis.dim); + } + else { + ret.baseAxis = seriesModel.getBaseAxis(); + ret.valueAxis = coordSys.getOtherAxis(ret.baseAxis); + ret.baseDataDim = data.mapDimension(ret.baseAxis.dim); + ret.valueDataDim = data.mapDimension(ret.valueAxis.dim); + } + + return ret; +} + +function dataDimToCoordDim(seriesModel, dataDim) { + var data = seriesModel.getData(); + var dimensions = data.dimensions; + dataDim = data.getDimension(dataDim); + for (var i = 0; i < dimensions.length; i++) { + var dimItem = data.getDimensionInfo(dimensions[i]); + if (dimItem.name === dataDim) { + return dimItem.coordDim; + } + } +} + +/** + * Filter data which is out of coordinateSystem range + * [dataFilter description] + * @param {module:echarts/coord/*} [coordSys] + * @param {Object} item + * @return {boolean} + */ +function dataFilter$1(coordSys, item) { + // Alwalys return true if there is no coordSys + return (coordSys && coordSys.containData && item.coord && !hasXOrY(item)) + ? coordSys.containData(item.coord) : true; +} + +function dimValueGetter(item, dimName, dataIndex, dimIndex) { + // x, y, radius, angle + if (dimIndex < 2) { + return item.coord && item.coord[dimIndex]; + } + return item.value; +} + +function numCalculate(data, valueDataDim, type) { + if (type === 'average') { + var sum = 0; + var count = 0; + data.each(valueDataDim, function (val, idx) { + if (!isNaN(val)) { + sum += val; + count++; + } + }); + return sum / count; + } + else if (type === 'median') { + return data.getMedian(valueDataDim); + } + else { + // max & min + return data.getDataExtent(valueDataDim, true)[type === 'max' ? 1 : 0]; + } +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var MarkerView = extendComponentView({ + + type: 'marker', + + init: function () { + /** + * Markline grouped by series + * @private + * @type {module:zrender/core/util.HashMap} + */ + this.markerGroupMap = createHashMap(); + }, + + render: function (markerModel, ecModel, api) { + var markerGroupMap = this.markerGroupMap; + markerGroupMap.each(function (item) { + item.__keep = false; + }); + + var markerModelKey = this.type + 'Model'; + ecModel.eachSeries(function (seriesModel) { + var markerModel = seriesModel[markerModelKey]; + markerModel && this.renderSeries(seriesModel, markerModel, ecModel, api); + }, this); + + markerGroupMap.each(function (item) { + !item.__keep && this.group.remove(item.group); + }, this); + }, + + renderSeries: function () {} +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +function updateMarkerLayout(mpData, seriesModel, api) { + var coordSys = seriesModel.coordinateSystem; + mpData.each(function (idx) { + var itemModel = mpData.getItemModel(idx); + var point; + var xPx = parsePercent$1(itemModel.get('x'), api.getWidth()); + var yPx = parsePercent$1(itemModel.get('y'), api.getHeight()); + if (!isNaN(xPx) && !isNaN(yPx)) { + point = [xPx, yPx]; + } + // Chart like bar may have there own marker positioning logic + else if (seriesModel.getMarkerPosition) { + // Use the getMarkerPoisition + point = seriesModel.getMarkerPosition( + mpData.getValues(mpData.dimensions, idx) + ); + } + else if (coordSys) { + var x = mpData.get(coordSys.dimensions[0], idx); + var y = mpData.get(coordSys.dimensions[1], idx); + point = coordSys.dataToPoint([x, y]); + + } + + // Use x, y if has any + if (!isNaN(xPx)) { + point[0] = xPx; + } + if (!isNaN(yPx)) { + point[1] = yPx; + } + + mpData.setItemLayout(idx, point); + }); +} + +MarkerView.extend({ + + type: 'markPoint', + + // updateLayout: function (markPointModel, ecModel, api) { + // ecModel.eachSeries(function (seriesModel) { + // var mpModel = seriesModel.markPointModel; + // if (mpModel) { + // updateMarkerLayout(mpModel.getData(), seriesModel, api); + // this.markerGroupMap.get(seriesModel.id).updateLayout(mpModel); + // } + // }, this); + // }, + + updateTransform: function (markPointModel, ecModel, api) { + ecModel.eachSeries(function (seriesModel) { + var mpModel = seriesModel.markPointModel; + if (mpModel) { + updateMarkerLayout(mpModel.getData(), seriesModel, api); + this.markerGroupMap.get(seriesModel.id).updateLayout(mpModel); + } + }, this); + }, + + renderSeries: function (seriesModel, mpModel, ecModel, api) { + var coordSys = seriesModel.coordinateSystem; + var seriesId = seriesModel.id; + var seriesData = seriesModel.getData(); + + var symbolDrawMap = this.markerGroupMap; + var symbolDraw = symbolDrawMap.get(seriesId) + || symbolDrawMap.set(seriesId, new SymbolDraw()); + + var mpData = createList$1(coordSys, seriesModel, mpModel); + + // FIXME + mpModel.setData(mpData); + + updateMarkerLayout(mpModel.getData(), seriesModel, api); + + mpData.each(function (idx) { + var itemModel = mpData.getItemModel(idx); + var symbolSize = itemModel.getShallow('symbolSize'); + if (typeof symbolSize === 'function') { + // FIXME 这里不兼容 ECharts 2.x,2.x 貌似参数是整个数据? + symbolSize = symbolSize( + mpModel.getRawValue(idx), mpModel.getDataParams(idx) + ); + } + mpData.setItemVisual(idx, { + symbolSize: symbolSize, + color: itemModel.get('itemStyle.color') + || seriesData.getVisual('color'), + symbol: itemModel.getShallow('symbol') + }); + }); + + // TODO Text are wrong + symbolDraw.updateData(mpData); + this.group.add(symbolDraw.group); + + // Set host model for tooltip + // FIXME + mpData.eachItemGraphicEl(function (el) { + el.traverse(function (child) { + child.dataModel = mpModel; + }); + }); + + symbolDraw.__keep = true; + + symbolDraw.group.silent = mpModel.get('silent') || seriesModel.get('silent'); + } +}); + +/** + * @inner + * @param {module:echarts/coord/*} [coordSys] + * @param {module:echarts/model/Series} seriesModel + * @param {module:echarts/model/Model} mpModel + */ +function createList$1(coordSys, seriesModel, mpModel) { + var coordDimsInfos; + if (coordSys) { + coordDimsInfos = map(coordSys && coordSys.dimensions, function (coordDim) { + var info = seriesModel.getData().getDimensionInfo( + seriesModel.getData().mapDimension(coordDim) + ) || {}; + // In map series data don't have lng and lat dimension. Fallback to same with coordSys + return defaults({name: coordDim}, info); + }); + } + else { + coordDimsInfos =[{ + name: 'value', + type: 'float' + }]; + } + + var mpData = new List(coordDimsInfos, mpModel); + var dataOpt = map(mpModel.get('data'), curry( + dataTransform, seriesModel + )); + if (coordSys) { + dataOpt = filter( + dataOpt, curry(dataFilter$1, coordSys) + ); + } + + mpData.initData(dataOpt, null, + coordSys ? dimValueGetter : function (item) { + return item.value; + } + ); + + return mpData; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// HINT Markpoint can't be used too much +registerPreprocessor(function (opt) { + // Make sure markPoint component is enabled + opt.markPoint = opt.markPoint || {}; +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +MarkerModel.extend({ + + type: 'markLine', + + defaultOption: { + zlevel: 0, + z: 5, + + symbol: ['circle', 'arrow'], + symbolSize: [8, 16], + + //symbolRotate: 0, + + precision: 2, + tooltip: { + trigger: 'item' + }, + label: { + show: true, + position: 'end' + }, + lineStyle: { + type: 'dashed' + }, + emphasis: { + label: { + show: true + }, + lineStyle: { + width: 3 + } + }, + animationEasing: 'linear' + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var markLineTransform = function (seriesModel, coordSys, mlModel, item) { + var data = seriesModel.getData(); + // Special type markLine like 'min', 'max', 'average', 'median' + var mlType = item.type; + + if (!isArray(item) + && ( + mlType === 'min' || mlType === 'max' || mlType === 'average' || mlType === 'median' + // In case + // data: [{ + // yAxis: 10 + // }] + || (item.xAxis != null || item.yAxis != null) + ) + ) { + var valueAxis; + var valueDataDim; + var value; + + if (item.yAxis != null || item.xAxis != null) { + valueDataDim = item.yAxis != null ? 'y' : 'x'; + valueAxis = coordSys.getAxis(valueDataDim); + + value = retrieve(item.yAxis, item.xAxis); + } + else { + var axisInfo = getAxisInfo$1(item, data, coordSys, seriesModel); + valueDataDim = axisInfo.valueDataDim; + valueAxis = axisInfo.valueAxis; + value = numCalculate(data, valueDataDim, mlType); + } + var valueIndex = valueDataDim === 'x' ? 0 : 1; + var baseIndex = 1 - valueIndex; + + var mlFrom = clone(item); + var mlTo = {}; + + mlFrom.type = null; + + mlFrom.coord = []; + mlTo.coord = []; + mlFrom.coord[baseIndex] = -Infinity; + mlTo.coord[baseIndex] = Infinity; + + var precision = mlModel.get('precision'); + if (precision >= 0 && typeof value === 'number') { + value = +value.toFixed(Math.min(precision, 20)); + } + + mlFrom.coord[valueIndex] = mlTo.coord[valueIndex] = value; + + item = [mlFrom, mlTo, { // Extra option for tooltip and label + type: mlType, + valueIndex: item.valueIndex, + // Force to use the value of calculated value. + value: value + }]; + } + + item = [ + dataTransform(seriesModel, item[0]), + dataTransform(seriesModel, item[1]), + extend({}, item[2]) + ]; + + // Avoid line data type is extended by from(to) data type + item[2].type = item[2].type || ''; + + // Merge from option and to option into line option + merge(item[2], item[0]); + merge(item[2], item[1]); + + return item; +}; + +function isInifinity(val) { + return !isNaN(val) && !isFinite(val); +} + +// If a markLine has one dim +function ifMarkLineHasOnlyDim(dimIndex, fromCoord, toCoord, coordSys) { + var otherDimIndex = 1 - dimIndex; + var dimName = coordSys.dimensions[dimIndex]; + return isInifinity(fromCoord[otherDimIndex]) && isInifinity(toCoord[otherDimIndex]) + && fromCoord[dimIndex] === toCoord[dimIndex] && coordSys.getAxis(dimName).containData(fromCoord[dimIndex]); +} + +function markLineFilter(coordSys, item) { + if (coordSys.type === 'cartesian2d') { + var fromCoord = item[0].coord; + var toCoord = item[1].coord; + // In case + // { + // markLine: { + // data: [{ yAxis: 2 }] + // } + // } + if ( + fromCoord && toCoord && + (ifMarkLineHasOnlyDim(1, fromCoord, toCoord, coordSys) + || ifMarkLineHasOnlyDim(0, fromCoord, toCoord, coordSys)) + ) { + return true; + } + } + return dataFilter$1(coordSys, item[0]) + && dataFilter$1(coordSys, item[1]); +} + +function updateSingleMarkerEndLayout( + data, idx, isFrom, seriesModel, api +) { + var coordSys = seriesModel.coordinateSystem; + var itemModel = data.getItemModel(idx); + + var point; + var xPx = parsePercent$1(itemModel.get('x'), api.getWidth()); + var yPx = parsePercent$1(itemModel.get('y'), api.getHeight()); + if (!isNaN(xPx) && !isNaN(yPx)) { + point = [xPx, yPx]; + } + else { + // Chart like bar may have there own marker positioning logic + if (seriesModel.getMarkerPosition) { + // Use the getMarkerPoisition + point = seriesModel.getMarkerPosition( + data.getValues(data.dimensions, idx) + ); + } + else { + var dims = coordSys.dimensions; + var x = data.get(dims[0], idx); + var y = data.get(dims[1], idx); + point = coordSys.dataToPoint([x, y]); + } + // Expand line to the edge of grid if value on one axis is Inifnity + // In case + // markLine: { + // data: [{ + // yAxis: 2 + // // or + // type: 'average' + // }] + // } + if (coordSys.type === 'cartesian2d') { + var xAxis = coordSys.getAxis('x'); + var yAxis = coordSys.getAxis('y'); + var dims = coordSys.dimensions; + if (isInifinity(data.get(dims[0], idx))) { + point[0] = xAxis.toGlobalCoord(xAxis.getExtent()[isFrom ? 0 : 1]); + } + else if (isInifinity(data.get(dims[1], idx))) { + point[1] = yAxis.toGlobalCoord(yAxis.getExtent()[isFrom ? 0 : 1]); + } + } + + // Use x, y if has any + if (!isNaN(xPx)) { + point[0] = xPx; + } + if (!isNaN(yPx)) { + point[1] = yPx; + } + } + + data.setItemLayout(idx, point); +} + +MarkerView.extend({ + + type: 'markLine', + + // updateLayout: function (markLineModel, ecModel, api) { + // ecModel.eachSeries(function (seriesModel) { + // var mlModel = seriesModel.markLineModel; + // if (mlModel) { + // var mlData = mlModel.getData(); + // var fromData = mlModel.__from; + // var toData = mlModel.__to; + // // Update visual and layout of from symbol and to symbol + // fromData.each(function (idx) { + // updateSingleMarkerEndLayout(fromData, idx, true, seriesModel, api); + // updateSingleMarkerEndLayout(toData, idx, false, seriesModel, api); + // }); + // // Update layout of line + // mlData.each(function (idx) { + // mlData.setItemLayout(idx, [ + // fromData.getItemLayout(idx), + // toData.getItemLayout(idx) + // ]); + // }); + + // this.markerGroupMap.get(seriesModel.id).updateLayout(); + + // } + // }, this); + // }, + + updateTransform: function (markLineModel, ecModel, api) { + ecModel.eachSeries(function (seriesModel) { + var mlModel = seriesModel.markLineModel; + if (mlModel) { + var mlData = mlModel.getData(); + var fromData = mlModel.__from; + var toData = mlModel.__to; + // Update visual and layout of from symbol and to symbol + fromData.each(function (idx) { + updateSingleMarkerEndLayout(fromData, idx, true, seriesModel, api); + updateSingleMarkerEndLayout(toData, idx, false, seriesModel, api); + }); + // Update layout of line + mlData.each(function (idx) { + mlData.setItemLayout(idx, [ + fromData.getItemLayout(idx), + toData.getItemLayout(idx) + ]); + }); + + this.markerGroupMap.get(seriesModel.id).updateLayout(); + + } + }, this); + }, + + renderSeries: function (seriesModel, mlModel, ecModel, api) { + var coordSys = seriesModel.coordinateSystem; + var seriesId = seriesModel.id; + var seriesData = seriesModel.getData(); + + var lineDrawMap = this.markerGroupMap; + var lineDraw = lineDrawMap.get(seriesId) + || lineDrawMap.set(seriesId, new LineDraw()); + this.group.add(lineDraw.group); + + var mlData = createList$2(coordSys, seriesModel, mlModel); + + var fromData = mlData.from; + var toData = mlData.to; + var lineData = mlData.line; + + mlModel.__from = fromData; + mlModel.__to = toData; + // Line data for tooltip and formatter + mlModel.setData(lineData); + + var symbolType = mlModel.get('symbol'); + var symbolSize = mlModel.get('symbolSize'); + if (!isArray(symbolType)) { + symbolType = [symbolType, symbolType]; + } + if (typeof symbolSize === 'number') { + symbolSize = [symbolSize, symbolSize]; + } + + // Update visual and layout of from symbol and to symbol + mlData.from.each(function (idx) { + updateDataVisualAndLayout(fromData, idx, true); + updateDataVisualAndLayout(toData, idx, false); + }); + + // Update visual and layout of line + lineData.each(function (idx) { + var lineColor = lineData.getItemModel(idx).get('lineStyle.color'); + lineData.setItemVisual(idx, { + color: lineColor || fromData.getItemVisual(idx, 'color') + }); + lineData.setItemLayout(idx, [ + fromData.getItemLayout(idx), + toData.getItemLayout(idx) + ]); + + lineData.setItemVisual(idx, { + 'fromSymbolSize': fromData.getItemVisual(idx, 'symbolSize'), + 'fromSymbol': fromData.getItemVisual(idx, 'symbol'), + 'toSymbolSize': toData.getItemVisual(idx, 'symbolSize'), + 'toSymbol': toData.getItemVisual(idx, 'symbol') + }); + }); + + lineDraw.updateData(lineData); + + // Set host model for tooltip + // FIXME + mlData.line.eachItemGraphicEl(function (el, idx) { + el.traverse(function (child) { + child.dataModel = mlModel; + }); + }); + + function updateDataVisualAndLayout(data, idx, isFrom) { + var itemModel = data.getItemModel(idx); + + updateSingleMarkerEndLayout( + data, idx, isFrom, seriesModel, api + ); + + data.setItemVisual(idx, { + symbolSize: itemModel.get('symbolSize') || symbolSize[isFrom ? 0 : 1], + symbol: itemModel.get('symbol', true) || symbolType[isFrom ? 0 : 1], + color: itemModel.get('itemStyle.color') || seriesData.getVisual('color') + }); + } + + lineDraw.__keep = true; + + lineDraw.group.silent = mlModel.get('silent') || seriesModel.get('silent'); + } +}); + +/** + * @inner + * @param {module:echarts/coord/*} coordSys + * @param {module:echarts/model/Series} seriesModel + * @param {module:echarts/model/Model} mpModel + */ +function createList$2(coordSys, seriesModel, mlModel) { + + var coordDimsInfos; + if (coordSys) { + coordDimsInfos = map(coordSys && coordSys.dimensions, function (coordDim) { + var info = seriesModel.getData().getDimensionInfo( + seriesModel.getData().mapDimension(coordDim) + ) || {}; + // In map series data don't have lng and lat dimension. Fallback to same with coordSys + return defaults({name: coordDim}, info); + }); + } + else { + coordDimsInfos =[{ + name: 'value', + type: 'float' + }]; + } + + var fromData = new List(coordDimsInfos, mlModel); + var toData = new List(coordDimsInfos, mlModel); + // No dimensions + var lineData = new List([], mlModel); + + var optData = map(mlModel.get('data'), curry( + markLineTransform, seriesModel, coordSys, mlModel + )); + if (coordSys) { + optData = filter( + optData, curry(markLineFilter, coordSys) + ); + } + var dimValueGetter$$1 = coordSys ? dimValueGetter : function (item) { + return item.value; + }; + fromData.initData( + map(optData, function (item) { return item[0]; }), + null, dimValueGetter$$1 + ); + toData.initData( + map(optData, function (item) { return item[1]; }), + null, dimValueGetter$$1 + ); + lineData.initData( + map(optData, function (item) { return item[2]; }) + ); + lineData.hasItemOption = true; + + return { + from: fromData, + to: toData, + line: lineData + }; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +registerPreprocessor(function (opt) { + // Make sure markLine component is enabled + opt.markLine = opt.markLine || {}; +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +MarkerModel.extend({ + + type: 'markArea', + + defaultOption: { + zlevel: 0, + // PENDING + z: 1, + tooltip: { + trigger: 'item' + }, + // markArea should fixed on the coordinate system + animation: false, + label: { + show: true, + position: 'top' + }, + itemStyle: { + // color and borderColor default to use color from series + // color: 'auto' + // borderColor: 'auto' + borderWidth: 0 + }, + + emphasis: { + label: { + show: true, + position: 'top' + } + } + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// TODO Better on polar + +var markAreaTransform = function (seriesModel, coordSys, maModel, item) { + var lt = dataTransform(seriesModel, item[0]); + var rb = dataTransform(seriesModel, item[1]); + var retrieve$$1 = retrieve; + + // FIXME make sure lt is less than rb + var ltCoord = lt.coord; + var rbCoord = rb.coord; + ltCoord[0] = retrieve$$1(ltCoord[0], -Infinity); + ltCoord[1] = retrieve$$1(ltCoord[1], -Infinity); + + rbCoord[0] = retrieve$$1(rbCoord[0], Infinity); + rbCoord[1] = retrieve$$1(rbCoord[1], Infinity); + + // Merge option into one + var result = mergeAll([{}, lt, rb]); + + result.coord = [ + lt.coord, rb.coord + ]; + result.x0 = lt.x; + result.y0 = lt.y; + result.x1 = rb.x; + result.y1 = rb.y; + return result; +}; + +function isInifinity$1(val) { + return !isNaN(val) && !isFinite(val); +} + +// If a markArea has one dim +function ifMarkLineHasOnlyDim$1(dimIndex, fromCoord, toCoord, coordSys) { + var otherDimIndex = 1 - dimIndex; + return isInifinity$1(fromCoord[otherDimIndex]) && isInifinity$1(toCoord[otherDimIndex]); +} + +function markAreaFilter(coordSys, item) { + var fromCoord = item.coord[0]; + var toCoord = item.coord[1]; + if (coordSys.type === 'cartesian2d') { + // In case + // { + // markArea: { + // data: [{ yAxis: 2 }] + // } + // } + if ( + fromCoord && toCoord && + (ifMarkLineHasOnlyDim$1(1, fromCoord, toCoord, coordSys) + || ifMarkLineHasOnlyDim$1(0, fromCoord, toCoord, coordSys)) + ) { + return true; + } + } + return dataFilter$1(coordSys, { + coord: fromCoord, + x: item.x0, + y: item.y0 + }) + || dataFilter$1(coordSys, { + coord: toCoord, + x: item.x1, + y: item.y1 + }); +} + +// dims can be ['x0', 'y0'], ['x1', 'y1'], ['x0', 'y1'], ['x1', 'y0'] +function getSingleMarkerEndPoint(data, idx, dims, seriesModel, api) { + var coordSys = seriesModel.coordinateSystem; + var itemModel = data.getItemModel(idx); + + var point; + var xPx = parsePercent$1(itemModel.get(dims[0]), api.getWidth()); + var yPx = parsePercent$1(itemModel.get(dims[1]), api.getHeight()); + if (!isNaN(xPx) && !isNaN(yPx)) { + point = [xPx, yPx]; + } + else { + // Chart like bar may have there own marker positioning logic + if (seriesModel.getMarkerPosition) { + // Use the getMarkerPoisition + point = seriesModel.getMarkerPosition( + data.getValues(dims, idx) + ); + } + else { + var x = data.get(dims[0], idx); + var y = data.get(dims[1], idx); + var pt = [x, y]; + coordSys.clampData && coordSys.clampData(pt, pt); + point = coordSys.dataToPoint(pt, true); + } + if (coordSys.type === 'cartesian2d') { + var xAxis = coordSys.getAxis('x'); + var yAxis = coordSys.getAxis('y'); + var x = data.get(dims[0], idx); + var y = data.get(dims[1], idx); + if (isInifinity$1(x)) { + point[0] = xAxis.toGlobalCoord(xAxis.getExtent()[dims[0] === 'x0' ? 0 : 1]); + } + else if (isInifinity$1(y)) { + point[1] = yAxis.toGlobalCoord(yAxis.getExtent()[dims[1] === 'y0' ? 0 : 1]); + } + } + + // Use x, y if has any + if (!isNaN(xPx)) { + point[0] = xPx; + } + if (!isNaN(yPx)) { + point[1] = yPx; + } + } + + return point; +} + +var dimPermutations = [['x0', 'y0'], ['x1', 'y0'], ['x1', 'y1'], ['x0', 'y1']]; + +MarkerView.extend({ + + type: 'markArea', + + // updateLayout: function (markAreaModel, ecModel, api) { + // ecModel.eachSeries(function (seriesModel) { + // var maModel = seriesModel.markAreaModel; + // if (maModel) { + // var areaData = maModel.getData(); + // areaData.each(function (idx) { + // var points = zrUtil.map(dimPermutations, function (dim) { + // return getSingleMarkerEndPoint(areaData, idx, dim, seriesModel, api); + // }); + // // Layout + // areaData.setItemLayout(idx, points); + // var el = areaData.getItemGraphicEl(idx); + // el.setShape('points', points); + // }); + // } + // }, this); + // }, + + updateTransform: function (markAreaModel, ecModel, api) { + ecModel.eachSeries(function (seriesModel) { + var maModel = seriesModel.markAreaModel; + if (maModel) { + var areaData = maModel.getData(); + areaData.each(function (idx) { + var points = map(dimPermutations, function (dim) { + return getSingleMarkerEndPoint(areaData, idx, dim, seriesModel, api); + }); + // Layout + areaData.setItemLayout(idx, points); + var el = areaData.getItemGraphicEl(idx); + el.setShape('points', points); + }); + } + }, this); + }, + + renderSeries: function (seriesModel, maModel, ecModel, api) { + var coordSys = seriesModel.coordinateSystem; + var seriesId = seriesModel.id; + var seriesData = seriesModel.getData(); + + var areaGroupMap = this.markerGroupMap; + var polygonGroup = areaGroupMap.get(seriesId) + || areaGroupMap.set(seriesId, {group: new Group()}); + + this.group.add(polygonGroup.group); + polygonGroup.__keep = true; + + var areaData = createList$3(coordSys, seriesModel, maModel); + + // Line data for tooltip and formatter + maModel.setData(areaData); + + // Update visual and layout of line + areaData.each(function (idx) { + // Layout + areaData.setItemLayout(idx, map(dimPermutations, function (dim) { + return getSingleMarkerEndPoint(areaData, idx, dim, seriesModel, api); + })); + + // Visual + areaData.setItemVisual(idx, { + color: seriesData.getVisual('color') + }); + }); + + + areaData.diff(polygonGroup.__data) + .add(function (idx) { + var polygon = new Polygon({ + shape: { + points: areaData.getItemLayout(idx) + } + }); + areaData.setItemGraphicEl(idx, polygon); + polygonGroup.group.add(polygon); + }) + .update(function (newIdx, oldIdx) { + var polygon = polygonGroup.__data.getItemGraphicEl(oldIdx); + updateProps(polygon, { + shape: { + points: areaData.getItemLayout(newIdx) + } + }, maModel, newIdx); + polygonGroup.group.add(polygon); + areaData.setItemGraphicEl(newIdx, polygon); + }) + .remove(function (idx) { + var polygon = polygonGroup.__data.getItemGraphicEl(idx); + polygonGroup.group.remove(polygon); + }) + .execute(); + + areaData.eachItemGraphicEl(function (polygon, idx) { + var itemModel = areaData.getItemModel(idx); + var labelModel = itemModel.getModel('label'); + var labelHoverModel = itemModel.getModel('emphasis.label'); + var color = areaData.getItemVisual(idx, 'color'); + polygon.useStyle( + defaults( + itemModel.getModel('itemStyle').getItemStyle(), + { + fill: modifyAlpha(color, 0.4), + stroke: color + } + ) + ); + + polygon.hoverStyle = itemModel.getModel('emphasis.itemStyle').getItemStyle(); + + setLabelStyle( + polygon.style, polygon.hoverStyle, labelModel, labelHoverModel, + { + labelFetcher: maModel, + labelDataIndex: idx, + defaultText: areaData.getName(idx) || '', + isRectText: true, + autoColor: color + } + ); + + setHoverStyle(polygon, {}); + + polygon.dataModel = maModel; + }); + + polygonGroup.__data = areaData; + + polygonGroup.group.silent = maModel.get('silent') || seriesModel.get('silent'); + } +}); + +/** + * @inner + * @param {module:echarts/coord/*} coordSys + * @param {module:echarts/model/Series} seriesModel + * @param {module:echarts/model/Model} mpModel + */ +function createList$3(coordSys, seriesModel, maModel) { + + var coordDimsInfos; + var areaData; + var dims = ['x0', 'y0', 'x1', 'y1']; + if (coordSys) { + coordDimsInfos = map(coordSys && coordSys.dimensions, function (coordDim) { + var data = seriesModel.getData(); + var info = data.getDimensionInfo( + data.mapDimension(coordDim) + ) || {}; + // In map series data don't have lng and lat dimension. Fallback to same with coordSys + return defaults({name: coordDim}, info); + }); + areaData = new List(map(dims, function (dim, idx) { + return { + name: dim, + type: coordDimsInfos[idx % 2].type + }; + }), maModel); + } + else { + coordDimsInfos =[{ + name: 'value', + type: 'float' + }]; + areaData = new List(coordDimsInfos, maModel); + } + + var optData = map(maModel.get('data'), curry( + markAreaTransform, seriesModel, coordSys, maModel + )); + if (coordSys) { + optData = filter( + optData, curry(markAreaFilter, coordSys) + ); + } + + var dimValueGetter$$1 = coordSys ? function (item, dimName, dataIndex, dimIndex) { + return item.coord[Math.floor(dimIndex / 2)][dimIndex % 2]; + } : function (item) { + return item.value; + }; + areaData.initData(optData, null, dimValueGetter$$1); + areaData.hasItemOption = true; + return areaData; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +registerPreprocessor(function (opt) { + // Make sure markArea component is enabled + opt.markArea = opt.markArea || {}; +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var preprocessor$3 = function (option) { + var timelineOpt = option && option.timeline; + + if (!isArray(timelineOpt)) { + timelineOpt = timelineOpt ? [timelineOpt] : []; + } + + each$1(timelineOpt, function (opt) { + if (!opt) { + return; + } + + compatibleEC2(opt); + }); +}; + +function compatibleEC2(opt) { + var type = opt.type; + + var ec2Types = {'number': 'value', 'time': 'time'}; + + // Compatible with ec2 + if (ec2Types[type]) { + opt.axisType = ec2Types[type]; + delete opt.type; + } + + transferItem(opt); + + if (has$2(opt, 'controlPosition')) { + var controlStyle = opt.controlStyle || (opt.controlStyle = {}); + if (!has$2(controlStyle, 'position')) { + controlStyle.position = opt.controlPosition; + } + if (controlStyle.position === 'none' && !has$2(controlStyle, 'show')) { + controlStyle.show = false; + delete controlStyle.position; + } + delete opt.controlPosition; + } + + each$1(opt.data || [], function (dataItem) { + if (isObject$1(dataItem) && !isArray(dataItem)) { + if (!has$2(dataItem, 'value') && has$2(dataItem, 'name')) { + // In ec2, using name as value. + dataItem.value = dataItem.name; + } + transferItem(dataItem); + } + }); +} + +function transferItem(opt) { + var itemStyle = opt.itemStyle || (opt.itemStyle = {}); + + var itemStyleEmphasis = itemStyle.emphasis || (itemStyle.emphasis = {}); + + // Transfer label out + var label = opt.label || (opt.label || {}); + var labelNormal = label.normal || (label.normal = {}); + var excludeLabelAttr = {normal: 1, emphasis: 1}; + + each$1(label, function (value, name) { + if (!excludeLabelAttr[name] && !has$2(labelNormal, name)) { + labelNormal[name] = value; + } + }); + + if (itemStyleEmphasis.label && !has$2(label, 'emphasis')) { + label.emphasis = itemStyleEmphasis.label; + delete itemStyleEmphasis.label; + } +} + +function has$2(obj, attr) { + return obj.hasOwnProperty(attr); +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +ComponentModel.registerSubTypeDefaulter('timeline', function () { + // Only slider now. + return 'slider'; +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +registerAction( + + {type: 'timelineChange', event: 'timelineChanged', update: 'prepareAndUpdate'}, + + function (payload, ecModel) { + + var timelineModel = ecModel.getComponent('timeline'); + if (timelineModel && payload.currentIndex != null) { + timelineModel.setCurrentIndex(payload.currentIndex); + + if (!timelineModel.get('loop', true) && timelineModel.isIndexMax()) { + timelineModel.setPlayState(false); + } + } + + // Set normalized currentIndex to payload. + ecModel.resetOption('timeline'); + + return defaults({ + currentIndex: timelineModel.option.currentIndex + }, payload); + } +); + +registerAction( + + {type: 'timelinePlayChange', event: 'timelinePlayChanged', update: 'update'}, + + function (payload, ecModel) { + var timelineModel = ecModel.getComponent('timeline'); + if (timelineModel && payload.playState != null) { + timelineModel.setPlayState(payload.playState); + } + } +); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var TimelineModel = ComponentModel.extend({ + + type: 'timeline', + + layoutMode: 'box', + + /** + * @protected + */ + defaultOption: { + + zlevel: 0, // 一级层叠 + z: 4, // 二级层叠 + show: true, + + axisType: 'time', // 模式是时间类型,支持 value, category + + realtime: true, + + left: '20%', + top: null, + right: '20%', + bottom: 0, + width: null, + height: 40, + padding: 5, + + controlPosition: 'left', // 'left' 'right' 'top' 'bottom' 'none' + autoPlay: false, + rewind: false, // 反向播放 + loop: true, + playInterval: 2000, // 播放时间间隔,单位ms + + currentIndex: 0, + + itemStyle: {}, + label: { + color: '#000' + }, + + data: [] + }, + + /** + * @override + */ + init: function (option, parentModel, ecModel) { + + /** + * @private + * @type {module:echarts/data/List} + */ + this._data; + + /** + * @private + * @type {Array.<string>} + */ + this._names; + + this.mergeDefaultAndTheme(option, ecModel); + this._initData(); + }, + + /** + * @override + */ + mergeOption: function (option) { + TimelineModel.superApply(this, 'mergeOption', arguments); + this._initData(); + }, + + /** + * @param {number} [currentIndex] + */ + setCurrentIndex: function (currentIndex) { + if (currentIndex == null) { + currentIndex = this.option.currentIndex; + } + var count = this._data.count(); + + if (this.option.loop) { + currentIndex = (currentIndex % count + count) % count; + } + else { + currentIndex >= count && (currentIndex = count - 1); + currentIndex < 0 && (currentIndex = 0); + } + + this.option.currentIndex = currentIndex; + }, + + /** + * @return {number} currentIndex + */ + getCurrentIndex: function () { + return this.option.currentIndex; + }, + + /** + * @return {boolean} + */ + isIndexMax: function () { + return this.getCurrentIndex() >= this._data.count() - 1; + }, + + /** + * @param {boolean} state true: play, false: stop + */ + setPlayState: function (state) { + this.option.autoPlay = !!state; + }, + + /** + * @return {boolean} true: play, false: stop + */ + getPlayState: function () { + return !!this.option.autoPlay; + }, + + /** + * @private + */ + _initData: function () { + var thisOption = this.option; + var dataArr = thisOption.data || []; + var axisType = thisOption.axisType; + var names = this._names = []; + + if (axisType === 'category') { + var idxArr = []; + each$1(dataArr, function (item, index) { + var value = getDataItemValue(item); + var newItem; + + if (isObject$1(item)) { + newItem = clone(item); + newItem.value = index; + } + else { + newItem = index; + } + + idxArr.push(newItem); + + if (!isString(value) && (value == null || isNaN(value))) { + value = ''; + } + + names.push(value + ''); + }); + dataArr = idxArr; + } + + var dimType = ({category: 'ordinal', time: 'time'})[axisType] || 'number'; + + var data = this._data = new List([{name: 'value', type: dimType}], this); + + data.initData(dataArr, names); + }, + + getData: function () { + return this._data; + }, + + /** + * @public + * @return {Array.<string>} categoreis + */ + getCategories: function () { + if (this.get('axisType') === 'category') { + return this._names.slice(); + } + } + +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var SliderTimelineModel = TimelineModel.extend({ + + type: 'timeline.slider', + + /** + * @protected + */ + defaultOption: { + + backgroundColor: 'rgba(0,0,0,0)', // 时间轴背景颜色 + borderColor: '#ccc', // 时间轴边框颜色 + borderWidth: 0, // 时间轴边框线宽,单位px,默认为0(无边框) + + orient: 'horizontal', // 'vertical' + inverse: false, + + tooltip: { // boolean or Object + trigger: 'item' // data item may also have tootip attr. + }, + + symbol: 'emptyCircle', + symbolSize: 10, + + lineStyle: { + show: true, + width: 2, + color: '#304654' + }, + label: { // 文本标签 + position: 'auto', // auto left right top bottom + // When using number, label position is not + // restricted by viewRect. + // positive: right/bottom, negative: left/top + show: true, + interval: 'auto', + rotate: 0, + // formatter: null, + // 其余属性默认使用全局文本样式,详见TEXTSTYLE + color: '#304654' + }, + itemStyle: { + color: '#304654', + borderWidth: 1 + }, + + checkpointStyle: { + symbol: 'circle', + symbolSize: 13, + color: '#c23531', + borderWidth: 5, + borderColor: 'rgba(194,53,49, 0.5)', + animation: true, + animationDuration: 300, + animationEasing: 'quinticInOut' + }, + + controlStyle: { + show: true, + showPlayBtn: true, + showPrevBtn: true, + showNextBtn: true, + itemSize: 22, + itemGap: 12, + position: 'left', // 'left' 'right' 'top' 'bottom' + playIcon: 'path://M31.6,53C17.5,53,6,41.5,6,27.4S17.5,1.8,31.6,1.8C45.7,1.8,57.2,13.3,57.2,27.4S45.7,53,31.6,53z M31.6,3.3 C18.4,3.3,7.5,14.1,7.5,27.4c0,13.3,10.8,24.1,24.1,24.1C44.9,51.5,55.7,40.7,55.7,27.4C55.7,14.1,44.9,3.3,31.6,3.3z M24.9,21.3 c0-2.2,1.6-3.1,3.5-2l10.5,6.1c1.899,1.1,1.899,2.9,0,4l-10.5,6.1c-1.9,1.1-3.5,0.2-3.5-2V21.3z', // jshint ignore:line + stopIcon: 'path://M30.9,53.2C16.8,53.2,5.3,41.7,5.3,27.6S16.8,2,30.9,2C45,2,56.4,13.5,56.4,27.6S45,53.2,30.9,53.2z M30.9,3.5C17.6,3.5,6.8,14.4,6.8,27.6c0,13.3,10.8,24.1,24.101,24.1C44.2,51.7,55,40.9,55,27.6C54.9,14.4,44.1,3.5,30.9,3.5z M36.9,35.8c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H36c0.5,0,0.9,0.4,0.9,1V35.8z M27.8,35.8 c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H27c0.5,0,0.9,0.4,0.9,1L27.8,35.8L27.8,35.8z', // jshint ignore:line + nextIcon: 'path://M18.6,50.8l22.5-22.5c0.2-0.2,0.3-0.4,0.3-0.7c0-0.3-0.1-0.5-0.3-0.7L18.7,4.4c-0.1-0.1-0.2-0.3-0.2-0.5 c0-0.4,0.3-0.8,0.8-0.8c0.2,0,0.5,0.1,0.6,0.3l23.5,23.5l0,0c0.2,0.2,0.3,0.4,0.3,0.7c0,0.3-0.1,0.5-0.3,0.7l-0.1,0.1L19.7,52 c-0.1,0.1-0.3,0.2-0.5,0.2c-0.4,0-0.8-0.3-0.8-0.8C18.4,51.2,18.5,51,18.6,50.8z', // jshint ignore:line + prevIcon: 'path://M43,52.8L20.4,30.3c-0.2-0.2-0.3-0.4-0.3-0.7c0-0.3,0.1-0.5,0.3-0.7L42.9,6.4c0.1-0.1,0.2-0.3,0.2-0.5 c0-0.4-0.3-0.8-0.8-0.8c-0.2,0-0.5,0.1-0.6,0.3L18.3,28.8l0,0c-0.2,0.2-0.3,0.4-0.3,0.7c0,0.3,0.1,0.5,0.3,0.7l0.1,0.1L41.9,54 c0.1,0.1,0.3,0.2,0.5,0.2c0.4,0,0.8-0.3,0.8-0.8C43.2,53.2,43.1,53,43,52.8z', // jshint ignore:line + + color: '#304654', + borderColor: '#304654', + borderWidth: 1 + }, + + emphasis: { + label: { + show: true, + // 其余属性默认使用全局文本样式,详见TEXTSTYLE + color: '#c23531' + }, + + itemStyle: { + color: '#c23531' + }, + + controlStyle: { + color: '#c23531', + borderColor: '#c23531', + borderWidth: 2 + } + }, + data: [] + } + +}); + +mixin(SliderTimelineModel, dataFormatMixin); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var TimelineView = Component.extend({ + type: 'timeline' +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * Extend axis 2d + * @constructor module:echarts/coord/cartesian/Axis2D + * @extends {module:echarts/coord/cartesian/Axis} + * @param {string} dim + * @param {*} scale + * @param {Array.<number>} coordExtent + * @param {string} axisType + * @param {string} position + */ +var TimelineAxis = function (dim, scale, coordExtent, axisType) { + + Axis.call(this, dim, scale, coordExtent); + + /** + * Axis type + * - 'category' + * - 'value' + * - 'time' + * - 'log' + * @type {string} + */ + this.type = axisType || 'value'; + + /** + * Axis model + * @param {module:echarts/component/TimelineModel} + */ + this.model = null; +}; + +TimelineAxis.prototype = { + + constructor: TimelineAxis, + + /** + * @override + */ + getLabelModel: function () { + return this.model.getModel('label'); + }, + + /** + * @override + */ + isHorizontal: function () { + return this.model.get('orient') === 'horizontal'; + } + +}; + +inherits(TimelineAxis, Axis); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var bind$6 = bind; +var each$27 = each$1; + +var PI$4 = Math.PI; + +TimelineView.extend({ + + type: 'timeline.slider', + + init: function (ecModel, api) { + + this.api = api; + + /** + * @private + * @type {module:echarts/component/timeline/TimelineAxis} + */ + this._axis; + + /** + * @private + * @type {module:zrender/core/BoundingRect} + */ + this._viewRect; + + /** + * @type {number} + */ + this._timer; + + /** + * @type {module:zrender/Element} + */ + this._currentPointer; + + /** + * @type {module:zrender/container/Group} + */ + this._mainGroup; + + /** + * @type {module:zrender/container/Group} + */ + this._labelGroup; + }, + + /** + * @override + */ + render: function (timelineModel, ecModel, api, payload) { + this.model = timelineModel; + this.api = api; + this.ecModel = ecModel; + + this.group.removeAll(); + + if (timelineModel.get('show', true)) { + + var layoutInfo = this._layout(timelineModel, api); + var mainGroup = this._createGroup('mainGroup'); + var labelGroup = this._createGroup('labelGroup'); + + /** + * @private + * @type {module:echarts/component/timeline/TimelineAxis} + */ + var axis = this._axis = this._createAxis(layoutInfo, timelineModel); + + timelineModel.formatTooltip = function (dataIndex) { + return encodeHTML(axis.scale.getLabel(dataIndex)); + }; + + each$27( + ['AxisLine', 'AxisTick', 'Control', 'CurrentPointer'], + function (name) { + this['_render' + name](layoutInfo, mainGroup, axis, timelineModel); + }, + this + ); + + this._renderAxisLabel(layoutInfo, labelGroup, axis, timelineModel); + this._position(layoutInfo, timelineModel); + } + + this._doPlayStop(); + }, + + /** + * @override + */ + remove: function () { + this._clearTimer(); + this.group.removeAll(); + }, + + /** + * @override + */ + dispose: function () { + this._clearTimer(); + }, + + _layout: function (timelineModel, api) { + var labelPosOpt = timelineModel.get('label.position'); + var orient = timelineModel.get('orient'); + var viewRect = getViewRect$4(timelineModel, api); + // Auto label offset. + if (labelPosOpt == null || labelPosOpt === 'auto') { + labelPosOpt = orient === 'horizontal' + ? ((viewRect.y + viewRect.height / 2) < api.getHeight() / 2 ? '-' : '+') + : ((viewRect.x + viewRect.width / 2) < api.getWidth() / 2 ? '+' : '-'); + } + else if (isNaN(labelPosOpt)) { + labelPosOpt = ({ + horizontal: {top: '-', bottom: '+'}, + vertical: {left: '-', right: '+'} + })[orient][labelPosOpt]; + } + + var labelAlignMap = { + horizontal: 'center', + vertical: (labelPosOpt >= 0 || labelPosOpt === '+') ? 'left' : 'right' + }; + + var labelBaselineMap = { + horizontal: (labelPosOpt >= 0 || labelPosOpt === '+') ? 'top' : 'bottom', + vertical: 'middle' + }; + var rotationMap = { + horizontal: 0, + vertical: PI$4 / 2 + }; + + // Position + var mainLength = orient === 'vertical' ? viewRect.height : viewRect.width; + + var controlModel = timelineModel.getModel('controlStyle'); + var showControl = controlModel.get('show', true); + var controlSize = showControl ? controlModel.get('itemSize') : 0; + var controlGap = showControl ? controlModel.get('itemGap') : 0; + var sizePlusGap = controlSize + controlGap; + + // Special label rotate. + var labelRotation = timelineModel.get('label.rotate') || 0; + labelRotation = labelRotation * PI$4 / 180; // To radian. + + var playPosition; + var prevBtnPosition; + var nextBtnPosition; + var axisExtent; + var controlPosition = controlModel.get('position', true); + var showPlayBtn = showControl && controlModel.get('showPlayBtn', true); + var showPrevBtn = showControl && controlModel.get('showPrevBtn', true); + var showNextBtn = showControl && controlModel.get('showNextBtn', true); + var xLeft = 0; + var xRight = mainLength; + + // position[0] means left, position[1] means middle. + if (controlPosition === 'left' || controlPosition === 'bottom') { + showPlayBtn && (playPosition = [0, 0], xLeft += sizePlusGap); + showPrevBtn && (prevBtnPosition = [xLeft, 0], xLeft += sizePlusGap); + showNextBtn && (nextBtnPosition = [xRight - controlSize, 0], xRight -= sizePlusGap); + } + else { // 'top' 'right' + showPlayBtn && (playPosition = [xRight - controlSize, 0], xRight -= sizePlusGap); + showPrevBtn && (prevBtnPosition = [0, 0], xLeft += sizePlusGap); + showNextBtn && (nextBtnPosition = [xRight - controlSize, 0], xRight -= sizePlusGap); + } + axisExtent = [xLeft, xRight]; + + if (timelineModel.get('inverse')) { + axisExtent.reverse(); + } + + return { + viewRect: viewRect, + mainLength: mainLength, + orient: orient, + + rotation: rotationMap[orient], + labelRotation: labelRotation, + labelPosOpt: labelPosOpt, + labelAlign: timelineModel.get('label.align') || labelAlignMap[orient], + labelBaseline: timelineModel.get('label.verticalAlign') + || timelineModel.get('label.baseline') + || labelBaselineMap[orient], + + // Based on mainGroup. + playPosition: playPosition, + prevBtnPosition: prevBtnPosition, + nextBtnPosition: nextBtnPosition, + axisExtent: axisExtent, + + controlSize: controlSize, + controlGap: controlGap + }; + }, + + _position: function (layoutInfo, timelineModel) { + // Position is be called finally, because bounding rect is needed for + // adapt content to fill viewRect (auto adapt offset). + + // Timeline may be not all in the viewRect when 'offset' is specified + // as a number, because it is more appropriate that label aligns at + // 'offset' but not the other edge defined by viewRect. + + var mainGroup = this._mainGroup; + var labelGroup = this._labelGroup; + + var viewRect = layoutInfo.viewRect; + if (layoutInfo.orient === 'vertical') { + // transform to horizontal, inverse rotate by left-top point. + var m = create$1(); + var rotateOriginX = viewRect.x; + var rotateOriginY = viewRect.y + viewRect.height; + translate(m, m, [-rotateOriginX, -rotateOriginY]); + rotate(m, m, -PI$4 / 2); + translate(m, m, [rotateOriginX, rotateOriginY]); + viewRect = viewRect.clone(); + viewRect.applyTransform(m); + } + + var viewBound = getBound(viewRect); + var mainBound = getBound(mainGroup.getBoundingRect()); + var labelBound = getBound(labelGroup.getBoundingRect()); + + var mainPosition = mainGroup.position; + var labelsPosition = labelGroup.position; + + labelsPosition[0] = mainPosition[0] = viewBound[0][0]; + + var labelPosOpt = layoutInfo.labelPosOpt; + + if (isNaN(labelPosOpt)) { // '+' or '-' + var mainBoundIdx = labelPosOpt === '+' ? 0 : 1; + toBound(mainPosition, mainBound, viewBound, 1, mainBoundIdx); + toBound(labelsPosition, labelBound, viewBound, 1, 1 - mainBoundIdx); + } + else { + var mainBoundIdx = labelPosOpt >= 0 ? 0 : 1; + toBound(mainPosition, mainBound, viewBound, 1, mainBoundIdx); + labelsPosition[1] = mainPosition[1] + labelPosOpt; + } + + mainGroup.attr('position', mainPosition); + labelGroup.attr('position', labelsPosition); + mainGroup.rotation = labelGroup.rotation = layoutInfo.rotation; + + setOrigin(mainGroup); + setOrigin(labelGroup); + + function setOrigin(targetGroup) { + var pos = targetGroup.position; + targetGroup.origin = [ + viewBound[0][0] - pos[0], + viewBound[1][0] - pos[1] + ]; + } + + function getBound(rect) { + // [[xmin, xmax], [ymin, ymax]] + return [ + [rect.x, rect.x + rect.width], + [rect.y, rect.y + rect.height] + ]; + } + + function toBound(fromPos, from, to, dimIdx, boundIdx) { + fromPos[dimIdx] += to[dimIdx][boundIdx] - from[dimIdx][boundIdx]; + } + }, + + _createAxis: function (layoutInfo, timelineModel) { + var data = timelineModel.getData(); + var axisType = timelineModel.get('axisType'); + + var scale = createScaleByModel(timelineModel, axisType); + + // Customize scale. The `tickValue` is `dataIndex`. + scale.getTicks = function () { + return data.mapArray(['value'], function (value) { + return value; + }); + }; + + var dataExtent = data.getDataExtent('value'); + scale.setExtent(dataExtent[0], dataExtent[1]); + scale.niceTicks(); + + var axis = new TimelineAxis('value', scale, layoutInfo.axisExtent, axisType); + axis.model = timelineModel; + + return axis; + }, + + _createGroup: function (name) { + var newGroup = this['_' + name] = new Group(); + this.group.add(newGroup); + return newGroup; + }, + + _renderAxisLine: function (layoutInfo, group, axis, timelineModel) { + var axisExtent = axis.getExtent(); + + if (!timelineModel.get('lineStyle.show')) { + return; + } + + group.add(new Line({ + shape: { + x1: axisExtent[0], y1: 0, + x2: axisExtent[1], y2: 0 + }, + style: extend( + {lineCap: 'round'}, + timelineModel.getModel('lineStyle').getLineStyle() + ), + silent: true, + z2: 1 + })); + }, + + /** + * @private + */ + _renderAxisTick: function (layoutInfo, group, axis, timelineModel) { + var data = timelineModel.getData(); + // Show all ticks, despite ignoring strategy. + var ticks = axis.scale.getTicks(); + + // The value is dataIndex, see the costomized scale. + each$27(ticks, function (value) { + var tickCoord = axis.dataToCoord(value); + var itemModel = data.getItemModel(value); + var itemStyleModel = itemModel.getModel('itemStyle'); + var hoverStyleModel = itemModel.getModel('emphasis.itemStyle'); + var symbolOpt = { + position: [tickCoord, 0], + onclick: bind$6(this._changeTimeline, this, value) + }; + var el = giveSymbol(itemModel, itemStyleModel, group, symbolOpt); + setHoverStyle(el, hoverStyleModel.getItemStyle()); + + if (itemModel.get('tooltip')) { + el.dataIndex = value; + el.dataModel = timelineModel; + } + else { + el.dataIndex = el.dataModel = null; + } + + }, this); + }, + + /** + * @private + */ + _renderAxisLabel: function (layoutInfo, group, axis, timelineModel) { + var labelModel = axis.getLabelModel(); + + if (!labelModel.get('show')) { + return; + } + + var data = timelineModel.getData(); + var labels = axis.getViewLabels(); + + each$27(labels, function (labelItem) { + // The tickValue is dataIndex, see the costomized scale. + var dataIndex = labelItem.tickValue; + + var itemModel = data.getItemModel(dataIndex); + var normalLabelModel = itemModel.getModel('label'); + var hoverLabelModel = itemModel.getModel('emphasis.label'); + var tickCoord = axis.dataToCoord(labelItem.tickValue); + var textEl = new Text({ + position: [tickCoord, 0], + rotation: layoutInfo.labelRotation - layoutInfo.rotation, + onclick: bind$6(this._changeTimeline, this, dataIndex), + silent: false + }); + setTextStyle(textEl.style, normalLabelModel, { + text: labelItem.formattedLabel, + textAlign: layoutInfo.labelAlign, + textVerticalAlign: layoutInfo.labelBaseline + }); + + group.add(textEl); + setHoverStyle( + textEl, setTextStyle({}, hoverLabelModel) + ); + + }, this); + }, + + /** + * @private + */ + _renderControl: function (layoutInfo, group, axis, timelineModel) { + var controlSize = layoutInfo.controlSize; + var rotation = layoutInfo.rotation; + + var itemStyle = timelineModel.getModel('controlStyle').getItemStyle(); + var hoverStyle = timelineModel.getModel('emphasis.controlStyle').getItemStyle(); + var rect = [0, -controlSize / 2, controlSize, controlSize]; + var playState = timelineModel.getPlayState(); + var inverse = timelineModel.get('inverse', true); + + makeBtn( + layoutInfo.nextBtnPosition, + 'controlStyle.nextIcon', + bind$6(this._changeTimeline, this, inverse ? '-' : '+') + ); + makeBtn( + layoutInfo.prevBtnPosition, + 'controlStyle.prevIcon', + bind$6(this._changeTimeline, this, inverse ? '+' : '-') + ); + makeBtn( + layoutInfo.playPosition, + 'controlStyle.' + (playState ? 'stopIcon' : 'playIcon'), + bind$6(this._handlePlayClick, this, !playState), + true + ); + + function makeBtn(position, iconPath, onclick, willRotate) { + if (!position) { + return; + } + var opt = { + position: position, + origin: [controlSize / 2, 0], + rotation: willRotate ? -rotation : 0, + rectHover: true, + style: itemStyle, + onclick: onclick + }; + var btn = makeIcon(timelineModel, iconPath, rect, opt); + group.add(btn); + setHoverStyle(btn, hoverStyle); + } + }, + + _renderCurrentPointer: function (layoutInfo, group, axis, timelineModel) { + var data = timelineModel.getData(); + var currentIndex = timelineModel.getCurrentIndex(); + var pointerModel = data.getItemModel(currentIndex).getModel('checkpointStyle'); + var me = this; + + var callback = { + onCreate: function (pointer) { + pointer.draggable = true; + pointer.drift = bind$6(me._handlePointerDrag, me); + pointer.ondragend = bind$6(me._handlePointerDragend, me); + pointerMoveTo(pointer, currentIndex, axis, timelineModel, true); + }, + onUpdate: function (pointer) { + pointerMoveTo(pointer, currentIndex, axis, timelineModel); + } + }; + + // Reuse when exists, for animation and drag. + this._currentPointer = giveSymbol( + pointerModel, pointerModel, this._mainGroup, {}, this._currentPointer, callback + ); + }, + + _handlePlayClick: function (nextState) { + this._clearTimer(); + this.api.dispatchAction({ + type: 'timelinePlayChange', + playState: nextState, + from: this.uid + }); + }, + + _handlePointerDrag: function (dx, dy, e) { + this._clearTimer(); + this._pointerChangeTimeline([e.offsetX, e.offsetY]); + }, + + _handlePointerDragend: function (e) { + this._pointerChangeTimeline([e.offsetX, e.offsetY], true); + }, + + _pointerChangeTimeline: function (mousePos, trigger) { + var toCoord = this._toAxisCoord(mousePos)[0]; + + var axis = this._axis; + var axisExtent = asc(axis.getExtent().slice()); + + toCoord > axisExtent[1] && (toCoord = axisExtent[1]); + toCoord < axisExtent[0] && (toCoord = axisExtent[0]); + + this._currentPointer.position[0] = toCoord; + this._currentPointer.dirty(); + + var targetDataIndex = this._findNearestTick(toCoord); + var timelineModel = this.model; + + if (trigger || ( + targetDataIndex !== timelineModel.getCurrentIndex() + && timelineModel.get('realtime') + )) { + this._changeTimeline(targetDataIndex); + } + }, + + _doPlayStop: function () { + this._clearTimer(); + + if (this.model.getPlayState()) { + this._timer = setTimeout( + bind$6(handleFrame, this), + this.model.get('playInterval') + ); + } + + function handleFrame() { + // Do not cache + var timelineModel = this.model; + this._changeTimeline( + timelineModel.getCurrentIndex() + + (timelineModel.get('rewind', true) ? -1 : 1) + ); + } + }, + + _toAxisCoord: function (vertex) { + var trans = this._mainGroup.getLocalTransform(); + return applyTransform$1(vertex, trans, true); + }, + + _findNearestTick: function (axisCoord) { + var data = this.model.getData(); + var dist = Infinity; + var targetDataIndex; + var axis = this._axis; + + data.each(['value'], function (value, dataIndex) { + var coord = axis.dataToCoord(value); + var d = Math.abs(coord - axisCoord); + if (d < dist) { + dist = d; + targetDataIndex = dataIndex; + } + }); + + return targetDataIndex; + }, + + _clearTimer: function () { + if (this._timer) { + clearTimeout(this._timer); + this._timer = null; + } + }, + + _changeTimeline: function (nextIndex) { + var currentIndex = this.model.getCurrentIndex(); + + if (nextIndex === '+') { + nextIndex = currentIndex + 1; + } + else if (nextIndex === '-') { + nextIndex = currentIndex - 1; + } + + this.api.dispatchAction({ + type: 'timelineChange', + currentIndex: nextIndex, + from: this.uid + }); + } + +}); + +function getViewRect$4(model, api) { + return getLayoutRect( + model.getBoxLayoutParams(), + { + width: api.getWidth(), + height: api.getHeight() + }, + model.get('padding') + ); +} + +function makeIcon(timelineModel, objPath, rect, opts) { + var icon = makePath( + timelineModel.get(objPath).replace(/^path:\/\//, ''), + clone(opts || {}), + new BoundingRect(rect[0], rect[1], rect[2], rect[3]), + 'center' + ); + + return icon; +} + +/** + * Create symbol or update symbol + * opt: basic position and event handlers + */ +function giveSymbol(hostModel, itemStyleModel, group, opt, symbol, callback) { + var color = itemStyleModel.get('color'); + + if (!symbol) { + var symbolType = hostModel.get('symbol'); + symbol = createSymbol(symbolType, -1, -1, 2, 2, color); + symbol.setStyle('strokeNoScale', true); + group.add(symbol); + callback && callback.onCreate(symbol); + } + else { + symbol.setColor(color); + group.add(symbol); // Group may be new, also need to add. + callback && callback.onUpdate(symbol); + } + + // Style + var itemStyle = itemStyleModel.getItemStyle(['color', 'symbol', 'symbolSize']); + symbol.setStyle(itemStyle); + + // Transform and events. + opt = merge({ + rectHover: true, + z2: 100 + }, opt, true); + + var symbolSize = hostModel.get('symbolSize'); + symbolSize = symbolSize instanceof Array + ? symbolSize.slice() + : [+symbolSize, +symbolSize]; + symbolSize[0] /= 2; + symbolSize[1] /= 2; + opt.scale = symbolSize; + + var symbolOffset = hostModel.get('symbolOffset'); + if (symbolOffset) { + var pos = opt.position = opt.position || [0, 0]; + pos[0] += parsePercent$1(symbolOffset[0], symbolSize[0]); + pos[1] += parsePercent$1(symbolOffset[1], symbolSize[1]); + } + + var symbolRotate = hostModel.get('symbolRotate'); + opt.rotation = (symbolRotate || 0) * Math.PI / 180 || 0; + + symbol.attr(opt); + + // FIXME + // (1) When symbol.style.strokeNoScale is true and updateTransform is not performed, + // getBoundingRect will return wrong result. + // (This is supposed to be resolved in zrender, but it is a little difficult to + // leverage performance and auto updateTransform) + // (2) All of ancesters of symbol do not scale, so we can just updateTransform symbol. + symbol.updateTransform(); + + return symbol; +} + +function pointerMoveTo(pointer, dataIndex, axis, timelineModel, noAnimation) { + if (pointer.dragging) { + return; + } + + var pointerModel = timelineModel.getModel('checkpointStyle'); + var toCoord = axis.dataToCoord(timelineModel.getData().get(['value'], dataIndex)); + + if (noAnimation || !pointerModel.get('animation', true)) { + pointer.attr({position: [toCoord, 0]}); + } + else { + pointer.stopAnimation(true); + pointer.animateTo( + {position: [toCoord, 0]}, + pointerModel.get('animationDuration', true), + pointerModel.get('animationEasing', true) + ); + } +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * DataZoom component entry + */ + +registerPreprocessor(preprocessor$3); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var ToolboxModel = extendComponentModel({ + + type: 'toolbox', + + layoutMode: { + type: 'box', + ignoreSize: true + }, + + optionUpdated: function () { + ToolboxModel.superApply(this, 'optionUpdated', arguments); + + each$1(this.option.feature, function (featureOpt, featureName) { + var Feature = get$1(featureName); + Feature && merge(featureOpt, Feature.defaultOption); + }); + }, + + defaultOption: { + + show: true, + + z: 6, + + zlevel: 0, + + orient: 'horizontal', + + left: 'right', + + top: 'top', + + // right + // bottom + + backgroundColor: 'transparent', + + borderColor: '#ccc', + + borderRadius: 0, + + borderWidth: 0, + + padding: 5, + + itemSize: 15, + + itemGap: 8, + + showTitle: true, + + iconStyle: { + borderColor: '#666', + color: 'none' + }, + emphasis: { + iconStyle: { + borderColor: '#3E98C5' + } + } + // textStyle: {}, + + // feature + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +extendComponentView({ + + type: 'toolbox', + + render: function (toolboxModel, ecModel, api, payload) { + var group = this.group; + group.removeAll(); + + if (!toolboxModel.get('show')) { + return; + } + + var itemSize = +toolboxModel.get('itemSize'); + var featureOpts = toolboxModel.get('feature') || {}; + var features = this._features || (this._features = {}); + + var featureNames = []; + each$1(featureOpts, function (opt, name) { + featureNames.push(name); + }); + + (new DataDiffer(this._featureNames || [], featureNames)) + .add(processFeature) + .update(processFeature) + .remove(curry(processFeature, null)) + .execute(); + + // Keep for diff. + this._featureNames = featureNames; + + function processFeature(newIndex, oldIndex) { + var featureName = featureNames[newIndex]; + var oldName = featureNames[oldIndex]; + var featureOpt = featureOpts[featureName]; + var featureModel = new Model(featureOpt, toolboxModel, toolboxModel.ecModel); + var feature; + + if (featureName && !oldName) { // Create + if (isUserFeatureName(featureName)) { + feature = { + model: featureModel, + onclick: featureModel.option.onclick, + featureName: featureName + }; + } + else { + var Feature = get$1(featureName); + if (!Feature) { + return; + } + feature = new Feature(featureModel, ecModel, api); + } + features[featureName] = feature; + } + else { + feature = features[oldName]; + // If feature does not exsit. + if (!feature) { + return; + } + feature.model = featureModel; + feature.ecModel = ecModel; + feature.api = api; + } + + if (!featureName && oldName) { + feature.dispose && feature.dispose(ecModel, api); + return; + } + + if (!featureModel.get('show') || feature.unusable) { + feature.remove && feature.remove(ecModel, api); + return; + } + + createIconPaths(featureModel, feature, featureName); + + featureModel.setIconStatus = function (iconName, status) { + var option = this.option; + var iconPaths = this.iconPaths; + option.iconStatus = option.iconStatus || {}; + option.iconStatus[iconName] = status; + // FIXME + iconPaths[iconName] && iconPaths[iconName].trigger(status); + }; + + if (feature.render) { + feature.render(featureModel, ecModel, api, payload); + } + } + + function createIconPaths(featureModel, feature, featureName) { + var iconStyleModel = featureModel.getModel('iconStyle'); + var iconStyleEmphasisModel = featureModel.getModel('emphasis.iconStyle'); + + // If one feature has mutiple icon. they are orginaized as + // { + // icon: { + // foo: '', + // bar: '' + // }, + // title: { + // foo: '', + // bar: '' + // } + // } + var icons = feature.getIcons ? feature.getIcons() : featureModel.get('icon'); + var titles = featureModel.get('title') || {}; + if (typeof icons === 'string') { + var icon = icons; + var title = titles; + icons = {}; + titles = {}; + icons[featureName] = icon; + titles[featureName] = title; + } + var iconPaths = featureModel.iconPaths = {}; + each$1(icons, function (iconStr, iconName) { + var path = createIcon( + iconStr, + {}, + { + x: -itemSize / 2, + y: -itemSize / 2, + width: itemSize, + height: itemSize + } + ); + path.setStyle(iconStyleModel.getItemStyle()); + path.hoverStyle = iconStyleEmphasisModel.getItemStyle(); + + setHoverStyle(path); + + if (toolboxModel.get('showTitle')) { + path.__title = titles[iconName]; + path.on('mouseover', function () { + // Should not reuse above hoverStyle, which might be modified. + var hoverStyle = iconStyleEmphasisModel.getItemStyle(); + path.setStyle({ + text: titles[iconName], + textPosition: hoverStyle.textPosition || 'bottom', + textFill: hoverStyle.fill || hoverStyle.stroke || '#000', + textAlign: hoverStyle.textAlign || 'center' + }); + }) + .on('mouseout', function () { + path.setStyle({ + textFill: null + }); + }); + } + path.trigger(featureModel.get('iconStatus.' + iconName) || 'normal'); + + group.add(path); + path.on('click', bind( + feature.onclick, feature, ecModel, api, iconName + )); + + iconPaths[iconName] = path; + }); + } + + layout$3(group, toolboxModel, api); + // Render background after group is layout + // FIXME + group.add(makeBackground(group.getBoundingRect(), toolboxModel)); + + // Adjust icon title positions to avoid them out of screen + group.eachChild(function (icon) { + var titleText = icon.__title; + var hoverStyle = icon.hoverStyle; + // May be background element + if (hoverStyle && titleText) { + var rect = getBoundingRect( + titleText, makeFont(hoverStyle) + ); + var offsetX = icon.position[0] + group.position[0]; + var offsetY = icon.position[1] + group.position[1] + itemSize; + + var needPutOnTop = false; + if (offsetY + rect.height > api.getHeight()) { + hoverStyle.textPosition = 'top'; + needPutOnTop = true; + } + var topOffset = needPutOnTop ? (-5 - rect.height) : (itemSize + 8); + if (offsetX + rect.width / 2 > api.getWidth()) { + hoverStyle.textPosition = ['100%', topOffset]; + hoverStyle.textAlign = 'right'; + } + else if (offsetX - rect.width / 2 < 0) { + hoverStyle.textPosition = [0, topOffset]; + hoverStyle.textAlign = 'left'; + } + } + }); + }, + + updateView: function (toolboxModel, ecModel, api, payload) { + each$1(this._features, function (feature) { + feature.updateView && feature.updateView(feature.model, ecModel, api, payload); + }); + }, + + // updateLayout: function (toolboxModel, ecModel, api, payload) { + // zrUtil.each(this._features, function (feature) { + // feature.updateLayout && feature.updateLayout(feature.model, ecModel, api, payload); + // }); + // }, + + remove: function (ecModel, api) { + each$1(this._features, function (feature) { + feature.remove && feature.remove(ecModel, api); + }); + this.group.removeAll(); + }, + + dispose: function (ecModel, api) { + each$1(this._features, function (feature) { + feature.dispose && feature.dispose(ecModel, api); + }); + } +}); + +function isUserFeatureName(featureName) { + return featureName.indexOf('my') === 0; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var saveAsImageLang = lang.toolbox.saveAsImage; + +function SaveAsImage(model) { + this.model = model; +} + +SaveAsImage.defaultOption = { + show: true, + icon: 'M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0', + title: saveAsImageLang.title, + type: 'png', + // Default use option.backgroundColor + // backgroundColor: '#fff', + name: '', + excludeComponents: ['toolbox'], + pixelRatio: 1, + lang: saveAsImageLang.lang.slice() +}; + +SaveAsImage.prototype.unusable = !env$1.canvasSupported; + +var proto$4 = SaveAsImage.prototype; + +proto$4.onclick = function (ecModel, api) { + var model = this.model; + var title = model.get('name') || ecModel.get('title.0.text') || 'echarts'; + var $a = document.createElement('a'); + var type = model.get('type', true) || 'png'; + $a.download = title + '.' + type; + $a.target = '_blank'; + var url = api.getConnectedDataURL({ + type: type, + backgroundColor: model.get('backgroundColor', true) + || ecModel.get('backgroundColor') || '#fff', + excludeComponents: model.get('excludeComponents'), + pixelRatio: model.get('pixelRatio') + }); + $a.href = url; + // Chrome and Firefox + if (typeof MouseEvent === 'function' && !env$1.browser.ie && !env$1.browser.edge) { + var evt = new MouseEvent('click', { + view: window, + bubbles: true, + cancelable: false + }); + $a.dispatchEvent(evt); + } + // IE + else { + if (window.navigator.msSaveOrOpenBlob) { + var bstr = atob(url.split(',')[1]); + var n = bstr.length; + var u8arr = new Uint8Array(n); + while(n--) { + u8arr[n] = bstr.charCodeAt(n); + } + var blob = new Blob([u8arr]); + window.navigator.msSaveOrOpenBlob(blob, title + '.' + type); + } + else { + var lang$$1 = model.get('lang'); + var html = '' + + '<body style="margin:0;">' + + '<img src="' + url + '" style="max-width:100%;" title="' + ((lang$$1 && lang$$1[0]) || '') + '" />' + + '</body>'; + var tab = window.open(); + tab.document.write(html); + } + } +}; + +register$1( + 'saveAsImage', SaveAsImage +); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var magicTypeLang = lang.toolbox.magicType; + +function MagicType(model) { + this.model = model; +} + +MagicType.defaultOption = { + show: true, + type: [], + // Icon group + icon: { + line: 'M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4', + bar: 'M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7', + stack: 'M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z', // jshint ignore:line + tiled: 'M2.3,2.2h22.8V25H2.3V2.2z M35,2.2h22.8V25H35V2.2zM2.3,35h22.8v22.8H2.3V35z M35,35h22.8v22.8H35V35z' + }, + // `line`, `bar`, `stack`, `tiled` + title: clone(magicTypeLang.title), + option: {}, + seriesIndex: {} +}; + +var proto$5 = MagicType.prototype; + +proto$5.getIcons = function () { + var model = this.model; + var availableIcons = model.get('icon'); + var icons = {}; + each$1(model.get('type'), function (type) { + if (availableIcons[type]) { + icons[type] = availableIcons[type]; + } + }); + return icons; +}; + +var seriesOptGenreator = { + 'line': function (seriesType, seriesId, seriesModel, model) { + if (seriesType === 'bar') { + return merge({ + id: seriesId, + type: 'line', + // Preserve data related option + data: seriesModel.get('data'), + stack: seriesModel.get('stack'), + markPoint: seriesModel.get('markPoint'), + markLine: seriesModel.get('markLine') + }, model.get('option.line') || {}, true); + } + }, + 'bar': function (seriesType, seriesId, seriesModel, model) { + if (seriesType === 'line') { + return merge({ + id: seriesId, + type: 'bar', + // Preserve data related option + data: seriesModel.get('data'), + stack: seriesModel.get('stack'), + markPoint: seriesModel.get('markPoint'), + markLine: seriesModel.get('markLine') + }, model.get('option.bar') || {}, true); + } + }, + 'stack': function (seriesType, seriesId, seriesModel, model) { + if (seriesType === 'line' || seriesType === 'bar') { + return merge({ + id: seriesId, + stack: '__ec_magicType_stack__' + }, model.get('option.stack') || {}, true); + } + }, + 'tiled': function (seriesType, seriesId, seriesModel, model) { + if (seriesType === 'line' || seriesType === 'bar') { + return merge({ + id: seriesId, + stack: '' + }, model.get('option.tiled') || {}, true); + } + } +}; + +var radioTypes = [ + ['line', 'bar'], + ['stack', 'tiled'] +]; + +proto$5.onclick = function (ecModel, api, type) { + var model = this.model; + var seriesIndex = model.get('seriesIndex.' + type); + // Not supported magicType + if (!seriesOptGenreator[type]) { + return; + } + var newOption = { + series: [] + }; + var generateNewSeriesTypes = function (seriesModel) { + var seriesType = seriesModel.subType; + var seriesId = seriesModel.id; + var newSeriesOpt = seriesOptGenreator[type]( + seriesType, seriesId, seriesModel, model + ); + if (newSeriesOpt) { + // PENDING If merge original option? + defaults(newSeriesOpt, seriesModel.option); + newOption.series.push(newSeriesOpt); + } + // Modify boundaryGap + var coordSys = seriesModel.coordinateSystem; + if (coordSys && coordSys.type === 'cartesian2d' && (type === 'line' || type === 'bar')) { + var categoryAxis = coordSys.getAxesByScale('ordinal')[0]; + if (categoryAxis) { + var axisDim = categoryAxis.dim; + var axisType = axisDim + 'Axis'; + var axisModel = ecModel.queryComponents({ + mainType: axisType, + index: seriesModel.get(name + 'Index'), + id: seriesModel.get(name + 'Id') + })[0]; + var axisIndex = axisModel.componentIndex; + + newOption[axisType] = newOption[axisType] || []; + for (var i = 0; i <= axisIndex; i++) { + newOption[axisType][axisIndex] = newOption[axisType][axisIndex] || {}; + } + newOption[axisType][axisIndex].boundaryGap = type === 'bar' ? true : false; + } + } + }; + + each$1(radioTypes, function (radio) { + if (indexOf(radio, type) >= 0) { + each$1(radio, function (item) { + model.setIconStatus(item, 'normal'); + }); + } + }); + + model.setIconStatus(type, 'emphasis'); + + ecModel.eachComponent( + { + mainType: 'series', + query: seriesIndex == null ? null : { + seriesIndex: seriesIndex + } + }, generateNewSeriesTypes + ); + api.dispatchAction({ + type: 'changeMagicType', + currentType: type, + newOption: newOption + }); +}; + +registerAction({ + type: 'changeMagicType', + event: 'magicTypeChanged', + update: 'prepareAndUpdate' +}, function (payload, ecModel) { + ecModel.mergeOption(payload.newOption); +}); + +register$1('magicType', MagicType); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var dataViewLang = lang.toolbox.dataView; + +var BLOCK_SPLITER = new Array(60).join('-'); +var ITEM_SPLITER = '\t'; +/** + * Group series into two types + * 1. on category axis, like line, bar + * 2. others, like scatter, pie + * @param {module:echarts/model/Global} ecModel + * @return {Object} + * @inner + */ +function groupSeries(ecModel) { + var seriesGroupByCategoryAxis = {}; + var otherSeries = []; + var meta = []; + ecModel.eachRawSeries(function (seriesModel) { + var coordSys = seriesModel.coordinateSystem; + + if (coordSys && (coordSys.type === 'cartesian2d' || coordSys.type === 'polar')) { + var baseAxis = coordSys.getBaseAxis(); + if (baseAxis.type === 'category') { + var key = baseAxis.dim + '_' + baseAxis.index; + if (!seriesGroupByCategoryAxis[key]) { + seriesGroupByCategoryAxis[key] = { + categoryAxis: baseAxis, + valueAxis: coordSys.getOtherAxis(baseAxis), + series: [] + }; + meta.push({ + axisDim: baseAxis.dim, + axisIndex: baseAxis.index + }); + } + seriesGroupByCategoryAxis[key].series.push(seriesModel); + } + else { + otherSeries.push(seriesModel); + } + } + else { + otherSeries.push(seriesModel); + } + }); + + return { + seriesGroupByCategoryAxis: seriesGroupByCategoryAxis, + other: otherSeries, + meta: meta + }; +} + +/** + * Assemble content of series on cateogory axis + * @param {Array.<module:echarts/model/Series>} series + * @return {string} + * @inner + */ +function assembleSeriesWithCategoryAxis(series) { + var tables = []; + each$1(series, function (group, key) { + var categoryAxis = group.categoryAxis; + var valueAxis = group.valueAxis; + var valueAxisDim = valueAxis.dim; + + var headers = [' '].concat(map(group.series, function (series) { + return series.name; + })); + var columns = [categoryAxis.model.getCategories()]; + each$1(group.series, function (series) { + columns.push(series.getRawData().mapArray(valueAxisDim, function (val) { + return val; + })); + }); + // Assemble table content + var lines = [headers.join(ITEM_SPLITER)]; + for (var i = 0; i < columns[0].length; i++) { + var items = []; + for (var j = 0; j < columns.length; j++) { + items.push(columns[j][i]); + } + lines.push(items.join(ITEM_SPLITER)); + } + tables.push(lines.join('\n')); + }); + return tables.join('\n\n' + BLOCK_SPLITER + '\n\n'); +} + +/** + * Assemble content of other series + * @param {Array.<module:echarts/model/Series>} series + * @return {string} + * @inner + */ +function assembleOtherSeries(series) { + return map(series, function (series) { + var data = series.getRawData(); + var lines = [series.name]; + var vals = []; + data.each(data.dimensions, function () { + var argLen = arguments.length; + var dataIndex = arguments[argLen - 1]; + var name = data.getName(dataIndex); + for (var i = 0; i < argLen - 1; i++) { + vals[i] = arguments[i]; + } + lines.push((name ? (name + ITEM_SPLITER) : '') + vals.join(ITEM_SPLITER)); + }); + return lines.join('\n'); + }).join('\n\n' + BLOCK_SPLITER + '\n\n'); +} + +/** + * @param {module:echarts/model/Global} + * @return {Object} + * @inner + */ +function getContentFromModel(ecModel) { + + var result = groupSeries(ecModel); + + return { + value: filter([ + assembleSeriesWithCategoryAxis(result.seriesGroupByCategoryAxis), + assembleOtherSeries(result.other) + ], function (str) { + return str.replace(/[\n\t\s]/g, ''); + }).join('\n\n' + BLOCK_SPLITER + '\n\n'), + + meta: result.meta + }; +} + + +function trim$1(str) { + return str.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); +} +/** + * If a block is tsv format + */ +function isTSVFormat(block) { + // Simple method to find out if a block is tsv format + var firstLine = block.slice(0, block.indexOf('\n')); + if (firstLine.indexOf(ITEM_SPLITER) >= 0) { + return true; + } +} + +var itemSplitRegex = new RegExp('[' + ITEM_SPLITER + ']+', 'g'); +/** + * @param {string} tsv + * @return {Object} + */ +function parseTSVContents(tsv) { + var tsvLines = tsv.split(/\n+/g); + var headers = trim$1(tsvLines.shift()).split(itemSplitRegex); + + var categories = []; + var series = map(headers, function (header) { + return { + name: header, + data: [] + }; + }); + for (var i = 0; i < tsvLines.length; i++) { + var items = trim$1(tsvLines[i]).split(itemSplitRegex); + categories.push(items.shift()); + for (var j = 0; j < items.length; j++) { + series[j] && (series[j].data[i] = items[j]); + } + } + return { + series: series, + categories: categories + }; +} + +/** + * @param {string} str + * @return {Array.<Object>} + * @inner + */ +function parseListContents(str) { + var lines = str.split(/\n+/g); + var seriesName = trim$1(lines.shift()); + + var data = []; + for (var i = 0; i < lines.length; i++) { + var items = trim$1(lines[i]).split(itemSplitRegex); + var name = ''; + var value; + var hasName = false; + if (isNaN(items[0])) { // First item is name + hasName = true; + name = items[0]; + items = items.slice(1); + data[i] = { + name: name, + value: [] + }; + value = data[i].value; + } + else { + value = data[i] = []; + } + for (var j = 0; j < items.length; j++) { + value.push(+items[j]); + } + if (value.length === 1) { + hasName ? (data[i].value = value[0]) : (data[i] = value[0]); + } + } + + return { + name: seriesName, + data: data + }; +} + +/** + * @param {string} str + * @param {Array.<Object>} blockMetaList + * @return {Object} + * @inner + */ +function parseContents(str, blockMetaList) { + var blocks = str.split(new RegExp('\n*' + BLOCK_SPLITER + '\n*', 'g')); + var newOption = { + series: [] + }; + each$1(blocks, function (block, idx) { + if (isTSVFormat(block)) { + var result = parseTSVContents(block); + var blockMeta = blockMetaList[idx]; + var axisKey = blockMeta.axisDim + 'Axis'; + + if (blockMeta) { + newOption[axisKey] = newOption[axisKey] || []; + newOption[axisKey][blockMeta.axisIndex] = { + data: result.categories + }; + newOption.series = newOption.series.concat(result.series); + } + } + else { + var result = parseListContents(block); + newOption.series.push(result); + } + }); + return newOption; +} + +/** + * @alias {module:echarts/component/toolbox/feature/DataView} + * @constructor + * @param {module:echarts/model/Model} model + */ +function DataView(model) { + + this._dom = null; + + this.model = model; +} + +DataView.defaultOption = { + show: true, + readOnly: false, + optionToContent: null, + contentToOption: null, + + icon: 'M17.5,17.3H33 M17.5,17.3H33 M45.4,29.5h-28 M11.5,2v56H51V14.8L38.4,2H11.5z M38.4,2.2v12.7H51 M45.4,41.7h-28', + title: clone(dataViewLang.title), + lang: clone(dataViewLang.lang), + backgroundColor: '#fff', + textColor: '#000', + textareaColor: '#fff', + textareaBorderColor: '#333', + buttonColor: '#c23531', + buttonTextColor: '#fff' +}; + +DataView.prototype.onclick = function (ecModel, api) { + var container = api.getDom(); + var model = this.model; + if (this._dom) { + container.removeChild(this._dom); + } + var root = document.createElement('div'); + root.style.cssText = 'position:absolute;left:5px;top:5px;bottom:5px;right:5px;'; + root.style.backgroundColor = model.get('backgroundColor') || '#fff'; + + // Create elements + var header = document.createElement('h4'); + var lang$$1 = model.get('lang') || []; + header.innerHTML = lang$$1[0] || model.get('title'); + header.style.cssText = 'margin: 10px 20px;'; + header.style.color = model.get('textColor'); + + var viewMain = document.createElement('div'); + var textarea = document.createElement('textarea'); + viewMain.style.cssText = 'display:block;width:100%;overflow:auto;'; + + var optionToContent = model.get('optionToContent'); + var contentToOption = model.get('contentToOption'); + var result = getContentFromModel(ecModel); + if (typeof optionToContent === 'function') { + var htmlOrDom = optionToContent(api.getOption()); + if (typeof htmlOrDom === 'string') { + viewMain.innerHTML = htmlOrDom; + } + else if (isDom(htmlOrDom)) { + viewMain.appendChild(htmlOrDom); + } + } + else { + // Use default textarea + viewMain.appendChild(textarea); + textarea.readOnly = model.get('readOnly'); + textarea.style.cssText = 'width:100%;height:100%;font-family:monospace;font-size:14px;line-height:1.6rem;'; + textarea.style.color = model.get('textColor'); + textarea.style.borderColor = model.get('textareaBorderColor'); + textarea.style.backgroundColor = model.get('textareaColor'); + textarea.value = result.value; + } + + var blockMetaList = result.meta; + + var buttonContainer = document.createElement('div'); + buttonContainer.style.cssText = 'position:absolute;bottom:0;left:0;right:0;'; + + var buttonStyle = 'float:right;margin-right:20px;border:none;' + + 'cursor:pointer;padding:2px 5px;font-size:12px;border-radius:3px'; + var closeButton = document.createElement('div'); + var refreshButton = document.createElement('div'); + + buttonStyle += ';background-color:' + model.get('buttonColor'); + buttonStyle += ';color:' + model.get('buttonTextColor'); + + var self = this; + + function close() { + container.removeChild(root); + self._dom = null; + } + addEventListener(closeButton, 'click', close); + + addEventListener(refreshButton, 'click', function () { + var newOption; + try { + if (typeof contentToOption === 'function') { + newOption = contentToOption(viewMain, api.getOption()); + } + else { + newOption = parseContents(textarea.value, blockMetaList); + } + } + catch (e) { + close(); + throw new Error('Data view format error ' + e); + } + if (newOption) { + api.dispatchAction({ + type: 'changeDataView', + newOption: newOption + }); + } + + close(); + }); + + closeButton.innerHTML = lang$$1[1]; + refreshButton.innerHTML = lang$$1[2]; + refreshButton.style.cssText = buttonStyle; + closeButton.style.cssText = buttonStyle; + + !model.get('readOnly') && buttonContainer.appendChild(refreshButton); + buttonContainer.appendChild(closeButton); + + // http://stackoverflow.com/questions/6637341/use-tab-to-indent-in-textarea + addEventListener(textarea, 'keydown', function (e) { + if ((e.keyCode || e.which) === 9) { + // get caret position/selection + var val = this.value; + var start = this.selectionStart; + var end = this.selectionEnd; + + // set textarea value to: text before caret + tab + text after caret + this.value = val.substring(0, start) + ITEM_SPLITER + val.substring(end); + + // put caret at right position again + this.selectionStart = this.selectionEnd = start + 1; + + // prevent the focus lose + stop(e); + } + }); + + root.appendChild(header); + root.appendChild(viewMain); + root.appendChild(buttonContainer); + + viewMain.style.height = (container.clientHeight - 80) + 'px'; + + container.appendChild(root); + this._dom = root; +}; + +DataView.prototype.remove = function (ecModel, api) { + this._dom && api.getDom().removeChild(this._dom); +}; + +DataView.prototype.dispose = function (ecModel, api) { + this.remove(ecModel, api); +}; + +/** + * @inner + */ +function tryMergeDataOption(newData, originalData) { + return map(newData, function (newVal, idx) { + var original = originalData && originalData[idx]; + if (isObject$1(original) && !isArray(original)) { + if (isObject$1(newVal) && !isArray(newVal)) { + newVal = newVal.value; + } + // Original data has option + return defaults({ + value: newVal + }, original); + } + else { + return newVal; + } + }); +} + +register$1('dataView', DataView); + +registerAction({ + type: 'changeDataView', + event: 'dataViewChanged', + update: 'prepareAndUpdate' +}, function (payload, ecModel) { + var newSeriesOptList = []; + each$1(payload.newOption.series, function (seriesOpt) { + var seriesModel = ecModel.getSeriesByName(seriesOpt.name)[0]; + if (!seriesModel) { + // New created series + // Geuss the series type + newSeriesOptList.push(extend({ + // Default is scatter + type: 'scatter' + }, seriesOpt)); + } + else { + var originalData = seriesModel.get('data'); + newSeriesOptList.push({ + name: seriesOpt.name, + data: tryMergeDataOption(seriesOpt.data, originalData) + }); + } + }); + + ecModel.mergeOption(defaults({ + series: newSeriesOptList + }, payload.newOption)); +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var each$29 = each$1; + +var ATTR$2 = '\0_ec_hist_store'; + +/** + * @param {module:echarts/model/Global} ecModel + * @param {Object} newSnapshot {dataZoomId, batch: [payloadInfo, ...]} + */ +function push(ecModel, newSnapshot) { + var store = giveStore$1(ecModel); + + // If previous dataZoom can not be found, + // complete an range with current range. + each$29(newSnapshot, function (batchItem, dataZoomId) { + var i = store.length - 1; + for (; i >= 0; i--) { + var snapshot = store[i]; + if (snapshot[dataZoomId]) { + break; + } + } + if (i < 0) { + // No origin range set, create one by current range. + var dataZoomModel = ecModel.queryComponents( + {mainType: 'dataZoom', subType: 'select', id: dataZoomId} + )[0]; + if (dataZoomModel) { + var percentRange = dataZoomModel.getPercentRange(); + store[0][dataZoomId] = { + dataZoomId: dataZoomId, + start: percentRange[0], + end: percentRange[1] + }; + } + } + }); + + store.push(newSnapshot); +} + +/** + * @param {module:echarts/model/Global} ecModel + * @return {Object} snapshot + */ +function pop(ecModel) { + var store = giveStore$1(ecModel); + var head = store[store.length - 1]; + store.length > 1 && store.pop(); + + // Find top for all dataZoom. + var snapshot = {}; + each$29(head, function (batchItem, dataZoomId) { + for (var i = store.length - 1; i >= 0; i--) { + var batchItem = store[i][dataZoomId]; + if (batchItem) { + snapshot[dataZoomId] = batchItem; + break; + } + } + }); + + return snapshot; +} + +/** + * @param {module:echarts/model/Global} ecModel + */ +function clear$1(ecModel) { + ecModel[ATTR$2] = null; +} + +/** + * @param {module:echarts/model/Global} ecModel + * @return {number} records. always >= 1. + */ +function count(ecModel) { + return giveStore$1(ecModel).length; +} + +/** + * [{key: dataZoomId, value: {dataZoomId, range}}, ...] + * History length of each dataZoom may be different. + * this._history[0] is used to store origin range. + * @type {Array.<Object>} + */ +function giveStore$1(ecModel) { + var store = ecModel[ATTR$2]; + if (!store) { + store = ecModel[ATTR$2] = [{}]; + } + return store; +} + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +DataZoomModel.extend({ + type: 'dataZoom.select' +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +DataZoomView.extend({ + type: 'dataZoom.select' +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +/** + * DataZoom component entry + */ + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// Use dataZoomSelect +var dataZoomLang = lang.toolbox.dataZoom; +var each$28 = each$1; + +// Spectial component id start with \0ec\0, see echarts/model/Global.js~hasInnerId +var DATA_ZOOM_ID_BASE = '\0_ec_\0toolbox-dataZoom_'; + +function DataZoom(model, ecModel, api) { + + /** + * @private + * @type {module:echarts/component/helper/BrushController} + */ + (this._brushController = new BrushController(api.getZr())) + .on('brush', bind(this._onBrush, this)) + .mount(); + + /** + * @private + * @type {boolean} + */ + this._isZoomActive; +} + +DataZoom.defaultOption = { + show: true, + // Icon group + icon: { + zoom: 'M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1', + back: 'M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26' + }, + // `zoom`, `back` + title: clone(dataZoomLang.title) +}; + +var proto$6 = DataZoom.prototype; + +proto$6.render = function (featureModel, ecModel, api, payload) { + this.model = featureModel; + this.ecModel = ecModel; + this.api = api; + + updateZoomBtnStatus(featureModel, ecModel, this, payload, api); + updateBackBtnStatus(featureModel, ecModel); +}; + +proto$6.onclick = function (ecModel, api, type) { + handlers$1[type].call(this); +}; + +proto$6.remove = function (ecModel, api) { + this._brushController.unmount(); +}; + +proto$6.dispose = function (ecModel, api) { + this._brushController.dispose(); +}; + +/** + * @private + */ +var handlers$1 = { + + zoom: function () { + var nextActive = !this._isZoomActive; + + this.api.dispatchAction({ + type: 'takeGlobalCursor', + key: 'dataZoomSelect', + dataZoomSelectActive: nextActive + }); + }, + + back: function () { + this._dispatchZoomAction(pop(this.ecModel)); + } +}; + +/** + * @private + */ +proto$6._onBrush = function (areas, opt) { + if (!opt.isEnd || !areas.length) { + return; + } + var snapshot = {}; + var ecModel = this.ecModel; + + this._brushController.updateCovers([]); // remove cover + + var brushTargetManager = new BrushTargetManager( + retrieveAxisSetting(this.model.option), ecModel, {include: ['grid']} + ); + brushTargetManager.matchOutputRanges(areas, ecModel, function (area, coordRange, coordSys) { + if (coordSys.type !== 'cartesian2d') { + return; + } + + var brushType = area.brushType; + if (brushType === 'rect') { + setBatch('x', coordSys, coordRange[0]); + setBatch('y', coordSys, coordRange[1]); + } + else { + setBatch(({lineX: 'x', lineY: 'y'})[brushType], coordSys, coordRange); + } + }); + + push(ecModel, snapshot); + + this._dispatchZoomAction(snapshot); + + function setBatch(dimName, coordSys, minMax) { + var axis = coordSys.getAxis(dimName); + var axisModel = axis.model; + var dataZoomModel = findDataZoom(dimName, axisModel, ecModel); + + // Restrict range. + var minMaxSpan = dataZoomModel.findRepresentativeAxisProxy(axisModel).getMinMaxSpan(); + if (minMaxSpan.minValueSpan != null || minMaxSpan.maxValueSpan != null) { + minMax = sliderMove( + 0, minMax.slice(), axis.scale.getExtent(), 0, + minMaxSpan.minValueSpan, minMaxSpan.maxValueSpan + ); + } + + dataZoomModel && (snapshot[dataZoomModel.id] = { + dataZoomId: dataZoomModel.id, + startValue: minMax[0], + endValue: minMax[1] + }); + } + + function findDataZoom(dimName, axisModel, ecModel) { + var found; + ecModel.eachComponent({mainType: 'dataZoom', subType: 'select'}, function (dzModel) { + var has = dzModel.getAxisModel(dimName, axisModel.componentIndex); + has && (found = dzModel); + }); + return found; + } +}; + +/** + * @private + */ +proto$6._dispatchZoomAction = function (snapshot) { + var batch = []; + + // Convert from hash map to array. + each$28(snapshot, function (batchItem, dataZoomId) { + batch.push(clone(batchItem)); + }); + + batch.length && this.api.dispatchAction({ + type: 'dataZoom', + from: this.uid, + batch: batch + }); +}; + +function retrieveAxisSetting(option) { + var setting = {}; + // Compatible with previous setting: null => all axis, false => no axis. + each$1(['xAxisIndex', 'yAxisIndex'], function (name) { + setting[name] = option[name]; + setting[name] == null && (setting[name] = 'all'); + (setting[name] === false || setting[name] === 'none') && (setting[name] = []); + }); + return setting; +} + +function updateBackBtnStatus(featureModel, ecModel) { + featureModel.setIconStatus( + 'back', + count(ecModel) > 1 ? 'emphasis' : 'normal' + ); +} + +function updateZoomBtnStatus(featureModel, ecModel, view, payload, api) { + var zoomActive = view._isZoomActive; + + if (payload && payload.type === 'takeGlobalCursor') { + zoomActive = payload.key === 'dataZoomSelect' + ? payload.dataZoomSelectActive : false; + } + + view._isZoomActive = zoomActive; + + featureModel.setIconStatus('zoom', zoomActive ? 'emphasis' : 'normal'); + + var brushTargetManager = new BrushTargetManager( + retrieveAxisSetting(featureModel.option), ecModel, {include: ['grid']} + ); + + view._brushController + .setPanels(brushTargetManager.makePanelOpts(api, function (targetInfo) { + return (targetInfo.xAxisDeclared && !targetInfo.yAxisDeclared) + ? 'lineX' + : (!targetInfo.xAxisDeclared && targetInfo.yAxisDeclared) + ? 'lineY' + : 'rect'; + })) + .enableBrush( + zoomActive + ? { + brushType: 'auto', + brushStyle: { + // FIXME user customized? + lineWidth: 0, + fill: 'rgba(0,0,0,0.2)' + } + } + : false + ); +} + + +register$1('dataZoom', DataZoom); + + +// Create special dataZoom option for select +// FIXME consider the case of merge option, where axes options are not exists. +registerPreprocessor(function (option) { + if (!option) { + return; + } + + var dataZoomOpts = option.dataZoom || (option.dataZoom = []); + if (!isArray(dataZoomOpts)) { + option.dataZoom = dataZoomOpts = [dataZoomOpts]; + } + + var toolboxOpt = option.toolbox; + if (toolboxOpt) { + // Assume there is only one toolbox + if (isArray(toolboxOpt)) { + toolboxOpt = toolboxOpt[0]; + } + + if (toolboxOpt && toolboxOpt.feature) { + var dataZoomOpt = toolboxOpt.feature.dataZoom; + // FIXME: If add dataZoom when setOption in merge mode, + // no axis info to be added. See `test/dataZoom-extreme.html` + addForAxis('xAxis', dataZoomOpt); + addForAxis('yAxis', dataZoomOpt); + } + } + + function addForAxis(axisName, dataZoomOpt) { + if (!dataZoomOpt) { + return; + } + + // Try not to modify model, because it is not merged yet. + var axisIndicesName = axisName + 'Index'; + var givenAxisIndices = dataZoomOpt[axisIndicesName]; + if (givenAxisIndices != null + && givenAxisIndices != 'all' + && !isArray(givenAxisIndices) + ) { + givenAxisIndices = (givenAxisIndices === false || givenAxisIndices === 'none') ? [] : [givenAxisIndices]; + } + + forEachComponent(axisName, function (axisOpt, axisIndex) { + if (givenAxisIndices != null + && givenAxisIndices != 'all' + && indexOf(givenAxisIndices, axisIndex) === -1 + ) { + return; + } + var newOpt = { + type: 'select', + $fromToolbox: true, + // Id for merge mapping. + id: DATA_ZOOM_ID_BASE + axisName + axisIndex + }; + // FIXME + // Only support one axis now. + newOpt[axisIndicesName] = axisIndex; + dataZoomOpts.push(newOpt); + }); + } + + function forEachComponent(mainType, cb) { + var opts = option[mainType]; + if (!isArray(opts)) { + opts = opts ? [opts] : []; + } + each$28(opts, cb); + } +}); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var restoreLang = lang.toolbox.restore; + +function Restore(model) { + this.model = model; +} + +Restore.defaultOption = { + show: true, + icon: 'M3.8,33.4 M47,18.9h9.8V8.7 M56.3,20.1 C52.1,9,40.5,0.6,26.8,2.1C12.6,3.7,1.6,16.2,2.1,30.6 M13,41.1H3.1v10.2 M3.7,39.9c4.2,11.1,15.8,19.5,29.5,18 c14.2-1.6,25.2-14.1,24.7-28.5', + title: restoreLang.title +}; + +var proto$7 = Restore.prototype; + +proto$7.onclick = function (ecModel, api, type) { + clear$1(ecModel); + + api.dispatchAction({ + type: 'restore', + from: this.uid + }); +}; + +register$1('restore', Restore); + +registerAction( + {type: 'restore', event: 'restore', update: 'prepareAndUpdate'}, + function (payload, ecModel) { + ecModel.resetOption('recreate'); + } +); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +var urn = 'urn:schemas-microsoft-com:vml'; +var win = typeof window === 'undefined' ? null : window; + +var vmlInited = false; + +var doc = win && win.document; + +function createNode(tagName) { + return doCreateNode(tagName); +} + +// Avoid assign to an exported variable, for transforming to cjs. +var doCreateNode; + +if (doc && !env$1.canvasSupported) { + try { + !doc.namespaces.zrvml && doc.namespaces.add('zrvml', urn); + doCreateNode = function (tagName) { + return doc.createElement('<zrvml:' + tagName + ' class="zrvml">'); + }; + } + catch (e) { + doCreateNode = function (tagName) { + return doc.createElement('<' + tagName + ' xmlns="' + urn + '" class="zrvml">'); + }; + } +} + +// From raphael +function initVML() { + if (vmlInited || !doc) { + return; + } + vmlInited = true; + + var styleSheets = doc.styleSheets; + if (styleSheets.length < 31) { + doc.createStyleSheet().addRule('.zrvml', 'behavior:url(#default#VML)'); + } + else { + // http://msdn.microsoft.com/en-us/library/ms531194%28VS.85%29.aspx + styleSheets[0].addRule('.zrvml', 'behavior:url(#default#VML)'); + } +} + +// http://www.w3.org/TR/NOTE-VML +// TODO Use proxy like svg instead of overwrite brush methods + +var CMD$3 = PathProxy.CMD; +var round$3 = Math.round; +var sqrt = Math.sqrt; +var abs$1 = Math.abs; +var cos = Math.cos; +var sin = Math.sin; +var mathMax$8 = Math.max; + +if (!env$1.canvasSupported) { + + var comma = ','; + var imageTransformPrefix = 'progid:DXImageTransform.Microsoft'; + + var Z = 21600; + var Z2 = Z / 2; + + var ZLEVEL_BASE = 100000; + var Z_BASE$1 = 1000; + + var initRootElStyle = function (el) { + el.style.cssText = 'position:absolute;left:0;top:0;width:1px;height:1px;'; + el.coordsize = Z + ',' + Z; + el.coordorigin = '0,0'; + }; + + var encodeHtmlAttribute = function (s) { + return String(s).replace(/&/g, '&').replace(/"/g, '"'); + }; + + var rgb2Str = function (r, g, b) { + return 'rgb(' + [r, g, b].join(',') + ')'; + }; + + var append = function (parent, child) { + if (child && parent && child.parentNode !== parent) { + parent.appendChild(child); + } + }; + + var remove = function (parent, child) { + if (child && parent && child.parentNode === parent) { + parent.removeChild(child); + } + }; + + var getZIndex = function (zlevel, z, z2) { + // z 的取值范围为 [0, 1000] + return (parseFloat(zlevel) || 0) * ZLEVEL_BASE + (parseFloat(z) || 0) * Z_BASE$1 + z2; + }; + + var parsePercent$3 = function (value, maxValue) { + if (typeof value === 'string') { + if (value.lastIndexOf('%') >= 0) { + return parseFloat(value) / 100 * maxValue; + } + return parseFloat(value); + } + return value; + }; + + /*************************************************** + * PATH + **************************************************/ + + var setColorAndOpacity = function (el, color, opacity) { + var colorArr = parse(color); + opacity = +opacity; + if (isNaN(opacity)) { + opacity = 1; + } + if (colorArr) { + el.color = rgb2Str(colorArr[0], colorArr[1], colorArr[2]); + el.opacity = opacity * colorArr[3]; + } + }; + + var getColorAndAlpha = function (color) { + var colorArr = parse(color); + return [ + rgb2Str(colorArr[0], colorArr[1], colorArr[2]), + colorArr[3] + ]; + }; + + var updateFillNode = function (el, style, zrEl) { + // TODO pattern + var fill = style.fill; + if (fill != null) { + // Modified from excanvas + if (fill instanceof Gradient) { + var gradientType; + var angle = 0; + var focus = [0, 0]; + // additional offset + var shift = 0; + // scale factor for offset + var expansion = 1; + var rect = zrEl.getBoundingRect(); + var rectWidth = rect.width; + var rectHeight = rect.height; + if (fill.type === 'linear') { + gradientType = 'gradient'; + var transform = zrEl.transform; + var p0 = [fill.x * rectWidth, fill.y * rectHeight]; + var p1 = [fill.x2 * rectWidth, fill.y2 * rectHeight]; + if (transform) { + applyTransform(p0, p0, transform); + applyTransform(p1, p1, transform); + } + var dx = p1[0] - p0[0]; + var dy = p1[1] - p0[1]; + angle = Math.atan2(dx, dy) * 180 / Math.PI; + // The angle should be a non-negative number. + if (angle < 0) { + angle += 360; + } + + // Very small angles produce an unexpected result because they are + // converted to a scientific notation string. + if (angle < 1e-6) { + angle = 0; + } + } + else { + gradientType = 'gradientradial'; + var p0 = [fill.x * rectWidth, fill.y * rectHeight]; + var transform = zrEl.transform; + var scale$$1 = zrEl.scale; + var width = rectWidth; + var height = rectHeight; + focus = [ + // Percent in bounding rect + (p0[0] - rect.x) / width, + (p0[1] - rect.y) / height + ]; + if (transform) { + applyTransform(p0, p0, transform); + } + + width /= scale$$1[0] * Z; + height /= scale$$1[1] * Z; + var dimension = mathMax$8(width, height); + shift = 2 * 0 / dimension; + expansion = 2 * fill.r / dimension - shift; + } + + // We need to sort the color stops in ascending order by offset, + // otherwise IE won't interpret it correctly. + var stops = fill.colorStops.slice(); + stops.sort(function(cs1, cs2) { + return cs1.offset - cs2.offset; + }); + + var length$$1 = stops.length; + // Color and alpha list of first and last stop + var colorAndAlphaList = []; + var colors = []; + for (var i = 0; i < length$$1; i++) { + var stop = stops[i]; + var colorAndAlpha = getColorAndAlpha(stop.color); + colors.push(stop.offset * expansion + shift + ' ' + colorAndAlpha[0]); + if (i === 0 || i === length$$1 - 1) { + colorAndAlphaList.push(colorAndAlpha); + } + } + + if (length$$1 >= 2) { + var color1 = colorAndAlphaList[0][0]; + var color2 = colorAndAlphaList[1][0]; + var opacity1 = colorAndAlphaList[0][1] * style.opacity; + var opacity2 = colorAndAlphaList[1][1] * style.opacity; + + el.type = gradientType; + el.method = 'none'; + el.focus = '100%'; + el.angle = angle; + el.color = color1; + el.color2 = color2; + el.colors = colors.join(','); + // When colors attribute is used, the meanings of opacity and o:opacity2 + // are reversed. + el.opacity = opacity2; + // FIXME g_o_:opacity ? + el.opacity2 = opacity1; + } + if (gradientType === 'radial') { + el.focusposition = focus.join(','); + } + } + else { + // FIXME Change from Gradient fill to color fill + setColorAndOpacity(el, fill, style.opacity); + } + } + }; + + var updateStrokeNode = function (el, style) { + // if (style.lineJoin != null) { + // el.joinstyle = style.lineJoin; + // } + // if (style.miterLimit != null) { + // el.miterlimit = style.miterLimit * Z; + // } + // if (style.lineCap != null) { + // el.endcap = style.lineCap; + // } + if (style.lineDash != null) { + el.dashstyle = style.lineDash.join(' '); + } + if (style.stroke != null && !(style.stroke instanceof Gradient)) { + setColorAndOpacity(el, style.stroke, style.opacity); + } + }; + + var updateFillAndStroke = function (vmlEl, type, style, zrEl) { + var isFill = type == 'fill'; + var el = vmlEl.getElementsByTagName(type)[0]; + // Stroke must have lineWidth + if (style[type] != null && style[type] !== 'none' && (isFill || (!isFill && style.lineWidth))) { + vmlEl[isFill ? 'filled' : 'stroked'] = 'true'; + // FIXME Remove before updating, or set `colors` will throw error + if (style[type] instanceof Gradient) { + remove(vmlEl, el); + } + if (!el) { + el = createNode(type); + } + + isFill ? updateFillNode(el, style, zrEl) : updateStrokeNode(el, style); + append(vmlEl, el); + } + else { + vmlEl[isFill ? 'filled' : 'stroked'] = 'false'; + remove(vmlEl, el); + } + }; + + var points$3 = [[], [], []]; + var pathDataToString = function (path, m) { + var M = CMD$3.M; + var C = CMD$3.C; + var L = CMD$3.L; + var A = CMD$3.A; + var Q = CMD$3.Q; + + var str = []; + var nPoint; + var cmdStr; + var cmd; + var i; + var xi; + var yi; + var data = path.data; + var dataLength = path.len(); + for (i = 0; i < dataLength;) { + cmd = data[i++]; + cmdStr = ''; + nPoint = 0; + switch (cmd) { + case M: + cmdStr = ' m '; + nPoint = 1; + xi = data[i++]; + yi = data[i++]; + points$3[0][0] = xi; + points$3[0][1] = yi; + break; + case L: + cmdStr = ' l '; + nPoint = 1; + xi = data[i++]; + yi = data[i++]; + points$3[0][0] = xi; + points$3[0][1] = yi; + break; + case Q: + case C: + cmdStr = ' c '; + nPoint = 3; + var x1 = data[i++]; + var y1 = data[i++]; + var x2 = data[i++]; + var y2 = data[i++]; + var x3; + var y3; + if (cmd === Q) { + // Convert quadratic to cubic using degree elevation + x3 = x2; + y3 = y2; + x2 = (x2 + 2 * x1) / 3; + y2 = (y2 + 2 * y1) / 3; + x1 = (xi + 2 * x1) / 3; + y1 = (yi + 2 * y1) / 3; + } + else { + x3 = data[i++]; + y3 = data[i++]; + } + points$3[0][0] = x1; + points$3[0][1] = y1; + points$3[1][0] = x2; + points$3[1][1] = y2; + points$3[2][0] = x3; + points$3[2][1] = y3; + + xi = x3; + yi = y3; + break; + case A: + var x = 0; + var y = 0; + var sx = 1; + var sy = 1; + var angle = 0; + if (m) { + // Extract SRT from matrix + x = m[4]; + y = m[5]; + sx = sqrt(m[0] * m[0] + m[1] * m[1]); + sy = sqrt(m[2] * m[2] + m[3] * m[3]); + angle = Math.atan2(-m[1] / sy, m[0] / sx); + } + + var cx = data[i++]; + var cy = data[i++]; + var rx = data[i++]; + var ry = data[i++]; + var startAngle = data[i++] + angle; + var endAngle = data[i++] + startAngle + angle; + // FIXME + // var psi = data[i++]; + i++; + var clockwise = data[i++]; + + var x0 = cx + cos(startAngle) * rx; + var y0 = cy + sin(startAngle) * ry; + + var x1 = cx + cos(endAngle) * rx; + var y1 = cy + sin(endAngle) * ry; + + var type = clockwise ? ' wa ' : ' at '; + if (Math.abs(x0 - x1) < 1e-4) { + // IE won't render arches drawn counter clockwise if x0 == x1. + if (Math.abs(endAngle - startAngle) > 1e-2) { + // Offset x0 by 1/80 of a pixel. Use something + // that can be represented in binary + if (clockwise) { + x0 += 270 / Z; + } + } + else { + // Avoid case draw full circle + if (Math.abs(y0 - cy) < 1e-4) { + if ((clockwise && x0 < cx) || (!clockwise && x0 > cx)) { + y1 -= 270 / Z; + } + else { + y1 += 270 / Z; + } + } + else if ((clockwise && y0 < cy) || (!clockwise && y0 > cy)) { + x1 += 270 / Z; + } + else { + x1 -= 270 / Z; + } + } + } + str.push( + type, + round$3(((cx - rx) * sx + x) * Z - Z2), comma, + round$3(((cy - ry) * sy + y) * Z - Z2), comma, + round$3(((cx + rx) * sx + x) * Z - Z2), comma, + round$3(((cy + ry) * sy + y) * Z - Z2), comma, + round$3((x0 * sx + x) * Z - Z2), comma, + round$3((y0 * sy + y) * Z - Z2), comma, + round$3((x1 * sx + x) * Z - Z2), comma, + round$3((y1 * sy + y) * Z - Z2) + ); + + xi = x1; + yi = y1; + break; + case CMD$3.R: + var p0 = points$3[0]; + var p1 = points$3[1]; + // x0, y0 + p0[0] = data[i++]; + p0[1] = data[i++]; + // x1, y1 + p1[0] = p0[0] + data[i++]; + p1[1] = p0[1] + data[i++]; + + if (m) { + applyTransform(p0, p0, m); + applyTransform(p1, p1, m); + } + + p0[0] = round$3(p0[0] * Z - Z2); + p1[0] = round$3(p1[0] * Z - Z2); + p0[1] = round$3(p0[1] * Z - Z2); + p1[1] = round$3(p1[1] * Z - Z2); + str.push( + // x0, y0 + ' m ', p0[0], comma, p0[1], + // x1, y0 + ' l ', p1[0], comma, p0[1], + // x1, y1 + ' l ', p1[0], comma, p1[1], + // x0, y1 + ' l ', p0[0], comma, p1[1] + ); + break; + case CMD$3.Z: + // FIXME Update xi, yi + str.push(' x '); + } + + if (nPoint > 0) { + str.push(cmdStr); + for (var k = 0; k < nPoint; k++) { + var p = points$3[k]; + + m && applyTransform(p, p, m); + // 不 round 会非常慢 + str.push( + round$3(p[0] * Z - Z2), comma, round$3(p[1] * Z - Z2), + k < nPoint - 1 ? comma : '' + ); + } + } + } + + return str.join(''); + }; + + // Rewrite the original path method + Path.prototype.brushVML = function (vmlRoot) { + var style = this.style; + + var vmlEl = this._vmlEl; + if (!vmlEl) { + vmlEl = createNode('shape'); + initRootElStyle(vmlEl); + + this._vmlEl = vmlEl; + } + + updateFillAndStroke(vmlEl, 'fill', style, this); + updateFillAndStroke(vmlEl, 'stroke', style, this); + + var m = this.transform; + var needTransform = m != null; + var strokeEl = vmlEl.getElementsByTagName('stroke')[0]; + if (strokeEl) { + var lineWidth = style.lineWidth; + // Get the line scale. + // Determinant of this.m_ means how much the area is enlarged by the + // transformation. So its square root can be used as a scale factor + // for width. + if (needTransform && !style.strokeNoScale) { + var det = m[0] * m[3] - m[1] * m[2]; + lineWidth *= sqrt(abs$1(det)); + } + strokeEl.weight = lineWidth + 'px'; + } + + var path = this.path || (this.path = new PathProxy()); + if (this.__dirtyPath) { + path.beginPath(); + this.buildPath(path, this.shape); + path.toStatic(); + this.__dirtyPath = false; + } + + vmlEl.path = pathDataToString(path, this.transform); + + vmlEl.style.zIndex = getZIndex(this.zlevel, this.z, this.z2); + + // Append to root + append(vmlRoot, vmlEl); + + // Text + if (style.text != null) { + this.drawRectText(vmlRoot, this.getBoundingRect()); + } + else { + this.removeRectText(vmlRoot); + } + }; + + Path.prototype.onRemove = function (vmlRoot) { + remove(vmlRoot, this._vmlEl); + this.removeRectText(vmlRoot); + }; + + Path.prototype.onAdd = function (vmlRoot) { + append(vmlRoot, this._vmlEl); + this.appendRectText(vmlRoot); + }; + + /*************************************************** + * IMAGE + **************************************************/ + var isImage = function (img) { + // FIXME img instanceof Image 如果 img 是一个字符串的时候,IE8 下会报错 + return (typeof img === 'object') && img.tagName && img.tagName.toUpperCase() === 'IMG'; + // return img instanceof Image; + }; + + // Rewrite the original path method + ZImage.prototype.brushVML = function (vmlRoot) { + var style = this.style; + var image = style.image; + + // Image original width, height + var ow; + var oh; + + if (isImage(image)) { + var src = image.src; + if (src === this._imageSrc) { + ow = this._imageWidth; + oh = this._imageHeight; + } + else { + var imageRuntimeStyle = image.runtimeStyle; + var oldRuntimeWidth = imageRuntimeStyle.width; + var oldRuntimeHeight = imageRuntimeStyle.height; + imageRuntimeStyle.width = 'auto'; + imageRuntimeStyle.height = 'auto'; + + // get the original size + ow = image.width; + oh = image.height; + + // and remove overides + imageRuntimeStyle.width = oldRuntimeWidth; + imageRuntimeStyle.height = oldRuntimeHeight; + + // Caching image original width, height and src + this._imageSrc = src; + this._imageWidth = ow; + this._imageHeight = oh; + } + image = src; + } + else { + if (image === this._imageSrc) { + ow = this._imageWidth; + oh = this._imageHeight; + } + } + if (!image) { + return; + } + + var x = style.x || 0; + var y = style.y || 0; + + var dw = style.width; + var dh = style.height; + + var sw = style.sWidth; + var sh = style.sHeight; + var sx = style.sx || 0; + var sy = style.sy || 0; + + var hasCrop = sw && sh; + + var vmlEl = this._vmlEl; + if (!vmlEl) { + // FIXME 使用 group 在 left, top 都不是 0 的时候就无法显示了。 + // vmlEl = vmlCore.createNode('group'); + vmlEl = doc.createElement('div'); + initRootElStyle(vmlEl); + + this._vmlEl = vmlEl; + } + + var vmlElStyle = vmlEl.style; + var hasRotation = false; + var m; + var scaleX = 1; + var scaleY = 1; + if (this.transform) { + m = this.transform; + scaleX = sqrt(m[0] * m[0] + m[1] * m[1]); + scaleY = sqrt(m[2] * m[2] + m[3] * m[3]); + + hasRotation = m[1] || m[2]; + } + if (hasRotation) { + // If filters are necessary (rotation exists), create them + // filters are bog-slow, so only create them if abbsolutely necessary + // The following check doesn't account for skews (which don't exist + // in the canvas spec (yet) anyway. + // From excanvas + var p0 = [x, y]; + var p1 = [x + dw, y]; + var p2 = [x, y + dh]; + var p3 = [x + dw, y + dh]; + applyTransform(p0, p0, m); + applyTransform(p1, p1, m); + applyTransform(p2, p2, m); + applyTransform(p3, p3, m); + + var maxX = mathMax$8(p0[0], p1[0], p2[0], p3[0]); + var maxY = mathMax$8(p0[1], p1[1], p2[1], p3[1]); + + var transformFilter = []; + transformFilter.push('M11=', m[0] / scaleX, comma, + 'M12=', m[2] / scaleY, comma, + 'M21=', m[1] / scaleX, comma, + 'M22=', m[3] / scaleY, comma, + 'Dx=', round$3(x * scaleX + m[4]), comma, + 'Dy=', round$3(y * scaleY + m[5])); + + vmlElStyle.padding = '0 ' + round$3(maxX) + 'px ' + round$3(maxY) + 'px 0'; + // FIXME DXImageTransform 在 IE11 的兼容模式下不起作用 + vmlElStyle.filter = imageTransformPrefix + '.Matrix(' + + transformFilter.join('') + ', SizingMethod=clip)'; + + } + else { + if (m) { + x = x * scaleX + m[4]; + y = y * scaleY + m[5]; + } + vmlElStyle.filter = ''; + vmlElStyle.left = round$3(x) + 'px'; + vmlElStyle.top = round$3(y) + 'px'; + } + + var imageEl = this._imageEl; + var cropEl = this._cropEl; + + if (!imageEl) { + imageEl = doc.createElement('div'); + this._imageEl = imageEl; + } + var imageELStyle = imageEl.style; + if (hasCrop) { + // Needs know image original width and height + if (! (ow && oh)) { + var tmpImage = new Image(); + var self = this; + tmpImage.onload = function () { + tmpImage.onload = null; + ow = tmpImage.width; + oh = tmpImage.height; + // Adjust image width and height to fit the ratio destinationSize / sourceSize + imageELStyle.width = round$3(scaleX * ow * dw / sw) + 'px'; + imageELStyle.height = round$3(scaleY * oh * dh / sh) + 'px'; + + // Caching image original width, height and src + self._imageWidth = ow; + self._imageHeight = oh; + self._imageSrc = image; + }; + tmpImage.src = image; + } + else { + imageELStyle.width = round$3(scaleX * ow * dw / sw) + 'px'; + imageELStyle.height = round$3(scaleY * oh * dh / sh) + 'px'; + } + + if (! cropEl) { + cropEl = doc.createElement('div'); + cropEl.style.overflow = 'hidden'; + this._cropEl = cropEl; + } + var cropElStyle = cropEl.style; + cropElStyle.width = round$3((dw + sx * dw / sw) * scaleX); + cropElStyle.height = round$3((dh + sy * dh / sh) * scaleY); + cropElStyle.filter = imageTransformPrefix + '.Matrix(Dx=' + + (-sx * dw / sw * scaleX) + ',Dy=' + (-sy * dh / sh * scaleY) + ')'; + + if (! cropEl.parentNode) { + vmlEl.appendChild(cropEl); + } + if (imageEl.parentNode != cropEl) { + cropEl.appendChild(imageEl); + } + } + else { + imageELStyle.width = round$3(scaleX * dw) + 'px'; + imageELStyle.height = round$3(scaleY * dh) + 'px'; + + vmlEl.appendChild(imageEl); + + if (cropEl && cropEl.parentNode) { + vmlEl.removeChild(cropEl); + this._cropEl = null; + } + } + + var filterStr = ''; + var alpha = style.opacity; + if (alpha < 1) { + filterStr += '.Alpha(opacity=' + round$3(alpha * 100) + ') '; + } + filterStr += imageTransformPrefix + '.AlphaImageLoader(src=' + image + ', SizingMethod=scale)'; + + imageELStyle.filter = filterStr; + + vmlEl.style.zIndex = getZIndex(this.zlevel, this.z, this.z2); + + // Append to root + append(vmlRoot, vmlEl); + + // Text + if (style.text != null) { + this.drawRectText(vmlRoot, this.getBoundingRect()); + } + }; + + ZImage.prototype.onRemove = function (vmlRoot) { + remove(vmlRoot, this._vmlEl); + + this._vmlEl = null; + this._cropEl = null; + this._imageEl = null; + + this.removeRectText(vmlRoot); + }; + + ZImage.prototype.onAdd = function (vmlRoot) { + append(vmlRoot, this._vmlEl); + this.appendRectText(vmlRoot); + }; + + + /*************************************************** + * TEXT + **************************************************/ + + var DEFAULT_STYLE_NORMAL = 'normal'; + + var fontStyleCache = {}; + var fontStyleCacheCount = 0; + var MAX_FONT_CACHE_SIZE = 100; + var fontEl = document.createElement('div'); + + var getFontStyle = function (fontString) { + var fontStyle = fontStyleCache[fontString]; + if (!fontStyle) { + // Clear cache + if (fontStyleCacheCount > MAX_FONT_CACHE_SIZE) { + fontStyleCacheCount = 0; + fontStyleCache = {}; + } + + var style = fontEl.style; + var fontFamily; + try { + style.font = fontString; + fontFamily = style.fontFamily.split(',')[0]; + } + catch (e) { + } + + fontStyle = { + style: style.fontStyle || DEFAULT_STYLE_NORMAL, + variant: style.fontVariant || DEFAULT_STYLE_NORMAL, + weight: style.fontWeight || DEFAULT_STYLE_NORMAL, + size: parseFloat(style.fontSize || 12) | 0, + family: fontFamily || 'Microsoft YaHei' + }; + + fontStyleCache[fontString] = fontStyle; + fontStyleCacheCount++; + } + return fontStyle; + }; + + var textMeasureEl; + // Overwrite measure text method + $override$1('measureText', function (text, textFont) { + var doc$$1 = doc; + if (!textMeasureEl) { + textMeasureEl = doc$$1.createElement('div'); + textMeasureEl.style.cssText = 'position:absolute;top:-20000px;left:0;' + + 'padding:0;margin:0;border:none;white-space:pre;'; + doc.body.appendChild(textMeasureEl); + } + + try { + textMeasureEl.style.font = textFont; + } catch (ex) { + // Ignore failures to set to invalid font. + } + textMeasureEl.innerHTML = ''; + // Don't use innerHTML or innerText because they allow markup/whitespace. + textMeasureEl.appendChild(doc$$1.createTextNode(text)); + return { + width: textMeasureEl.offsetWidth + }; + }); + + var tmpRect$2 = new BoundingRect(); + + var drawRectText = function (vmlRoot, rect, textRect, fromTextEl) { + + var style = this.style; + + // Optimize, avoid normalize every time. + this.__dirty && normalizeTextStyle(style, true); + + var text = style.text; + // Convert to string + text != null && (text += ''); + if (!text) { + return; + } + + // Convert rich text to plain text. Rich text is not supported in + // IE8-, but tags in rich text template will be removed. + if (style.rich) { + var contentBlock = parseRichText(text, style); + text = []; + for (var i = 0; i < contentBlock.lines.length; i++) { + var tokens = contentBlock.lines[i].tokens; + var textLine = []; + for (var j = 0; j < tokens.length; j++) { + textLine.push(tokens[j].text); + } + text.push(textLine.join('')); + } + text = text.join('\n'); + } + + var x; + var y; + var align = style.textAlign; + var verticalAlign = style.textVerticalAlign; + + var fontStyle = getFontStyle(style.font); + // FIXME encodeHtmlAttribute ? + var font = fontStyle.style + ' ' + fontStyle.variant + ' ' + fontStyle.weight + ' ' + + fontStyle.size + 'px "' + fontStyle.family + '"'; + + textRect = textRect || getBoundingRect(text, font, align, verticalAlign); + + // Transform rect to view space + var m = this.transform; + // Ignore transform for text in other element + if (m && !fromTextEl) { + tmpRect$2.copy(rect); + tmpRect$2.applyTransform(m); + rect = tmpRect$2; + } + + if (!fromTextEl) { + var textPosition = style.textPosition; + var distance$$1 = style.textDistance; + // Text position represented by coord + if (textPosition instanceof Array) { + x = rect.x + parsePercent$3(textPosition[0], rect.width); + y = rect.y + parsePercent$3(textPosition[1], rect.height); + + align = align || 'left'; + } + else { + var res = adjustTextPositionOnRect( + textPosition, rect, distance$$1 + ); + x = res.x; + y = res.y; + + // Default align and baseline when has textPosition + align = align || res.textAlign; + verticalAlign = verticalAlign || res.textVerticalAlign; + } + } + else { + x = rect.x; + y = rect.y; + } + + x = adjustTextX(x, textRect.width, align); + y = adjustTextY(y, textRect.height, verticalAlign); + + // Force baseline 'middle' + y += textRect.height / 2; + + // var fontSize = fontStyle.size; + // 1.75 is an arbitrary number, as there is no info about the text baseline + // switch (baseline) { + // case 'hanging': + // case 'top': + // y += fontSize / 1.75; + // break; + // case 'middle': + // break; + // default: + // // case null: + // // case 'alphabetic': + // // case 'ideographic': + // // case 'bottom': + // y -= fontSize / 2.25; + // break; + // } + + // switch (align) { + // case 'left': + // break; + // case 'center': + // x -= textRect.width / 2; + // break; + // case 'right': + // x -= textRect.width; + // break; + // case 'end': + // align = elementStyle.direction == 'ltr' ? 'right' : 'left'; + // break; + // case 'start': + // align = elementStyle.direction == 'rtl' ? 'right' : 'left'; + // break; + // default: + // align = 'left'; + // } + + var createNode$$1 = createNode; + + var textVmlEl = this._textVmlEl; + var pathEl; + var textPathEl; + var skewEl; + if (!textVmlEl) { + textVmlEl = createNode$$1('line'); + pathEl = createNode$$1('path'); + textPathEl = createNode$$1('textpath'); + skewEl = createNode$$1('skew'); + + // FIXME Why here is not cammel case + // Align 'center' seems wrong + textPathEl.style['v-text-align'] = 'left'; + + initRootElStyle(textVmlEl); + + pathEl.textpathok = true; + textPathEl.on = true; + + textVmlEl.from = '0 0'; + textVmlEl.to = '1000 0.05'; + + append(textVmlEl, skewEl); + append(textVmlEl, pathEl); + append(textVmlEl, textPathEl); + + this._textVmlEl = textVmlEl; + } + else { + // 这里是在前面 appendChild 保证顺序的前提下 + skewEl = textVmlEl.firstChild; + pathEl = skewEl.nextSibling; + textPathEl = pathEl.nextSibling; + } + + var coords = [x, y]; + var textVmlElStyle = textVmlEl.style; + // Ignore transform for text in other element + if (m && fromTextEl) { + applyTransform(coords, coords, m); + + skewEl.on = true; + + skewEl.matrix = m[0].toFixed(3) + comma + m[2].toFixed(3) + comma + + m[1].toFixed(3) + comma + m[3].toFixed(3) + ',0,0'; + + // Text position + skewEl.offset = (round$3(coords[0]) || 0) + ',' + (round$3(coords[1]) || 0); + // Left top point as origin + skewEl.origin = '0 0'; + + textVmlElStyle.left = '0px'; + textVmlElStyle.top = '0px'; + } + else { + skewEl.on = false; + textVmlElStyle.left = round$3(x) + 'px'; + textVmlElStyle.top = round$3(y) + 'px'; + } + + textPathEl.string = encodeHtmlAttribute(text); + // TODO + try { + textPathEl.style.font = font; + } + // Error font format + catch (e) {} + + updateFillAndStroke(textVmlEl, 'fill', { + fill: style.textFill, + opacity: style.opacity + }, this); + updateFillAndStroke(textVmlEl, 'stroke', { + stroke: style.textStroke, + opacity: style.opacity, + lineDash: style.lineDash + }, this); + + textVmlEl.style.zIndex = getZIndex(this.zlevel, this.z, this.z2); + + // Attached to root + append(vmlRoot, textVmlEl); + }; + + var removeRectText = function (vmlRoot) { + remove(vmlRoot, this._textVmlEl); + this._textVmlEl = null; + }; + + var appendRectText = function (vmlRoot) { + append(vmlRoot, this._textVmlEl); + }; + + var list = [RectText, Displayable, ZImage, Path, Text]; + + // In case Displayable has been mixed in RectText + for (var i$3 = 0; i$3 < list.length; i$3++) { + var proto$8 = list[i$3].prototype; + proto$8.drawRectText = drawRectText; + proto$8.removeRectText = removeRectText; + proto$8.appendRectText = appendRectText; + } + + Text.prototype.brushVML = function (vmlRoot) { + var style = this.style; + if (style.text != null) { + this.drawRectText(vmlRoot, { + x: style.x || 0, y: style.y || 0, + width: 0, height: 0 + }, this.getBoundingRect(), true); + } + else { + this.removeRectText(vmlRoot); + } + }; + + Text.prototype.onRemove = function (vmlRoot) { + this.removeRectText(vmlRoot); + }; + + Text.prototype.onAdd = function (vmlRoot) { + this.appendRectText(vmlRoot); + }; +} + +/** + * VML Painter. + * + * @module zrender/vml/Painter + */ + +function parseInt10$1(val) { + return parseInt(val, 10); +} + +/** + * @alias module:zrender/vml/Painter + */ +function VMLPainter(root, storage) { + + initVML(); + + this.root = root; + + this.storage = storage; + + var vmlViewport = document.createElement('div'); + + var vmlRoot = document.createElement('div'); + + vmlViewport.style.cssText = 'display:inline-block;overflow:hidden;position:relative;width:300px;height:150px;'; + + vmlRoot.style.cssText = 'position:absolute;left:0;top:0;'; + + root.appendChild(vmlViewport); + + this._vmlRoot = vmlRoot; + this._vmlViewport = vmlViewport; + + this.resize(); + + // Modify storage + var oldDelFromStorage = storage.delFromStorage; + var oldAddToStorage = storage.addToStorage; + storage.delFromStorage = function (el) { + oldDelFromStorage.call(storage, el); + + if (el) { + el.onRemove && el.onRemove(vmlRoot); + } + }; + + storage.addToStorage = function (el) { + // Displayable already has a vml node + el.onAdd && el.onAdd(vmlRoot); + + oldAddToStorage.call(storage, el); + }; + + this._firstPaint = true; +} + +VMLPainter.prototype = { + + constructor: VMLPainter, + + getType: function () { + return 'vml'; + }, + + /** + * @return {HTMLDivElement} + */ + getViewportRoot: function () { + return this._vmlViewport; + }, + + getViewportRootOffset: function () { + var viewportRoot = this.getViewportRoot(); + if (viewportRoot) { + return { + offsetLeft: viewportRoot.offsetLeft || 0, + offsetTop: viewportRoot.offsetTop || 0 + }; + } + }, + + /** + * 刷新 + */ + refresh: function () { + + var list = this.storage.getDisplayList(true, true); + + this._paintList(list); + }, + + _paintList: function (list) { + var vmlRoot = this._vmlRoot; + for (var i = 0; i < list.length; i++) { + var el = list[i]; + if (el.invisible || el.ignore) { + if (!el.__alreadyNotVisible) { + el.onRemove(vmlRoot); + } + // Set as already invisible + el.__alreadyNotVisible = true; + } + else { + if (el.__alreadyNotVisible) { + el.onAdd(vmlRoot); + } + el.__alreadyNotVisible = false; + if (el.__dirty) { + el.beforeBrush && el.beforeBrush(); + (el.brushVML || el.brush).call(el, vmlRoot); + el.afterBrush && el.afterBrush(); + } + } + el.__dirty = false; + } + + if (this._firstPaint) { + // Detached from document at first time + // to avoid page refreshing too many times + + // FIXME 如果每次都先 removeChild 可能会导致一些填充和描边的效果改变 + this._vmlViewport.appendChild(vmlRoot); + this._firstPaint = false; + } + }, + + resize: function (width, height) { + var width = width == null ? this._getWidth() : width; + var height = height == null ? this._getHeight() : height; + + if (this._width != width || this._height != height) { + this._width = width; + this._height = height; + + var vmlViewportStyle = this._vmlViewport.style; + vmlViewportStyle.width = width + 'px'; + vmlViewportStyle.height = height + 'px'; + } + }, + + dispose: function () { + this.root.innerHTML = ''; + + this._vmlRoot = + this._vmlViewport = + this.storage = null; + }, + + getWidth: function () { + return this._width; + }, + + getHeight: function () { + return this._height; + }, + + clear: function () { + if (this._vmlViewport) { + this.root.removeChild(this._vmlViewport); + } + }, + + _getWidth: function () { + var root = this.root; + var stl = root.currentStyle; + + return ((root.clientWidth || parseInt10$1(stl.width)) + - parseInt10$1(stl.paddingLeft) + - parseInt10$1(stl.paddingRight)) | 0; + }, + + _getHeight: function () { + var root = this.root; + var stl = root.currentStyle; + + return ((root.clientHeight || parseInt10$1(stl.height)) + - parseInt10$1(stl.paddingTop) + - parseInt10$1(stl.paddingBottom)) | 0; + } +}; + +// Not supported methods +function createMethodNotSupport(method) { + return function () { + zrLog('In IE8.0 VML mode painter not support method "' + method + '"'); + }; +} + +// Unsupported methods +each$1([ + 'getLayer', 'insertLayer', 'eachLayer', 'eachBuiltinLayer', 'eachOtherLayer', 'getLayers', + 'modLayer', 'delLayer', 'clearLayer', 'toDataURL', 'pathToImage' +], function (name) { + VMLPainter.prototype[name] = createMethodNotSupport(name); +}); + +registerPainter('vml', VMLPainter); + +var svgURI = 'http://www.w3.org/2000/svg'; + +function createElement(name) { + return document.createElementNS(svgURI, name); +} + +// TODO +// 1. shadow +// 2. Image: sx, sy, sw, sh + +var CMD$4 = PathProxy.CMD; +var arrayJoin = Array.prototype.join; + +var NONE = 'none'; +var mathRound = Math.round; +var mathSin$3 = Math.sin; +var mathCos$3 = Math.cos; +var PI$5 = Math.PI; +var PI2$7 = Math.PI * 2; +var degree = 180 / PI$5; + +var EPSILON$4 = 1e-4; + +function round4(val) { + return mathRound(val * 1e4) / 1e4; +} + +function isAroundZero$1(val) { + return val < EPSILON$4 && val > -EPSILON$4; +} + +function pathHasFill(style, isText) { + var fill = isText ? style.textFill : style.fill; + return fill != null && fill !== NONE; +} + +function pathHasStroke(style, isText) { + var stroke = isText ? style.textStroke : style.stroke; + return stroke != null && stroke !== NONE; +} + +function setTransform(svgEl, m) { + if (m) { + attr(svgEl, 'transform', 'matrix(' + arrayJoin.call(m, ',') + ')'); + } +} + +function attr(el, key, val) { + if (!val || val.type !== 'linear' && val.type !== 'radial') { + // Don't set attribute for gradient, since it need new dom nodes + if (typeof val === 'string' && val.indexOf('NaN') > -1) { + console.log(val); + } + el.setAttribute(key, val); + } +} + +function attrXLink(el, key, val) { + el.setAttributeNS('http://www.w3.org/1999/xlink', key, val); +} + +function bindStyle(svgEl, style, isText) { + if (pathHasFill(style, isText)) { + var fill = isText ? style.textFill : style.fill; + fill = fill === 'transparent' ? NONE : fill; + + /** + * FIXME: + * This is a temporary fix for Chrome's clipping bug + * that happens when a clip-path is referring another one. + * This fix should be used before Chrome's bug is fixed. + * For an element that has clip-path, and fill is none, + * set it to be "rgba(0, 0, 0, 0.002)" will hide the element. + * Otherwise, it will show black fill color. + * 0.002 is used because this won't work for alpha values smaller + * than 0.002. + * + * See + * https://bugs.chromium.org/p/chromium/issues/detail?id=659790 + * for more information. + */ + if (svgEl.getAttribute('clip-path') !== 'none' && fill === NONE) { + fill = 'rgba(0, 0, 0, 0.002)'; + } + + attr(svgEl, 'fill', fill); + attr(svgEl, 'fill-opacity', style.opacity); + } + else { + attr(svgEl, 'fill', NONE); + } + + if (pathHasStroke(style, isText)) { + var stroke = isText ? style.textStroke : style.stroke; + stroke = stroke === 'transparent' ? NONE : stroke; + attr(svgEl, 'stroke', stroke); + var strokeWidth = isText + ? style.textStrokeWidth + : style.lineWidth; + var strokeScale = !isText && style.strokeNoScale + ? style.host.getLineScale() + : 1; + attr(svgEl, 'stroke-width', strokeWidth / strokeScale); + // stroke then fill for text; fill then stroke for others + attr(svgEl, 'paint-order', isText ? 'stroke' : 'fill'); + attr(svgEl, 'stroke-opacity', style.opacity); + var lineDash = style.lineDash; + if (lineDash) { + attr(svgEl, 'stroke-dasharray', style.lineDash.join(',')); + attr(svgEl, 'stroke-dashoffset', mathRound(style.lineDashOffset || 0)); + } + else { + attr(svgEl, 'stroke-dasharray', ''); + } + + // PENDING + style.lineCap && attr(svgEl, 'stroke-linecap', style.lineCap); + style.lineJoin && attr(svgEl, 'stroke-linejoin', style.lineJoin); + style.miterLimit && attr(svgEl, 'stroke-miterlimit', style.miterLimit); + } + else { + attr(svgEl, 'stroke', NONE); + } +} + +/*************************************************** + * PATH + **************************************************/ +function pathDataToString$1(path) { + var str = []; + var data = path.data; + var dataLength = path.len(); + for (var i = 0; i < dataLength;) { + var cmd = data[i++]; + var cmdStr = ''; + var nData = 0; + switch (cmd) { + case CMD$4.M: + cmdStr = 'M'; + nData = 2; + break; + case CMD$4.L: + cmdStr = 'L'; + nData = 2; + break; + case CMD$4.Q: + cmdStr = 'Q'; + nData = 4; + break; + case CMD$4.C: + cmdStr = 'C'; + nData = 6; + break; + case CMD$4.A: + var cx = data[i++]; + var cy = data[i++]; + var rx = data[i++]; + var ry = data[i++]; + var theta = data[i++]; + var dTheta = data[i++]; + var psi = data[i++]; + var clockwise = data[i++]; + + var dThetaPositive = Math.abs(dTheta); + var isCircle = isAroundZero$1(dThetaPositive - PI2$7) + && !isAroundZero$1(dThetaPositive); + + var large = false; + if (dThetaPositive >= PI2$7) { + large = true; + } + else if (isAroundZero$1(dThetaPositive)) { + large = false; + } + else { + large = (dTheta > -PI$5 && dTheta < 0 || dTheta > PI$5) + === !!clockwise; + } + + var x0 = round4(cx + rx * mathCos$3(theta)); + var y0 = round4(cy + ry * mathSin$3(theta)); + + // It will not draw if start point and end point are exactly the same + // We need to shift the end point with a small value + // FIXME A better way to draw circle ? + if (isCircle) { + if (clockwise) { + dTheta = PI2$7 - 1e-4; + } + else { + dTheta = -PI2$7 + 1e-4; + } + + large = true; + + if (i === 9) { + // Move to (x0, y0) only when CMD.A comes at the + // first position of a shape. + // For instance, when drawing a ring, CMD.A comes + // after CMD.M, so it's unnecessary to move to + // (x0, y0). + str.push('M', x0, y0); + } + } + + var x = round4(cx + rx * mathCos$3(theta + dTheta)); + var y = round4(cy + ry * mathSin$3(theta + dTheta)); + + // FIXME Ellipse + str.push('A', round4(rx), round4(ry), + mathRound(psi * degree), +large, +clockwise, x, y); + break; + case CMD$4.Z: + cmdStr = 'Z'; + break; + case CMD$4.R: + var x = round4(data[i++]); + var y = round4(data[i++]); + var w = round4(data[i++]); + var h = round4(data[i++]); + str.push( + 'M', x, y, + 'L', x + w, y, + 'L', x + w, y + h, + 'L', x, y + h, + 'L', x, y + ); + break; + } + cmdStr && str.push(cmdStr); + for (var j = 0; j < nData; j++) { + // PENDING With scale + str.push(round4(data[i++])); + } + } + return str.join(' '); +} + +var svgPath = {}; +svgPath.brush = function (el) { + var style = el.style; + + var svgEl = el.__svgEl; + if (!svgEl) { + svgEl = createElement('path'); + el.__svgEl = svgEl; + } + + if (!el.path) { + el.createPathProxy(); + } + var path = el.path; + + if (el.__dirtyPath) { + path.beginPath(); + el.buildPath(path, el.shape); + el.__dirtyPath = false; + + var pathStr = pathDataToString$1(path); + if (pathStr.indexOf('NaN') < 0) { + // Ignore illegal path, which may happen such in out-of-range + // data in Calendar series. + attr(svgEl, 'd', pathStr); + } + } + + bindStyle(svgEl, style); + setTransform(svgEl, el.transform); + + if (style.text != null) { + svgTextDrawRectText(el, el.getBoundingRect()); + } +}; + +/*************************************************** + * IMAGE + **************************************************/ +var svgImage = {}; +svgImage.brush = function (el) { + var style = el.style; + var image = style.image; + + if (image instanceof HTMLImageElement) { + var src = image.src; + image = src; + } + if (! image) { + return; + } + + var x = style.x || 0; + var y = style.y || 0; + + var dw = style.width; + var dh = style.height; + + var svgEl = el.__svgEl; + if (! svgEl) { + svgEl = createElement('image'); + el.__svgEl = svgEl; + } + + if (image !== el.__imageSrc) { + attrXLink(svgEl, 'href', image); + // Caching image src + el.__imageSrc = image; + } + + attr(svgEl, 'width', dw); + attr(svgEl, 'height', dh); + + attr(svgEl, 'x', x); + attr(svgEl, 'y', y); + + setTransform(svgEl, el.transform); + + if (style.text != null) { + svgTextDrawRectText(el, el.getBoundingRect()); + } +}; + +/*************************************************** + * TEXT + **************************************************/ +var svgText = {}; +var tmpRect$3 = new BoundingRect(); + +var svgTextDrawRectText = function (el, rect, textRect) { + var style = el.style; + + el.__dirty && normalizeTextStyle(style, true); + + var text = style.text; + // Convert to string + if (text == null) { + // Draw no text only when text is set to null, but not '' + return; + } + else { + text += ''; + } + + var textSvgEl = el.__textSvgEl; + if (! textSvgEl) { + textSvgEl = createElement('text'); + el.__textSvgEl = textSvgEl; + } + + var x; + var y; + var textPosition = style.textPosition; + var distance = style.textDistance; + var align = style.textAlign || 'left'; + + if (typeof style.fontSize === 'number') { + style.fontSize += 'px'; + } + var font = style.font + || [ + style.fontStyle || '', + style.fontWeight || '', + style.fontSize || '', + style.fontFamily || '' + ].join(' ') + || DEFAULT_FONT; + + var verticalAlign = getVerticalAlignForSvg(style.textVerticalAlign); + + textRect = getBoundingRect(text, font, align, + verticalAlign); + + var lineHeight = textRect.lineHeight; + // Text position represented by coord + if (textPosition instanceof Array) { + x = rect.x + textPosition[0]; + y = rect.y + textPosition[1]; + } + else { + var newPos = adjustTextPositionOnRect( + textPosition, rect, distance + ); + x = newPos.x; + y = newPos.y; + verticalAlign = getVerticalAlignForSvg(newPos.textVerticalAlign); + align = newPos.textAlign; + } + + attr(textSvgEl, 'alignment-baseline', verticalAlign); + + if (font) { + textSvgEl.style.font = font; + } + + var textPadding = style.textPadding; + + // Make baseline top + attr(textSvgEl, 'x', x); + attr(textSvgEl, 'y', y); + + bindStyle(textSvgEl, style, true); + if (el instanceof Text || el.style.transformText) { + // Transform text with element + setTransform(textSvgEl, el.transform); + } + else { + if (el.transform) { + tmpRect$3.copy(rect); + tmpRect$3.applyTransform(el.transform); + rect = tmpRect$3; + } + else { + var pos = el.transformCoordToGlobal(rect.x, rect.y); + rect.x = pos[0]; + rect.y = pos[1]; + } + + // Text rotation, but no element transform + var origin = style.textOrigin; + if (origin === 'center') { + x = textRect.width / 2 + x; + y = textRect.height / 2 + y; + } + else if (origin) { + x = origin[0] + x; + y = origin[1] + y; + } + var rotate$$1 = -style.textRotation || 0; + var transform = create$1(); + // Apply textRotate to element matrix + rotate(transform, el.transform, rotate$$1); + setTransform(textSvgEl, transform); + } + + var textLines = text.split('\n'); + var nTextLines = textLines.length; + var textAnchor = align; + // PENDING + if (textAnchor === 'left') { + textAnchor = 'start'; + textPadding && (x += textPadding[3]); + } + else if (textAnchor === 'right') { + textAnchor = 'end'; + textPadding && (x -= textPadding[1]); + } + else if (textAnchor === 'center') { + textAnchor = 'middle'; + textPadding && (x += (textPadding[3] - textPadding[1]) / 2); + } + + var dy = 0; + if (verticalAlign === 'baseline') { + dy = -textRect.height + lineHeight; + textPadding && (dy -= textPadding[2]); + } + else if (verticalAlign === 'middle') { + dy = (-textRect.height + lineHeight) / 2; + textPadding && (y += (textPadding[0] - textPadding[2]) / 2); + } + else { + textPadding && (dy += textPadding[0]); + } + + // Font may affect position of each tspan elements + if (el.__text !== text || el.__textFont !== font) { + var tspanList = el.__tspanList || []; + el.__tspanList = tspanList; + for (var i = 0; i < nTextLines; i++) { + // Using cached tspan elements + var tspan = tspanList[i]; + if (! tspan) { + tspan = tspanList[i] = createElement('tspan'); + textSvgEl.appendChild(tspan); + attr(tspan, 'alignment-baseline', verticalAlign); + attr(tspan, 'text-anchor', textAnchor); + } + else { + tspan.innerHTML = ''; + } + attr(tspan, 'x', x); + attr(tspan, 'y', y + i * lineHeight + dy); + tspan.appendChild(document.createTextNode(textLines[i])); + } + // Remove unsed tspan elements + for (; i < tspanList.length; i++) { + textSvgEl.removeChild(tspanList[i]); + } + tspanList.length = nTextLines; + + el.__text = text; + el.__textFont = font; + } + else if (el.__tspanList.length) { + // Update span x and y + var len = el.__tspanList.length; + for (var i = 0; i < len; ++i) { + var tspan = el.__tspanList[i]; + if (tspan) { + attr(tspan, 'x', x); + attr(tspan, 'y', y + i * lineHeight + dy); + } + } + } +}; + +function getVerticalAlignForSvg(verticalAlign) { + if (verticalAlign === 'middle') { + return 'middle'; + } + else if (verticalAlign === 'bottom') { + return 'baseline'; + } + else { + return 'hanging'; + } +} + +svgText.drawRectText = svgTextDrawRectText; + +svgText.brush = function (el) { + var style = el.style; + if (style.text != null) { + // 强制设置 textPosition + style.textPosition = [0, 0]; + svgTextDrawRectText(el, { + x: style.x || 0, y: style.y || 0, + width: 0, height: 0 + }, el.getBoundingRect()); + } +}; + +// Myers' Diff Algorithm +// Modified from https://github.com/kpdecker/jsdiff/blob/master/src/diff/base.js + +function Diff() {} + +Diff.prototype = { + diff: function (oldArr, newArr, equals) { + if (!equals) { + equals = function (a, b) { + return a === b; + }; + } + this.equals = equals; + + var self = this; + + oldArr = oldArr.slice(); + newArr = newArr.slice(); + // Allow subclasses to massage the input prior to running + var newLen = newArr.length; + var oldLen = oldArr.length; + var editLength = 1; + var maxEditLength = newLen + oldLen; + var bestPath = [{ newPos: -1, components: [] }]; + + // Seed editLength = 0, i.e. the content starts with the same values + var oldPos = this.extractCommon(bestPath[0], newArr, oldArr, 0); + if (bestPath[0].newPos + 1 >= newLen && oldPos + 1 >= oldLen) { + var indices = []; + for (var i = 0; i < newArr.length; i++) { + indices.push(i); + } + // Identity per the equality and tokenizer + return [{ + indices: indices, count: newArr.length + }]; + } + + // Main worker method. checks all permutations of a given edit length for acceptance. + function execEditLength() { + for (var diagonalPath = -1 * editLength; diagonalPath <= editLength; diagonalPath += 2) { + var basePath; + var addPath = bestPath[diagonalPath - 1]; + var removePath = bestPath[diagonalPath + 1]; + var oldPos = (removePath ? removePath.newPos : 0) - diagonalPath; + if (addPath) { + // No one else is going to attempt to use this value, clear it + bestPath[diagonalPath - 1] = undefined; + } + + var canAdd = addPath && addPath.newPos + 1 < newLen; + var canRemove = removePath && 0 <= oldPos && oldPos < oldLen; + if (!canAdd && !canRemove) { + // If this path is a terminal then prune + bestPath[diagonalPath] = undefined; + continue; + } + + // Select the diagonal that we want to branch from. We select the prior + // path whose position in the new string is the farthest from the origin + // and does not pass the bounds of the diff graph + if (!canAdd || (canRemove && addPath.newPos < removePath.newPos)) { + basePath = clonePath(removePath); + self.pushComponent(basePath.components, undefined, true); + } + else { + basePath = addPath; // No need to clone, we've pulled it from the list + basePath.newPos++; + self.pushComponent(basePath.components, true, undefined); + } + + oldPos = self.extractCommon(basePath, newArr, oldArr, diagonalPath); + + // If we have hit the end of both strings, then we are done + if (basePath.newPos + 1 >= newLen && oldPos + 1 >= oldLen) { + return buildValues(self, basePath.components, newArr, oldArr); + } + else { + // Otherwise track this path as a potential candidate and continue. + bestPath[diagonalPath] = basePath; + } + } + + editLength++; + } + + while (editLength <= maxEditLength) { + var ret = execEditLength(); + if (ret) { + return ret; + } + } + }, + + pushComponent: function (components, added, removed) { + var last = components[components.length - 1]; + if (last && last.added === added && last.removed === removed) { + // We need to clone here as the component clone operation is just + // as shallow array clone + components[components.length - 1] = {count: last.count + 1, added: added, removed: removed }; + } + else { + components.push({count: 1, added: added, removed: removed }); + } + }, + extractCommon: function (basePath, newArr, oldArr, diagonalPath) { + var newLen = newArr.length; + var oldLen = oldArr.length; + var newPos = basePath.newPos; + var oldPos = newPos - diagonalPath; + var commonCount = 0; + + while (newPos + 1 < newLen && oldPos + 1 < oldLen && this.equals(newArr[newPos + 1], oldArr[oldPos + 1])) { + newPos++; + oldPos++; + commonCount++; + } + + if (commonCount) { + basePath.components.push({count: commonCount}); + } + + basePath.newPos = newPos; + return oldPos; + }, + tokenize: function (value) { + return value.slice(); + }, + join: function (value) { + return value.slice(); + } +}; + +function buildValues(diff, components, newArr, oldArr) { + var componentPos = 0; + var componentLen = components.length; + var newPos = 0; + var oldPos = 0; + + for (; componentPos < componentLen; componentPos++) { + var component = components[componentPos]; + if (!component.removed) { + var indices = []; + for (var i = newPos; i < newPos + component.count; i++) { + indices.push(i); + } + component.indices = indices; + newPos += component.count; + // Common case + if (!component.added) { + oldPos += component.count; + } + } + else { + var indices = []; + for (var i = oldPos; i < oldPos + component.count; i++) { + indices.push(i); + } + component.indices = indices; + oldPos += component.count; + } + } + + return components; +} + +function clonePath(path) { + return { newPos: path.newPos, components: path.components.slice(0) }; +} + +var arrayDiff = new Diff(); + +var arrayDiff$1 = function (oldArr, newArr, callback) { + return arrayDiff.diff(oldArr, newArr, callback); +}; + +/** + * @file Manages elements that can be defined in <defs> in SVG, + * e.g., gradients, clip path, etc. + * @author Zhang Wenli + */ + +var MARK_UNUSED = '0'; +var MARK_USED = '1'; + +/** + * Manages elements that can be defined in <defs> in SVG, + * e.g., gradients, clip path, etc. + * + * @class + * @param {number} zrId zrender instance id + * @param {SVGElement} svgRoot root of SVG document + * @param {string|string[]} tagNames possible tag names + * @param {string} markLabel label name to make if the element + * is used + */ +function Definable( + zrId, + svgRoot, + tagNames, + markLabel, + domName +) { + this._zrId = zrId; + this._svgRoot = svgRoot; + this._tagNames = typeof tagNames === 'string' ? [tagNames] : tagNames; + this._markLabel = markLabel; + this._domName = domName || '_dom'; + + this.nextId = 0; +} + + +Definable.prototype.createElement = createElement; + + +/** + * Get the <defs> tag for svgRoot; optionally creates one if not exists. + * + * @param {boolean} isForceCreating if need to create when not exists + * @return {SVGDefsElement} SVG <defs> element, null if it doesn't + * exist and isForceCreating is false + */ +Definable.prototype.getDefs = function (isForceCreating) { + var svgRoot = this._svgRoot; + var defs = this._svgRoot.getElementsByTagName('defs'); + if (defs.length === 0) { + // Not exist + if (isForceCreating) { + defs = svgRoot.insertBefore( + this.createElement('defs'), // Create new tag + svgRoot.firstChild // Insert in the front of svg + ); + if (!defs.contains) { + // IE doesn't support contains method + defs.contains = function (el) { + var children = defs.children; + if (!children) { + return false; + } + for (var i = children.length - 1; i >= 0; --i) { + if (children[i] === el) { + return true; + } + } + return false; + }; + } + return defs; + } + else { + return null; + } + } + else { + return defs[0]; + } +}; + + +/** + * Update DOM element if necessary. + * + * @param {Object|string} element style element. e.g., for gradient, + * it may be '#ccc' or {type: 'linear', ...} + * @param {Function|undefined} onUpdate update callback + */ +Definable.prototype.update = function (element, onUpdate) { + if (!element) { + return; + } + + var defs = this.getDefs(false); + if (element[this._domName] && defs.contains(element[this._domName])) { + // Update DOM + if (typeof onUpdate === 'function') { + onUpdate(element); + } + } + else { + // No previous dom, create new + var dom = this.add(element); + if (dom) { + element[this._domName] = dom; + } + } +}; + + +/** + * Add gradient dom to defs + * + * @param {SVGElement} dom DOM to be added to <defs> + */ +Definable.prototype.addDom = function (dom) { + var defs = this.getDefs(true); + defs.appendChild(dom); +}; + + +/** + * Remove DOM of a given element. + * + * @param {SVGElement} element element to remove dom + */ +Definable.prototype.removeDom = function (element) { + var defs = this.getDefs(false); + if (defs && element[this._domName]) { + defs.removeChild(element[this._domName]); + element[this._domName] = null; + } +}; + + +/** + * Get DOMs of this element. + * + * @return {HTMLDomElement} doms of this defineable elements in <defs> + */ +Definable.prototype.getDoms = function () { + var defs = this.getDefs(false); + if (!defs) { + // No dom when defs is not defined + return []; + } + + var doms = []; + each$1(this._tagNames, function (tagName) { + var tags = defs.getElementsByTagName(tagName); + // Note that tags is HTMLCollection, which is array-like + // rather than real array. + // So `doms.concat(tags)` add tags as one object. + doms = doms.concat([].slice.call(tags)); + }); + + return doms; +}; + + +/** + * Mark DOMs to be unused before painting, and clear unused ones at the end + * of the painting. + */ +Definable.prototype.markAllUnused = function () { + var doms = this.getDoms(); + var that = this; + each$1(doms, function (dom) { + dom[that._markLabel] = MARK_UNUSED; + }); +}; + + +/** + * Mark a single DOM to be used. + * + * @param {SVGElement} dom DOM to mark + */ +Definable.prototype.markUsed = function (dom) { + if (dom) { + dom[this._markLabel] = MARK_USED; + } +}; + + +/** + * Remove unused DOMs defined in <defs> + */ +Definable.prototype.removeUnused = function () { + var defs = this.getDefs(false); + if (!defs) { + // Nothing to remove + return; + } + + var doms = this.getDoms(); + var that = this; + each$1(doms, function (dom) { + if (dom[that._markLabel] !== MARK_USED) { + // Remove gradient + defs.removeChild(dom); + } + }); +}; + + +/** + * Get SVG proxy. + * + * @param {Displayable} displayable displayable element + * @return {Path|Image|Text} svg proxy of given element + */ +Definable.prototype.getSvgProxy = function (displayable) { + if (displayable instanceof Path) { + return svgPath; + } + else if (displayable instanceof ZImage) { + return svgImage; + } + else if (displayable instanceof Text) { + return svgText; + } + else { + return svgPath; + } +}; + + +/** + * Get text SVG element. + * + * @param {Displayable} displayable displayable element + * @return {SVGElement} SVG element of text + */ +Definable.prototype.getTextSvgElement = function (displayable) { + return displayable.__textSvgEl; +}; + + +/** + * Get SVG element. + * + * @param {Displayable} displayable displayable element + * @return {SVGElement} SVG element + */ +Definable.prototype.getSvgElement = function (displayable) { + return displayable.__svgEl; +}; + +/** + * @file Manages SVG gradient elements. + * @author Zhang Wenli + */ + +/** + * Manages SVG gradient elements. + * + * @class + * @extends Definable + * @param {number} zrId zrender instance id + * @param {SVGElement} svgRoot root of SVG document + */ +function GradientManager(zrId, svgRoot) { + Definable.call( + this, + zrId, + svgRoot, + ['linearGradient', 'radialGradient'], + '__gradient_in_use__' + ); +} + + +inherits(GradientManager, Definable); + + +/** + * Create new gradient DOM for fill or stroke if not exist, + * but will not update gradient if exists. + * + * @param {SvgElement} svgElement SVG element to paint + * @param {Displayable} displayable zrender displayable element + */ +GradientManager.prototype.addWithoutUpdate = function ( + svgElement, + displayable +) { + if (displayable && displayable.style) { + var that = this; + each$1(['fill', 'stroke'], function (fillOrStroke) { + if (displayable.style[fillOrStroke] + && (displayable.style[fillOrStroke].type === 'linear' + || displayable.style[fillOrStroke].type === 'radial') + ) { + var gradient = displayable.style[fillOrStroke]; + var defs = that.getDefs(true); + + // Create dom in <defs> if not exists + var dom; + if (gradient._dom) { + // Gradient exists + dom = gradient._dom; + if (!defs.contains(gradient._dom)) { + // _dom is no longer in defs, recreate + that.addDom(dom); + } + } + else { + // New dom + dom = that.add(gradient); + } + + that.markUsed(displayable); + + var id = dom.getAttribute('id'); + svgElement.setAttribute(fillOrStroke, 'url(#' + id + ')'); + } + }); + } +}; + + +/** + * Add a new gradient tag in <defs> + * + * @param {Gradient} gradient zr gradient instance + * @return {SVGLinearGradientElement | SVGRadialGradientElement} + * created DOM + */ +GradientManager.prototype.add = function (gradient) { + var dom; + if (gradient.type === 'linear') { + dom = this.createElement('linearGradient'); + } + else if (gradient.type === 'radial') { + dom = this.createElement('radialGradient'); + } + else { + zrLog('Illegal gradient type.'); + return null; + } + + // Set dom id with gradient id, since each gradient instance + // will have no more than one dom element. + // id may exists before for those dirty elements, in which case + // id should remain the same, and other attributes should be + // updated. + gradient.id = gradient.id || this.nextId++; + dom.setAttribute('id', 'zr' + this._zrId + + '-gradient-' + gradient.id); + + this.updateDom(gradient, dom); + this.addDom(dom); + + return dom; +}; + + +/** + * Update gradient. + * + * @param {Gradient} gradient zr gradient instance + */ +GradientManager.prototype.update = function (gradient) { + var that = this; + Definable.prototype.update.call(this, gradient, function () { + var type = gradient.type; + var tagName = gradient._dom.tagName; + if (type === 'linear' && tagName === 'linearGradient' + || type === 'radial' && tagName === 'radialGradient' + ) { + // Gradient type is not changed, update gradient + that.updateDom(gradient, gradient._dom); + } + else { + // Remove and re-create if type is changed + that.removeDom(gradient); + that.add(gradient); + } + }); +}; + + +/** + * Update gradient dom + * + * @param {Gradient} gradient zr gradient instance + * @param {SVGLinearGradientElement | SVGRadialGradientElement} dom + * DOM to update + */ +GradientManager.prototype.updateDom = function (gradient, dom) { + if (gradient.type === 'linear') { + dom.setAttribute('x1', gradient.x); + dom.setAttribute('y1', gradient.y); + dom.setAttribute('x2', gradient.x2); + dom.setAttribute('y2', gradient.y2); + } + else if (gradient.type === 'radial') { + dom.setAttribute('cx', gradient.x); + dom.setAttribute('cy', gradient.y); + dom.setAttribute('r', gradient.r); + } + else { + zrLog('Illegal gradient type.'); + return; + } + + if (gradient.global) { + // x1, x2, y1, y2 in range of 0 to canvas width or height + dom.setAttribute('gradientUnits', 'userSpaceOnUse'); + } + else { + // x1, x2, y1, y2 in range of 0 to 1 + dom.setAttribute('gradientUnits', 'objectBoundingBox'); + } + + // Remove color stops if exists + dom.innerHTML = ''; + + // Add color stops + var colors = gradient.colorStops; + for (var i = 0, len = colors.length; i < len; ++i) { + var stop = this.createElement('stop'); + stop.setAttribute('offset', colors[i].offset * 100 + '%'); + stop.setAttribute('stop-color', colors[i].color); + dom.appendChild(stop); + } + + // Store dom element in gradient, to avoid creating multiple + // dom instances for the same gradient element + gradient._dom = dom; +}; + +/** + * Mark a single gradient to be used + * + * @param {Displayable} displayable displayable element + */ +GradientManager.prototype.markUsed = function (displayable) { + if (displayable.style) { + var gradient = displayable.style.fill; + if (gradient && gradient._dom) { + Definable.prototype.markUsed.call(this, gradient._dom); + } + + gradient = displayable.style.stroke; + if (gradient && gradient._dom) { + Definable.prototype.markUsed.call(this, gradient._dom); + } + } +}; + +/** + * @file Manages SVG clipPath elements. + * @author Zhang Wenli + */ + +/** + * Manages SVG clipPath elements. + * + * @class + * @extends Definable + * @param {number} zrId zrender instance id + * @param {SVGElement} svgRoot root of SVG document + */ +function ClippathManager(zrId, svgRoot) { + Definable.call(this, zrId, svgRoot, 'clipPath', '__clippath_in_use__'); +} + + +inherits(ClippathManager, Definable); + + +/** + * Update clipPath. + * + * @param {Displayable} displayable displayable element + */ +ClippathManager.prototype.update = function (displayable) { + var svgEl = this.getSvgElement(displayable); + if (svgEl) { + this.updateDom(svgEl, displayable.__clipPaths, false); + } + + var textEl = this.getTextSvgElement(displayable); + if (textEl) { + // Make another clipPath for text, since it's transform + // matrix is not the same with svgElement + this.updateDom(textEl, displayable.__clipPaths, true); + } + + this.markUsed(displayable); +}; + + +/** + * Create an SVGElement of displayable and create a <clipPath> of its + * clipPath + * + * @param {Displayable} parentEl parent element + * @param {ClipPath[]} clipPaths clipPaths of parent element + * @param {boolean} isText if parent element is Text + */ +ClippathManager.prototype.updateDom = function ( + parentEl, + clipPaths, + isText +) { + if (clipPaths && clipPaths.length > 0) { + // Has clipPath, create <clipPath> with the first clipPath + var defs = this.getDefs(true); + var clipPath = clipPaths[0]; + var clipPathEl; + var id; + + var dom = isText ? '_textDom' : '_dom'; + + if (clipPath[dom]) { + // Use a dom that is already in <defs> + id = clipPath[dom].getAttribute('id'); + clipPathEl = clipPath[dom]; + + // Use a dom that is already in <defs> + if (!defs.contains(clipPathEl)) { + // This happens when set old clipPath that has + // been previously removed + defs.appendChild(clipPathEl); + } + } + else { + // New <clipPath> + id = 'zr' + this._zrId + '-clip-' + this.nextId; + ++this.nextId; + clipPathEl = this.createElement('clipPath'); + clipPathEl.setAttribute('id', id); + defs.appendChild(clipPathEl); + + clipPath[dom] = clipPathEl; + } + + // Build path and add to <clipPath> + var svgProxy = this.getSvgProxy(clipPath); + if (clipPath.transform + && clipPath.parent.invTransform + && !isText + ) { + /** + * If a clipPath has a parent with transform, the transform + * of parent should not be considered when setting transform + * of clipPath. So we need to transform back from parent's + * transform, which is done by multiplying parent's inverse + * transform. + */ + // Store old transform + var transform = Array.prototype.slice.call( + clipPath.transform + ); + + // Transform back from parent, and brush path + mul$1( + clipPath.transform, + clipPath.parent.invTransform, + clipPath.transform + ); + svgProxy.brush(clipPath); + + // Set back transform of clipPath + clipPath.transform = transform; + } + else { + svgProxy.brush(clipPath); + } + + var pathEl = this.getSvgElement(clipPath); + + clipPathEl.innerHTML = ''; + /** + * Use `cloneNode()` here to appendChild to multiple parents, + * which may happend when Text and other shapes are using the same + * clipPath. Since Text will create an extra clipPath DOM due to + * different transform rules. + */ + clipPathEl.appendChild(pathEl.cloneNode()); + + parentEl.setAttribute('clip-path', 'url(#' + id + ')'); + + if (clipPaths.length > 1) { + // Make the other clipPaths recursively + this.updateDom(clipPathEl, clipPaths.slice(1), isText); + } + } + else { + // No clipPath + if (parentEl) { + parentEl.setAttribute('clip-path', 'none'); + } + } +}; + +/** + * Mark a single clipPath to be used + * + * @param {Displayable} displayable displayable element + */ +ClippathManager.prototype.markUsed = function (displayable) { + var that = this; + if (displayable.__clipPaths && displayable.__clipPaths.length > 0) { + each$1(displayable.__clipPaths, function (clipPath) { + if (clipPath._dom) { + Definable.prototype.markUsed.call(that, clipPath._dom); + } + if (clipPath._textDom) { + Definable.prototype.markUsed.call(that, clipPath._textDom); + } + }); + } +}; + +/** + * @file Manages SVG shadow elements. + * @author Zhang Wenli + */ + +/** + * Manages SVG shadow elements. + * + * @class + * @extends Definable + * @param {number} zrId zrender instance id + * @param {SVGElement} svgRoot root of SVG document + */ +function ShadowManager(zrId, svgRoot) { + Definable.call( + this, + zrId, + svgRoot, + ['filter'], + '__filter_in_use__', + '_shadowDom' + ); +} + + +inherits(ShadowManager, Definable); + + +/** + * Create new shadow DOM for fill or stroke if not exist, + * but will not update shadow if exists. + * + * @param {SvgElement} svgElement SVG element to paint + * @param {Displayable} displayable zrender displayable element + */ +ShadowManager.prototype.addWithoutUpdate = function ( + svgElement, + displayable +) { + if (displayable && hasShadow(displayable.style)) { + var style = displayable.style; + + // Create dom in <defs> if not exists + var dom; + if (style._shadowDom) { + // Gradient exists + dom = style._shadowDom; + + var defs = this.getDefs(true); + if (!defs.contains(style._shadowDom)) { + // _shadowDom is no longer in defs, recreate + this.addDom(dom); + } + } + else { + // New dom + dom = this.add(displayable); + } + + this.markUsed(displayable); + + var id = dom.getAttribute('id'); + svgElement.style.filter = 'url(#' + id + ')'; + } +}; + + +/** + * Add a new shadow tag in <defs> + * + * @param {Displayable} displayable zrender displayable element + * @return {SVGFilterElement} created DOM + */ +ShadowManager.prototype.add = function (displayable) { + var dom = this.createElement('filter'); + var style = displayable.style; + + // Set dom id with shadow id, since each shadow instance + // will have no more than one dom element. + // id may exists before for those dirty elements, in which case + // id should remain the same, and other attributes should be + // updated. + style._shadowDomId = style._shadowDomId || this.nextId++; + dom.setAttribute('id', 'zr' + this._zrId + + '-shadow-' + style._shadowDomId); + + this.updateDom(displayable, dom); + this.addDom(dom); + + return dom; +}; + + +/** + * Update shadow. + * + * @param {Displayable} displayable zrender displayable element + */ +ShadowManager.prototype.update = function (svgElement, displayable) { + var style = displayable.style; + if (hasShadow(style)) { + var that = this; + Definable.prototype.update.call(this, displayable, function (style) { + that.updateDom(displayable, style._shadowDom); + }); + } + else { + // Remove shadow + this.remove(svgElement, style); + } +}; + + +/** + * Remove DOM and clear parent filter + */ +ShadowManager.prototype.remove = function (svgElement, style) { + if (style._shadowDomId != null) { + this.removeDom(style); + svgElement.style.filter = ''; + } +}; + + +/** + * Update shadow dom + * + * @param {Displayable} displayable zrender displayable element + * @param {SVGFilterElement} dom DOM to update + */ +ShadowManager.prototype.updateDom = function (displayable, dom) { + var domChild = dom.getElementsByTagName('feDropShadow'); + if (domChild.length === 0) { + domChild = this.createElement('feDropShadow'); + } + else { + domChild = domChild[0]; + } + + var style = displayable.style; + var scaleX = displayable.scale ? (displayable.scale[0] || 1) : 1; + var scaleY = displayable.scale ? (displayable.scale[1] || 1) : 1; + + // TODO: textBoxShadowBlur is not supported yet + var offsetX, offsetY, blur, color; + if (style.shadowBlur || style.shadowOffsetX || style.shadowOffsetY) { + offsetX = style.shadowOffsetX || 0; + offsetY = style.shadowOffsetY || 0; + blur = style.shadowBlur; + color = style.shadowColor; + } + else if (style.textShadowBlur) { + offsetX = style.textShadowOffsetX || 0; + offsetY = style.textShadowOffsetY || 0; + blur = style.textShadowBlur; + color = style.textShadowColor; + } + else { + // Remove shadow + this.removeDom(dom, style); + return; + } + + domChild.setAttribute('dx', offsetX / scaleX); + domChild.setAttribute('dy', offsetY / scaleY); + domChild.setAttribute('flood-color', color); + + // Divide by two here so that it looks the same as in canvas + // See: https://html.spec.whatwg.org/multipage/canvas.html#dom-context-2d-shadowblur + var stdDx = blur / 2 / scaleX; + var stdDy = blur / 2 / scaleY; + var stdDeviation = stdDx + ' ' + stdDy; + domChild.setAttribute('stdDeviation', stdDeviation); + + // Fix filter clipping problem + dom.setAttribute('x', '-100%'); + dom.setAttribute('y', '-100%'); + dom.setAttribute('width', Math.ceil(blur / 2 * 200) + '%'); + dom.setAttribute('height', Math.ceil(blur / 2 * 200) + '%'); + + dom.appendChild(domChild); + + // Store dom element in shadow, to avoid creating multiple + // dom instances for the same shadow element + style._shadowDom = dom; +}; + +/** + * Mark a single shadow to be used + * + * @param {Displayable} displayable displayable element + */ +ShadowManager.prototype.markUsed = function (displayable) { + var style = displayable.style; + if (style && style._shadowDom) { + Definable.prototype.markUsed.call(this, style._shadowDom); + } +}; + +function hasShadow(style) { + // TODO: textBoxShadowBlur is not supported yet + return style + && (style.shadowBlur || style.shadowOffsetX || style.shadowOffsetY + || style.textShadowBlur || style.textShadowOffsetX + || style.textShadowOffsetY); +} + +/** + * SVG Painter + * @module zrender/svg/Painter + */ + +function parseInt10$2(val) { + return parseInt(val, 10); +} + +function getSvgProxy(el) { + if (el instanceof Path) { + return svgPath; + } + else if (el instanceof ZImage) { + return svgImage; + } + else if (el instanceof Text) { + return svgText; + } + else { + return svgPath; + } +} + +function checkParentAvailable(parent, child) { + return child && parent && child.parentNode !== parent; +} + +function insertAfter(parent, child, prevSibling) { + if (checkParentAvailable(parent, child) && prevSibling) { + var nextSibling = prevSibling.nextSibling; + nextSibling ? parent.insertBefore(child, nextSibling) + : parent.appendChild(child); + } +} + +function prepend(parent, child) { + if (checkParentAvailable(parent, child)) { + var firstChild = parent.firstChild; + firstChild ? parent.insertBefore(child, firstChild) + : parent.appendChild(child); + } +} + +function remove$1(parent, child) { + if (child && parent && child.parentNode === parent) { + parent.removeChild(child); + } +} + +function getTextSvgElement(displayable) { + return displayable.__textSvgEl; +} + +function getSvgElement(displayable) { + return displayable.__svgEl; +} + +/** + * @alias module:zrender/svg/Painter + * @constructor + * @param {HTMLElement} root 绘图容器 + * @param {module:zrender/Storage} storage + * @param {Object} opts + */ +var SVGPainter = function (root, storage, opts, zrId) { + + this.root = root; + this.storage = storage; + this._opts = opts = extend({}, opts || {}); + + var svgRoot = createElement('svg'); + svgRoot.setAttribute('xmlns', 'http://www.w3.org/2000/svg'); + svgRoot.setAttribute('version', '1.1'); + svgRoot.setAttribute('baseProfile', 'full'); + svgRoot.style.cssText = 'user-select:none;position:absolute;left:0;top:0;'; + + this.gradientManager = new GradientManager(zrId, svgRoot); + this.clipPathManager = new ClippathManager(zrId, svgRoot); + this.shadowManager = new ShadowManager(zrId, svgRoot); + + var viewport = document.createElement('div'); + viewport.style.cssText = 'overflow:hidden;position:relative'; + + this._svgRoot = svgRoot; + this._viewport = viewport; + + root.appendChild(viewport); + viewport.appendChild(svgRoot); + + this.resize(opts.width, opts.height); + + this._visibleList = []; +}; + +SVGPainter.prototype = { + + constructor: SVGPainter, + + getType: function () { + return 'svg'; + }, + + getViewportRoot: function () { + return this._viewport; + }, + + getViewportRootOffset: function () { + var viewportRoot = this.getViewportRoot(); + if (viewportRoot) { + return { + offsetLeft: viewportRoot.offsetLeft || 0, + offsetTop: viewportRoot.offsetTop || 0 + }; + } + }, + + refresh: function () { + + var list = this.storage.getDisplayList(true); + + this._paintList(list); + }, + + setBackgroundColor: function (backgroundColor) { + // TODO gradient + this._viewport.style.background = backgroundColor; + }, + + _paintList: function (list) { + this.gradientManager.markAllUnused(); + this.clipPathManager.markAllUnused(); + this.shadowManager.markAllUnused(); + + var svgRoot = this._svgRoot; + var visibleList = this._visibleList; + var listLen = list.length; + + var newVisibleList = []; + var i; + for (i = 0; i < listLen; i++) { + var displayable = list[i]; + var svgProxy = getSvgProxy(displayable); + var svgElement = getSvgElement(displayable) + || getTextSvgElement(displayable); + if (!displayable.invisible) { + if (displayable.__dirty) { + svgProxy && svgProxy.brush(displayable); + + // Update clipPath + this.clipPathManager.update(displayable); + + // Update gradient and shadow + if (displayable.style) { + this.gradientManager + .update(displayable.style.fill); + this.gradientManager + .update(displayable.style.stroke); + + this.shadowManager + .update(svgElement, displayable); + } + + displayable.__dirty = false; + } + newVisibleList.push(displayable); + } + } + + var diff = arrayDiff$1(visibleList, newVisibleList); + var prevSvgElement; + + // First do remove, in case element moved to the head and do remove + // after add + for (i = 0; i < diff.length; i++) { + var item = diff[i]; + if (item.removed) { + for (var k = 0; k < item.count; k++) { + var displayable = visibleList[item.indices[k]]; + var svgElement = getSvgElement(displayable); + var textSvgElement = getTextSvgElement(displayable); + remove$1(svgRoot, svgElement); + remove$1(svgRoot, textSvgElement); + } + } + } + for (i = 0; i < diff.length; i++) { + var item = diff[i]; + if (item.added) { + for (var k = 0; k < item.count; k++) { + var displayable = newVisibleList[item.indices[k]]; + var svgElement = getSvgElement(displayable); + var textSvgElement = getTextSvgElement(displayable); + prevSvgElement + ? insertAfter(svgRoot, svgElement, prevSvgElement) + : prepend(svgRoot, svgElement); + if (svgElement) { + insertAfter(svgRoot, textSvgElement, svgElement); + } + else if (prevSvgElement) { + insertAfter( + svgRoot, textSvgElement, prevSvgElement + ); + } + else { + prepend(svgRoot, textSvgElement); + } + // Insert text + insertAfter(svgRoot, textSvgElement, svgElement); + prevSvgElement = textSvgElement || svgElement + || prevSvgElement; + + this.gradientManager + .addWithoutUpdate(svgElement, displayable); + this.shadowManager + .addWithoutUpdate(prevSvgElement, displayable); + this.clipPathManager.markUsed(displayable); + } + } + else if (!item.removed) { + for (var k = 0; k < item.count; k++) { + var displayable = newVisibleList[item.indices[k]]; + prevSvgElement + = svgElement + = getTextSvgElement(displayable) + || getSvgElement(displayable) + || prevSvgElement; + + this.gradientManager.markUsed(displayable); + this.gradientManager + .addWithoutUpdate(svgElement, displayable); + + this.shadowManager.markUsed(displayable); + this.shadowManager + .addWithoutUpdate(svgElement, displayable); + + this.clipPathManager.markUsed(displayable); + } + } + } + + this.gradientManager.removeUnused(); + this.clipPathManager.removeUnused(); + this.shadowManager.removeUnused(); + + this._visibleList = newVisibleList; + }, + + _getDefs: function (isForceCreating) { + var svgRoot = this._svgRoot; + var defs = this._svgRoot.getElementsByTagName('defs'); + if (defs.length === 0) { + // Not exist + if (isForceCreating) { + var defs = svgRoot.insertBefore( + createElement('defs'), // Create new tag + svgRoot.firstChild // Insert in the front of svg + ); + if (!defs.contains) { + // IE doesn't support contains method + defs.contains = function (el) { + var children = defs.children; + if (!children) { + return false; + } + for (var i = children.length - 1; i >= 0; --i) { + if (children[i] === el) { + return true; + } + } + return false; + }; + } + return defs; + } + else { + return null; + } + } + else { + return defs[0]; + } + }, + + resize: function (width, height) { + var viewport = this._viewport; + // FIXME Why ? + viewport.style.display = 'none'; + + // Save input w/h + var opts = this._opts; + width != null && (opts.width = width); + height != null && (opts.height = height); + + width = this._getSize(0); + height = this._getSize(1); + + viewport.style.display = ''; + + if (this._width !== width || this._height !== height) { + this._width = width; + this._height = height; + + var viewportStyle = viewport.style; + viewportStyle.width = width + 'px'; + viewportStyle.height = height + 'px'; + + var svgRoot = this._svgRoot; + // Set width by 'svgRoot.width = width' is invalid + svgRoot.setAttribute('width', width); + svgRoot.setAttribute('height', height); + } + }, + + /** + * 获取绘图区域宽度 + */ + getWidth: function () { + return this._width; + }, + + /** + * 获取绘图区域高度 + */ + getHeight: function () { + return this._height; + }, + + _getSize: function (whIdx) { + var opts = this._opts; + var wh = ['width', 'height'][whIdx]; + var cwh = ['clientWidth', 'clientHeight'][whIdx]; + var plt = ['paddingLeft', 'paddingTop'][whIdx]; + var prb = ['paddingRight', 'paddingBottom'][whIdx]; + + if (opts[wh] != null && opts[wh] !== 'auto') { + return parseFloat(opts[wh]); + } + + var root = this.root; + // IE8 does not support getComputedStyle, but it use VML. + var stl = document.defaultView.getComputedStyle(root); + + return ( + (root[cwh] || parseInt10$2(stl[wh]) || parseInt10$2(root.style[wh])) + - (parseInt10$2(stl[plt]) || 0) + - (parseInt10$2(stl[prb]) || 0) + ) | 0; + }, + + dispose: function () { + this.root.innerHTML = ''; + + this._svgRoot + = this._viewport + = this.storage + = null; + }, + + clear: function () { + if (this._viewport) { + this.root.removeChild(this._viewport); + } + }, + + pathToDataUrl: function () { + this.refresh(); + var html = this._svgRoot.outerHTML; + return 'data:image/svg+xml;charset=UTF-8,' + html; + } +}; + +// Not supported methods +function createMethodNotSupport$1(method) { + return function () { + zrLog('In SVG mode painter not support method "' + method + '"'); + }; +} + +// Unsuppoted methods +each$1([ + 'getLayer', 'insertLayer', 'eachLayer', 'eachBuiltinLayer', + 'eachOtherLayer', 'getLayers', 'modLayer', 'delLayer', 'clearLayer', + 'toDataURL', 'pathToImage' +], function (name) { + SVGPainter.prototype[name] = createMethodNotSupport$1(name); +}); + +registerPainter('svg', SVGPainter); + +/* +* Licensed to the Apache Software Foundation (ASF) under one +* or more contributor license agreements. See the NOTICE file +* distributed with this work for additional information +* regarding copyright ownership. The ASF licenses this file +* to you under the Apache License, Version 2.0 (the +* "License"); you may not use this file except in compliance +* with the License. You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, +* software distributed under the License is distributed on an +* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +* KIND, either express or implied. See the License for the +* specific language governing permissions and limitations +* under the License. +*/ + +// Import all charts and components + +exports.version = version; +exports.dependencies = dependencies; +exports.PRIORITY = PRIORITY; +exports.init = init; +exports.connect = connect; +exports.disConnect = disConnect; +exports.disconnect = disconnect; +exports.dispose = dispose; +exports.getInstanceByDom = getInstanceByDom; +exports.getInstanceById = getInstanceById; +exports.registerTheme = registerTheme; +exports.registerPreprocessor = registerPreprocessor; +exports.registerProcessor = registerProcessor; +exports.registerPostUpdate = registerPostUpdate; +exports.registerAction = registerAction; +exports.registerCoordinateSystem = registerCoordinateSystem; +exports.getCoordinateSystemDimensions = getCoordinateSystemDimensions; +exports.registerLayout = registerLayout; +exports.registerVisual = registerVisual; +exports.registerLoading = registerLoading; +exports.extendComponentModel = extendComponentModel; +exports.extendComponentView = extendComponentView; +exports.extendSeriesModel = extendSeriesModel; +exports.extendChartView = extendChartView; +exports.setCanvasCreator = setCanvasCreator; +exports.registerMap = registerMap; +exports.getMap = getMap; +exports.dataTool = dataTool; +exports.zrender = zrender; +exports.graphic = graphic; +exports.number = number; +exports.format = format; +exports.throttle = throttle; +exports.helper = helper; +exports.matrix = matrix; +exports.vector = vector; +exports.color = color; +exports.parseGeoJSON = parseGeoJson$1; +exports.parseGeoJson = parseGeoJson; +exports.util = ecUtil; +exports.List = List; +exports.Model = Model; +exports.Axis = Axis; +exports.env = env$1; + +}))); +//# sourceMappingURL=echarts.js.map +; +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// This is CodeMirror (https://codemirror.net), a code editor +// implemented in JavaScript on top of the browser's DOM. +// +// You can find some technical background for some of the code below +// at http://marijnhaverbeke.nl/blog/#cm-internals . + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global.CodeMirror = factory()); +}(this, (function () { 'use strict'; + + // Kludges for bugs and behavior differences that can't be feature + // detected are enabled based on userAgent etc sniffing. + var userAgent = navigator.userAgent; + var platform = navigator.platform; + + var gecko = /gecko\/\d/i.test(userAgent); + var ie_upto10 = /MSIE \d/.test(userAgent); + var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(userAgent); + var edge = /Edge\/(\d+)/.exec(userAgent); + var ie = ie_upto10 || ie_11up || edge; + var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : +(edge || ie_11up)[1]); + var webkit = !edge && /WebKit\//.test(userAgent); + var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(userAgent); + var chrome = !edge && /Chrome\//.test(userAgent); + var presto = /Opera\//.test(userAgent); + var safari = /Apple Computer/.test(navigator.vendor); + var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(userAgent); + var phantom = /PhantomJS/.test(userAgent); + + var ios = !edge && /AppleWebKit/.test(userAgent) && /Mobile\/\w+/.test(userAgent); + var android = /Android/.test(userAgent); + // This is woefully incomplete. Suggestions for alternative methods welcome. + var mobile = ios || android || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent); + var mac = ios || /Mac/.test(platform); + var chromeOS = /\bCrOS\b/.test(userAgent); + var windows = /win/i.test(platform); + + var presto_version = presto && userAgent.match(/Version\/(\d*\.\d*)/); + if (presto_version) { presto_version = Number(presto_version[1]); } + if (presto_version && presto_version >= 15) { presto = false; webkit = true; } + // Some browsers use the wrong event properties to signal cmd/ctrl on OS X + var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11)); + var captureRightClick = gecko || (ie && ie_version >= 9); + + function classTest(cls) { return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*") } + + var rmClass = function(node, cls) { + var current = node.className; + var match = classTest(cls).exec(current); + if (match) { + var after = current.slice(match.index + match[0].length); + node.className = current.slice(0, match.index) + (after ? match[1] + after : ""); + } + }; + + function removeChildren(e) { + for (var count = e.childNodes.length; count > 0; --count) + { e.removeChild(e.firstChild); } + return e + } + + function removeChildrenAndAdd(parent, e) { + return removeChildren(parent).appendChild(e) + } + + function elt(tag, content, className, style) { + var e = document.createElement(tag); + if (className) { e.className = className; } + if (style) { e.style.cssText = style; } + if (typeof content == "string") { e.appendChild(document.createTextNode(content)); } + else if (content) { for (var i = 0; i < content.length; ++i) { e.appendChild(content[i]); } } + return e + } + // wrapper for elt, which removes the elt from the accessibility tree + function eltP(tag, content, className, style) { + var e = elt(tag, content, className, style); + e.setAttribute("role", "presentation"); + return e + } + + var range; + if (document.createRange) { range = function(node, start, end, endNode) { + var r = document.createRange(); + r.setEnd(endNode || node, end); + r.setStart(node, start); + return r + }; } + else { range = function(node, start, end) { + var r = document.body.createTextRange(); + try { r.moveToElementText(node.parentNode); } + catch(e) { return r } + r.collapse(true); + r.moveEnd("character", end); + r.moveStart("character", start); + return r + }; } + + function contains(parent, child) { + if (child.nodeType == 3) // Android browser always returns false when child is a textnode + { child = child.parentNode; } + if (parent.contains) + { return parent.contains(child) } + do { + if (child.nodeType == 11) { child = child.host; } + if (child == parent) { return true } + } while (child = child.parentNode) + } + + function activeElt() { + // IE and Edge may throw an "Unspecified Error" when accessing document.activeElement. + // IE < 10 will throw when accessed while the page is loading or in an iframe. + // IE > 9 and Edge will throw when accessed in an iframe if document.body is unavailable. + var activeElement; + try { + activeElement = document.activeElement; + } catch(e) { + activeElement = document.body || null; + } + while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement) + { activeElement = activeElement.shadowRoot.activeElement; } + return activeElement + } + + function addClass(node, cls) { + var current = node.className; + if (!classTest(cls).test(current)) { node.className += (current ? " " : "") + cls; } + } + function joinClasses(a, b) { + var as = a.split(" "); + for (var i = 0; i < as.length; i++) + { if (as[i] && !classTest(as[i]).test(b)) { b += " " + as[i]; } } + return b + } + + var selectInput = function(node) { node.select(); }; + if (ios) // Mobile Safari apparently has a bug where select() is broken. + { selectInput = function(node) { node.selectionStart = 0; node.selectionEnd = node.value.length; }; } + else if (ie) // Suppress mysterious IE10 errors + { selectInput = function(node) { try { node.select(); } catch(_e) {} }; } + + function bind(f) { + var args = Array.prototype.slice.call(arguments, 1); + return function(){return f.apply(null, args)} + } + + function copyObj(obj, target, overwrite) { + if (!target) { target = {}; } + for (var prop in obj) + { if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop))) + { target[prop] = obj[prop]; } } + return target + } + + // Counts the column offset in a string, taking tabs into account. + // Used mostly to find indentation. + function countColumn(string, end, tabSize, startIndex, startValue) { + if (end == null) { + end = string.search(/[^\s\u00a0]/); + if (end == -1) { end = string.length; } + } + for (var i = startIndex || 0, n = startValue || 0;;) { + var nextTab = string.indexOf("\t", i); + if (nextTab < 0 || nextTab >= end) + { return n + (end - i) } + n += nextTab - i; + n += tabSize - (n % tabSize); + i = nextTab + 1; + } + } + + var Delayed = function() {this.id = null;}; + Delayed.prototype.set = function (ms, f) { + clearTimeout(this.id); + this.id = setTimeout(f, ms); + }; + + function indexOf(array, elt) { + for (var i = 0; i < array.length; ++i) + { if (array[i] == elt) { return i } } + return -1 + } + + // Number of pixels added to scroller and sizer to hide scrollbar + var scrollerGap = 30; + + // Returned or thrown by various protocols to signal 'I'm not + // handling this'. + var Pass = {toString: function(){return "CodeMirror.Pass"}}; + + // Reused option objects for setSelection & friends + var sel_dontScroll = {scroll: false}, sel_mouse = {origin: "*mouse"}, sel_move = {origin: "+move"}; + + // The inverse of countColumn -- find the offset that corresponds to + // a particular column. + function findColumn(string, goal, tabSize) { + for (var pos = 0, col = 0;;) { + var nextTab = string.indexOf("\t", pos); + if (nextTab == -1) { nextTab = string.length; } + var skipped = nextTab - pos; + if (nextTab == string.length || col + skipped >= goal) + { return pos + Math.min(skipped, goal - col) } + col += nextTab - pos; + col += tabSize - (col % tabSize); + pos = nextTab + 1; + if (col >= goal) { return pos } + } + } + + var spaceStrs = [""]; + function spaceStr(n) { + while (spaceStrs.length <= n) + { spaceStrs.push(lst(spaceStrs) + " "); } + return spaceStrs[n] + } + + function lst(arr) { return arr[arr.length-1] } + + function map(array, f) { + var out = []; + for (var i = 0; i < array.length; i++) { out[i] = f(array[i], i); } + return out + } + + function insertSorted(array, value, score) { + var pos = 0, priority = score(value); + while (pos < array.length && score(array[pos]) <= priority) { pos++; } + array.splice(pos, 0, value); + } + + function nothing() {} + + function createObj(base, props) { + var inst; + if (Object.create) { + inst = Object.create(base); + } else { + nothing.prototype = base; + inst = new nothing(); + } + if (props) { copyObj(props, inst); } + return inst + } + + var nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/; + function isWordCharBasic(ch) { + return /\w/.test(ch) || ch > "\x80" && + (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)) + } + function isWordChar(ch, helper) { + if (!helper) { return isWordCharBasic(ch) } + if (helper.source.indexOf("\\w") > -1 && isWordCharBasic(ch)) { return true } + return helper.test(ch) + } + + function isEmpty(obj) { + for (var n in obj) { if (obj.hasOwnProperty(n) && obj[n]) { return false } } + return true + } + + // Extending unicode characters. A series of a non-extending char + + // any number of extending chars is treated as a single unit as far + // as editing and measuring is concerned. This is not fully correct, + // since some scripts/fonts/browsers also treat other configurations + // of code points as a group. + var extendingChars = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/; + function isExtendingChar(ch) { return ch.charCodeAt(0) >= 768 && extendingChars.test(ch) } + + // Returns a number from the range [`0`; `str.length`] unless `pos` is outside that range. + function skipExtendingChars(str, pos, dir) { + while ((dir < 0 ? pos > 0 : pos < str.length) && isExtendingChar(str.charAt(pos))) { pos += dir; } + return pos + } + + // Returns the value from the range [`from`; `to`] that satisfies + // `pred` and is closest to `from`. Assumes that at least `to` + // satisfies `pred`. Supports `from` being greater than `to`. + function findFirst(pred, from, to) { + // At any point we are certain `to` satisfies `pred`, don't know + // whether `from` does. + var dir = from > to ? -1 : 1; + for (;;) { + if (from == to) { return from } + var midF = (from + to) / 2, mid = dir < 0 ? Math.ceil(midF) : Math.floor(midF); + if (mid == from) { return pred(mid) ? from : to } + if (pred(mid)) { to = mid; } + else { from = mid + dir; } + } + } + + // BIDI HELPERS + + function iterateBidiSections(order, from, to, f) { + if (!order) { return f(from, to, "ltr", 0) } + var found = false; + for (var i = 0; i < order.length; ++i) { + var part = order[i]; + if (part.from < to && part.to > from || from == to && part.to == from) { + f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr", i); + found = true; + } + } + if (!found) { f(from, to, "ltr"); } + } + + var bidiOther = null; + function getBidiPartAt(order, ch, sticky) { + var found; + bidiOther = null; + for (var i = 0; i < order.length; ++i) { + var cur = order[i]; + if (cur.from < ch && cur.to > ch) { return i } + if (cur.to == ch) { + if (cur.from != cur.to && sticky == "before") { found = i; } + else { bidiOther = i; } + } + if (cur.from == ch) { + if (cur.from != cur.to && sticky != "before") { found = i; } + else { bidiOther = i; } + } + } + return found != null ? found : bidiOther + } + + // Bidirectional ordering algorithm + // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm + // that this (partially) implements. + + // One-char codes used for character types: + // L (L): Left-to-Right + // R (R): Right-to-Left + // r (AL): Right-to-Left Arabic + // 1 (EN): European Number + // + (ES): European Number Separator + // % (ET): European Number Terminator + // n (AN): Arabic Number + // , (CS): Common Number Separator + // m (NSM): Non-Spacing Mark + // b (BN): Boundary Neutral + // s (B): Paragraph Separator + // t (S): Segment Separator + // w (WS): Whitespace + // N (ON): Other Neutrals + + // Returns null if characters are ordered as they appear + // (left-to-right), or an array of sections ({from, to, level} + // objects) in the order in which they occur visually. + var bidiOrdering = (function() { + // Character types for codepoints 0 to 0xff + var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN"; + // Character types for codepoints 0x600 to 0x6f9 + var arabicTypes = "nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111"; + function charType(code) { + if (code <= 0xf7) { return lowTypes.charAt(code) } + else if (0x590 <= code && code <= 0x5f4) { return "R" } + else if (0x600 <= code && code <= 0x6f9) { return arabicTypes.charAt(code - 0x600) } + else if (0x6ee <= code && code <= 0x8ac) { return "r" } + else if (0x2000 <= code && code <= 0x200b) { return "w" } + else if (code == 0x200c) { return "b" } + else { return "L" } + } + + var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/; + var isNeutral = /[stwN]/, isStrong = /[LRr]/, countsAsLeft = /[Lb1n]/, countsAsNum = /[1n]/; + + function BidiSpan(level, from, to) { + this.level = level; + this.from = from; this.to = to; + } + + return function(str, direction) { + var outerType = direction == "ltr" ? "L" : "R"; + + if (str.length == 0 || direction == "ltr" && !bidiRE.test(str)) { return false } + var len = str.length, types = []; + for (var i = 0; i < len; ++i) + { types.push(charType(str.charCodeAt(i))); } + + // W1. Examine each non-spacing mark (NSM) in the level run, and + // change the type of the NSM to the type of the previous + // character. If the NSM is at the start of the level run, it will + // get the type of sor. + for (var i$1 = 0, prev = outerType; i$1 < len; ++i$1) { + var type = types[i$1]; + if (type == "m") { types[i$1] = prev; } + else { prev = type; } + } + + // W2. Search backwards from each instance of a European number + // until the first strong type (R, L, AL, or sor) is found. If an + // AL is found, change the type of the European number to Arabic + // number. + // W3. Change all ALs to R. + for (var i$2 = 0, cur = outerType; i$2 < len; ++i$2) { + var type$1 = types[i$2]; + if (type$1 == "1" && cur == "r") { types[i$2] = "n"; } + else if (isStrong.test(type$1)) { cur = type$1; if (type$1 == "r") { types[i$2] = "R"; } } + } + + // W4. A single European separator between two European numbers + // changes to a European number. A single common separator between + // two numbers of the same type changes to that type. + for (var i$3 = 1, prev$1 = types[0]; i$3 < len - 1; ++i$3) { + var type$2 = types[i$3]; + if (type$2 == "+" && prev$1 == "1" && types[i$3+1] == "1") { types[i$3] = "1"; } + else if (type$2 == "," && prev$1 == types[i$3+1] && + (prev$1 == "1" || prev$1 == "n")) { types[i$3] = prev$1; } + prev$1 = type$2; + } + + // W5. A sequence of European terminators adjacent to European + // numbers changes to all European numbers. + // W6. Otherwise, separators and terminators change to Other + // Neutral. + for (var i$4 = 0; i$4 < len; ++i$4) { + var type$3 = types[i$4]; + if (type$3 == ",") { types[i$4] = "N"; } + else if (type$3 == "%") { + var end = (void 0); + for (end = i$4 + 1; end < len && types[end] == "%"; ++end) {} + var replace = (i$4 && types[i$4-1] == "!") || (end < len && types[end] == "1") ? "1" : "N"; + for (var j = i$4; j < end; ++j) { types[j] = replace; } + i$4 = end - 1; + } + } + + // W7. Search backwards from each instance of a European number + // until the first strong type (R, L, or sor) is found. If an L is + // found, then change the type of the European number to L. + for (var i$5 = 0, cur$1 = outerType; i$5 < len; ++i$5) { + var type$4 = types[i$5]; + if (cur$1 == "L" && type$4 == "1") { types[i$5] = "L"; } + else if (isStrong.test(type$4)) { cur$1 = type$4; } + } + + // N1. A sequence of neutrals takes the direction of the + // surrounding strong text if the text on both sides has the same + // direction. European and Arabic numbers act as if they were R in + // terms of their influence on neutrals. Start-of-level-run (sor) + // and end-of-level-run (eor) are used at level run boundaries. + // N2. Any remaining neutrals take the embedding direction. + for (var i$6 = 0; i$6 < len; ++i$6) { + if (isNeutral.test(types[i$6])) { + var end$1 = (void 0); + for (end$1 = i$6 + 1; end$1 < len && isNeutral.test(types[end$1]); ++end$1) {} + var before = (i$6 ? types[i$6-1] : outerType) == "L"; + var after = (end$1 < len ? types[end$1] : outerType) == "L"; + var replace$1 = before == after ? (before ? "L" : "R") : outerType; + for (var j$1 = i$6; j$1 < end$1; ++j$1) { types[j$1] = replace$1; } + i$6 = end$1 - 1; + } + } + + // Here we depart from the documented algorithm, in order to avoid + // building up an actual levels array. Since there are only three + // levels (0, 1, 2) in an implementation that doesn't take + // explicit embedding into account, we can build up the order on + // the fly, without following the level-based algorithm. + var order = [], m; + for (var i$7 = 0; i$7 < len;) { + if (countsAsLeft.test(types[i$7])) { + var start = i$7; + for (++i$7; i$7 < len && countsAsLeft.test(types[i$7]); ++i$7) {} + order.push(new BidiSpan(0, start, i$7)); + } else { + var pos = i$7, at = order.length; + for (++i$7; i$7 < len && types[i$7] != "L"; ++i$7) {} + for (var j$2 = pos; j$2 < i$7;) { + if (countsAsNum.test(types[j$2])) { + if (pos < j$2) { order.splice(at, 0, new BidiSpan(1, pos, j$2)); } + var nstart = j$2; + for (++j$2; j$2 < i$7 && countsAsNum.test(types[j$2]); ++j$2) {} + order.splice(at, 0, new BidiSpan(2, nstart, j$2)); + pos = j$2; + } else { ++j$2; } + } + if (pos < i$7) { order.splice(at, 0, new BidiSpan(1, pos, i$7)); } + } + } + if (direction == "ltr") { + if (order[0].level == 1 && (m = str.match(/^\s+/))) { + order[0].from = m[0].length; + order.unshift(new BidiSpan(0, 0, m[0].length)); + } + if (lst(order).level == 1 && (m = str.match(/\s+$/))) { + lst(order).to -= m[0].length; + order.push(new BidiSpan(0, len - m[0].length, len)); + } + } + + return direction == "rtl" ? order.reverse() : order + } + })(); + + // Get the bidi ordering for the given line (and cache it). Returns + // false for lines that are fully left-to-right, and an array of + // BidiSpan objects otherwise. + function getOrder(line, direction) { + var order = line.order; + if (order == null) { order = line.order = bidiOrdering(line.text, direction); } + return order + } + + // EVENT HANDLING + + // Lightweight event framework. on/off also work on DOM nodes, + // registering native DOM handlers. + + var noHandlers = []; + + var on = function(emitter, type, f) { + if (emitter.addEventListener) { + emitter.addEventListener(type, f, false); + } else if (emitter.attachEvent) { + emitter.attachEvent("on" + type, f); + } else { + var map$$1 = emitter._handlers || (emitter._handlers = {}); + map$$1[type] = (map$$1[type] || noHandlers).concat(f); + } + }; + + function getHandlers(emitter, type) { + return emitter._handlers && emitter._handlers[type] || noHandlers + } + + function off(emitter, type, f) { + if (emitter.removeEventListener) { + emitter.removeEventListener(type, f, false); + } else if (emitter.detachEvent) { + emitter.detachEvent("on" + type, f); + } else { + var map$$1 = emitter._handlers, arr = map$$1 && map$$1[type]; + if (arr) { + var index = indexOf(arr, f); + if (index > -1) + { map$$1[type] = arr.slice(0, index).concat(arr.slice(index + 1)); } + } + } + } + + function signal(emitter, type /*, values...*/) { + var handlers = getHandlers(emitter, type); + if (!handlers.length) { return } + var args = Array.prototype.slice.call(arguments, 2); + for (var i = 0; i < handlers.length; ++i) { handlers[i].apply(null, args); } + } + + // The DOM events that CodeMirror handles can be overridden by + // registering a (non-DOM) handler on the editor for the event name, + // and preventDefault-ing the event in that handler. + function signalDOMEvent(cm, e, override) { + if (typeof e == "string") + { e = {type: e, preventDefault: function() { this.defaultPrevented = true; }}; } + signal(cm, override || e.type, cm, e); + return e_defaultPrevented(e) || e.codemirrorIgnore + } + + function signalCursorActivity(cm) { + var arr = cm._handlers && cm._handlers.cursorActivity; + if (!arr) { return } + var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []); + for (var i = 0; i < arr.length; ++i) { if (indexOf(set, arr[i]) == -1) + { set.push(arr[i]); } } + } + + function hasHandler(emitter, type) { + return getHandlers(emitter, type).length > 0 + } + + // Add on and off methods to a constructor's prototype, to make + // registering events on such objects more convenient. + function eventMixin(ctor) { + ctor.prototype.on = function(type, f) {on(this, type, f);}; + ctor.prototype.off = function(type, f) {off(this, type, f);}; + } + + // Due to the fact that we still support jurassic IE versions, some + // compatibility wrappers are needed. + + function e_preventDefault(e) { + if (e.preventDefault) { e.preventDefault(); } + else { e.returnValue = false; } + } + function e_stopPropagation(e) { + if (e.stopPropagation) { e.stopPropagation(); } + else { e.cancelBubble = true; } + } + function e_defaultPrevented(e) { + return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false + } + function e_stop(e) {e_preventDefault(e); e_stopPropagation(e);} + + function e_target(e) {return e.target || e.srcElement} + function e_button(e) { + var b = e.which; + if (b == null) { + if (e.button & 1) { b = 1; } + else if (e.button & 2) { b = 3; } + else if (e.button & 4) { b = 2; } + } + if (mac && e.ctrlKey && b == 1) { b = 3; } + return b + } + + // Detect drag-and-drop + var dragAndDrop = function() { + // There is *some* kind of drag-and-drop support in IE6-8, but I + // couldn't get it to work yet. + if (ie && ie_version < 9) { return false } + var div = elt('div'); + return "draggable" in div || "dragDrop" in div + }(); + + var zwspSupported; + function zeroWidthElement(measure) { + if (zwspSupported == null) { + var test = elt("span", "\u200b"); + removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")])); + if (measure.firstChild.offsetHeight != 0) + { zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8); } + } + var node = zwspSupported ? elt("span", "\u200b") : + elt("span", "\u00a0", null, "display: inline-block; width: 1px; margin-right: -1px"); + node.setAttribute("cm-text", ""); + return node + } + + // Feature-detect IE's crummy client rect reporting for bidi text + var badBidiRects; + function hasBadBidiRects(measure) { + if (badBidiRects != null) { return badBidiRects } + var txt = removeChildrenAndAdd(measure, document.createTextNode("A\u062eA")); + var r0 = range(txt, 0, 1).getBoundingClientRect(); + var r1 = range(txt, 1, 2).getBoundingClientRect(); + removeChildren(measure); + if (!r0 || r0.left == r0.right) { return false } // Safari returns null in some cases (#2780) + return badBidiRects = (r1.right - r0.right < 3) + } + + // See if "".split is the broken IE version, if so, provide an + // alternative way to split lines. + var splitLinesAuto = "\n\nb".split(/\n/).length != 3 ? function (string) { + var pos = 0, result = [], l = string.length; + while (pos <= l) { + var nl = string.indexOf("\n", pos); + if (nl == -1) { nl = string.length; } + var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl); + var rt = line.indexOf("\r"); + if (rt != -1) { + result.push(line.slice(0, rt)); + pos += rt + 1; + } else { + result.push(line); + pos = nl + 1; + } + } + return result + } : function (string) { return string.split(/\r\n?|\n/); }; + + var hasSelection = window.getSelection ? function (te) { + try { return te.selectionStart != te.selectionEnd } + catch(e) { return false } + } : function (te) { + var range$$1; + try {range$$1 = te.ownerDocument.selection.createRange();} + catch(e) {} + if (!range$$1 || range$$1.parentElement() != te) { return false } + return range$$1.compareEndPoints("StartToEnd", range$$1) != 0 + }; + + var hasCopyEvent = (function () { + var e = elt("div"); + if ("oncopy" in e) { return true } + e.setAttribute("oncopy", "return;"); + return typeof e.oncopy == "function" + })(); + + var badZoomedRects = null; + function hasBadZoomedRects(measure) { + if (badZoomedRects != null) { return badZoomedRects } + var node = removeChildrenAndAdd(measure, elt("span", "x")); + var normal = node.getBoundingClientRect(); + var fromRange = range(node, 0, 1).getBoundingClientRect(); + return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1 + } + + // Known modes, by name and by MIME + var modes = {}, mimeModes = {}; + + // Extra arguments are stored as the mode's dependencies, which is + // used by (legacy) mechanisms like loadmode.js to automatically + // load a mode. (Preferred mechanism is the require/define calls.) + function defineMode(name, mode) { + if (arguments.length > 2) + { mode.dependencies = Array.prototype.slice.call(arguments, 2); } + modes[name] = mode; + } + + function defineMIME(mime, spec) { + mimeModes[mime] = spec; + } + + // Given a MIME type, a {name, ...options} config object, or a name + // string, return a mode config object. + function resolveMode(spec) { + if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) { + spec = mimeModes[spec]; + } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) { + var found = mimeModes[spec.name]; + if (typeof found == "string") { found = {name: found}; } + spec = createObj(found, spec); + spec.name = found.name; + } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) { + return resolveMode("application/xml") + } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+json$/.test(spec)) { + return resolveMode("application/json") + } + if (typeof spec == "string") { return {name: spec} } + else { return spec || {name: "null"} } + } + + // Given a mode spec (anything that resolveMode accepts), find and + // initialize an actual mode object. + function getMode(options, spec) { + spec = resolveMode(spec); + var mfactory = modes[spec.name]; + if (!mfactory) { return getMode(options, "text/plain") } + var modeObj = mfactory(options, spec); + if (modeExtensions.hasOwnProperty(spec.name)) { + var exts = modeExtensions[spec.name]; + for (var prop in exts) { + if (!exts.hasOwnProperty(prop)) { continue } + if (modeObj.hasOwnProperty(prop)) { modeObj["_" + prop] = modeObj[prop]; } + modeObj[prop] = exts[prop]; + } + } + modeObj.name = spec.name; + if (spec.helperType) { modeObj.helperType = spec.helperType; } + if (spec.modeProps) { for (var prop$1 in spec.modeProps) + { modeObj[prop$1] = spec.modeProps[prop$1]; } } + + return modeObj + } + + // This can be used to attach properties to mode objects from + // outside the actual mode definition. + var modeExtensions = {}; + function extendMode(mode, properties) { + var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : (modeExtensions[mode] = {}); + copyObj(properties, exts); + } + + function copyState(mode, state) { + if (state === true) { return state } + if (mode.copyState) { return mode.copyState(state) } + var nstate = {}; + for (var n in state) { + var val = state[n]; + if (val instanceof Array) { val = val.concat([]); } + nstate[n] = val; + } + return nstate + } + + // Given a mode and a state (for that mode), find the inner mode and + // state at the position that the state refers to. + function innerMode(mode, state) { + var info; + while (mode.innerMode) { + info = mode.innerMode(state); + if (!info || info.mode == mode) { break } + state = info.state; + mode = info.mode; + } + return info || {mode: mode, state: state} + } + + function startState(mode, a1, a2) { + return mode.startState ? mode.startState(a1, a2) : true + } + + // STRING STREAM + + // Fed to the mode parsers, provides helper functions to make + // parsers more succinct. + + var StringStream = function(string, tabSize, lineOracle) { + this.pos = this.start = 0; + this.string = string; + this.tabSize = tabSize || 8; + this.lastColumnPos = this.lastColumnValue = 0; + this.lineStart = 0; + this.lineOracle = lineOracle; + }; + + StringStream.prototype.eol = function () {return this.pos >= this.string.length}; + StringStream.prototype.sol = function () {return this.pos == this.lineStart}; + StringStream.prototype.peek = function () {return this.string.charAt(this.pos) || undefined}; + StringStream.prototype.next = function () { + if (this.pos < this.string.length) + { return this.string.charAt(this.pos++) } + }; + StringStream.prototype.eat = function (match) { + var ch = this.string.charAt(this.pos); + var ok; + if (typeof match == "string") { ok = ch == match; } + else { ok = ch && (match.test ? match.test(ch) : match(ch)); } + if (ok) {++this.pos; return ch} + }; + StringStream.prototype.eatWhile = function (match) { + var start = this.pos; + while (this.eat(match)){} + return this.pos > start + }; + StringStream.prototype.eatSpace = function () { + var this$1 = this; + + var start = this.pos; + while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) { ++this$1.pos; } + return this.pos > start + }; + StringStream.prototype.skipToEnd = function () {this.pos = this.string.length;}; + StringStream.prototype.skipTo = function (ch) { + var found = this.string.indexOf(ch, this.pos); + if (found > -1) {this.pos = found; return true} + }; + StringStream.prototype.backUp = function (n) {this.pos -= n;}; + StringStream.prototype.column = function () { + if (this.lastColumnPos < this.start) { + this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue); + this.lastColumnPos = this.start; + } + return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0) + }; + StringStream.prototype.indentation = function () { + return countColumn(this.string, null, this.tabSize) - + (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0) + }; + StringStream.prototype.match = function (pattern, consume, caseInsensitive) { + if (typeof pattern == "string") { + var cased = function (str) { return caseInsensitive ? str.toLowerCase() : str; }; + var substr = this.string.substr(this.pos, pattern.length); + if (cased(substr) == cased(pattern)) { + if (consume !== false) { this.pos += pattern.length; } + return true + } + } else { + var match = this.string.slice(this.pos).match(pattern); + if (match && match.index > 0) { return null } + if (match && consume !== false) { this.pos += match[0].length; } + return match + } + }; + StringStream.prototype.current = function (){return this.string.slice(this.start, this.pos)}; + StringStream.prototype.hideFirstChars = function (n, inner) { + this.lineStart += n; + try { return inner() } + finally { this.lineStart -= n; } + }; + StringStream.prototype.lookAhead = function (n) { + var oracle = this.lineOracle; + return oracle && oracle.lookAhead(n) + }; + StringStream.prototype.baseToken = function () { + var oracle = this.lineOracle; + return oracle && oracle.baseToken(this.pos) + }; + + // Find the line object corresponding to the given line number. + function getLine(doc, n) { + n -= doc.first; + if (n < 0 || n >= doc.size) { throw new Error("There is no line " + (n + doc.first) + " in the document.") } + var chunk = doc; + while (!chunk.lines) { + for (var i = 0;; ++i) { + var child = chunk.children[i], sz = child.chunkSize(); + if (n < sz) { chunk = child; break } + n -= sz; + } + } + return chunk.lines[n] + } + + // Get the part of a document between two positions, as an array of + // strings. + function getBetween(doc, start, end) { + var out = [], n = start.line; + doc.iter(start.line, end.line + 1, function (line) { + var text = line.text; + if (n == end.line) { text = text.slice(0, end.ch); } + if (n == start.line) { text = text.slice(start.ch); } + out.push(text); + ++n; + }); + return out + } + // Get the lines between from and to, as array of strings. + function getLines(doc, from, to) { + var out = []; + doc.iter(from, to, function (line) { out.push(line.text); }); // iter aborts when callback returns truthy value + return out + } + + // Update the height of a line, propagating the height change + // upwards to parent nodes. + function updateLineHeight(line, height) { + var diff = height - line.height; + if (diff) { for (var n = line; n; n = n.parent) { n.height += diff; } } + } + + // Given a line object, find its line number by walking up through + // its parent links. + function lineNo(line) { + if (line.parent == null) { return null } + var cur = line.parent, no = indexOf(cur.lines, line); + for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) { + for (var i = 0;; ++i) { + if (chunk.children[i] == cur) { break } + no += chunk.children[i].chunkSize(); + } + } + return no + cur.first + } + + // Find the line at the given vertical position, using the height + // information in the document tree. + function lineAtHeight(chunk, h) { + var n = chunk.first; + outer: do { + for (var i$1 = 0; i$1 < chunk.children.length; ++i$1) { + var child = chunk.children[i$1], ch = child.height; + if (h < ch) { chunk = child; continue outer } + h -= ch; + n += child.chunkSize(); + } + return n + } while (!chunk.lines) + var i = 0; + for (; i < chunk.lines.length; ++i) { + var line = chunk.lines[i], lh = line.height; + if (h < lh) { break } + h -= lh; + } + return n + i + } + + function isLine(doc, l) {return l >= doc.first && l < doc.first + doc.size} + + function lineNumberFor(options, i) { + return String(options.lineNumberFormatter(i + options.firstLineNumber)) + } + + // A Pos instance represents a position within the text. + function Pos(line, ch, sticky) { + if ( sticky === void 0 ) sticky = null; + + if (!(this instanceof Pos)) { return new Pos(line, ch, sticky) } + this.line = line; + this.ch = ch; + this.sticky = sticky; + } + + // Compare two positions, return 0 if they are the same, a negative + // number when a is less, and a positive number otherwise. + function cmp(a, b) { return a.line - b.line || a.ch - b.ch } + + function equalCursorPos(a, b) { return a.sticky == b.sticky && cmp(a, b) == 0 } + + function copyPos(x) {return Pos(x.line, x.ch)} + function maxPos(a, b) { return cmp(a, b) < 0 ? b : a } + function minPos(a, b) { return cmp(a, b) < 0 ? a : b } + + // Most of the external API clips given positions to make sure they + // actually exist within the document. + function clipLine(doc, n) {return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1))} + function clipPos(doc, pos) { + if (pos.line < doc.first) { return Pos(doc.first, 0) } + var last = doc.first + doc.size - 1; + if (pos.line > last) { return Pos(last, getLine(doc, last).text.length) } + return clipToLen(pos, getLine(doc, pos.line).text.length) + } + function clipToLen(pos, linelen) { + var ch = pos.ch; + if (ch == null || ch > linelen) { return Pos(pos.line, linelen) } + else if (ch < 0) { return Pos(pos.line, 0) } + else { return pos } + } + function clipPosArray(doc, array) { + var out = []; + for (var i = 0; i < array.length; i++) { out[i] = clipPos(doc, array[i]); } + return out + } + + var SavedContext = function(state, lookAhead) { + this.state = state; + this.lookAhead = lookAhead; + }; + + var Context = function(doc, state, line, lookAhead) { + this.state = state; + this.doc = doc; + this.line = line; + this.maxLookAhead = lookAhead || 0; + this.baseTokens = null; + this.baseTokenPos = 1; + }; + + Context.prototype.lookAhead = function (n) { + var line = this.doc.getLine(this.line + n); + if (line != null && n > this.maxLookAhead) { this.maxLookAhead = n; } + return line + }; + + Context.prototype.baseToken = function (n) { + var this$1 = this; + + if (!this.baseTokens) { return null } + while (this.baseTokens[this.baseTokenPos] <= n) + { this$1.baseTokenPos += 2; } + var type = this.baseTokens[this.baseTokenPos + 1]; + return {type: type && type.replace(/( |^)overlay .*/, ""), + size: this.baseTokens[this.baseTokenPos] - n} + }; + + Context.prototype.nextLine = function () { + this.line++; + if (this.maxLookAhead > 0) { this.maxLookAhead--; } + }; + + Context.fromSaved = function (doc, saved, line) { + if (saved instanceof SavedContext) + { return new Context(doc, copyState(doc.mode, saved.state), line, saved.lookAhead) } + else + { return new Context(doc, copyState(doc.mode, saved), line) } + }; + + Context.prototype.save = function (copy) { + var state = copy !== false ? copyState(this.doc.mode, this.state) : this.state; + return this.maxLookAhead > 0 ? new SavedContext(state, this.maxLookAhead) : state + }; + + + // Compute a style array (an array starting with a mode generation + // -- for invalidation -- followed by pairs of end positions and + // style strings), which is used to highlight the tokens on the + // line. + function highlightLine(cm, line, context, forceToEnd) { + // A styles array always starts with a number identifying the + // mode/overlays that it is based on (for easy invalidation). + var st = [cm.state.modeGen], lineClasses = {}; + // Compute the base array of styles + runMode(cm, line.text, cm.doc.mode, context, function (end, style) { return st.push(end, style); }, + lineClasses, forceToEnd); + var state = context.state; + + // Run overlays, adjust style array. + var loop = function ( o ) { + context.baseTokens = st; + var overlay = cm.state.overlays[o], i = 1, at = 0; + context.state = true; + runMode(cm, line.text, overlay.mode, context, function (end, style) { + var start = i; + // Ensure there's a token end at the current position, and that i points at it + while (at < end) { + var i_end = st[i]; + if (i_end > end) + { st.splice(i, 1, end, st[i+1], i_end); } + i += 2; + at = Math.min(end, i_end); + } + if (!style) { return } + if (overlay.opaque) { + st.splice(start, i - start, end, "overlay " + style); + i = start + 2; + } else { + for (; start < i; start += 2) { + var cur = st[start+1]; + st[start+1] = (cur ? cur + " " : "") + "overlay " + style; + } + } + }, lineClasses); + context.state = state; + context.baseTokens = null; + context.baseTokenPos = 1; + }; + + for (var o = 0; o < cm.state.overlays.length; ++o) loop( o ); + + return {styles: st, classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null} + } + + function getLineStyles(cm, line, updateFrontier) { + if (!line.styles || line.styles[0] != cm.state.modeGen) { + var context = getContextBefore(cm, lineNo(line)); + var resetState = line.text.length > cm.options.maxHighlightLength && copyState(cm.doc.mode, context.state); + var result = highlightLine(cm, line, context); + if (resetState) { context.state = resetState; } + line.stateAfter = context.save(!resetState); + line.styles = result.styles; + if (result.classes) { line.styleClasses = result.classes; } + else if (line.styleClasses) { line.styleClasses = null; } + if (updateFrontier === cm.doc.highlightFrontier) + { cm.doc.modeFrontier = Math.max(cm.doc.modeFrontier, ++cm.doc.highlightFrontier); } + } + return line.styles + } + + function getContextBefore(cm, n, precise) { + var doc = cm.doc, display = cm.display; + if (!doc.mode.startState) { return new Context(doc, true, n) } + var start = findStartLine(cm, n, precise); + var saved = start > doc.first && getLine(doc, start - 1).stateAfter; + var context = saved ? Context.fromSaved(doc, saved, start) : new Context(doc, startState(doc.mode), start); + + doc.iter(start, n, function (line) { + processLine(cm, line.text, context); + var pos = context.line; + line.stateAfter = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo ? context.save() : null; + context.nextLine(); + }); + if (precise) { doc.modeFrontier = context.line; } + return context + } + + // Lightweight form of highlight -- proceed over this line and + // update state, but don't save a style array. Used for lines that + // aren't currently visible. + function processLine(cm, text, context, startAt) { + var mode = cm.doc.mode; + var stream = new StringStream(text, cm.options.tabSize, context); + stream.start = stream.pos = startAt || 0; + if (text == "") { callBlankLine(mode, context.state); } + while (!stream.eol()) { + readToken(mode, stream, context.state); + stream.start = stream.pos; + } + } + + function callBlankLine(mode, state) { + if (mode.blankLine) { return mode.blankLine(state) } + if (!mode.innerMode) { return } + var inner = innerMode(mode, state); + if (inner.mode.blankLine) { return inner.mode.blankLine(inner.state) } + } + + function readToken(mode, stream, state, inner) { + for (var i = 0; i < 10; i++) { + if (inner) { inner[0] = innerMode(mode, state).mode; } + var style = mode.token(stream, state); + if (stream.pos > stream.start) { return style } + } + throw new Error("Mode " + mode.name + " failed to advance stream.") + } + + var Token = function(stream, type, state) { + this.start = stream.start; this.end = stream.pos; + this.string = stream.current(); + this.type = type || null; + this.state = state; + }; + + // Utility for getTokenAt and getLineTokens + function takeToken(cm, pos, precise, asArray) { + var doc = cm.doc, mode = doc.mode, style; + pos = clipPos(doc, pos); + var line = getLine(doc, pos.line), context = getContextBefore(cm, pos.line, precise); + var stream = new StringStream(line.text, cm.options.tabSize, context), tokens; + if (asArray) { tokens = []; } + while ((asArray || stream.pos < pos.ch) && !stream.eol()) { + stream.start = stream.pos; + style = readToken(mode, stream, context.state); + if (asArray) { tokens.push(new Token(stream, style, copyState(doc.mode, context.state))); } + } + return asArray ? tokens : new Token(stream, style, context.state) + } + + function extractLineClasses(type, output) { + if (type) { for (;;) { + var lineClass = type.match(/(?:^|\s+)line-(background-)?(\S+)/); + if (!lineClass) { break } + type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length); + var prop = lineClass[1] ? "bgClass" : "textClass"; + if (output[prop] == null) + { output[prop] = lineClass[2]; } + else if (!(new RegExp("(?:^|\s)" + lineClass[2] + "(?:$|\s)")).test(output[prop])) + { output[prop] += " " + lineClass[2]; } + } } + return type + } + + // Run the given mode's parser over a line, calling f for each token. + function runMode(cm, text, mode, context, f, lineClasses, forceToEnd) { + var flattenSpans = mode.flattenSpans; + if (flattenSpans == null) { flattenSpans = cm.options.flattenSpans; } + var curStart = 0, curStyle = null; + var stream = new StringStream(text, cm.options.tabSize, context), style; + var inner = cm.options.addModeClass && [null]; + if (text == "") { extractLineClasses(callBlankLine(mode, context.state), lineClasses); } + while (!stream.eol()) { + if (stream.pos > cm.options.maxHighlightLength) { + flattenSpans = false; + if (forceToEnd) { processLine(cm, text, context, stream.pos); } + stream.pos = text.length; + style = null; + } else { + style = extractLineClasses(readToken(mode, stream, context.state, inner), lineClasses); + } + if (inner) { + var mName = inner[0].name; + if (mName) { style = "m-" + (style ? mName + " " + style : mName); } + } + if (!flattenSpans || curStyle != style) { + while (curStart < stream.start) { + curStart = Math.min(stream.start, curStart + 5000); + f(curStart, curStyle); + } + curStyle = style; + } + stream.start = stream.pos; + } + while (curStart < stream.pos) { + // Webkit seems to refuse to render text nodes longer than 57444 + // characters, and returns inaccurate measurements in nodes + // starting around 5000 chars. + var pos = Math.min(stream.pos, curStart + 5000); + f(pos, curStyle); + curStart = pos; + } + } + + // Finds the line to start with when starting a parse. Tries to + // find a line with a stateAfter, so that it can start with a + // valid state. If that fails, it returns the line with the + // smallest indentation, which tends to need the least context to + // parse correctly. + function findStartLine(cm, n, precise) { + var minindent, minline, doc = cm.doc; + var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100); + for (var search = n; search > lim; --search) { + if (search <= doc.first) { return doc.first } + var line = getLine(doc, search - 1), after = line.stateAfter; + if (after && (!precise || search + (after instanceof SavedContext ? after.lookAhead : 0) <= doc.modeFrontier)) + { return search } + var indented = countColumn(line.text, null, cm.options.tabSize); + if (minline == null || minindent > indented) { + minline = search - 1; + minindent = indented; + } + } + return minline + } + + function retreatFrontier(doc, n) { + doc.modeFrontier = Math.min(doc.modeFrontier, n); + if (doc.highlightFrontier < n - 10) { return } + var start = doc.first; + for (var line = n - 1; line > start; line--) { + var saved = getLine(doc, line).stateAfter; + // change is on 3 + // state on line 1 looked ahead 2 -- so saw 3 + // test 1 + 2 < 3 should cover this + if (saved && (!(saved instanceof SavedContext) || line + saved.lookAhead < n)) { + start = line + 1; + break + } + } + doc.highlightFrontier = Math.min(doc.highlightFrontier, start); + } + + // Optimize some code when these features are not used. + var sawReadOnlySpans = false, sawCollapsedSpans = false; + + function seeReadOnlySpans() { + sawReadOnlySpans = true; + } + + function seeCollapsedSpans() { + sawCollapsedSpans = true; + } + + // TEXTMARKER SPANS + + function MarkedSpan(marker, from, to) { + this.marker = marker; + this.from = from; this.to = to; + } + + // Search an array of spans for a span matching the given marker. + function getMarkedSpanFor(spans, marker) { + if (spans) { for (var i = 0; i < spans.length; ++i) { + var span = spans[i]; + if (span.marker == marker) { return span } + } } + } + // Remove a span from an array, returning undefined if no spans are + // left (we don't store arrays for lines without spans). + function removeMarkedSpan(spans, span) { + var r; + for (var i = 0; i < spans.length; ++i) + { if (spans[i] != span) { (r || (r = [])).push(spans[i]); } } + return r + } + // Add a span to a line. + function addMarkedSpan(line, span) { + line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span]; + span.marker.attachLine(line); + } + + // Used for the algorithm that adjusts markers for a change in the + // document. These functions cut an array of spans at a given + // character position, returning an array of remaining chunks (or + // undefined if nothing remains). + function markedSpansBefore(old, startCh, isInsert) { + var nw; + if (old) { for (var i = 0; i < old.length; ++i) { + var span = old[i], marker = span.marker; + var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh); + if (startsBefore || span.from == startCh && marker.type == "bookmark" && (!isInsert || !span.marker.insertLeft)) { + var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh) + ;(nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to)); + } + } } + return nw + } + function markedSpansAfter(old, endCh, isInsert) { + var nw; + if (old) { for (var i = 0; i < old.length; ++i) { + var span = old[i], marker = span.marker; + var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh); + if (endsAfter || span.from == endCh && marker.type == "bookmark" && (!isInsert || span.marker.insertLeft)) { + var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh) + ;(nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh, + span.to == null ? null : span.to - endCh)); + } + } } + return nw + } + + // Given a change object, compute the new set of marker spans that + // cover the line in which the change took place. Removes spans + // entirely within the change, reconnects spans belonging to the + // same marker that appear on both sides of the change, and cuts off + // spans partially within the change. Returns an array of span + // arrays with one element for each line in (after) the change. + function stretchSpansOverChange(doc, change) { + if (change.full) { return null } + var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans; + var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans; + if (!oldFirst && !oldLast) { return null } + + var startCh = change.from.ch, endCh = change.to.ch, isInsert = cmp(change.from, change.to) == 0; + // Get the spans that 'stick out' on both sides + var first = markedSpansBefore(oldFirst, startCh, isInsert); + var last = markedSpansAfter(oldLast, endCh, isInsert); + + // Next, merge those two ends + var sameLine = change.text.length == 1, offset = lst(change.text).length + (sameLine ? startCh : 0); + if (first) { + // Fix up .to properties of first + for (var i = 0; i < first.length; ++i) { + var span = first[i]; + if (span.to == null) { + var found = getMarkedSpanFor(last, span.marker); + if (!found) { span.to = startCh; } + else if (sameLine) { span.to = found.to == null ? null : found.to + offset; } + } + } + } + if (last) { + // Fix up .from in last (or move them into first in case of sameLine) + for (var i$1 = 0; i$1 < last.length; ++i$1) { + var span$1 = last[i$1]; + if (span$1.to != null) { span$1.to += offset; } + if (span$1.from == null) { + var found$1 = getMarkedSpanFor(first, span$1.marker); + if (!found$1) { + span$1.from = offset; + if (sameLine) { (first || (first = [])).push(span$1); } + } + } else { + span$1.from += offset; + if (sameLine) { (first || (first = [])).push(span$1); } + } + } + } + // Make sure we didn't create any zero-length spans + if (first) { first = clearEmptySpans(first); } + if (last && last != first) { last = clearEmptySpans(last); } + + var newMarkers = [first]; + if (!sameLine) { + // Fill gap with whole-line-spans + var gap = change.text.length - 2, gapMarkers; + if (gap > 0 && first) + { for (var i$2 = 0; i$2 < first.length; ++i$2) + { if (first[i$2].to == null) + { (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i$2].marker, null, null)); } } } + for (var i$3 = 0; i$3 < gap; ++i$3) + { newMarkers.push(gapMarkers); } + newMarkers.push(last); + } + return newMarkers + } + + // Remove spans that are empty and don't have a clearWhenEmpty + // option of false. + function clearEmptySpans(spans) { + for (var i = 0; i < spans.length; ++i) { + var span = spans[i]; + if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false) + { spans.splice(i--, 1); } + } + if (!spans.length) { return null } + return spans + } + + // Used to 'clip' out readOnly ranges when making a change. + function removeReadOnlyRanges(doc, from, to) { + var markers = null; + doc.iter(from.line, to.line + 1, function (line) { + if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) { + var mark = line.markedSpans[i].marker; + if (mark.readOnly && (!markers || indexOf(markers, mark) == -1)) + { (markers || (markers = [])).push(mark); } + } } + }); + if (!markers) { return null } + var parts = [{from: from, to: to}]; + for (var i = 0; i < markers.length; ++i) { + var mk = markers[i], m = mk.find(0); + for (var j = 0; j < parts.length; ++j) { + var p = parts[j]; + if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) { continue } + var newParts = [j, 1], dfrom = cmp(p.from, m.from), dto = cmp(p.to, m.to); + if (dfrom < 0 || !mk.inclusiveLeft && !dfrom) + { newParts.push({from: p.from, to: m.from}); } + if (dto > 0 || !mk.inclusiveRight && !dto) + { newParts.push({from: m.to, to: p.to}); } + parts.splice.apply(parts, newParts); + j += newParts.length - 3; + } + } + return parts + } + + // Connect or disconnect spans from a line. + function detachMarkedSpans(line) { + var spans = line.markedSpans; + if (!spans) { return } + for (var i = 0; i < spans.length; ++i) + { spans[i].marker.detachLine(line); } + line.markedSpans = null; + } + function attachMarkedSpans(line, spans) { + if (!spans) { return } + for (var i = 0; i < spans.length; ++i) + { spans[i].marker.attachLine(line); } + line.markedSpans = spans; + } + + // Helpers used when computing which overlapping collapsed span + // counts as the larger one. + function extraLeft(marker) { return marker.inclusiveLeft ? -1 : 0 } + function extraRight(marker) { return marker.inclusiveRight ? 1 : 0 } + + // Returns a number indicating which of two overlapping collapsed + // spans is larger (and thus includes the other). Falls back to + // comparing ids when the spans cover exactly the same range. + function compareCollapsedMarkers(a, b) { + var lenDiff = a.lines.length - b.lines.length; + if (lenDiff != 0) { return lenDiff } + var aPos = a.find(), bPos = b.find(); + var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b); + if (fromCmp) { return -fromCmp } + var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b); + if (toCmp) { return toCmp } + return b.id - a.id + } + + // Find out whether a line ends or starts in a collapsed span. If + // so, return the marker for that span. + function collapsedSpanAtSide(line, start) { + var sps = sawCollapsedSpans && line.markedSpans, found; + if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) { + sp = sps[i]; + if (sp.marker.collapsed && (start ? sp.from : sp.to) == null && + (!found || compareCollapsedMarkers(found, sp.marker) < 0)) + { found = sp.marker; } + } } + return found + } + function collapsedSpanAtStart(line) { return collapsedSpanAtSide(line, true) } + function collapsedSpanAtEnd(line) { return collapsedSpanAtSide(line, false) } + + function collapsedSpanAround(line, ch) { + var sps = sawCollapsedSpans && line.markedSpans, found; + if (sps) { for (var i = 0; i < sps.length; ++i) { + var sp = sps[i]; + if (sp.marker.collapsed && (sp.from == null || sp.from < ch) && (sp.to == null || sp.to > ch) && + (!found || compareCollapsedMarkers(found, sp.marker) < 0)) { found = sp.marker; } + } } + return found + } + + // Test whether there exists a collapsed span that partially + // overlaps (covers the start or end, but not both) of a new span. + // Such overlap is not allowed. + function conflictingCollapsedRange(doc, lineNo$$1, from, to, marker) { + var line = getLine(doc, lineNo$$1); + var sps = sawCollapsedSpans && line.markedSpans; + if (sps) { for (var i = 0; i < sps.length; ++i) { + var sp = sps[i]; + if (!sp.marker.collapsed) { continue } + var found = sp.marker.find(0); + var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker); + var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker); + if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) { continue } + if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) || + fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0)) + { return true } + } } + } + + // A visual line is a line as drawn on the screen. Folding, for + // example, can cause multiple logical lines to appear on the same + // visual line. This finds the start of the visual line that the + // given line is part of (usually that is the line itself). + function visualLine(line) { + var merged; + while (merged = collapsedSpanAtStart(line)) + { line = merged.find(-1, true).line; } + return line + } + + function visualLineEnd(line) { + var merged; + while (merged = collapsedSpanAtEnd(line)) + { line = merged.find(1, true).line; } + return line + } + + // Returns an array of logical lines that continue the visual line + // started by the argument, or undefined if there are no such lines. + function visualLineContinued(line) { + var merged, lines; + while (merged = collapsedSpanAtEnd(line)) { + line = merged.find(1, true).line + ;(lines || (lines = [])).push(line); + } + return lines + } + + // Get the line number of the start of the visual line that the + // given line number is part of. + function visualLineNo(doc, lineN) { + var line = getLine(doc, lineN), vis = visualLine(line); + if (line == vis) { return lineN } + return lineNo(vis) + } + + // Get the line number of the start of the next visual line after + // the given line. + function visualLineEndNo(doc, lineN) { + if (lineN > doc.lastLine()) { return lineN } + var line = getLine(doc, lineN), merged; + if (!lineIsHidden(doc, line)) { return lineN } + while (merged = collapsedSpanAtEnd(line)) + { line = merged.find(1, true).line; } + return lineNo(line) + 1 + } + + // Compute whether a line is hidden. Lines count as hidden when they + // are part of a visual line that starts with another line, or when + // they are entirely covered by collapsed, non-widget span. + function lineIsHidden(doc, line) { + var sps = sawCollapsedSpans && line.markedSpans; + if (sps) { for (var sp = (void 0), i = 0; i < sps.length; ++i) { + sp = sps[i]; + if (!sp.marker.collapsed) { continue } + if (sp.from == null) { return true } + if (sp.marker.widgetNode) { continue } + if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp)) + { return true } + } } + } + function lineIsHiddenInner(doc, line, span) { + if (span.to == null) { + var end = span.marker.find(1, true); + return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker)) + } + if (span.marker.inclusiveRight && span.to == line.text.length) + { return true } + for (var sp = (void 0), i = 0; i < line.markedSpans.length; ++i) { + sp = line.markedSpans[i]; + if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to && + (sp.to == null || sp.to != span.from) && + (sp.marker.inclusiveLeft || span.marker.inclusiveRight) && + lineIsHiddenInner(doc, line, sp)) { return true } + } + } + + // Find the height above the given line. + function heightAtLine(lineObj) { + lineObj = visualLine(lineObj); + + var h = 0, chunk = lineObj.parent; + for (var i = 0; i < chunk.lines.length; ++i) { + var line = chunk.lines[i]; + if (line == lineObj) { break } + else { h += line.height; } + } + for (var p = chunk.parent; p; chunk = p, p = chunk.parent) { + for (var i$1 = 0; i$1 < p.children.length; ++i$1) { + var cur = p.children[i$1]; + if (cur == chunk) { break } + else { h += cur.height; } + } + } + return h + } + + // Compute the character length of a line, taking into account + // collapsed ranges (see markText) that might hide parts, and join + // other lines onto it. + function lineLength(line) { + if (line.height == 0) { return 0 } + var len = line.text.length, merged, cur = line; + while (merged = collapsedSpanAtStart(cur)) { + var found = merged.find(0, true); + cur = found.from.line; + len += found.from.ch - found.to.ch; + } + cur = line; + while (merged = collapsedSpanAtEnd(cur)) { + var found$1 = merged.find(0, true); + len -= cur.text.length - found$1.from.ch; + cur = found$1.to.line; + len += cur.text.length - found$1.to.ch; + } + return len + } + + // Find the longest line in the document. + function findMaxLine(cm) { + var d = cm.display, doc = cm.doc; + d.maxLine = getLine(doc, doc.first); + d.maxLineLength = lineLength(d.maxLine); + d.maxLineChanged = true; + doc.iter(function (line) { + var len = lineLength(line); + if (len > d.maxLineLength) { + d.maxLineLength = len; + d.maxLine = line; + } + }); + } + + // LINE DATA STRUCTURE + + // Line objects. These hold state related to a line, including + // highlighting info (the styles array). + var Line = function(text, markedSpans, estimateHeight) { + this.text = text; + attachMarkedSpans(this, markedSpans); + this.height = estimateHeight ? estimateHeight(this) : 1; + }; + + Line.prototype.lineNo = function () { return lineNo(this) }; + eventMixin(Line); + + // Change the content (text, markers) of a line. Automatically + // invalidates cached information and tries to re-estimate the + // line's height. + function updateLine(line, text, markedSpans, estimateHeight) { + line.text = text; + if (line.stateAfter) { line.stateAfter = null; } + if (line.styles) { line.styles = null; } + if (line.order != null) { line.order = null; } + detachMarkedSpans(line); + attachMarkedSpans(line, markedSpans); + var estHeight = estimateHeight ? estimateHeight(line) : 1; + if (estHeight != line.height) { updateLineHeight(line, estHeight); } + } + + // Detach a line from the document tree and its markers. + function cleanUpLine(line) { + line.parent = null; + detachMarkedSpans(line); + } + + // Convert a style as returned by a mode (either null, or a string + // containing one or more styles) to a CSS style. This is cached, + // and also looks for line-wide styles. + var styleToClassCache = {}, styleToClassCacheWithMode = {}; + function interpretTokenStyle(style, options) { + if (!style || /^\s*$/.test(style)) { return null } + var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache; + return cache[style] || + (cache[style] = style.replace(/\S+/g, "cm-$&")) + } + + // Render the DOM representation of the text of a line. Also builds + // up a 'line map', which points at the DOM nodes that represent + // specific stretches of text, and is used by the measuring code. + // The returned object contains the DOM node, this map, and + // information about line-wide styles that were set by the mode. + function buildLineContent(cm, lineView) { + // The padding-right forces the element to have a 'border', which + // is needed on Webkit to be able to get line-level bounding + // rectangles for it (in measureChar). + var content = eltP("span", null, null, webkit ? "padding-right: .1px" : null); + var builder = {pre: eltP("pre", [content], "CodeMirror-line"), content: content, + col: 0, pos: 0, cm: cm, + trailingSpace: false, + splitSpaces: cm.getOption("lineWrapping")}; + lineView.measure = {}; + + // Iterate over the logical lines that make up this visual line. + for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) { + var line = i ? lineView.rest[i - 1] : lineView.line, order = (void 0); + builder.pos = 0; + builder.addToken = buildToken; + // Optionally wire in some hacks into the token-rendering + // algorithm, to deal with browser quirks. + if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line, cm.doc.direction))) + { builder.addToken = buildTokenBadBidi(builder.addToken, order); } + builder.map = []; + var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line); + insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate)); + if (line.styleClasses) { + if (line.styleClasses.bgClass) + { builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || ""); } + if (line.styleClasses.textClass) + { builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || ""); } + } + + // Ensure at least a single node is present, for measuring. + if (builder.map.length == 0) + { builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure))); } + + // Store the map and a cache object for the current logical line + if (i == 0) { + lineView.measure.map = builder.map; + lineView.measure.cache = {}; + } else { + (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map) + ;(lineView.measure.caches || (lineView.measure.caches = [])).push({}); + } + } + + // See issue #2901 + if (webkit) { + var last = builder.content.lastChild; + if (/\bcm-tab\b/.test(last.className) || (last.querySelector && last.querySelector(".cm-tab"))) + { builder.content.className = "cm-tab-wrap-hack"; } + } + + signal(cm, "renderLine", cm, lineView.line, builder.pre); + if (builder.pre.className) + { builder.textClass = joinClasses(builder.pre.className, builder.textClass || ""); } + + return builder + } + + function defaultSpecialCharPlaceholder(ch) { + var token = elt("span", "\u2022", "cm-invalidchar"); + token.title = "\\u" + ch.charCodeAt(0).toString(16); + token.setAttribute("aria-label", token.title); + return token + } + + // Build up the DOM representation for a single token, and add it to + // the line map. Takes care to render special characters separately. + function buildToken(builder, text, style, startStyle, endStyle, css, attributes) { + if (!text) { return } + var displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text; + var special = builder.cm.state.specialChars, mustWrap = false; + var content; + if (!special.test(text)) { + builder.col += text.length; + content = document.createTextNode(displayText); + builder.map.push(builder.pos, builder.pos + text.length, content); + if (ie && ie_version < 9) { mustWrap = true; } + builder.pos += text.length; + } else { + content = document.createDocumentFragment(); + var pos = 0; + while (true) { + special.lastIndex = pos; + var m = special.exec(text); + var skipped = m ? m.index - pos : text.length - pos; + if (skipped) { + var txt = document.createTextNode(displayText.slice(pos, pos + skipped)); + if (ie && ie_version < 9) { content.appendChild(elt("span", [txt])); } + else { content.appendChild(txt); } + builder.map.push(builder.pos, builder.pos + skipped, txt); + builder.col += skipped; + builder.pos += skipped; + } + if (!m) { break } + pos += skipped + 1; + var txt$1 = (void 0); + if (m[0] == "\t") { + var tabSize = builder.cm.options.tabSize, tabWidth = tabSize - builder.col % tabSize; + txt$1 = content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab")); + txt$1.setAttribute("role", "presentation"); + txt$1.setAttribute("cm-text", "\t"); + builder.col += tabWidth; + } else if (m[0] == "\r" || m[0] == "\n") { + txt$1 = content.appendChild(elt("span", m[0] == "\r" ? "\u240d" : "\u2424", "cm-invalidchar")); + txt$1.setAttribute("cm-text", m[0]); + builder.col += 1; + } else { + txt$1 = builder.cm.options.specialCharPlaceholder(m[0]); + txt$1.setAttribute("cm-text", m[0]); + if (ie && ie_version < 9) { content.appendChild(elt("span", [txt$1])); } + else { content.appendChild(txt$1); } + builder.col += 1; + } + builder.map.push(builder.pos, builder.pos + 1, txt$1); + builder.pos++; + } + } + builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32; + if (style || startStyle || endStyle || mustWrap || css) { + var fullStyle = style || ""; + if (startStyle) { fullStyle += startStyle; } + if (endStyle) { fullStyle += endStyle; } + var token = elt("span", [content], fullStyle, css); + if (attributes) { + for (var attr in attributes) { if (attributes.hasOwnProperty(attr) && attr != "style" && attr != "class") + { token.setAttribute(attr, attributes[attr]); } } + } + return builder.content.appendChild(token) + } + builder.content.appendChild(content); + } + + // Change some spaces to NBSP to prevent the browser from collapsing + // trailing spaces at the end of a line when rendering text (issue #1362). + function splitSpaces(text, trailingBefore) { + if (text.length > 1 && !/ /.test(text)) { return text } + var spaceBefore = trailingBefore, result = ""; + for (var i = 0; i < text.length; i++) { + var ch = text.charAt(i); + if (ch == " " && spaceBefore && (i == text.length - 1 || text.charCodeAt(i + 1) == 32)) + { ch = "\u00a0"; } + result += ch; + spaceBefore = ch == " "; + } + return result + } + + // Work around nonsense dimensions being reported for stretches of + // right-to-left text. + function buildTokenBadBidi(inner, order) { + return function (builder, text, style, startStyle, endStyle, css, attributes) { + style = style ? style + " cm-force-border" : "cm-force-border"; + var start = builder.pos, end = start + text.length; + for (;;) { + // Find the part that overlaps with the start of this text + var part = (void 0); + for (var i = 0; i < order.length; i++) { + part = order[i]; + if (part.to > start && part.from <= start) { break } + } + if (part.to >= end) { return inner(builder, text, style, startStyle, endStyle, css, attributes) } + inner(builder, text.slice(0, part.to - start), style, startStyle, null, css, attributes); + startStyle = null; + text = text.slice(part.to - start); + start = part.to; + } + } + } + + function buildCollapsedSpan(builder, size, marker, ignoreWidget) { + var widget = !ignoreWidget && marker.widgetNode; + if (widget) { builder.map.push(builder.pos, builder.pos + size, widget); } + if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) { + if (!widget) + { widget = builder.content.appendChild(document.createElement("span")); } + widget.setAttribute("cm-marker", marker.id); + } + if (widget) { + builder.cm.display.input.setUneditable(widget); + builder.content.appendChild(widget); + } + builder.pos += size; + builder.trailingSpace = false; + } + + // Outputs a number of spans to make up a line, taking highlighting + // and marked text into account. + function insertLineContent(line, builder, styles) { + var spans = line.markedSpans, allText = line.text, at = 0; + if (!spans) { + for (var i$1 = 1; i$1 < styles.length; i$1+=2) + { builder.addToken(builder, allText.slice(at, at = styles[i$1]), interpretTokenStyle(styles[i$1+1], builder.cm.options)); } + return + } + + var len = allText.length, pos = 0, i = 1, text = "", style, css; + var nextChange = 0, spanStyle, spanEndStyle, spanStartStyle, collapsed, attributes; + for (;;) { + if (nextChange == pos) { // Update current marker set + spanStyle = spanEndStyle = spanStartStyle = css = ""; + attributes = null; + collapsed = null; nextChange = Infinity; + var foundBookmarks = [], endStyles = (void 0); + for (var j = 0; j < spans.length; ++j) { + var sp = spans[j], m = sp.marker; + if (m.type == "bookmark" && sp.from == pos && m.widgetNode) { + foundBookmarks.push(m); + } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) { + if (sp.to != null && sp.to != pos && nextChange > sp.to) { + nextChange = sp.to; + spanEndStyle = ""; + } + if (m.className) { spanStyle += " " + m.className; } + if (m.css) { css = (css ? css + ";" : "") + m.css; } + if (m.startStyle && sp.from == pos) { spanStartStyle += " " + m.startStyle; } + if (m.endStyle && sp.to == nextChange) { (endStyles || (endStyles = [])).push(m.endStyle, sp.to); } + // support for the old title property + // https://github.com/codemirror/CodeMirror/pull/5673 + if (m.title) { (attributes || (attributes = {})).title = m.title; } + if (m.attributes) { + for (var attr in m.attributes) + { (attributes || (attributes = {}))[attr] = m.attributes[attr]; } + } + if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0)) + { collapsed = sp; } + } else if (sp.from > pos && nextChange > sp.from) { + nextChange = sp.from; + } + } + if (endStyles) { for (var j$1 = 0; j$1 < endStyles.length; j$1 += 2) + { if (endStyles[j$1 + 1] == nextChange) { spanEndStyle += " " + endStyles[j$1]; } } } + + if (!collapsed || collapsed.from == pos) { for (var j$2 = 0; j$2 < foundBookmarks.length; ++j$2) + { buildCollapsedSpan(builder, 0, foundBookmarks[j$2]); } } + if (collapsed && (collapsed.from || 0) == pos) { + buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos, + collapsed.marker, collapsed.from == null); + if (collapsed.to == null) { return } + if (collapsed.to == pos) { collapsed = false; } + } + } + if (pos >= len) { break } + + var upto = Math.min(len, nextChange); + while (true) { + if (text) { + var end = pos + text.length; + if (!collapsed) { + var tokenText = end > upto ? text.slice(0, upto - pos) : text; + builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle, + spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", css, attributes); + } + if (end >= upto) {text = text.slice(upto - pos); pos = upto; break} + pos = end; + spanStartStyle = ""; + } + text = allText.slice(at, at = styles[i++]); + style = interpretTokenStyle(styles[i++], builder.cm.options); + } + } + } + + + // These objects are used to represent the visible (currently drawn) + // part of the document. A LineView may correspond to multiple + // logical lines, if those are connected by collapsed ranges. + function LineView(doc, line, lineN) { + // The starting line + this.line = line; + // Continuing lines, if any + this.rest = visualLineContinued(line); + // Number of logical lines in this visual line + this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1; + this.node = this.text = null; + this.hidden = lineIsHidden(doc, line); + } + + // Create a range of LineView objects for the given lines. + function buildViewArray(cm, from, to) { + var array = [], nextPos; + for (var pos = from; pos < to; pos = nextPos) { + var view = new LineView(cm.doc, getLine(cm.doc, pos), pos); + nextPos = pos + view.size; + array.push(view); + } + return array + } + + var operationGroup = null; + + function pushOperation(op) { + if (operationGroup) { + operationGroup.ops.push(op); + } else { + op.ownsGroup = operationGroup = { + ops: [op], + delayedCallbacks: [] + }; + } + } + + function fireCallbacksForOps(group) { + // Calls delayed callbacks and cursorActivity handlers until no + // new ones appear + var callbacks = group.delayedCallbacks, i = 0; + do { + for (; i < callbacks.length; i++) + { callbacks[i].call(null); } + for (var j = 0; j < group.ops.length; j++) { + var op = group.ops[j]; + if (op.cursorActivityHandlers) + { while (op.cursorActivityCalled < op.cursorActivityHandlers.length) + { op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm); } } + } + } while (i < callbacks.length) + } + + function finishOperation(op, endCb) { + var group = op.ownsGroup; + if (!group) { return } + + try { fireCallbacksForOps(group); } + finally { + operationGroup = null; + endCb(group); + } + } + + var orphanDelayedCallbacks = null; + + // Often, we want to signal events at a point where we are in the + // middle of some work, but don't want the handler to start calling + // other methods on the editor, which might be in an inconsistent + // state or simply not expect any other events to happen. + // signalLater looks whether there are any handlers, and schedules + // them to be executed when the last operation ends, or, if no + // operation is active, when a timeout fires. + function signalLater(emitter, type /*, values...*/) { + var arr = getHandlers(emitter, type); + if (!arr.length) { return } + var args = Array.prototype.slice.call(arguments, 2), list; + if (operationGroup) { + list = operationGroup.delayedCallbacks; + } else if (orphanDelayedCallbacks) { + list = orphanDelayedCallbacks; + } else { + list = orphanDelayedCallbacks = []; + setTimeout(fireOrphanDelayed, 0); + } + var loop = function ( i ) { + list.push(function () { return arr[i].apply(null, args); }); + }; + + for (var i = 0; i < arr.length; ++i) + loop( i ); + } + + function fireOrphanDelayed() { + var delayed = orphanDelayedCallbacks; + orphanDelayedCallbacks = null; + for (var i = 0; i < delayed.length; ++i) { delayed[i](); } + } + + // When an aspect of a line changes, a string is added to + // lineView.changes. This updates the relevant part of the line's + // DOM structure. + function updateLineForChanges(cm, lineView, lineN, dims) { + for (var j = 0; j < lineView.changes.length; j++) { + var type = lineView.changes[j]; + if (type == "text") { updateLineText(cm, lineView); } + else if (type == "gutter") { updateLineGutter(cm, lineView, lineN, dims); } + else if (type == "class") { updateLineClasses(cm, lineView); } + else if (type == "widget") { updateLineWidgets(cm, lineView, dims); } + } + lineView.changes = null; + } + + // Lines with gutter elements, widgets or a background class need to + // be wrapped, and have the extra elements added to the wrapper div + function ensureLineWrapped(lineView) { + if (lineView.node == lineView.text) { + lineView.node = elt("div", null, null, "position: relative"); + if (lineView.text.parentNode) + { lineView.text.parentNode.replaceChild(lineView.node, lineView.text); } + lineView.node.appendChild(lineView.text); + if (ie && ie_version < 8) { lineView.node.style.zIndex = 2; } + } + return lineView.node + } + + function updateLineBackground(cm, lineView) { + var cls = lineView.bgClass ? lineView.bgClass + " " + (lineView.line.bgClass || "") : lineView.line.bgClass; + if (cls) { cls += " CodeMirror-linebackground"; } + if (lineView.background) { + if (cls) { lineView.background.className = cls; } + else { lineView.background.parentNode.removeChild(lineView.background); lineView.background = null; } + } else if (cls) { + var wrap = ensureLineWrapped(lineView); + lineView.background = wrap.insertBefore(elt("div", null, cls), wrap.firstChild); + cm.display.input.setUneditable(lineView.background); + } + } + + // Wrapper around buildLineContent which will reuse the structure + // in display.externalMeasured when possible. + function getLineContent(cm, lineView) { + var ext = cm.display.externalMeasured; + if (ext && ext.line == lineView.line) { + cm.display.externalMeasured = null; + lineView.measure = ext.measure; + return ext.built + } + return buildLineContent(cm, lineView) + } + + // Redraw the line's text. Interacts with the background and text + // classes because the mode may output tokens that influence these + // classes. + function updateLineText(cm, lineView) { + var cls = lineView.text.className; + var built = getLineContent(cm, lineView); + if (lineView.text == lineView.node) { lineView.node = built.pre; } + lineView.text.parentNode.replaceChild(built.pre, lineView.text); + lineView.text = built.pre; + if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) { + lineView.bgClass = built.bgClass; + lineView.textClass = built.textClass; + updateLineClasses(cm, lineView); + } else if (cls) { + lineView.text.className = cls; + } + } + + function updateLineClasses(cm, lineView) { + updateLineBackground(cm, lineView); + if (lineView.line.wrapClass) + { ensureLineWrapped(lineView).className = lineView.line.wrapClass; } + else if (lineView.node != lineView.text) + { lineView.node.className = ""; } + var textClass = lineView.textClass ? lineView.textClass + " " + (lineView.line.textClass || "") : lineView.line.textClass; + lineView.text.className = textClass || ""; + } + + function updateLineGutter(cm, lineView, lineN, dims) { + if (lineView.gutter) { + lineView.node.removeChild(lineView.gutter); + lineView.gutter = null; + } + if (lineView.gutterBackground) { + lineView.node.removeChild(lineView.gutterBackground); + lineView.gutterBackground = null; + } + if (lineView.line.gutterClass) { + var wrap = ensureLineWrapped(lineView); + lineView.gutterBackground = elt("div", null, "CodeMirror-gutter-background " + lineView.line.gutterClass, + ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px; width: " + (dims.gutterTotalWidth) + "px")); + cm.display.input.setUneditable(lineView.gutterBackground); + wrap.insertBefore(lineView.gutterBackground, lineView.text); + } + var markers = lineView.line.gutterMarkers; + if (cm.options.lineNumbers || markers) { + var wrap$1 = ensureLineWrapped(lineView); + var gutterWrap = lineView.gutter = elt("div", null, "CodeMirror-gutter-wrapper", ("left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px")); + cm.display.input.setUneditable(gutterWrap); + wrap$1.insertBefore(gutterWrap, lineView.text); + if (lineView.line.gutterClass) + { gutterWrap.className += " " + lineView.line.gutterClass; } + if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"])) + { lineView.lineNumber = gutterWrap.appendChild( + elt("div", lineNumberFor(cm.options, lineN), + "CodeMirror-linenumber CodeMirror-gutter-elt", + ("left: " + (dims.gutterLeft["CodeMirror-linenumbers"]) + "px; width: " + (cm.display.lineNumInnerWidth) + "px"))); } + if (markers) { for (var k = 0; k < cm.display.gutterSpecs.length; ++k) { + var id = cm.display.gutterSpecs[k].className, found = markers.hasOwnProperty(id) && markers[id]; + if (found) + { gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt", + ("left: " + (dims.gutterLeft[id]) + "px; width: " + (dims.gutterWidth[id]) + "px"))); } + } } + } + } + + function updateLineWidgets(cm, lineView, dims) { + if (lineView.alignable) { lineView.alignable = null; } + for (var node = lineView.node.firstChild, next = (void 0); node; node = next) { + next = node.nextSibling; + if (node.className == "CodeMirror-linewidget") + { lineView.node.removeChild(node); } + } + insertLineWidgets(cm, lineView, dims); + } + + // Build a line's DOM representation from scratch + function buildLineElement(cm, lineView, lineN, dims) { + var built = getLineContent(cm, lineView); + lineView.text = lineView.node = built.pre; + if (built.bgClass) { lineView.bgClass = built.bgClass; } + if (built.textClass) { lineView.textClass = built.textClass; } + + updateLineClasses(cm, lineView); + updateLineGutter(cm, lineView, lineN, dims); + insertLineWidgets(cm, lineView, dims); + return lineView.node + } + + // A lineView may contain multiple logical lines (when merged by + // collapsed spans). The widgets for all of them need to be drawn. + function insertLineWidgets(cm, lineView, dims) { + insertLineWidgetsFor(cm, lineView.line, lineView, dims, true); + if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++) + { insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false); } } + } + + function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) { + if (!line.widgets) { return } + var wrap = ensureLineWrapped(lineView); + for (var i = 0, ws = line.widgets; i < ws.length; ++i) { + var widget = ws[i], node = elt("div", [widget.node], "CodeMirror-linewidget"); + if (!widget.handleMouseEvents) { node.setAttribute("cm-ignore-events", "true"); } + positionLineWidget(widget, node, lineView, dims); + cm.display.input.setUneditable(node); + if (allowAbove && widget.above) + { wrap.insertBefore(node, lineView.gutter || lineView.text); } + else + { wrap.appendChild(node); } + signalLater(widget, "redraw"); + } + } + + function positionLineWidget(widget, node, lineView, dims) { + if (widget.noHScroll) { + (lineView.alignable || (lineView.alignable = [])).push(node); + var width = dims.wrapperWidth; + node.style.left = dims.fixedPos + "px"; + if (!widget.coverGutter) { + width -= dims.gutterTotalWidth; + node.style.paddingLeft = dims.gutterTotalWidth + "px"; + } + node.style.width = width + "px"; + } + if (widget.coverGutter) { + node.style.zIndex = 5; + node.style.position = "relative"; + if (!widget.noHScroll) { node.style.marginLeft = -dims.gutterTotalWidth + "px"; } + } + } + + function widgetHeight(widget) { + if (widget.height != null) { return widget.height } + var cm = widget.doc.cm; + if (!cm) { return 0 } + if (!contains(document.body, widget.node)) { + var parentStyle = "position: relative;"; + if (widget.coverGutter) + { parentStyle += "margin-left: -" + cm.display.gutters.offsetWidth + "px;"; } + if (widget.noHScroll) + { parentStyle += "width: " + cm.display.wrapper.clientWidth + "px;"; } + removeChildrenAndAdd(cm.display.measure, elt("div", [widget.node], null, parentStyle)); + } + return widget.height = widget.node.parentNode.offsetHeight + } + + // Return true when the given mouse event happened in a widget + function eventInWidget(display, e) { + for (var n = e_target(e); n != display.wrapper; n = n.parentNode) { + if (!n || (n.nodeType == 1 && n.getAttribute("cm-ignore-events") == "true") || + (n.parentNode == display.sizer && n != display.mover)) + { return true } + } + } + + // POSITION MEASUREMENT + + function paddingTop(display) {return display.lineSpace.offsetTop} + function paddingVert(display) {return display.mover.offsetHeight - display.lineSpace.offsetHeight} + function paddingH(display) { + if (display.cachedPaddingH) { return display.cachedPaddingH } + var e = removeChildrenAndAdd(display.measure, elt("pre", "x", "CodeMirror-line-like")); + var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle; + var data = {left: parseInt(style.paddingLeft), right: parseInt(style.paddingRight)}; + if (!isNaN(data.left) && !isNaN(data.right)) { display.cachedPaddingH = data; } + return data + } + + function scrollGap(cm) { return scrollerGap - cm.display.nativeBarWidth } + function displayWidth(cm) { + return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth + } + function displayHeight(cm) { + return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight + } + + // Ensure the lineView.wrapping.heights array is populated. This is + // an array of bottom offsets for the lines that make up a drawn + // line. When lineWrapping is on, there might be more than one + // height. + function ensureLineHeights(cm, lineView, rect) { + var wrapping = cm.options.lineWrapping; + var curWidth = wrapping && displayWidth(cm); + if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) { + var heights = lineView.measure.heights = []; + if (wrapping) { + lineView.measure.width = curWidth; + var rects = lineView.text.firstChild.getClientRects(); + for (var i = 0; i < rects.length - 1; i++) { + var cur = rects[i], next = rects[i + 1]; + if (Math.abs(cur.bottom - next.bottom) > 2) + { heights.push((cur.bottom + next.top) / 2 - rect.top); } + } + } + heights.push(rect.bottom - rect.top); + } + } + + // Find a line map (mapping character offsets to text nodes) and a + // measurement cache for the given line number. (A line view might + // contain multiple lines when collapsed ranges are present.) + function mapFromLineView(lineView, line, lineN) { + if (lineView.line == line) + { return {map: lineView.measure.map, cache: lineView.measure.cache} } + for (var i = 0; i < lineView.rest.length; i++) + { if (lineView.rest[i] == line) + { return {map: lineView.measure.maps[i], cache: lineView.measure.caches[i]} } } + for (var i$1 = 0; i$1 < lineView.rest.length; i$1++) + { if (lineNo(lineView.rest[i$1]) > lineN) + { return {map: lineView.measure.maps[i$1], cache: lineView.measure.caches[i$1], before: true} } } + } + + // Render a line into the hidden node display.externalMeasured. Used + // when measurement is needed for a line that's not in the viewport. + function updateExternalMeasurement(cm, line) { + line = visualLine(line); + var lineN = lineNo(line); + var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN); + view.lineN = lineN; + var built = view.built = buildLineContent(cm, view); + view.text = built.pre; + removeChildrenAndAdd(cm.display.lineMeasure, built.pre); + return view + } + + // Get a {top, bottom, left, right} box (in line-local coordinates) + // for a given character. + function measureChar(cm, line, ch, bias) { + return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias) + } + + // Find a line view that corresponds to the given line number. + function findViewForLine(cm, lineN) { + if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo) + { return cm.display.view[findViewIndex(cm, lineN)] } + var ext = cm.display.externalMeasured; + if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size) + { return ext } + } + + // Measurement can be split in two steps, the set-up work that + // applies to the whole line, and the measurement of the actual + // character. Functions like coordsChar, that need to do a lot of + // measurements in a row, can thus ensure that the set-up work is + // only done once. + function prepareMeasureForLine(cm, line) { + var lineN = lineNo(line); + var view = findViewForLine(cm, lineN); + if (view && !view.text) { + view = null; + } else if (view && view.changes) { + updateLineForChanges(cm, view, lineN, getDimensions(cm)); + cm.curOp.forceUpdate = true; + } + if (!view) + { view = updateExternalMeasurement(cm, line); } + + var info = mapFromLineView(view, line, lineN); + return { + line: line, view: view, rect: null, + map: info.map, cache: info.cache, before: info.before, + hasHeights: false + } + } + + // Given a prepared measurement object, measures the position of an + // actual character (or fetches it from the cache). + function measureCharPrepared(cm, prepared, ch, bias, varHeight) { + if (prepared.before) { ch = -1; } + var key = ch + (bias || ""), found; + if (prepared.cache.hasOwnProperty(key)) { + found = prepared.cache[key]; + } else { + if (!prepared.rect) + { prepared.rect = prepared.view.text.getBoundingClientRect(); } + if (!prepared.hasHeights) { + ensureLineHeights(cm, prepared.view, prepared.rect); + prepared.hasHeights = true; + } + found = measureCharInner(cm, prepared, ch, bias); + if (!found.bogus) { prepared.cache[key] = found; } + } + return {left: found.left, right: found.right, + top: varHeight ? found.rtop : found.top, + bottom: varHeight ? found.rbottom : found.bottom} + } + + var nullRect = {left: 0, right: 0, top: 0, bottom: 0}; + + function nodeAndOffsetInLineMap(map$$1, ch, bias) { + var node, start, end, collapse, mStart, mEnd; + // First, search the line map for the text node corresponding to, + // or closest to, the target character. + for (var i = 0; i < map$$1.length; i += 3) { + mStart = map$$1[i]; + mEnd = map$$1[i + 1]; + if (ch < mStart) { + start = 0; end = 1; + collapse = "left"; + } else if (ch < mEnd) { + start = ch - mStart; + end = start + 1; + } else if (i == map$$1.length - 3 || ch == mEnd && map$$1[i + 3] > ch) { + end = mEnd - mStart; + start = end - 1; + if (ch >= mEnd) { collapse = "right"; } + } + if (start != null) { + node = map$$1[i + 2]; + if (mStart == mEnd && bias == (node.insertLeft ? "left" : "right")) + { collapse = bias; } + if (bias == "left" && start == 0) + { while (i && map$$1[i - 2] == map$$1[i - 3] && map$$1[i - 1].insertLeft) { + node = map$$1[(i -= 3) + 2]; + collapse = "left"; + } } + if (bias == "right" && start == mEnd - mStart) + { while (i < map$$1.length - 3 && map$$1[i + 3] == map$$1[i + 4] && !map$$1[i + 5].insertLeft) { + node = map$$1[(i += 3) + 2]; + collapse = "right"; + } } + break + } + } + return {node: node, start: start, end: end, collapse: collapse, coverStart: mStart, coverEnd: mEnd} + } + + function getUsefulRect(rects, bias) { + var rect = nullRect; + if (bias == "left") { for (var i = 0; i < rects.length; i++) { + if ((rect = rects[i]).left != rect.right) { break } + } } else { for (var i$1 = rects.length - 1; i$1 >= 0; i$1--) { + if ((rect = rects[i$1]).left != rect.right) { break } + } } + return rect + } + + function measureCharInner(cm, prepared, ch, bias) { + var place = nodeAndOffsetInLineMap(prepared.map, ch, bias); + var node = place.node, start = place.start, end = place.end, collapse = place.collapse; + + var rect; + if (node.nodeType == 3) { // If it is a text node, use a range to retrieve the coordinates. + for (var i$1 = 0; i$1 < 4; i$1++) { // Retry a maximum of 4 times when nonsense rectangles are returned + while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) { --start; } + while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) { ++end; } + if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart) + { rect = node.parentNode.getBoundingClientRect(); } + else + { rect = getUsefulRect(range(node, start, end).getClientRects(), bias); } + if (rect.left || rect.right || start == 0) { break } + end = start; + start = start - 1; + collapse = "right"; + } + if (ie && ie_version < 11) { rect = maybeUpdateRectForZooming(cm.display.measure, rect); } + } else { // If it is a widget, simply get the box for the whole widget. + if (start > 0) { collapse = bias = "right"; } + var rects; + if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1) + { rect = rects[bias == "right" ? rects.length - 1 : 0]; } + else + { rect = node.getBoundingClientRect(); } + } + if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) { + var rSpan = node.parentNode.getClientRects()[0]; + if (rSpan) + { rect = {left: rSpan.left, right: rSpan.left + charWidth(cm.display), top: rSpan.top, bottom: rSpan.bottom}; } + else + { rect = nullRect; } + } + + var rtop = rect.top - prepared.rect.top, rbot = rect.bottom - prepared.rect.top; + var mid = (rtop + rbot) / 2; + var heights = prepared.view.measure.heights; + var i = 0; + for (; i < heights.length - 1; i++) + { if (mid < heights[i]) { break } } + var top = i ? heights[i - 1] : 0, bot = heights[i]; + var result = {left: (collapse == "right" ? rect.right : rect.left) - prepared.rect.left, + right: (collapse == "left" ? rect.left : rect.right) - prepared.rect.left, + top: top, bottom: bot}; + if (!rect.left && !rect.right) { result.bogus = true; } + if (!cm.options.singleCursorHeightPerLine) { result.rtop = rtop; result.rbottom = rbot; } + + return result + } + + // Work around problem with bounding client rects on ranges being + // returned incorrectly when zoomed on IE10 and below. + function maybeUpdateRectForZooming(measure, rect) { + if (!window.screen || screen.logicalXDPI == null || + screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure)) + { return rect } + var scaleX = screen.logicalXDPI / screen.deviceXDPI; + var scaleY = screen.logicalYDPI / screen.deviceYDPI; + return {left: rect.left * scaleX, right: rect.right * scaleX, + top: rect.top * scaleY, bottom: rect.bottom * scaleY} + } + + function clearLineMeasurementCacheFor(lineView) { + if (lineView.measure) { + lineView.measure.cache = {}; + lineView.measure.heights = null; + if (lineView.rest) { for (var i = 0; i < lineView.rest.length; i++) + { lineView.measure.caches[i] = {}; } } + } + } + + function clearLineMeasurementCache(cm) { + cm.display.externalMeasure = null; + removeChildren(cm.display.lineMeasure); + for (var i = 0; i < cm.display.view.length; i++) + { clearLineMeasurementCacheFor(cm.display.view[i]); } + } + + function clearCaches(cm) { + clearLineMeasurementCache(cm); + cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null; + if (!cm.options.lineWrapping) { cm.display.maxLineChanged = true; } + cm.display.lineNumChars = null; + } + + function pageScrollX() { + // Work around https://bugs.chromium.org/p/chromium/issues/detail?id=489206 + // which causes page_Offset and bounding client rects to use + // different reference viewports and invalidate our calculations. + if (chrome && android) { return -(document.body.getBoundingClientRect().left - parseInt(getComputedStyle(document.body).marginLeft)) } + return window.pageXOffset || (document.documentElement || document.body).scrollLeft + } + function pageScrollY() { + if (chrome && android) { return -(document.body.getBoundingClientRect().top - parseInt(getComputedStyle(document.body).marginTop)) } + return window.pageYOffset || (document.documentElement || document.body).scrollTop + } + + function widgetTopHeight(lineObj) { + var height = 0; + if (lineObj.widgets) { for (var i = 0; i < lineObj.widgets.length; ++i) { if (lineObj.widgets[i].above) + { height += widgetHeight(lineObj.widgets[i]); } } } + return height + } + + // Converts a {top, bottom, left, right} box from line-local + // coordinates into another coordinate system. Context may be one of + // "line", "div" (display.lineDiv), "local"./null (editor), "window", + // or "page". + function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) { + if (!includeWidgets) { + var height = widgetTopHeight(lineObj); + rect.top += height; rect.bottom += height; + } + if (context == "line") { return rect } + if (!context) { context = "local"; } + var yOff = heightAtLine(lineObj); + if (context == "local") { yOff += paddingTop(cm.display); } + else { yOff -= cm.display.viewOffset; } + if (context == "page" || context == "window") { + var lOff = cm.display.lineSpace.getBoundingClientRect(); + yOff += lOff.top + (context == "window" ? 0 : pageScrollY()); + var xOff = lOff.left + (context == "window" ? 0 : pageScrollX()); + rect.left += xOff; rect.right += xOff; + } + rect.top += yOff; rect.bottom += yOff; + return rect + } + + // Coverts a box from "div" coords to another coordinate system. + // Context may be "window", "page", "div", or "local"./null. + function fromCoordSystem(cm, coords, context) { + if (context == "div") { return coords } + var left = coords.left, top = coords.top; + // First move into "page" coordinate system + if (context == "page") { + left -= pageScrollX(); + top -= pageScrollY(); + } else if (context == "local" || !context) { + var localBox = cm.display.sizer.getBoundingClientRect(); + left += localBox.left; + top += localBox.top; + } + + var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect(); + return {left: left - lineSpaceBox.left, top: top - lineSpaceBox.top} + } + + function charCoords(cm, pos, context, lineObj, bias) { + if (!lineObj) { lineObj = getLine(cm.doc, pos.line); } + return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context) + } + + // Returns a box for a given cursor position, which may have an + // 'other' property containing the position of the secondary cursor + // on a bidi boundary. + // A cursor Pos(line, char, "before") is on the same visual line as `char - 1` + // and after `char - 1` in writing order of `char - 1` + // A cursor Pos(line, char, "after") is on the same visual line as `char` + // and before `char` in writing order of `char` + // Examples (upper-case letters are RTL, lower-case are LTR): + // Pos(0, 1, ...) + // before after + // ab a|b a|b + // aB a|B aB| + // Ab |Ab A|b + // AB B|A B|A + // Every position after the last character on a line is considered to stick + // to the last character on the line. + function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) { + lineObj = lineObj || getLine(cm.doc, pos.line); + if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); } + function get(ch, right) { + var m = measureCharPrepared(cm, preparedMeasure, ch, right ? "right" : "left", varHeight); + if (right) { m.left = m.right; } else { m.right = m.left; } + return intoCoordSystem(cm, lineObj, m, context) + } + var order = getOrder(lineObj, cm.doc.direction), ch = pos.ch, sticky = pos.sticky; + if (ch >= lineObj.text.length) { + ch = lineObj.text.length; + sticky = "before"; + } else if (ch <= 0) { + ch = 0; + sticky = "after"; + } + if (!order) { return get(sticky == "before" ? ch - 1 : ch, sticky == "before") } + + function getBidi(ch, partPos, invert) { + var part = order[partPos], right = part.level == 1; + return get(invert ? ch - 1 : ch, right != invert) + } + var partPos = getBidiPartAt(order, ch, sticky); + var other = bidiOther; + var val = getBidi(ch, partPos, sticky == "before"); + if (other != null) { val.other = getBidi(ch, other, sticky != "before"); } + return val + } + + // Used to cheaply estimate the coordinates for a position. Used for + // intermediate scroll updates. + function estimateCoords(cm, pos) { + var left = 0; + pos = clipPos(cm.doc, pos); + if (!cm.options.lineWrapping) { left = charWidth(cm.display) * pos.ch; } + var lineObj = getLine(cm.doc, pos.line); + var top = heightAtLine(lineObj) + paddingTop(cm.display); + return {left: left, right: left, top: top, bottom: top + lineObj.height} + } + + // Positions returned by coordsChar contain some extra information. + // xRel is the relative x position of the input coordinates compared + // to the found position (so xRel > 0 means the coordinates are to + // the right of the character position, for example). When outside + // is true, that means the coordinates lie outside the line's + // vertical range. + function PosWithInfo(line, ch, sticky, outside, xRel) { + var pos = Pos(line, ch, sticky); + pos.xRel = xRel; + if (outside) { pos.outside = outside; } + return pos + } + + // Compute the character position closest to the given coordinates. + // Input must be lineSpace-local ("div" coordinate system). + function coordsChar(cm, x, y) { + var doc = cm.doc; + y += cm.display.viewOffset; + if (y < 0) { return PosWithInfo(doc.first, 0, null, -1, -1) } + var lineN = lineAtHeight(doc, y), last = doc.first + doc.size - 1; + if (lineN > last) + { return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, null, 1, 1) } + if (x < 0) { x = 0; } + + var lineObj = getLine(doc, lineN); + for (;;) { + var found = coordsCharInner(cm, lineObj, lineN, x, y); + var collapsed = collapsedSpanAround(lineObj, found.ch + (found.xRel > 0 || found.outside > 0 ? 1 : 0)); + if (!collapsed) { return found } + var rangeEnd = collapsed.find(1); + if (rangeEnd.line == lineN) { return rangeEnd } + lineObj = getLine(doc, lineN = rangeEnd.line); + } + } + + function wrappedLineExtent(cm, lineObj, preparedMeasure, y) { + y -= widgetTopHeight(lineObj); + var end = lineObj.text.length; + var begin = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch - 1).bottom <= y; }, end, 0); + end = findFirst(function (ch) { return measureCharPrepared(cm, preparedMeasure, ch).top > y; }, begin, end); + return {begin: begin, end: end} + } + + function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) { + if (!preparedMeasure) { preparedMeasure = prepareMeasureForLine(cm, lineObj); } + var targetTop = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, target), "line").top; + return wrappedLineExtent(cm, lineObj, preparedMeasure, targetTop) + } + + // Returns true if the given side of a box is after the given + // coordinates, in top-to-bottom, left-to-right order. + function boxIsAfter(box, x, y, left) { + return box.bottom <= y ? false : box.top > y ? true : (left ? box.left : box.right) > x + } + + function coordsCharInner(cm, lineObj, lineNo$$1, x, y) { + // Move y into line-local coordinate space + y -= heightAtLine(lineObj); + var preparedMeasure = prepareMeasureForLine(cm, lineObj); + // When directly calling `measureCharPrepared`, we have to adjust + // for the widgets at this line. + var widgetHeight$$1 = widgetTopHeight(lineObj); + var begin = 0, end = lineObj.text.length, ltr = true; + + var order = getOrder(lineObj, cm.doc.direction); + // If the line isn't plain left-to-right text, first figure out + // which bidi section the coordinates fall into. + if (order) { + var part = (cm.options.lineWrapping ? coordsBidiPartWrapped : coordsBidiPart) + (cm, lineObj, lineNo$$1, preparedMeasure, order, x, y); + ltr = part.level != 1; + // The awkward -1 offsets are needed because findFirst (called + // on these below) will treat its first bound as inclusive, + // second as exclusive, but we want to actually address the + // characters in the part's range + begin = ltr ? part.from : part.to - 1; + end = ltr ? part.to : part.from - 1; + } + + // A binary search to find the first character whose bounding box + // starts after the coordinates. If we run across any whose box wrap + // the coordinates, store that. + var chAround = null, boxAround = null; + var ch = findFirst(function (ch) { + var box = measureCharPrepared(cm, preparedMeasure, ch); + box.top += widgetHeight$$1; box.bottom += widgetHeight$$1; + if (!boxIsAfter(box, x, y, false)) { return false } + if (box.top <= y && box.left <= x) { + chAround = ch; + boxAround = box; + } + return true + }, begin, end); + + var baseX, sticky, outside = false; + // If a box around the coordinates was found, use that + if (boxAround) { + // Distinguish coordinates nearer to the left or right side of the box + var atLeft = x - boxAround.left < boxAround.right - x, atStart = atLeft == ltr; + ch = chAround + (atStart ? 0 : 1); + sticky = atStart ? "after" : "before"; + baseX = atLeft ? boxAround.left : boxAround.right; + } else { + // (Adjust for extended bound, if necessary.) + if (!ltr && (ch == end || ch == begin)) { ch++; } + // To determine which side to associate with, get the box to the + // left of the character and compare it's vertical position to the + // coordinates + sticky = ch == 0 ? "after" : ch == lineObj.text.length ? "before" : + (measureCharPrepared(cm, preparedMeasure, ch - (ltr ? 1 : 0)).bottom + widgetHeight$$1 <= y) == ltr ? + "after" : "before"; + // Now get accurate coordinates for this place, in order to get a + // base X position + var coords = cursorCoords(cm, Pos(lineNo$$1, ch, sticky), "line", lineObj, preparedMeasure); + baseX = coords.left; + outside = y < coords.top ? -1 : y >= coords.bottom ? 1 : 0; + } + + ch = skipExtendingChars(lineObj.text, ch, 1); + return PosWithInfo(lineNo$$1, ch, sticky, outside, x - baseX) + } + + function coordsBidiPart(cm, lineObj, lineNo$$1, preparedMeasure, order, x, y) { + // Bidi parts are sorted left-to-right, and in a non-line-wrapping + // situation, we can take this ordering to correspond to the visual + // ordering. This finds the first part whose end is after the given + // coordinates. + var index = findFirst(function (i) { + var part = order[i], ltr = part.level != 1; + return boxIsAfter(cursorCoords(cm, Pos(lineNo$$1, ltr ? part.to : part.from, ltr ? "before" : "after"), + "line", lineObj, preparedMeasure), x, y, true) + }, 0, order.length - 1); + var part = order[index]; + // If this isn't the first part, the part's start is also after + // the coordinates, and the coordinates aren't on the same line as + // that start, move one part back. + if (index > 0) { + var ltr = part.level != 1; + var start = cursorCoords(cm, Pos(lineNo$$1, ltr ? part.from : part.to, ltr ? "after" : "before"), + "line", lineObj, preparedMeasure); + if (boxIsAfter(start, x, y, true) && start.top > y) + { part = order[index - 1]; } + } + return part + } + + function coordsBidiPartWrapped(cm, lineObj, _lineNo, preparedMeasure, order, x, y) { + // In a wrapped line, rtl text on wrapping boundaries can do things + // that don't correspond to the ordering in our `order` array at + // all, so a binary search doesn't work, and we want to return a + // part that only spans one line so that the binary search in + // coordsCharInner is safe. As such, we first find the extent of the + // wrapped line, and then do a flat search in which we discard any + // spans that aren't on the line. + var ref = wrappedLineExtent(cm, lineObj, preparedMeasure, y); + var begin = ref.begin; + var end = ref.end; + if (/\s/.test(lineObj.text.charAt(end - 1))) { end--; } + var part = null, closestDist = null; + for (var i = 0; i < order.length; i++) { + var p = order[i]; + if (p.from >= end || p.to <= begin) { continue } + var ltr = p.level != 1; + var endX = measureCharPrepared(cm, preparedMeasure, ltr ? Math.min(end, p.to) - 1 : Math.max(begin, p.from)).right; + // Weigh against spans ending before this, so that they are only + // picked if nothing ends after + var dist = endX < x ? x - endX + 1e9 : endX - x; + if (!part || closestDist > dist) { + part = p; + closestDist = dist; + } + } + if (!part) { part = order[order.length - 1]; } + // Clip the part to the wrapped line. + if (part.from < begin) { part = {from: begin, to: part.to, level: part.level}; } + if (part.to > end) { part = {from: part.from, to: end, level: part.level}; } + return part + } + + var measureText; + // Compute the default text height. + function textHeight(display) { + if (display.cachedTextHeight != null) { return display.cachedTextHeight } + if (measureText == null) { + measureText = elt("pre", null, "CodeMirror-line-like"); + // Measure a bunch of lines, for browsers that compute + // fractional heights. + for (var i = 0; i < 49; ++i) { + measureText.appendChild(document.createTextNode("x")); + measureText.appendChild(elt("br")); + } + measureText.appendChild(document.createTextNode("x")); + } + removeChildrenAndAdd(display.measure, measureText); + var height = measureText.offsetHeight / 50; + if (height > 3) { display.cachedTextHeight = height; } + removeChildren(display.measure); + return height || 1 + } + + // Compute the default character width. + function charWidth(display) { + if (display.cachedCharWidth != null) { return display.cachedCharWidth } + var anchor = elt("span", "xxxxxxxxxx"); + var pre = elt("pre", [anchor], "CodeMirror-line-like"); + removeChildrenAndAdd(display.measure, pre); + var rect = anchor.getBoundingClientRect(), width = (rect.right - rect.left) / 10; + if (width > 2) { display.cachedCharWidth = width; } + return width || 10 + } + + // Do a bulk-read of the DOM positions and sizes needed to draw the + // view, so that we don't interleave reading and writing to the DOM. + function getDimensions(cm) { + var d = cm.display, left = {}, width = {}; + var gutterLeft = d.gutters.clientLeft; + for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) { + var id = cm.display.gutterSpecs[i].className; + left[id] = n.offsetLeft + n.clientLeft + gutterLeft; + width[id] = n.clientWidth; + } + return {fixedPos: compensateForHScroll(d), + gutterTotalWidth: d.gutters.offsetWidth, + gutterLeft: left, + gutterWidth: width, + wrapperWidth: d.wrapper.clientWidth} + } + + // Computes display.scroller.scrollLeft + display.gutters.offsetWidth, + // but using getBoundingClientRect to get a sub-pixel-accurate + // result. + function compensateForHScroll(display) { + return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left + } + + // Returns a function that estimates the height of a line, to use as + // first approximation until the line becomes visible (and is thus + // properly measurable). + function estimateHeight(cm) { + var th = textHeight(cm.display), wrapping = cm.options.lineWrapping; + var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3); + return function (line) { + if (lineIsHidden(cm.doc, line)) { return 0 } + + var widgetsHeight = 0; + if (line.widgets) { for (var i = 0; i < line.widgets.length; i++) { + if (line.widgets[i].height) { widgetsHeight += line.widgets[i].height; } + } } + + if (wrapping) + { return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th } + else + { return widgetsHeight + th } + } + } + + function estimateLineHeights(cm) { + var doc = cm.doc, est = estimateHeight(cm); + doc.iter(function (line) { + var estHeight = est(line); + if (estHeight != line.height) { updateLineHeight(line, estHeight); } + }); + } + + // Given a mouse event, find the corresponding position. If liberal + // is false, it checks whether a gutter or scrollbar was clicked, + // and returns null if it was. forRect is used by rectangular + // selections, and tries to estimate a character position even for + // coordinates beyond the right of the text. + function posFromMouse(cm, e, liberal, forRect) { + var display = cm.display; + if (!liberal && e_target(e).getAttribute("cm-not-content") == "true") { return null } + + var x, y, space = display.lineSpace.getBoundingClientRect(); + // Fails unpredictably on IE[67] when mouse is dragged around quickly. + try { x = e.clientX - space.left; y = e.clientY - space.top; } + catch (e) { return null } + var coords = coordsChar(cm, x, y), line; + if (forRect && coords.xRel == 1 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) { + var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length; + coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff)); + } + return coords + } + + // Find the view element corresponding to a given line. Return null + // when the line isn't visible. + function findViewIndex(cm, n) { + if (n >= cm.display.viewTo) { return null } + n -= cm.display.viewFrom; + if (n < 0) { return null } + var view = cm.display.view; + for (var i = 0; i < view.length; i++) { + n -= view[i].size; + if (n < 0) { return i } + } + } + + // Updates the display.view data structure for a given change to the + // document. From and to are in pre-change coordinates. Lendiff is + // the amount of lines added or subtracted by the change. This is + // used for changes that span multiple lines, or change the way + // lines are divided into visual lines. regLineChange (below) + // registers single-line changes. + function regChange(cm, from, to, lendiff) { + if (from == null) { from = cm.doc.first; } + if (to == null) { to = cm.doc.first + cm.doc.size; } + if (!lendiff) { lendiff = 0; } + + var display = cm.display; + if (lendiff && to < display.viewTo && + (display.updateLineNumbers == null || display.updateLineNumbers > from)) + { display.updateLineNumbers = from; } + + cm.curOp.viewChanged = true; + + if (from >= display.viewTo) { // Change after + if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo) + { resetView(cm); } + } else if (to <= display.viewFrom) { // Change before + if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) { + resetView(cm); + } else { + display.viewFrom += lendiff; + display.viewTo += lendiff; + } + } else if (from <= display.viewFrom && to >= display.viewTo) { // Full overlap + resetView(cm); + } else if (from <= display.viewFrom) { // Top overlap + var cut = viewCuttingPoint(cm, to, to + lendiff, 1); + if (cut) { + display.view = display.view.slice(cut.index); + display.viewFrom = cut.lineN; + display.viewTo += lendiff; + } else { + resetView(cm); + } + } else if (to >= display.viewTo) { // Bottom overlap + var cut$1 = viewCuttingPoint(cm, from, from, -1); + if (cut$1) { + display.view = display.view.slice(0, cut$1.index); + display.viewTo = cut$1.lineN; + } else { + resetView(cm); + } + } else { // Gap in the middle + var cutTop = viewCuttingPoint(cm, from, from, -1); + var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1); + if (cutTop && cutBot) { + display.view = display.view.slice(0, cutTop.index) + .concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN)) + .concat(display.view.slice(cutBot.index)); + display.viewTo += lendiff; + } else { + resetView(cm); + } + } + + var ext = display.externalMeasured; + if (ext) { + if (to < ext.lineN) + { ext.lineN += lendiff; } + else if (from < ext.lineN + ext.size) + { display.externalMeasured = null; } + } + } + + // Register a change to a single line. Type must be one of "text", + // "gutter", "class", "widget" + function regLineChange(cm, line, type) { + cm.curOp.viewChanged = true; + var display = cm.display, ext = cm.display.externalMeasured; + if (ext && line >= ext.lineN && line < ext.lineN + ext.size) + { display.externalMeasured = null; } + + if (line < display.viewFrom || line >= display.viewTo) { return } + var lineView = display.view[findViewIndex(cm, line)]; + if (lineView.node == null) { return } + var arr = lineView.changes || (lineView.changes = []); + if (indexOf(arr, type) == -1) { arr.push(type); } + } + + // Clear the view. + function resetView(cm) { + cm.display.viewFrom = cm.display.viewTo = cm.doc.first; + cm.display.view = []; + cm.display.viewOffset = 0; + } + + function viewCuttingPoint(cm, oldN, newN, dir) { + var index = findViewIndex(cm, oldN), diff, view = cm.display.view; + if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size) + { return {index: index, lineN: newN} } + var n = cm.display.viewFrom; + for (var i = 0; i < index; i++) + { n += view[i].size; } + if (n != oldN) { + if (dir > 0) { + if (index == view.length - 1) { return null } + diff = (n + view[index].size) - oldN; + index++; + } else { + diff = n - oldN; + } + oldN += diff; newN += diff; + } + while (visualLineNo(cm.doc, newN) != newN) { + if (index == (dir < 0 ? 0 : view.length - 1)) { return null } + newN += dir * view[index - (dir < 0 ? 1 : 0)].size; + index += dir; + } + return {index: index, lineN: newN} + } + + // Force the view to cover a given range, adding empty view element + // or clipping off existing ones as needed. + function adjustView(cm, from, to) { + var display = cm.display, view = display.view; + if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) { + display.view = buildViewArray(cm, from, to); + display.viewFrom = from; + } else { + if (display.viewFrom > from) + { display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view); } + else if (display.viewFrom < from) + { display.view = display.view.slice(findViewIndex(cm, from)); } + display.viewFrom = from; + if (display.viewTo < to) + { display.view = display.view.concat(buildViewArray(cm, display.viewTo, to)); } + else if (display.viewTo > to) + { display.view = display.view.slice(0, findViewIndex(cm, to)); } + } + display.viewTo = to; + } + + // Count the number of lines in the view whose DOM representation is + // out of date (or nonexistent). + function countDirtyView(cm) { + var view = cm.display.view, dirty = 0; + for (var i = 0; i < view.length; i++) { + var lineView = view[i]; + if (!lineView.hidden && (!lineView.node || lineView.changes)) { ++dirty; } + } + return dirty + } + + function updateSelection(cm) { + cm.display.input.showSelection(cm.display.input.prepareSelection()); + } + + function prepareSelection(cm, primary) { + if ( primary === void 0 ) primary = true; + + var doc = cm.doc, result = {}; + var curFragment = result.cursors = document.createDocumentFragment(); + var selFragment = result.selection = document.createDocumentFragment(); + + for (var i = 0; i < doc.sel.ranges.length; i++) { + if (!primary && i == doc.sel.primIndex) { continue } + var range$$1 = doc.sel.ranges[i]; + if (range$$1.from().line >= cm.display.viewTo || range$$1.to().line < cm.display.viewFrom) { continue } + var collapsed = range$$1.empty(); + if (collapsed || cm.options.showCursorWhenSelecting) + { drawSelectionCursor(cm, range$$1.head, curFragment); } + if (!collapsed) + { drawSelectionRange(cm, range$$1, selFragment); } + } + return result + } + + // Draws a cursor for the given range + function drawSelectionCursor(cm, head, output) { + var pos = cursorCoords(cm, head, "div", null, null, !cm.options.singleCursorHeightPerLine); + + var cursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor")); + cursor.style.left = pos.left + "px"; + cursor.style.top = pos.top + "px"; + cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px"; + + if (pos.other) { + // Secondary cursor, shown when on a 'jump' in bi-directional text + var otherCursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor")); + otherCursor.style.display = ""; + otherCursor.style.left = pos.other.left + "px"; + otherCursor.style.top = pos.other.top + "px"; + otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px"; + } + } + + function cmpCoords(a, b) { return a.top - b.top || a.left - b.left } + + // Draws the given range as a highlighted selection + function drawSelectionRange(cm, range$$1, output) { + var display = cm.display, doc = cm.doc; + var fragment = document.createDocumentFragment(); + var padding = paddingH(cm.display), leftSide = padding.left; + var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right; + var docLTR = doc.direction == "ltr"; + + function add(left, top, width, bottom) { + if (top < 0) { top = 0; } + top = Math.round(top); + bottom = Math.round(bottom); + fragment.appendChild(elt("div", null, "CodeMirror-selected", ("position: absolute; left: " + left + "px;\n top: " + top + "px; width: " + (width == null ? rightSide - left : width) + "px;\n height: " + (bottom - top) + "px"))); + } + + function drawForLine(line, fromArg, toArg) { + var lineObj = getLine(doc, line); + var lineLen = lineObj.text.length; + var start, end; + function coords(ch, bias) { + return charCoords(cm, Pos(line, ch), "div", lineObj, bias) + } + + function wrapX(pos, dir, side) { + var extent = wrappedLineExtentChar(cm, lineObj, null, pos); + var prop = (dir == "ltr") == (side == "after") ? "left" : "right"; + var ch = side == "after" ? extent.begin : extent.end - (/\s/.test(lineObj.text.charAt(extent.end - 1)) ? 2 : 1); + return coords(ch, prop)[prop] + } + + var order = getOrder(lineObj, doc.direction); + iterateBidiSections(order, fromArg || 0, toArg == null ? lineLen : toArg, function (from, to, dir, i) { + var ltr = dir == "ltr"; + var fromPos = coords(from, ltr ? "left" : "right"); + var toPos = coords(to - 1, ltr ? "right" : "left"); + + var openStart = fromArg == null && from == 0, openEnd = toArg == null && to == lineLen; + var first = i == 0, last = !order || i == order.length - 1; + if (toPos.top - fromPos.top <= 3) { // Single line + var openLeft = (docLTR ? openStart : openEnd) && first; + var openRight = (docLTR ? openEnd : openStart) && last; + var left = openLeft ? leftSide : (ltr ? fromPos : toPos).left; + var right = openRight ? rightSide : (ltr ? toPos : fromPos).right; + add(left, fromPos.top, right - left, fromPos.bottom); + } else { // Multiple lines + var topLeft, topRight, botLeft, botRight; + if (ltr) { + topLeft = docLTR && openStart && first ? leftSide : fromPos.left; + topRight = docLTR ? rightSide : wrapX(from, dir, "before"); + botLeft = docLTR ? leftSide : wrapX(to, dir, "after"); + botRight = docLTR && openEnd && last ? rightSide : toPos.right; + } else { + topLeft = !docLTR ? leftSide : wrapX(from, dir, "before"); + topRight = !docLTR && openStart && first ? rightSide : fromPos.right; + botLeft = !docLTR && openEnd && last ? leftSide : toPos.left; + botRight = !docLTR ? rightSide : wrapX(to, dir, "after"); + } + add(topLeft, fromPos.top, topRight - topLeft, fromPos.bottom); + if (fromPos.bottom < toPos.top) { add(leftSide, fromPos.bottom, null, toPos.top); } + add(botLeft, toPos.top, botRight - botLeft, toPos.bottom); + } + + if (!start || cmpCoords(fromPos, start) < 0) { start = fromPos; } + if (cmpCoords(toPos, start) < 0) { start = toPos; } + if (!end || cmpCoords(fromPos, end) < 0) { end = fromPos; } + if (cmpCoords(toPos, end) < 0) { end = toPos; } + }); + return {start: start, end: end} + } + + var sFrom = range$$1.from(), sTo = range$$1.to(); + if (sFrom.line == sTo.line) { + drawForLine(sFrom.line, sFrom.ch, sTo.ch); + } else { + var fromLine = getLine(doc, sFrom.line), toLine = getLine(doc, sTo.line); + var singleVLine = visualLine(fromLine) == visualLine(toLine); + var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end; + var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start; + if (singleVLine) { + if (leftEnd.top < rightStart.top - 2) { + add(leftEnd.right, leftEnd.top, null, leftEnd.bottom); + add(leftSide, rightStart.top, rightStart.left, rightStart.bottom); + } else { + add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom); + } + } + if (leftEnd.bottom < rightStart.top) + { add(leftSide, leftEnd.bottom, null, rightStart.top); } + } + + output.appendChild(fragment); + } + + // Cursor-blinking + function restartBlink(cm) { + if (!cm.state.focused) { return } + var display = cm.display; + clearInterval(display.blinker); + var on = true; + display.cursorDiv.style.visibility = ""; + if (cm.options.cursorBlinkRate > 0) + { display.blinker = setInterval(function () { return display.cursorDiv.style.visibility = (on = !on) ? "" : "hidden"; }, + cm.options.cursorBlinkRate); } + else if (cm.options.cursorBlinkRate < 0) + { display.cursorDiv.style.visibility = "hidden"; } + } + + function ensureFocus(cm) { + if (!cm.state.focused) { cm.display.input.focus(); onFocus(cm); } + } + + function delayBlurEvent(cm) { + cm.state.delayingBlurEvent = true; + setTimeout(function () { if (cm.state.delayingBlurEvent) { + cm.state.delayingBlurEvent = false; + onBlur(cm); + } }, 100); + } + + function onFocus(cm, e) { + if (cm.state.delayingBlurEvent) { cm.state.delayingBlurEvent = false; } + + if (cm.options.readOnly == "nocursor") { return } + if (!cm.state.focused) { + signal(cm, "focus", cm, e); + cm.state.focused = true; + addClass(cm.display.wrapper, "CodeMirror-focused"); + // This test prevents this from firing when a context + // menu is closed (since the input reset would kill the + // select-all detection hack) + if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) { + cm.display.input.reset(); + if (webkit) { setTimeout(function () { return cm.display.input.reset(true); }, 20); } // Issue #1730 + } + cm.display.input.receivedFocus(); + } + restartBlink(cm); + } + function onBlur(cm, e) { + if (cm.state.delayingBlurEvent) { return } + + if (cm.state.focused) { + signal(cm, "blur", cm, e); + cm.state.focused = false; + rmClass(cm.display.wrapper, "CodeMirror-focused"); + } + clearInterval(cm.display.blinker); + setTimeout(function () { if (!cm.state.focused) { cm.display.shift = false; } }, 150); + } + + // Read the actual heights of the rendered lines, and update their + // stored heights to match. + function updateHeightsInViewport(cm) { + var display = cm.display; + var prevBottom = display.lineDiv.offsetTop; + for (var i = 0; i < display.view.length; i++) { + var cur = display.view[i], wrapping = cm.options.lineWrapping; + var height = (void 0), width = 0; + if (cur.hidden) { continue } + if (ie && ie_version < 8) { + var bot = cur.node.offsetTop + cur.node.offsetHeight; + height = bot - prevBottom; + prevBottom = bot; + } else { + var box = cur.node.getBoundingClientRect(); + height = box.bottom - box.top; + // Check that lines don't extend past the right of the current + // editor width + if (!wrapping && cur.text.firstChild) + { width = cur.text.firstChild.getBoundingClientRect().right - box.left - 1; } + } + var diff = cur.line.height - height; + if (diff > .005 || diff < -.005) { + updateLineHeight(cur.line, height); + updateWidgetHeight(cur.line); + if (cur.rest) { for (var j = 0; j < cur.rest.length; j++) + { updateWidgetHeight(cur.rest[j]); } } + } + if (width > cm.display.sizerWidth) { + var chWidth = Math.ceil(width / charWidth(cm.display)); + if (chWidth > cm.display.maxLineLength) { + cm.display.maxLineLength = chWidth; + cm.display.maxLine = cur.line; + cm.display.maxLineChanged = true; + } + } + } + } + + // Read and store the height of line widgets associated with the + // given line. + function updateWidgetHeight(line) { + if (line.widgets) { for (var i = 0; i < line.widgets.length; ++i) { + var w = line.widgets[i], parent = w.node.parentNode; + if (parent) { w.height = parent.offsetHeight; } + } } + } + + // Compute the lines that are visible in a given viewport (defaults + // the the current scroll position). viewport may contain top, + // height, and ensure (see op.scrollToPos) properties. + function visibleLines(display, doc, viewport) { + var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop; + top = Math.floor(top - paddingTop(display)); + var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight; + + var from = lineAtHeight(doc, top), to = lineAtHeight(doc, bottom); + // Ensure is a {from: {line, ch}, to: {line, ch}} object, and + // forces those lines into the viewport (if possible). + if (viewport && viewport.ensure) { + var ensureFrom = viewport.ensure.from.line, ensureTo = viewport.ensure.to.line; + if (ensureFrom < from) { + from = ensureFrom; + to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight); + } else if (Math.min(ensureTo, doc.lastLine()) >= to) { + from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight); + to = ensureTo; + } + } + return {from: from, to: Math.max(to, from + 1)} + } + + // SCROLLING THINGS INTO VIEW + + // If an editor sits on the top or bottom of the window, partially + // scrolled out of view, this ensures that the cursor is visible. + function maybeScrollWindow(cm, rect) { + if (signalDOMEvent(cm, "scrollCursorIntoView")) { return } + + var display = cm.display, box = display.sizer.getBoundingClientRect(), doScroll = null; + if (rect.top + box.top < 0) { doScroll = true; } + else if (rect.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) { doScroll = false; } + if (doScroll != null && !phantom) { + var scrollNode = elt("div", "\u200b", null, ("position: absolute;\n top: " + (rect.top - display.viewOffset - paddingTop(cm.display)) + "px;\n height: " + (rect.bottom - rect.top + scrollGap(cm) + display.barHeight) + "px;\n left: " + (rect.left) + "px; width: " + (Math.max(2, rect.right - rect.left)) + "px;")); + cm.display.lineSpace.appendChild(scrollNode); + scrollNode.scrollIntoView(doScroll); + cm.display.lineSpace.removeChild(scrollNode); + } + } + + // Scroll a given position into view (immediately), verifying that + // it actually became visible (as line heights are accurately + // measured, the position of something may 'drift' during drawing). + function scrollPosIntoView(cm, pos, end, margin) { + if (margin == null) { margin = 0; } + var rect; + if (!cm.options.lineWrapping && pos == end) { + // Set pos and end to the cursor positions around the character pos sticks to + // If pos.sticky == "before", that is around pos.ch - 1, otherwise around pos.ch + // If pos == Pos(_, 0, "before"), pos and end are unchanged + pos = pos.ch ? Pos(pos.line, pos.sticky == "before" ? pos.ch - 1 : pos.ch, "after") : pos; + end = pos.sticky == "before" ? Pos(pos.line, pos.ch + 1, "before") : pos; + } + for (var limit = 0; limit < 5; limit++) { + var changed = false; + var coords = cursorCoords(cm, pos); + var endCoords = !end || end == pos ? coords : cursorCoords(cm, end); + rect = {left: Math.min(coords.left, endCoords.left), + top: Math.min(coords.top, endCoords.top) - margin, + right: Math.max(coords.left, endCoords.left), + bottom: Math.max(coords.bottom, endCoords.bottom) + margin}; + var scrollPos = calculateScrollPos(cm, rect); + var startTop = cm.doc.scrollTop, startLeft = cm.doc.scrollLeft; + if (scrollPos.scrollTop != null) { + updateScrollTop(cm, scrollPos.scrollTop); + if (Math.abs(cm.doc.scrollTop - startTop) > 1) { changed = true; } + } + if (scrollPos.scrollLeft != null) { + setScrollLeft(cm, scrollPos.scrollLeft); + if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) { changed = true; } + } + if (!changed) { break } + } + return rect + } + + // Scroll a given set of coordinates into view (immediately). + function scrollIntoView(cm, rect) { + var scrollPos = calculateScrollPos(cm, rect); + if (scrollPos.scrollTop != null) { updateScrollTop(cm, scrollPos.scrollTop); } + if (scrollPos.scrollLeft != null) { setScrollLeft(cm, scrollPos.scrollLeft); } + } + + // Calculate a new scroll position needed to scroll the given + // rectangle into view. Returns an object with scrollTop and + // scrollLeft properties. When these are undefined, the + // vertical/horizontal position does not need to be adjusted. + function calculateScrollPos(cm, rect) { + var display = cm.display, snapMargin = textHeight(cm.display); + if (rect.top < 0) { rect.top = 0; } + var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop; + var screen = displayHeight(cm), result = {}; + if (rect.bottom - rect.top > screen) { rect.bottom = rect.top + screen; } + var docBottom = cm.doc.height + paddingVert(display); + var atTop = rect.top < snapMargin, atBottom = rect.bottom > docBottom - snapMargin; + if (rect.top < screentop) { + result.scrollTop = atTop ? 0 : rect.top; + } else if (rect.bottom > screentop + screen) { + var newTop = Math.min(rect.top, (atBottom ? docBottom : rect.bottom) - screen); + if (newTop != screentop) { result.scrollTop = newTop; } + } + + var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft; + var screenw = displayWidth(cm) - (cm.options.fixedGutter ? display.gutters.offsetWidth : 0); + var tooWide = rect.right - rect.left > screenw; + if (tooWide) { rect.right = rect.left + screenw; } + if (rect.left < 10) + { result.scrollLeft = 0; } + else if (rect.left < screenleft) + { result.scrollLeft = Math.max(0, rect.left - (tooWide ? 0 : 10)); } + else if (rect.right > screenw + screenleft - 3) + { result.scrollLeft = rect.right + (tooWide ? 0 : 10) - screenw; } + return result + } + + // Store a relative adjustment to the scroll position in the current + // operation (to be applied when the operation finishes). + function addToScrollTop(cm, top) { + if (top == null) { return } + resolveScrollToPos(cm); + cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top; + } + + // Make sure that at the end of the operation the current cursor is + // shown. + function ensureCursorVisible(cm) { + resolveScrollToPos(cm); + var cur = cm.getCursor(); + cm.curOp.scrollToPos = {from: cur, to: cur, margin: cm.options.cursorScrollMargin}; + } + + function scrollToCoords(cm, x, y) { + if (x != null || y != null) { resolveScrollToPos(cm); } + if (x != null) { cm.curOp.scrollLeft = x; } + if (y != null) { cm.curOp.scrollTop = y; } + } + + function scrollToRange(cm, range$$1) { + resolveScrollToPos(cm); + cm.curOp.scrollToPos = range$$1; + } + + // When an operation has its scrollToPos property set, and another + // scroll action is applied before the end of the operation, this + // 'simulates' scrolling that position into view in a cheap way, so + // that the effect of intermediate scroll commands is not ignored. + function resolveScrollToPos(cm) { + var range$$1 = cm.curOp.scrollToPos; + if (range$$1) { + cm.curOp.scrollToPos = null; + var from = estimateCoords(cm, range$$1.from), to = estimateCoords(cm, range$$1.to); + scrollToCoordsRange(cm, from, to, range$$1.margin); + } + } + + function scrollToCoordsRange(cm, from, to, margin) { + var sPos = calculateScrollPos(cm, { + left: Math.min(from.left, to.left), + top: Math.min(from.top, to.top) - margin, + right: Math.max(from.right, to.right), + bottom: Math.max(from.bottom, to.bottom) + margin + }); + scrollToCoords(cm, sPos.scrollLeft, sPos.scrollTop); + } + + // Sync the scrollable area and scrollbars, ensure the viewport + // covers the visible area. + function updateScrollTop(cm, val) { + if (Math.abs(cm.doc.scrollTop - val) < 2) { return } + if (!gecko) { updateDisplaySimple(cm, {top: val}); } + setScrollTop(cm, val, true); + if (gecko) { updateDisplaySimple(cm); } + startWorker(cm, 100); + } + + function setScrollTop(cm, val, forceScroll) { + val = Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight, val); + if (cm.display.scroller.scrollTop == val && !forceScroll) { return } + cm.doc.scrollTop = val; + cm.display.scrollbars.setScrollTop(val); + if (cm.display.scroller.scrollTop != val) { cm.display.scroller.scrollTop = val; } + } + + // Sync scroller and scrollbar, ensure the gutter elements are + // aligned. + function setScrollLeft(cm, val, isScroller, forceScroll) { + val = Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth); + if ((isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) && !forceScroll) { return } + cm.doc.scrollLeft = val; + alignHorizontally(cm); + if (cm.display.scroller.scrollLeft != val) { cm.display.scroller.scrollLeft = val; } + cm.display.scrollbars.setScrollLeft(val); + } + + // SCROLLBARS + + // Prepare DOM reads needed to update the scrollbars. Done in one + // shot to minimize update/measure roundtrips. + function measureForScrollbars(cm) { + var d = cm.display, gutterW = d.gutters.offsetWidth; + var docH = Math.round(cm.doc.height + paddingVert(cm.display)); + return { + clientHeight: d.scroller.clientHeight, + viewHeight: d.wrapper.clientHeight, + scrollWidth: d.scroller.scrollWidth, clientWidth: d.scroller.clientWidth, + viewWidth: d.wrapper.clientWidth, + barLeft: cm.options.fixedGutter ? gutterW : 0, + docHeight: docH, + scrollHeight: docH + scrollGap(cm) + d.barHeight, + nativeBarWidth: d.nativeBarWidth, + gutterWidth: gutterW + } + } + + var NativeScrollbars = function(place, scroll, cm) { + this.cm = cm; + var vert = this.vert = elt("div", [elt("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar"); + var horiz = this.horiz = elt("div", [elt("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar"); + vert.tabIndex = horiz.tabIndex = -1; + place(vert); place(horiz); + + on(vert, "scroll", function () { + if (vert.clientHeight) { scroll(vert.scrollTop, "vertical"); } + }); + on(horiz, "scroll", function () { + if (horiz.clientWidth) { scroll(horiz.scrollLeft, "horizontal"); } + }); + + this.checkedZeroWidth = false; + // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8). + if (ie && ie_version < 8) { this.horiz.style.minHeight = this.vert.style.minWidth = "18px"; } + }; + + NativeScrollbars.prototype.update = function (measure) { + var needsH = measure.scrollWidth > measure.clientWidth + 1; + var needsV = measure.scrollHeight > measure.clientHeight + 1; + var sWidth = measure.nativeBarWidth; + + if (needsV) { + this.vert.style.display = "block"; + this.vert.style.bottom = needsH ? sWidth + "px" : "0"; + var totalHeight = measure.viewHeight - (needsH ? sWidth : 0); + // A bug in IE8 can cause this value to be negative, so guard it. + this.vert.firstChild.style.height = + Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + "px"; + } else { + this.vert.style.display = ""; + this.vert.firstChild.style.height = "0"; + } + + if (needsH) { + this.horiz.style.display = "block"; + this.horiz.style.right = needsV ? sWidth + "px" : "0"; + this.horiz.style.left = measure.barLeft + "px"; + var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0); + this.horiz.firstChild.style.width = + Math.max(0, measure.scrollWidth - measure.clientWidth + totalWidth) + "px"; + } else { + this.horiz.style.display = ""; + this.horiz.firstChild.style.width = "0"; + } + + if (!this.checkedZeroWidth && measure.clientHeight > 0) { + if (sWidth == 0) { this.zeroWidthHack(); } + this.checkedZeroWidth = true; + } + + return {right: needsV ? sWidth : 0, bottom: needsH ? sWidth : 0} + }; + + NativeScrollbars.prototype.setScrollLeft = function (pos) { + if (this.horiz.scrollLeft != pos) { this.horiz.scrollLeft = pos; } + if (this.disableHoriz) { this.enableZeroWidthBar(this.horiz, this.disableHoriz, "horiz"); } + }; + + NativeScrollbars.prototype.setScrollTop = function (pos) { + if (this.vert.scrollTop != pos) { this.vert.scrollTop = pos; } + if (this.disableVert) { this.enableZeroWidthBar(this.vert, this.disableVert, "vert"); } + }; + + NativeScrollbars.prototype.zeroWidthHack = function () { + var w = mac && !mac_geMountainLion ? "12px" : "18px"; + this.horiz.style.height = this.vert.style.width = w; + this.horiz.style.pointerEvents = this.vert.style.pointerEvents = "none"; + this.disableHoriz = new Delayed; + this.disableVert = new Delayed; + }; + + NativeScrollbars.prototype.enableZeroWidthBar = function (bar, delay, type) { + bar.style.pointerEvents = "auto"; + function maybeDisable() { + // To find out whether the scrollbar is still visible, we + // check whether the element under the pixel in the bottom + // right corner of the scrollbar box is the scrollbar box + // itself (when the bar is still visible) or its filler child + // (when the bar is hidden). If it is still visible, we keep + // it enabled, if it's hidden, we disable pointer events. + var box = bar.getBoundingClientRect(); + var elt$$1 = type == "vert" ? document.elementFromPoint(box.right - 1, (box.top + box.bottom) / 2) + : document.elementFromPoint((box.right + box.left) / 2, box.bottom - 1); + if (elt$$1 != bar) { bar.style.pointerEvents = "none"; } + else { delay.set(1000, maybeDisable); } + } + delay.set(1000, maybeDisable); + }; + + NativeScrollbars.prototype.clear = function () { + var parent = this.horiz.parentNode; + parent.removeChild(this.horiz); + parent.removeChild(this.vert); + }; + + var NullScrollbars = function () {}; + + NullScrollbars.prototype.update = function () { return {bottom: 0, right: 0} }; + NullScrollbars.prototype.setScrollLeft = function () {}; + NullScrollbars.prototype.setScrollTop = function () {}; + NullScrollbars.prototype.clear = function () {}; + + function updateScrollbars(cm, measure) { + if (!measure) { measure = measureForScrollbars(cm); } + var startWidth = cm.display.barWidth, startHeight = cm.display.barHeight; + updateScrollbarsInner(cm, measure); + for (var i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) { + if (startWidth != cm.display.barWidth && cm.options.lineWrapping) + { updateHeightsInViewport(cm); } + updateScrollbarsInner(cm, measureForScrollbars(cm)); + startWidth = cm.display.barWidth; startHeight = cm.display.barHeight; + } + } + + // Re-synchronize the fake scrollbars with the actual size of the + // content. + function updateScrollbarsInner(cm, measure) { + var d = cm.display; + var sizes = d.scrollbars.update(measure); + + d.sizer.style.paddingRight = (d.barWidth = sizes.right) + "px"; + d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + "px"; + d.heightForcer.style.borderBottom = sizes.bottom + "px solid transparent"; + + if (sizes.right && sizes.bottom) { + d.scrollbarFiller.style.display = "block"; + d.scrollbarFiller.style.height = sizes.bottom + "px"; + d.scrollbarFiller.style.width = sizes.right + "px"; + } else { d.scrollbarFiller.style.display = ""; } + if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) { + d.gutterFiller.style.display = "block"; + d.gutterFiller.style.height = sizes.bottom + "px"; + d.gutterFiller.style.width = measure.gutterWidth + "px"; + } else { d.gutterFiller.style.display = ""; } + } + + var scrollbarModel = {"native": NativeScrollbars, "null": NullScrollbars}; + + function initScrollbars(cm) { + if (cm.display.scrollbars) { + cm.display.scrollbars.clear(); + if (cm.display.scrollbars.addClass) + { rmClass(cm.display.wrapper, cm.display.scrollbars.addClass); } + } + + cm.display.scrollbars = new scrollbarModel[cm.options.scrollbarStyle](function (node) { + cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller); + // Prevent clicks in the scrollbars from killing focus + on(node, "mousedown", function () { + if (cm.state.focused) { setTimeout(function () { return cm.display.input.focus(); }, 0); } + }); + node.setAttribute("cm-not-content", "true"); + }, function (pos, axis) { + if (axis == "horizontal") { setScrollLeft(cm, pos); } + else { updateScrollTop(cm, pos); } + }, cm); + if (cm.display.scrollbars.addClass) + { addClass(cm.display.wrapper, cm.display.scrollbars.addClass); } + } + + // Operations are used to wrap a series of changes to the editor + // state in such a way that each change won't have to update the + // cursor and display (which would be awkward, slow, and + // error-prone). Instead, display updates are batched and then all + // combined and executed at once. + + var nextOpId = 0; + // Start a new operation. + function startOperation(cm) { + cm.curOp = { + cm: cm, + viewChanged: false, // Flag that indicates that lines might need to be redrawn + startHeight: cm.doc.height, // Used to detect need to update scrollbar + forceUpdate: false, // Used to force a redraw + updateInput: 0, // Whether to reset the input textarea + typing: false, // Whether this reset should be careful to leave existing text (for compositing) + changeObjs: null, // Accumulated changes, for firing change events + cursorActivityHandlers: null, // Set of handlers to fire cursorActivity on + cursorActivityCalled: 0, // Tracks which cursorActivity handlers have been called already + selectionChanged: false, // Whether the selection needs to be redrawn + updateMaxLine: false, // Set when the widest line needs to be determined anew + scrollLeft: null, scrollTop: null, // Intermediate scroll position, not pushed to DOM yet + scrollToPos: null, // Used to scroll to a specific position + focus: false, + id: ++nextOpId // Unique ID + }; + pushOperation(cm.curOp); + } + + // Finish an operation, updating the display and signalling delayed events + function endOperation(cm) { + var op = cm.curOp; + if (op) { finishOperation(op, function (group) { + for (var i = 0; i < group.ops.length; i++) + { group.ops[i].cm.curOp = null; } + endOperations(group); + }); } + } + + // The DOM updates done when an operation finishes are batched so + // that the minimum number of relayouts are required. + function endOperations(group) { + var ops = group.ops; + for (var i = 0; i < ops.length; i++) // Read DOM + { endOperation_R1(ops[i]); } + for (var i$1 = 0; i$1 < ops.length; i$1++) // Write DOM (maybe) + { endOperation_W1(ops[i$1]); } + for (var i$2 = 0; i$2 < ops.length; i$2++) // Read DOM + { endOperation_R2(ops[i$2]); } + for (var i$3 = 0; i$3 < ops.length; i$3++) // Write DOM (maybe) + { endOperation_W2(ops[i$3]); } + for (var i$4 = 0; i$4 < ops.length; i$4++) // Read DOM + { endOperation_finish(ops[i$4]); } + } + + function endOperation_R1(op) { + var cm = op.cm, display = cm.display; + maybeClipScrollbars(cm); + if (op.updateMaxLine) { findMaxLine(cm); } + + op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null || + op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom || + op.scrollToPos.to.line >= display.viewTo) || + display.maxLineChanged && cm.options.lineWrapping; + op.update = op.mustUpdate && + new DisplayUpdate(cm, op.mustUpdate && {top: op.scrollTop, ensure: op.scrollToPos}, op.forceUpdate); + } + + function endOperation_W1(op) { + op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update); + } + + function endOperation_R2(op) { + var cm = op.cm, display = cm.display; + if (op.updatedDisplay) { updateHeightsInViewport(cm); } + + op.barMeasure = measureForScrollbars(cm); + + // If the max line changed since it was last measured, measure it, + // and ensure the document's width matches it. + // updateDisplay_W2 will use these properties to do the actual resizing + if (display.maxLineChanged && !cm.options.lineWrapping) { + op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3; + cm.display.sizerWidth = op.adjustWidthTo; + op.barMeasure.scrollWidth = + Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth); + op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm)); + } + + if (op.updatedDisplay || op.selectionChanged) + { op.preparedSelection = display.input.prepareSelection(); } + } + + function endOperation_W2(op) { + var cm = op.cm; + + if (op.adjustWidthTo != null) { + cm.display.sizer.style.minWidth = op.adjustWidthTo + "px"; + if (op.maxScrollLeft < cm.doc.scrollLeft) + { setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true); } + cm.display.maxLineChanged = false; + } + + var takeFocus = op.focus && op.focus == activeElt(); + if (op.preparedSelection) + { cm.display.input.showSelection(op.preparedSelection, takeFocus); } + if (op.updatedDisplay || op.startHeight != cm.doc.height) + { updateScrollbars(cm, op.barMeasure); } + if (op.updatedDisplay) + { setDocumentHeight(cm, op.barMeasure); } + + if (op.selectionChanged) { restartBlink(cm); } + + if (cm.state.focused && op.updateInput) + { cm.display.input.reset(op.typing); } + if (takeFocus) { ensureFocus(op.cm); } + } + + function endOperation_finish(op) { + var cm = op.cm, display = cm.display, doc = cm.doc; + + if (op.updatedDisplay) { postUpdateDisplay(cm, op.update); } + + // Abort mouse wheel delta measurement, when scrolling explicitly + if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos)) + { display.wheelStartX = display.wheelStartY = null; } + + // Propagate the scroll position to the actual DOM scroller + if (op.scrollTop != null) { setScrollTop(cm, op.scrollTop, op.forceScroll); } + + if (op.scrollLeft != null) { setScrollLeft(cm, op.scrollLeft, true, true); } + // If we need to scroll a specific position into view, do so. + if (op.scrollToPos) { + var rect = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from), + clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin); + maybeScrollWindow(cm, rect); + } + + // Fire events for markers that are hidden/unidden by editing or + // undoing + var hidden = op.maybeHiddenMarkers, unhidden = op.maybeUnhiddenMarkers; + if (hidden) { for (var i = 0; i < hidden.length; ++i) + { if (!hidden[i].lines.length) { signal(hidden[i], "hide"); } } } + if (unhidden) { for (var i$1 = 0; i$1 < unhidden.length; ++i$1) + { if (unhidden[i$1].lines.length) { signal(unhidden[i$1], "unhide"); } } } + + if (display.wrapper.offsetHeight) + { doc.scrollTop = cm.display.scroller.scrollTop; } + + // Fire change events, and delayed event handlers + if (op.changeObjs) + { signal(cm, "changes", cm, op.changeObjs); } + if (op.update) + { op.update.finish(); } + } + + // Run the given function in an operation + function runInOp(cm, f) { + if (cm.curOp) { return f() } + startOperation(cm); + try { return f() } + finally { endOperation(cm); } + } + // Wraps a function in an operation. Returns the wrapped function. + function operation(cm, f) { + return function() { + if (cm.curOp) { return f.apply(cm, arguments) } + startOperation(cm); + try { return f.apply(cm, arguments) } + finally { endOperation(cm); } + } + } + // Used to add methods to editor and doc instances, wrapping them in + // operations. + function methodOp(f) { + return function() { + if (this.curOp) { return f.apply(this, arguments) } + startOperation(this); + try { return f.apply(this, arguments) } + finally { endOperation(this); } + } + } + function docMethodOp(f) { + return function() { + var cm = this.cm; + if (!cm || cm.curOp) { return f.apply(this, arguments) } + startOperation(cm); + try { return f.apply(this, arguments) } + finally { endOperation(cm); } + } + } + + // HIGHLIGHT WORKER + + function startWorker(cm, time) { + if (cm.doc.highlightFrontier < cm.display.viewTo) + { cm.state.highlight.set(time, bind(highlightWorker, cm)); } + } + + function highlightWorker(cm) { + var doc = cm.doc; + if (doc.highlightFrontier >= cm.display.viewTo) { return } + var end = +new Date + cm.options.workTime; + var context = getContextBefore(cm, doc.highlightFrontier); + var changedLines = []; + + doc.iter(context.line, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function (line) { + if (context.line >= cm.display.viewFrom) { // Visible + var oldStyles = line.styles; + var resetState = line.text.length > cm.options.maxHighlightLength ? copyState(doc.mode, context.state) : null; + var highlighted = highlightLine(cm, line, context, true); + if (resetState) { context.state = resetState; } + line.styles = highlighted.styles; + var oldCls = line.styleClasses, newCls = highlighted.classes; + if (newCls) { line.styleClasses = newCls; } + else if (oldCls) { line.styleClasses = null; } + var ischange = !oldStyles || oldStyles.length != line.styles.length || + oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass); + for (var i = 0; !ischange && i < oldStyles.length; ++i) { ischange = oldStyles[i] != line.styles[i]; } + if (ischange) { changedLines.push(context.line); } + line.stateAfter = context.save(); + context.nextLine(); + } else { + if (line.text.length <= cm.options.maxHighlightLength) + { processLine(cm, line.text, context); } + line.stateAfter = context.line % 5 == 0 ? context.save() : null; + context.nextLine(); + } + if (+new Date > end) { + startWorker(cm, cm.options.workDelay); + return true + } + }); + doc.highlightFrontier = context.line; + doc.modeFrontier = Math.max(doc.modeFrontier, context.line); + if (changedLines.length) { runInOp(cm, function () { + for (var i = 0; i < changedLines.length; i++) + { regLineChange(cm, changedLines[i], "text"); } + }); } + } + + // DISPLAY DRAWING + + var DisplayUpdate = function(cm, viewport, force) { + var display = cm.display; + + this.viewport = viewport; + // Store some values that we'll need later (but don't want to force a relayout for) + this.visible = visibleLines(display, cm.doc, viewport); + this.editorIsHidden = !display.wrapper.offsetWidth; + this.wrapperHeight = display.wrapper.clientHeight; + this.wrapperWidth = display.wrapper.clientWidth; + this.oldDisplayWidth = displayWidth(cm); + this.force = force; + this.dims = getDimensions(cm); + this.events = []; + }; + + DisplayUpdate.prototype.signal = function (emitter, type) { + if (hasHandler(emitter, type)) + { this.events.push(arguments); } + }; + DisplayUpdate.prototype.finish = function () { + var this$1 = this; + + for (var i = 0; i < this.events.length; i++) + { signal.apply(null, this$1.events[i]); } + }; + + function maybeClipScrollbars(cm) { + var display = cm.display; + if (!display.scrollbarsClipped && display.scroller.offsetWidth) { + display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth; + display.heightForcer.style.height = scrollGap(cm) + "px"; + display.sizer.style.marginBottom = -display.nativeBarWidth + "px"; + display.sizer.style.borderRightWidth = scrollGap(cm) + "px"; + display.scrollbarsClipped = true; + } + } + + function selectionSnapshot(cm) { + if (cm.hasFocus()) { return null } + var active = activeElt(); + if (!active || !contains(cm.display.lineDiv, active)) { return null } + var result = {activeElt: active}; + if (window.getSelection) { + var sel = window.getSelection(); + if (sel.anchorNode && sel.extend && contains(cm.display.lineDiv, sel.anchorNode)) { + result.anchorNode = sel.anchorNode; + result.anchorOffset = sel.anchorOffset; + result.focusNode = sel.focusNode; + result.focusOffset = sel.focusOffset; + } + } + return result + } + + function restoreSelection(snapshot) { + if (!snapshot || !snapshot.activeElt || snapshot.activeElt == activeElt()) { return } + snapshot.activeElt.focus(); + if (snapshot.anchorNode && contains(document.body, snapshot.anchorNode) && contains(document.body, snapshot.focusNode)) { + var sel = window.getSelection(), range$$1 = document.createRange(); + range$$1.setEnd(snapshot.anchorNode, snapshot.anchorOffset); + range$$1.collapse(false); + sel.removeAllRanges(); + sel.addRange(range$$1); + sel.extend(snapshot.focusNode, snapshot.focusOffset); + } + } + + // Does the actual updating of the line display. Bails out + // (returning false) when there is nothing to be done and forced is + // false. + function updateDisplayIfNeeded(cm, update) { + var display = cm.display, doc = cm.doc; + + if (update.editorIsHidden) { + resetView(cm); + return false + } + + // Bail out if the visible area is already rendered and nothing changed. + if (!update.force && + update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo && + (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) && + display.renderedView == display.view && countDirtyView(cm) == 0) + { return false } + + if (maybeUpdateLineNumberWidth(cm)) { + resetView(cm); + update.dims = getDimensions(cm); + } + + // Compute a suitable new viewport (from & to) + var end = doc.first + doc.size; + var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first); + var to = Math.min(end, update.visible.to + cm.options.viewportMargin); + if (display.viewFrom < from && from - display.viewFrom < 20) { from = Math.max(doc.first, display.viewFrom); } + if (display.viewTo > to && display.viewTo - to < 20) { to = Math.min(end, display.viewTo); } + if (sawCollapsedSpans) { + from = visualLineNo(cm.doc, from); + to = visualLineEndNo(cm.doc, to); + } + + var different = from != display.viewFrom || to != display.viewTo || + display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth; + adjustView(cm, from, to); + + display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom)); + // Position the mover div to align with the current scroll position + cm.display.mover.style.top = display.viewOffset + "px"; + + var toUpdate = countDirtyView(cm); + if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view && + (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo)) + { return false } + + // For big changes, we hide the enclosing element during the + // update, since that speeds up the operations on most browsers. + var selSnapshot = selectionSnapshot(cm); + if (toUpdate > 4) { display.lineDiv.style.display = "none"; } + patchDisplay(cm, display.updateLineNumbers, update.dims); + if (toUpdate > 4) { display.lineDiv.style.display = ""; } + display.renderedView = display.view; + // There might have been a widget with a focused element that got + // hidden or updated, if so re-focus it. + restoreSelection(selSnapshot); + + // Prevent selection and cursors from interfering with the scroll + // width and height. + removeChildren(display.cursorDiv); + removeChildren(display.selectionDiv); + display.gutters.style.height = display.sizer.style.minHeight = 0; + + if (different) { + display.lastWrapHeight = update.wrapperHeight; + display.lastWrapWidth = update.wrapperWidth; + startWorker(cm, 400); + } + + display.updateLineNumbers = null; + + return true + } + + function postUpdateDisplay(cm, update) { + var viewport = update.viewport; + + for (var first = true;; first = false) { + if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) { + // Clip forced viewport to actual scrollable area. + if (viewport && viewport.top != null) + { viewport = {top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top)}; } + // Updated line heights might result in the drawn area not + // actually covering the viewport. Keep looping until it does. + update.visible = visibleLines(cm.display, cm.doc, viewport); + if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo) + { break } + } + if (!updateDisplayIfNeeded(cm, update)) { break } + updateHeightsInViewport(cm); + var barMeasure = measureForScrollbars(cm); + updateSelection(cm); + updateScrollbars(cm, barMeasure); + setDocumentHeight(cm, barMeasure); + update.force = false; + } + + update.signal(cm, "update", cm); + if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) { + update.signal(cm, "viewportChange", cm, cm.display.viewFrom, cm.display.viewTo); + cm.display.reportedViewFrom = cm.display.viewFrom; cm.display.reportedViewTo = cm.display.viewTo; + } + } + + function updateDisplaySimple(cm, viewport) { + var update = new DisplayUpdate(cm, viewport); + if (updateDisplayIfNeeded(cm, update)) { + updateHeightsInViewport(cm); + postUpdateDisplay(cm, update); + var barMeasure = measureForScrollbars(cm); + updateSelection(cm); + updateScrollbars(cm, barMeasure); + setDocumentHeight(cm, barMeasure); + update.finish(); + } + } + + // Sync the actual display DOM structure with display.view, removing + // nodes for lines that are no longer in view, and creating the ones + // that are not there yet, and updating the ones that are out of + // date. + function patchDisplay(cm, updateNumbersFrom, dims) { + var display = cm.display, lineNumbers = cm.options.lineNumbers; + var container = display.lineDiv, cur = container.firstChild; + + function rm(node) { + var next = node.nextSibling; + // Works around a throw-scroll bug in OS X Webkit + if (webkit && mac && cm.display.currentWheelTarget == node) + { node.style.display = "none"; } + else + { node.parentNode.removeChild(node); } + return next + } + + var view = display.view, lineN = display.viewFrom; + // Loop over the elements in the view, syncing cur (the DOM nodes + // in display.lineDiv) with the view as we go. + for (var i = 0; i < view.length; i++) { + var lineView = view[i]; + if (lineView.hidden) ; else if (!lineView.node || lineView.node.parentNode != container) { // Not drawn yet + var node = buildLineElement(cm, lineView, lineN, dims); + container.insertBefore(node, cur); + } else { // Already drawn + while (cur != lineView.node) { cur = rm(cur); } + var updateNumber = lineNumbers && updateNumbersFrom != null && + updateNumbersFrom <= lineN && lineView.lineNumber; + if (lineView.changes) { + if (indexOf(lineView.changes, "gutter") > -1) { updateNumber = false; } + updateLineForChanges(cm, lineView, lineN, dims); + } + if (updateNumber) { + removeChildren(lineView.lineNumber); + lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN))); + } + cur = lineView.node.nextSibling; + } + lineN += lineView.size; + } + while (cur) { cur = rm(cur); } + } + + function updateGutterSpace(display) { + var width = display.gutters.offsetWidth; + display.sizer.style.marginLeft = width + "px"; + } + + function setDocumentHeight(cm, measure) { + cm.display.sizer.style.minHeight = measure.docHeight + "px"; + cm.display.heightForcer.style.top = measure.docHeight + "px"; + cm.display.gutters.style.height = (measure.docHeight + cm.display.barHeight + scrollGap(cm)) + "px"; + } + + // Re-align line numbers and gutter marks to compensate for + // horizontal scrolling. + function alignHorizontally(cm) { + var display = cm.display, view = display.view; + if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) { return } + var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft; + var gutterW = display.gutters.offsetWidth, left = comp + "px"; + for (var i = 0; i < view.length; i++) { if (!view[i].hidden) { + if (cm.options.fixedGutter) { + if (view[i].gutter) + { view[i].gutter.style.left = left; } + if (view[i].gutterBackground) + { view[i].gutterBackground.style.left = left; } + } + var align = view[i].alignable; + if (align) { for (var j = 0; j < align.length; j++) + { align[j].style.left = left; } } + } } + if (cm.options.fixedGutter) + { display.gutters.style.left = (comp + gutterW) + "px"; } + } + + // Used to ensure that the line number gutter is still the right + // size for the current document size. Returns true when an update + // is needed. + function maybeUpdateLineNumberWidth(cm) { + if (!cm.options.lineNumbers) { return false } + var doc = cm.doc, last = lineNumberFor(cm.options, doc.first + doc.size - 1), display = cm.display; + if (last.length != display.lineNumChars) { + var test = display.measure.appendChild(elt("div", [elt("div", last)], + "CodeMirror-linenumber CodeMirror-gutter-elt")); + var innerW = test.firstChild.offsetWidth, padding = test.offsetWidth - innerW; + display.lineGutter.style.width = ""; + display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1; + display.lineNumWidth = display.lineNumInnerWidth + padding; + display.lineNumChars = display.lineNumInnerWidth ? last.length : -1; + display.lineGutter.style.width = display.lineNumWidth + "px"; + updateGutterSpace(cm.display); + return true + } + return false + } + + function getGutters(gutters, lineNumbers) { + var result = [], sawLineNumbers = false; + for (var i = 0; i < gutters.length; i++) { + var name = gutters[i], style = null; + if (typeof name != "string") { style = name.style; name = name.className; } + if (name == "CodeMirror-linenumbers") { + if (!lineNumbers) { continue } + else { sawLineNumbers = true; } + } + result.push({className: name, style: style}); + } + if (lineNumbers && !sawLineNumbers) { result.push({className: "CodeMirror-linenumbers", style: null}); } + return result + } + + // Rebuild the gutter elements, ensure the margin to the left of the + // code matches their width. + function renderGutters(display) { + var gutters = display.gutters, specs = display.gutterSpecs; + removeChildren(gutters); + display.lineGutter = null; + for (var i = 0; i < specs.length; ++i) { + var ref = specs[i]; + var className = ref.className; + var style = ref.style; + var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + className)); + if (style) { gElt.style.cssText = style; } + if (className == "CodeMirror-linenumbers") { + display.lineGutter = gElt; + gElt.style.width = (display.lineNumWidth || 1) + "px"; + } + } + gutters.style.display = specs.length ? "" : "none"; + updateGutterSpace(display); + } + + function updateGutters(cm) { + renderGutters(cm.display); + regChange(cm); + alignHorizontally(cm); + } + + // The display handles the DOM integration, both for input reading + // and content drawing. It holds references to DOM nodes and + // display-related state. + + function Display(place, doc, input, options) { + var d = this; + this.input = input; + + // Covers bottom-right square when both scrollbars are present. + d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler"); + d.scrollbarFiller.setAttribute("cm-not-content", "true"); + // Covers bottom of gutter when coverGutterNextToScrollbar is on + // and h scrollbar is present. + d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler"); + d.gutterFiller.setAttribute("cm-not-content", "true"); + // Will contain the actual code, positioned to cover the viewport. + d.lineDiv = eltP("div", null, "CodeMirror-code"); + // Elements are added to these to represent selection and cursors. + d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1"); + d.cursorDiv = elt("div", null, "CodeMirror-cursors"); + // A visibility: hidden element used to find the size of things. + d.measure = elt("div", null, "CodeMirror-measure"); + // When lines outside of the viewport are measured, they are drawn in this. + d.lineMeasure = elt("div", null, "CodeMirror-measure"); + // Wraps everything that needs to exist inside the vertically-padded coordinate system + d.lineSpace = eltP("div", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv], + null, "position: relative; outline: none"); + var lines = eltP("div", [d.lineSpace], "CodeMirror-lines"); + // Moved around its parent to cover visible view. + d.mover = elt("div", [lines], null, "position: relative"); + // Set to the height of the document, allowing scrolling. + d.sizer = elt("div", [d.mover], "CodeMirror-sizer"); + d.sizerWidth = null; + // Behavior of elts with overflow: auto and padding is + // inconsistent across browsers. This is used to ensure the + // scrollable area is big enough. + d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerGap + "px; width: 1px;"); + // Will contain the gutters, if any. + d.gutters = elt("div", null, "CodeMirror-gutters"); + d.lineGutter = null; + // Actual scrollable element. + d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll"); + d.scroller.setAttribute("tabIndex", "-1"); + // The element in which the editor lives. + d.wrapper = elt("div", [d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror"); + + // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported) + if (ie && ie_version < 8) { d.gutters.style.zIndex = -1; d.scroller.style.paddingRight = 0; } + if (!webkit && !(gecko && mobile)) { d.scroller.draggable = true; } + + if (place) { + if (place.appendChild) { place.appendChild(d.wrapper); } + else { place(d.wrapper); } + } + + // Current rendered range (may be bigger than the view window). + d.viewFrom = d.viewTo = doc.first; + d.reportedViewFrom = d.reportedViewTo = doc.first; + // Information about the rendered lines. + d.view = []; + d.renderedView = null; + // Holds info about a single rendered line when it was rendered + // for measurement, while not in view. + d.externalMeasured = null; + // Empty space (in pixels) above the view + d.viewOffset = 0; + d.lastWrapHeight = d.lastWrapWidth = 0; + d.updateLineNumbers = null; + + d.nativeBarWidth = d.barHeight = d.barWidth = 0; + d.scrollbarsClipped = false; + + // Used to only resize the line number gutter when necessary (when + // the amount of lines crosses a boundary that makes its width change) + d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null; + // Set to true when a non-horizontal-scrolling line widget is + // added. As an optimization, line widget aligning is skipped when + // this is false. + d.alignWidgets = false; + + d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null; + + // Tracks the maximum line length so that the horizontal scrollbar + // can be kept static when scrolling. + d.maxLine = null; + d.maxLineLength = 0; + d.maxLineChanged = false; + + // Used for measuring wheel scrolling granularity + d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null; + + // True when shift is held down. + d.shift = false; + + // Used to track whether anything happened since the context menu + // was opened. + d.selForContextMenu = null; + + d.activeTouch = null; + + d.gutterSpecs = getGutters(options.gutters, options.lineNumbers); + renderGutters(d); + + input.init(d); + } + + // Since the delta values reported on mouse wheel events are + // unstandardized between browsers and even browser versions, and + // generally horribly unpredictable, this code starts by measuring + // the scroll effect that the first few mouse wheel events have, + // and, from that, detects the way it can convert deltas to pixel + // offsets afterwards. + // + // The reason we want to know the amount a wheel event will scroll + // is that it gives us a chance to update the display before the + // actual scrolling happens, reducing flickering. + + var wheelSamples = 0, wheelPixelsPerUnit = null; + // Fill in a browser-detected starting value on browsers where we + // know one. These don't have to be accurate -- the result of them + // being wrong would just be a slight flicker on the first wheel + // scroll (if it is large enough). + if (ie) { wheelPixelsPerUnit = -.53; } + else if (gecko) { wheelPixelsPerUnit = 15; } + else if (chrome) { wheelPixelsPerUnit = -.7; } + else if (safari) { wheelPixelsPerUnit = -1/3; } + + function wheelEventDelta(e) { + var dx = e.wheelDeltaX, dy = e.wheelDeltaY; + if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) { dx = e.detail; } + if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) { dy = e.detail; } + else if (dy == null) { dy = e.wheelDelta; } + return {x: dx, y: dy} + } + function wheelEventPixels(e) { + var delta = wheelEventDelta(e); + delta.x *= wheelPixelsPerUnit; + delta.y *= wheelPixelsPerUnit; + return delta + } + + function onScrollWheel(cm, e) { + var delta = wheelEventDelta(e), dx = delta.x, dy = delta.y; + + var display = cm.display, scroll = display.scroller; + // Quit if there's nothing to scroll here + var canScrollX = scroll.scrollWidth > scroll.clientWidth; + var canScrollY = scroll.scrollHeight > scroll.clientHeight; + if (!(dx && canScrollX || dy && canScrollY)) { return } + + // Webkit browsers on OS X abort momentum scrolls when the target + // of the scroll event is removed from the scrollable element. + // This hack (see related code in patchDisplay) makes sure the + // element is kept around. + if (dy && mac && webkit) { + outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) { + for (var i = 0; i < view.length; i++) { + if (view[i].node == cur) { + cm.display.currentWheelTarget = cur; + break outer + } + } + } + } + + // On some browsers, horizontal scrolling will cause redraws to + // happen before the gutter has been realigned, causing it to + // wriggle around in a most unseemly way. When we have an + // estimated pixels/delta value, we just handle horizontal + // scrolling entirely here. It'll be slightly off from native, but + // better than glitching out. + if (dx && !gecko && !presto && wheelPixelsPerUnit != null) { + if (dy && canScrollY) + { updateScrollTop(cm, Math.max(0, scroll.scrollTop + dy * wheelPixelsPerUnit)); } + setScrollLeft(cm, Math.max(0, scroll.scrollLeft + dx * wheelPixelsPerUnit)); + // Only prevent default scrolling if vertical scrolling is + // actually possible. Otherwise, it causes vertical scroll + // jitter on OSX trackpads when deltaX is small and deltaY + // is large (issue #3579) + if (!dy || (dy && canScrollY)) + { e_preventDefault(e); } + display.wheelStartX = null; // Abort measurement, if in progress + return + } + + // 'Project' the visible viewport to cover the area that is being + // scrolled into view (if we know enough to estimate it). + if (dy && wheelPixelsPerUnit != null) { + var pixels = dy * wheelPixelsPerUnit; + var top = cm.doc.scrollTop, bot = top + display.wrapper.clientHeight; + if (pixels < 0) { top = Math.max(0, top + pixels - 50); } + else { bot = Math.min(cm.doc.height, bot + pixels + 50); } + updateDisplaySimple(cm, {top: top, bottom: bot}); + } + + if (wheelSamples < 20) { + if (display.wheelStartX == null) { + display.wheelStartX = scroll.scrollLeft; display.wheelStartY = scroll.scrollTop; + display.wheelDX = dx; display.wheelDY = dy; + setTimeout(function () { + if (display.wheelStartX == null) { return } + var movedX = scroll.scrollLeft - display.wheelStartX; + var movedY = scroll.scrollTop - display.wheelStartY; + var sample = (movedY && display.wheelDY && movedY / display.wheelDY) || + (movedX && display.wheelDX && movedX / display.wheelDX); + display.wheelStartX = display.wheelStartY = null; + if (!sample) { return } + wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1); + ++wheelSamples; + }, 200); + } else { + display.wheelDX += dx; display.wheelDY += dy; + } + } + } + + // Selection objects are immutable. A new one is created every time + // the selection changes. A selection is one or more non-overlapping + // (and non-touching) ranges, sorted, and an integer that indicates + // which one is the primary selection (the one that's scrolled into + // view, that getCursor returns, etc). + var Selection = function(ranges, primIndex) { + this.ranges = ranges; + this.primIndex = primIndex; + }; + + Selection.prototype.primary = function () { return this.ranges[this.primIndex] }; + + Selection.prototype.equals = function (other) { + var this$1 = this; + + if (other == this) { return true } + if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) { return false } + for (var i = 0; i < this.ranges.length; i++) { + var here = this$1.ranges[i], there = other.ranges[i]; + if (!equalCursorPos(here.anchor, there.anchor) || !equalCursorPos(here.head, there.head)) { return false } + } + return true + }; + + Selection.prototype.deepCopy = function () { + var this$1 = this; + + var out = []; + for (var i = 0; i < this.ranges.length; i++) + { out[i] = new Range(copyPos(this$1.ranges[i].anchor), copyPos(this$1.ranges[i].head)); } + return new Selection(out, this.primIndex) + }; + + Selection.prototype.somethingSelected = function () { + var this$1 = this; + + for (var i = 0; i < this.ranges.length; i++) + { if (!this$1.ranges[i].empty()) { return true } } + return false + }; + + Selection.prototype.contains = function (pos, end) { + var this$1 = this; + + if (!end) { end = pos; } + for (var i = 0; i < this.ranges.length; i++) { + var range = this$1.ranges[i]; + if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0) + { return i } + } + return -1 + }; + + var Range = function(anchor, head) { + this.anchor = anchor; this.head = head; + }; + + Range.prototype.from = function () { return minPos(this.anchor, this.head) }; + Range.prototype.to = function () { return maxPos(this.anchor, this.head) }; + Range.prototype.empty = function () { return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch }; + + // Take an unsorted, potentially overlapping set of ranges, and + // build a selection out of it. 'Consumes' ranges array (modifying + // it). + function normalizeSelection(cm, ranges, primIndex) { + var mayTouch = cm && cm.options.selectionsMayTouch; + var prim = ranges[primIndex]; + ranges.sort(function (a, b) { return cmp(a.from(), b.from()); }); + primIndex = indexOf(ranges, prim); + for (var i = 1; i < ranges.length; i++) { + var cur = ranges[i], prev = ranges[i - 1]; + var diff = cmp(prev.to(), cur.from()); + if (mayTouch && !cur.empty() ? diff > 0 : diff >= 0) { + var from = minPos(prev.from(), cur.from()), to = maxPos(prev.to(), cur.to()); + var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head; + if (i <= primIndex) { --primIndex; } + ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to)); + } + } + return new Selection(ranges, primIndex) + } + + function simpleSelection(anchor, head) { + return new Selection([new Range(anchor, head || anchor)], 0) + } + + // Compute the position of the end of a change (its 'to' property + // refers to the pre-change end). + function changeEnd(change) { + if (!change.text) { return change.to } + return Pos(change.from.line + change.text.length - 1, + lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0)) + } + + // Adjust a position to refer to the post-change position of the + // same text, or the end of the change if the change covers it. + function adjustForChange(pos, change) { + if (cmp(pos, change.from) < 0) { return pos } + if (cmp(pos, change.to) <= 0) { return changeEnd(change) } + + var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, ch = pos.ch; + if (pos.line == change.to.line) { ch += changeEnd(change).ch - change.to.ch; } + return Pos(line, ch) + } + + function computeSelAfterChange(doc, change) { + var out = []; + for (var i = 0; i < doc.sel.ranges.length; i++) { + var range = doc.sel.ranges[i]; + out.push(new Range(adjustForChange(range.anchor, change), + adjustForChange(range.head, change))); + } + return normalizeSelection(doc.cm, out, doc.sel.primIndex) + } + + function offsetPos(pos, old, nw) { + if (pos.line == old.line) + { return Pos(nw.line, pos.ch - old.ch + nw.ch) } + else + { return Pos(nw.line + (pos.line - old.line), pos.ch) } + } + + // Used by replaceSelections to allow moving the selection to the + // start or around the replaced test. Hint may be "start" or "around". + function computeReplacedSel(doc, changes, hint) { + var out = []; + var oldPrev = Pos(doc.first, 0), newPrev = oldPrev; + for (var i = 0; i < changes.length; i++) { + var change = changes[i]; + var from = offsetPos(change.from, oldPrev, newPrev); + var to = offsetPos(changeEnd(change), oldPrev, newPrev); + oldPrev = change.to; + newPrev = to; + if (hint == "around") { + var range = doc.sel.ranges[i], inv = cmp(range.head, range.anchor) < 0; + out[i] = new Range(inv ? to : from, inv ? from : to); + } else { + out[i] = new Range(from, from); + } + } + return new Selection(out, doc.sel.primIndex) + } + + // Used to get the editor into a consistent state again when options change. + + function loadMode(cm) { + cm.doc.mode = getMode(cm.options, cm.doc.modeOption); + resetModeState(cm); + } + + function resetModeState(cm) { + cm.doc.iter(function (line) { + if (line.stateAfter) { line.stateAfter = null; } + if (line.styles) { line.styles = null; } + }); + cm.doc.modeFrontier = cm.doc.highlightFrontier = cm.doc.first; + startWorker(cm, 100); + cm.state.modeGen++; + if (cm.curOp) { regChange(cm); } + } + + // DOCUMENT DATA STRUCTURE + + // By default, updates that start and end at the beginning of a line + // are treated specially, in order to make the association of line + // widgets and marker elements with the text behave more intuitive. + function isWholeLineUpdate(doc, change) { + return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == "" && + (!doc.cm || doc.cm.options.wholeLineUpdateBefore) + } + + // Perform a change on the document data structure. + function updateDoc(doc, change, markedSpans, estimateHeight$$1) { + function spansFor(n) {return markedSpans ? markedSpans[n] : null} + function update(line, text, spans) { + updateLine(line, text, spans, estimateHeight$$1); + signalLater(line, "change", line, change); + } + function linesFor(start, end) { + var result = []; + for (var i = start; i < end; ++i) + { result.push(new Line(text[i], spansFor(i), estimateHeight$$1)); } + return result + } + + var from = change.from, to = change.to, text = change.text; + var firstLine = getLine(doc, from.line), lastLine = getLine(doc, to.line); + var lastText = lst(text), lastSpans = spansFor(text.length - 1), nlines = to.line - from.line; + + // Adjust the line structure + if (change.full) { + doc.insert(0, linesFor(0, text.length)); + doc.remove(text.length, doc.size - text.length); + } else if (isWholeLineUpdate(doc, change)) { + // This is a whole-line replace. Treated specially to make + // sure line objects move the way they are supposed to. + var added = linesFor(0, text.length - 1); + update(lastLine, lastLine.text, lastSpans); + if (nlines) { doc.remove(from.line, nlines); } + if (added.length) { doc.insert(from.line, added); } + } else if (firstLine == lastLine) { + if (text.length == 1) { + update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans); + } else { + var added$1 = linesFor(1, text.length - 1); + added$1.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight$$1)); + update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); + doc.insert(from.line + 1, added$1); + } + } else if (text.length == 1) { + update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0)); + doc.remove(from.line + 1, nlines); + } else { + update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); + update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans); + var added$2 = linesFor(1, text.length - 1); + if (nlines > 1) { doc.remove(from.line + 1, nlines - 1); } + doc.insert(from.line + 1, added$2); + } + + signalLater(doc, "change", doc, change); + } + + // Call f for all linked documents. + function linkedDocs(doc, f, sharedHistOnly) { + function propagate(doc, skip, sharedHist) { + if (doc.linked) { for (var i = 0; i < doc.linked.length; ++i) { + var rel = doc.linked[i]; + if (rel.doc == skip) { continue } + var shared = sharedHist && rel.sharedHist; + if (sharedHistOnly && !shared) { continue } + f(rel.doc, shared); + propagate(rel.doc, doc, shared); + } } + } + propagate(doc, null, true); + } + + // Attach a document to an editor. + function attachDoc(cm, doc) { + if (doc.cm) { throw new Error("This document is already in use.") } + cm.doc = doc; + doc.cm = cm; + estimateLineHeights(cm); + loadMode(cm); + setDirectionClass(cm); + if (!cm.options.lineWrapping) { findMaxLine(cm); } + cm.options.mode = doc.modeOption; + regChange(cm); + } + + function setDirectionClass(cm) { + (cm.doc.direction == "rtl" ? addClass : rmClass)(cm.display.lineDiv, "CodeMirror-rtl"); + } + + function directionChanged(cm) { + runInOp(cm, function () { + setDirectionClass(cm); + regChange(cm); + }); + } + + function History(startGen) { + // Arrays of change events and selections. Doing something adds an + // event to done and clears undo. Undoing moves events from done + // to undone, redoing moves them in the other direction. + this.done = []; this.undone = []; + this.undoDepth = Infinity; + // Used to track when changes can be merged into a single undo + // event + this.lastModTime = this.lastSelTime = 0; + this.lastOp = this.lastSelOp = null; + this.lastOrigin = this.lastSelOrigin = null; + // Used by the isClean() method + this.generation = this.maxGeneration = startGen || 1; + } + + // Create a history change event from an updateDoc-style change + // object. + function historyChangeFromChange(doc, change) { + var histChange = {from: copyPos(change.from), to: changeEnd(change), text: getBetween(doc, change.from, change.to)}; + attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); + linkedDocs(doc, function (doc) { return attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); }, true); + return histChange + } + + // Pop all selection events off the end of a history array. Stop at + // a change event. + function clearSelectionEvents(array) { + while (array.length) { + var last = lst(array); + if (last.ranges) { array.pop(); } + else { break } + } + } + + // Find the top change event in the history. Pop off selection + // events that are in the way. + function lastChangeEvent(hist, force) { + if (force) { + clearSelectionEvents(hist.done); + return lst(hist.done) + } else if (hist.done.length && !lst(hist.done).ranges) { + return lst(hist.done) + } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) { + hist.done.pop(); + return lst(hist.done) + } + } + + // Register a change in the history. Merges changes that are within + // a single operation, or are close together with an origin that + // allows merging (starting with "+") into a single event. + function addChangeToHistory(doc, change, selAfter, opId) { + var hist = doc.history; + hist.undone.length = 0; + var time = +new Date, cur; + var last; + + if ((hist.lastOp == opId || + hist.lastOrigin == change.origin && change.origin && + ((change.origin.charAt(0) == "+" && hist.lastModTime > time - (doc.cm ? doc.cm.options.historyEventDelay : 500)) || + change.origin.charAt(0) == "*")) && + (cur = lastChangeEvent(hist, hist.lastOp == opId))) { + // Merge this change into the last event + last = lst(cur.changes); + if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) { + // Optimized case for simple insertion -- don't want to add + // new changesets for every character typed + last.to = changeEnd(change); + } else { + // Add new sub-event + cur.changes.push(historyChangeFromChange(doc, change)); + } + } else { + // Can not be merged, start a new event. + var before = lst(hist.done); + if (!before || !before.ranges) + { pushSelectionToHistory(doc.sel, hist.done); } + cur = {changes: [historyChangeFromChange(doc, change)], + generation: hist.generation}; + hist.done.push(cur); + while (hist.done.length > hist.undoDepth) { + hist.done.shift(); + if (!hist.done[0].ranges) { hist.done.shift(); } + } + } + hist.done.push(selAfter); + hist.generation = ++hist.maxGeneration; + hist.lastModTime = hist.lastSelTime = time; + hist.lastOp = hist.lastSelOp = opId; + hist.lastOrigin = hist.lastSelOrigin = change.origin; + + if (!last) { signal(doc, "historyAdded"); } + } + + function selectionEventCanBeMerged(doc, origin, prev, sel) { + var ch = origin.charAt(0); + return ch == "*" || + ch == "+" && + prev.ranges.length == sel.ranges.length && + prev.somethingSelected() == sel.somethingSelected() && + new Date - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500) + } + + // Called whenever the selection changes, sets the new selection as + // the pending selection in the history, and pushes the old pending + // selection into the 'done' array when it was significantly + // different (in number of selected ranges, emptiness, or time). + function addSelectionToHistory(doc, sel, opId, options) { + var hist = doc.history, origin = options && options.origin; + + // A new event is started when the previous origin does not match + // the current, or the origins don't allow matching. Origins + // starting with * are always merged, those starting with + are + // merged when similar and close together in time. + if (opId == hist.lastSelOp || + (origin && hist.lastSelOrigin == origin && + (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin || + selectionEventCanBeMerged(doc, origin, lst(hist.done), sel)))) + { hist.done[hist.done.length - 1] = sel; } + else + { pushSelectionToHistory(sel, hist.done); } + + hist.lastSelTime = +new Date; + hist.lastSelOrigin = origin; + hist.lastSelOp = opId; + if (options && options.clearRedo !== false) + { clearSelectionEvents(hist.undone); } + } + + function pushSelectionToHistory(sel, dest) { + var top = lst(dest); + if (!(top && top.ranges && top.equals(sel))) + { dest.push(sel); } + } + + // Used to store marked span information in the history. + function attachLocalSpans(doc, change, from, to) { + var existing = change["spans_" + doc.id], n = 0; + doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function (line) { + if (line.markedSpans) + { (existing || (existing = change["spans_" + doc.id] = {}))[n] = line.markedSpans; } + ++n; + }); + } + + // When un/re-doing restores text containing marked spans, those + // that have been explicitly cleared should not be restored. + function removeClearedSpans(spans) { + if (!spans) { return null } + var out; + for (var i = 0; i < spans.length; ++i) { + if (spans[i].marker.explicitlyCleared) { if (!out) { out = spans.slice(0, i); } } + else if (out) { out.push(spans[i]); } + } + return !out ? spans : out.length ? out : null + } + + // Retrieve and filter the old marked spans stored in a change event. + function getOldSpans(doc, change) { + var found = change["spans_" + doc.id]; + if (!found) { return null } + var nw = []; + for (var i = 0; i < change.text.length; ++i) + { nw.push(removeClearedSpans(found[i])); } + return nw + } + + // Used for un/re-doing changes from the history. Combines the + // result of computing the existing spans with the set of spans that + // existed in the history (so that deleting around a span and then + // undoing brings back the span). + function mergeOldSpans(doc, change) { + var old = getOldSpans(doc, change); + var stretched = stretchSpansOverChange(doc, change); + if (!old) { return stretched } + if (!stretched) { return old } + + for (var i = 0; i < old.length; ++i) { + var oldCur = old[i], stretchCur = stretched[i]; + if (oldCur && stretchCur) { + spans: for (var j = 0; j < stretchCur.length; ++j) { + var span = stretchCur[j]; + for (var k = 0; k < oldCur.length; ++k) + { if (oldCur[k].marker == span.marker) { continue spans } } + oldCur.push(span); + } + } else if (stretchCur) { + old[i] = stretchCur; + } + } + return old + } + + // Used both to provide a JSON-safe object in .getHistory, and, when + // detaching a document, to split the history in two + function copyHistoryArray(events, newGroup, instantiateSel) { + var copy = []; + for (var i = 0; i < events.length; ++i) { + var event = events[i]; + if (event.ranges) { + copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event); + continue + } + var changes = event.changes, newChanges = []; + copy.push({changes: newChanges}); + for (var j = 0; j < changes.length; ++j) { + var change = changes[j], m = (void 0); + newChanges.push({from: change.from, to: change.to, text: change.text}); + if (newGroup) { for (var prop in change) { if (m = prop.match(/^spans_(\d+)$/)) { + if (indexOf(newGroup, Number(m[1])) > -1) { + lst(newChanges)[prop] = change[prop]; + delete change[prop]; + } + } } } + } + } + return copy + } + + // The 'scroll' parameter given to many of these indicated whether + // the new cursor position should be scrolled into view after + // modifying the selection. + + // If shift is held or the extend flag is set, extends a range to + // include a given position (and optionally a second position). + // Otherwise, simply returns the range between the given positions. + // Used for cursor motion and such. + function extendRange(range, head, other, extend) { + if (extend) { + var anchor = range.anchor; + if (other) { + var posBefore = cmp(head, anchor) < 0; + if (posBefore != (cmp(other, anchor) < 0)) { + anchor = head; + head = other; + } else if (posBefore != (cmp(head, other) < 0)) { + head = other; + } + } + return new Range(anchor, head) + } else { + return new Range(other || head, head) + } + } + + // Extend the primary selection range, discard the rest. + function extendSelection(doc, head, other, options, extend) { + if (extend == null) { extend = doc.cm && (doc.cm.display.shift || doc.extend); } + setSelection(doc, new Selection([extendRange(doc.sel.primary(), head, other, extend)], 0), options); + } + + // Extend all selections (pos is an array of selections with length + // equal the number of selections) + function extendSelections(doc, heads, options) { + var out = []; + var extend = doc.cm && (doc.cm.display.shift || doc.extend); + for (var i = 0; i < doc.sel.ranges.length; i++) + { out[i] = extendRange(doc.sel.ranges[i], heads[i], null, extend); } + var newSel = normalizeSelection(doc.cm, out, doc.sel.primIndex); + setSelection(doc, newSel, options); + } + + // Updates a single range in the selection. + function replaceOneSelection(doc, i, range, options) { + var ranges = doc.sel.ranges.slice(0); + ranges[i] = range; + setSelection(doc, normalizeSelection(doc.cm, ranges, doc.sel.primIndex), options); + } + + // Reset the selection to a single range. + function setSimpleSelection(doc, anchor, head, options) { + setSelection(doc, simpleSelection(anchor, head), options); + } + + // Give beforeSelectionChange handlers a change to influence a + // selection update. + function filterSelectionChange(doc, sel, options) { + var obj = { + ranges: sel.ranges, + update: function(ranges) { + var this$1 = this; + + this.ranges = []; + for (var i = 0; i < ranges.length; i++) + { this$1.ranges[i] = new Range(clipPos(doc, ranges[i].anchor), + clipPos(doc, ranges[i].head)); } + }, + origin: options && options.origin + }; + signal(doc, "beforeSelectionChange", doc, obj); + if (doc.cm) { signal(doc.cm, "beforeSelectionChange", doc.cm, obj); } + if (obj.ranges != sel.ranges) { return normalizeSelection(doc.cm, obj.ranges, obj.ranges.length - 1) } + else { return sel } + } + + function setSelectionReplaceHistory(doc, sel, options) { + var done = doc.history.done, last = lst(done); + if (last && last.ranges) { + done[done.length - 1] = sel; + setSelectionNoUndo(doc, sel, options); + } else { + setSelection(doc, sel, options); + } + } + + // Set a new selection. + function setSelection(doc, sel, options) { + setSelectionNoUndo(doc, sel, options); + addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options); + } + + function setSelectionNoUndo(doc, sel, options) { + if (hasHandler(doc, "beforeSelectionChange") || doc.cm && hasHandler(doc.cm, "beforeSelectionChange")) + { sel = filterSelectionChange(doc, sel, options); } + + var bias = options && options.bias || + (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1); + setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true)); + + if (!(options && options.scroll === false) && doc.cm) + { ensureCursorVisible(doc.cm); } + } + + function setSelectionInner(doc, sel) { + if (sel.equals(doc.sel)) { return } + + doc.sel = sel; + + if (doc.cm) { + doc.cm.curOp.updateInput = 1; + doc.cm.curOp.selectionChanged = true; + signalCursorActivity(doc.cm); + } + signalLater(doc, "cursorActivity", doc); + } + + // Verify that the selection does not partially select any atomic + // marked ranges. + function reCheckSelection(doc) { + setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false)); + } + + // Return a selection that does not partially select any atomic + // ranges. + function skipAtomicInSelection(doc, sel, bias, mayClear) { + var out; + for (var i = 0; i < sel.ranges.length; i++) { + var range = sel.ranges[i]; + var old = sel.ranges.length == doc.sel.ranges.length && doc.sel.ranges[i]; + var newAnchor = skipAtomic(doc, range.anchor, old && old.anchor, bias, mayClear); + var newHead = skipAtomic(doc, range.head, old && old.head, bias, mayClear); + if (out || newAnchor != range.anchor || newHead != range.head) { + if (!out) { out = sel.ranges.slice(0, i); } + out[i] = new Range(newAnchor, newHead); + } + } + return out ? normalizeSelection(doc.cm, out, sel.primIndex) : sel + } + + function skipAtomicInner(doc, pos, oldPos, dir, mayClear) { + var line = getLine(doc, pos.line); + if (line.markedSpans) { for (var i = 0; i < line.markedSpans.length; ++i) { + var sp = line.markedSpans[i], m = sp.marker; + + // Determine if we should prevent the cursor being placed to the left/right of an atomic marker + // Historically this was determined using the inclusiveLeft/Right option, but the new way to control it + // is with selectLeft/Right + var preventCursorLeft = ("selectLeft" in m) ? !m.selectLeft : m.inclusiveLeft; + var preventCursorRight = ("selectRight" in m) ? !m.selectRight : m.inclusiveRight; + + if ((sp.from == null || (preventCursorLeft ? sp.from <= pos.ch : sp.from < pos.ch)) && + (sp.to == null || (preventCursorRight ? sp.to >= pos.ch : sp.to > pos.ch))) { + if (mayClear) { + signal(m, "beforeCursorEnter"); + if (m.explicitlyCleared) { + if (!line.markedSpans) { break } + else {--i; continue} + } + } + if (!m.atomic) { continue } + + if (oldPos) { + var near = m.find(dir < 0 ? 1 : -1), diff = (void 0); + if (dir < 0 ? preventCursorRight : preventCursorLeft) + { near = movePos(doc, near, -dir, near && near.line == pos.line ? line : null); } + if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0)) + { return skipAtomicInner(doc, near, pos, dir, mayClear) } + } + + var far = m.find(dir < 0 ? -1 : 1); + if (dir < 0 ? preventCursorLeft : preventCursorRight) + { far = movePos(doc, far, dir, far.line == pos.line ? line : null); } + return far ? skipAtomicInner(doc, far, pos, dir, mayClear) : null + } + } } + return pos + } + + // Ensure a given position is not inside an atomic range. + function skipAtomic(doc, pos, oldPos, bias, mayClear) { + var dir = bias || 1; + var found = skipAtomicInner(doc, pos, oldPos, dir, mayClear) || + (!mayClear && skipAtomicInner(doc, pos, oldPos, dir, true)) || + skipAtomicInner(doc, pos, oldPos, -dir, mayClear) || + (!mayClear && skipAtomicInner(doc, pos, oldPos, -dir, true)); + if (!found) { + doc.cantEdit = true; + return Pos(doc.first, 0) + } + return found + } + + function movePos(doc, pos, dir, line) { + if (dir < 0 && pos.ch == 0) { + if (pos.line > doc.first) { return clipPos(doc, Pos(pos.line - 1)) } + else { return null } + } else if (dir > 0 && pos.ch == (line || getLine(doc, pos.line)).text.length) { + if (pos.line < doc.first + doc.size - 1) { return Pos(pos.line + 1, 0) } + else { return null } + } else { + return new Pos(pos.line, pos.ch + dir) + } + } + + function selectAll(cm) { + cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll); + } + + // UPDATING + + // Allow "beforeChange" event handlers to influence a change + function filterChange(doc, change, update) { + var obj = { + canceled: false, + from: change.from, + to: change.to, + text: change.text, + origin: change.origin, + cancel: function () { return obj.canceled = true; } + }; + if (update) { obj.update = function (from, to, text, origin) { + if (from) { obj.from = clipPos(doc, from); } + if (to) { obj.to = clipPos(doc, to); } + if (text) { obj.text = text; } + if (origin !== undefined) { obj.origin = origin; } + }; } + signal(doc, "beforeChange", doc, obj); + if (doc.cm) { signal(doc.cm, "beforeChange", doc.cm, obj); } + + if (obj.canceled) { + if (doc.cm) { doc.cm.curOp.updateInput = 2; } + return null + } + return {from: obj.from, to: obj.to, text: obj.text, origin: obj.origin} + } + + // Apply a change to a document, and add it to the document's + // history, and propagating it to all linked documents. + function makeChange(doc, change, ignoreReadOnly) { + if (doc.cm) { + if (!doc.cm.curOp) { return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly) } + if (doc.cm.state.suppressEdits) { return } + } + + if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) { + change = filterChange(doc, change, true); + if (!change) { return } + } + + // Possibly split or suppress the update based on the presence + // of read-only spans in its range. + var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to); + if (split) { + for (var i = split.length - 1; i >= 0; --i) + { makeChangeInner(doc, {from: split[i].from, to: split[i].to, text: i ? [""] : change.text, origin: change.origin}); } + } else { + makeChangeInner(doc, change); + } + } + + function makeChangeInner(doc, change) { + if (change.text.length == 1 && change.text[0] == "" && cmp(change.from, change.to) == 0) { return } + var selAfter = computeSelAfterChange(doc, change); + addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN); + + makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change)); + var rebased = []; + + linkedDocs(doc, function (doc, sharedHist) { + if (!sharedHist && indexOf(rebased, doc.history) == -1) { + rebaseHist(doc.history, change); + rebased.push(doc.history); + } + makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change)); + }); + } + + // Revert a change stored in a document's history. + function makeChangeFromHistory(doc, type, allowSelectionOnly) { + var suppress = doc.cm && doc.cm.state.suppressEdits; + if (suppress && !allowSelectionOnly) { return } + + var hist = doc.history, event, selAfter = doc.sel; + var source = type == "undo" ? hist.done : hist.undone, dest = type == "undo" ? hist.undone : hist.done; + + // Verify that there is a useable event (so that ctrl-z won't + // needlessly clear selection events) + var i = 0; + for (; i < source.length; i++) { + event = source[i]; + if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges) + { break } + } + if (i == source.length) { return } + hist.lastOrigin = hist.lastSelOrigin = null; + + for (;;) { + event = source.pop(); + if (event.ranges) { + pushSelectionToHistory(event, dest); + if (allowSelectionOnly && !event.equals(doc.sel)) { + setSelection(doc, event, {clearRedo: false}); + return + } + selAfter = event; + } else if (suppress) { + source.push(event); + return + } else { break } + } + + // Build up a reverse change object to add to the opposite history + // stack (redo when undoing, and vice versa). + var antiChanges = []; + pushSelectionToHistory(selAfter, dest); + dest.push({changes: antiChanges, generation: hist.generation}); + hist.generation = event.generation || ++hist.maxGeneration; + + var filter = hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange"); + + var loop = function ( i ) { + var change = event.changes[i]; + change.origin = type; + if (filter && !filterChange(doc, change, false)) { + source.length = 0; + return {} + } + + antiChanges.push(historyChangeFromChange(doc, change)); + + var after = i ? computeSelAfterChange(doc, change) : lst(source); + makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change)); + if (!i && doc.cm) { doc.cm.scrollIntoView({from: change.from, to: changeEnd(change)}); } + var rebased = []; + + // Propagate to the linked documents + linkedDocs(doc, function (doc, sharedHist) { + if (!sharedHist && indexOf(rebased, doc.history) == -1) { + rebaseHist(doc.history, change); + rebased.push(doc.history); + } + makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change)); + }); + }; + + for (var i$1 = event.changes.length - 1; i$1 >= 0; --i$1) { + var returned = loop( i$1 ); + + if ( returned ) return returned.v; + } + } + + // Sub-views need their line numbers shifted when text is added + // above or below them in the parent document. + function shiftDoc(doc, distance) { + if (distance == 0) { return } + doc.first += distance; + doc.sel = new Selection(map(doc.sel.ranges, function (range) { return new Range( + Pos(range.anchor.line + distance, range.anchor.ch), + Pos(range.head.line + distance, range.head.ch) + ); }), doc.sel.primIndex); + if (doc.cm) { + regChange(doc.cm, doc.first, doc.first - distance, distance); + for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++) + { regLineChange(doc.cm, l, "gutter"); } + } + } + + // More lower-level change function, handling only a single document + // (not linked ones). + function makeChangeSingleDoc(doc, change, selAfter, spans) { + if (doc.cm && !doc.cm.curOp) + { return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans) } + + if (change.to.line < doc.first) { + shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line)); + return + } + if (change.from.line > doc.lastLine()) { return } + + // Clip the change to the size of this doc + if (change.from.line < doc.first) { + var shift = change.text.length - 1 - (doc.first - change.from.line); + shiftDoc(doc, shift); + change = {from: Pos(doc.first, 0), to: Pos(change.to.line + shift, change.to.ch), + text: [lst(change.text)], origin: change.origin}; + } + var last = doc.lastLine(); + if (change.to.line > last) { + change = {from: change.from, to: Pos(last, getLine(doc, last).text.length), + text: [change.text[0]], origin: change.origin}; + } + + change.removed = getBetween(doc, change.from, change.to); + + if (!selAfter) { selAfter = computeSelAfterChange(doc, change); } + if (doc.cm) { makeChangeSingleDocInEditor(doc.cm, change, spans); } + else { updateDoc(doc, change, spans); } + setSelectionNoUndo(doc, selAfter, sel_dontScroll); + + if (doc.cantEdit && skipAtomic(doc, Pos(doc.firstLine(), 0))) + { doc.cantEdit = false; } + } + + // Handle the interaction of a change to a document with the editor + // that this document is part of. + function makeChangeSingleDocInEditor(cm, change, spans) { + var doc = cm.doc, display = cm.display, from = change.from, to = change.to; + + var recomputeMaxLength = false, checkWidthStart = from.line; + if (!cm.options.lineWrapping) { + checkWidthStart = lineNo(visualLine(getLine(doc, from.line))); + doc.iter(checkWidthStart, to.line + 1, function (line) { + if (line == display.maxLine) { + recomputeMaxLength = true; + return true + } + }); + } + + if (doc.sel.contains(change.from, change.to) > -1) + { signalCursorActivity(cm); } + + updateDoc(doc, change, spans, estimateHeight(cm)); + + if (!cm.options.lineWrapping) { + doc.iter(checkWidthStart, from.line + change.text.length, function (line) { + var len = lineLength(line); + if (len > display.maxLineLength) { + display.maxLine = line; + display.maxLineLength = len; + display.maxLineChanged = true; + recomputeMaxLength = false; + } + }); + if (recomputeMaxLength) { cm.curOp.updateMaxLine = true; } + } + + retreatFrontier(doc, from.line); + startWorker(cm, 400); + + var lendiff = change.text.length - (to.line - from.line) - 1; + // Remember that these lines changed, for updating the display + if (change.full) + { regChange(cm); } + else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change)) + { regLineChange(cm, from.line, "text"); } + else + { regChange(cm, from.line, to.line + 1, lendiff); } + + var changesHandler = hasHandler(cm, "changes"), changeHandler = hasHandler(cm, "change"); + if (changeHandler || changesHandler) { + var obj = { + from: from, to: to, + text: change.text, + removed: change.removed, + origin: change.origin + }; + if (changeHandler) { signalLater(cm, "change", cm, obj); } + if (changesHandler) { (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj); } + } + cm.display.selForContextMenu = null; + } + + function replaceRange(doc, code, from, to, origin) { + var assign; + + if (!to) { to = from; } + if (cmp(to, from) < 0) { (assign = [to, from], from = assign[0], to = assign[1]); } + if (typeof code == "string") { code = doc.splitLines(code); } + makeChange(doc, {from: from, to: to, text: code, origin: origin}); + } + + // Rebasing/resetting history to deal with externally-sourced changes + + function rebaseHistSelSingle(pos, from, to, diff) { + if (to < pos.line) { + pos.line += diff; + } else if (from < pos.line) { + pos.line = from; + pos.ch = 0; + } + } + + // Tries to rebase an array of history events given a change in the + // document. If the change touches the same lines as the event, the + // event, and everything 'behind' it, is discarded. If the change is + // before the event, the event's positions are updated. Uses a + // copy-on-write scheme for the positions, to avoid having to + // reallocate them all on every rebase, but also avoid problems with + // shared position objects being unsafely updated. + function rebaseHistArray(array, from, to, diff) { + for (var i = 0; i < array.length; ++i) { + var sub = array[i], ok = true; + if (sub.ranges) { + if (!sub.copied) { sub = array[i] = sub.deepCopy(); sub.copied = true; } + for (var j = 0; j < sub.ranges.length; j++) { + rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff); + rebaseHistSelSingle(sub.ranges[j].head, from, to, diff); + } + continue + } + for (var j$1 = 0; j$1 < sub.changes.length; ++j$1) { + var cur = sub.changes[j$1]; + if (to < cur.from.line) { + cur.from = Pos(cur.from.line + diff, cur.from.ch); + cur.to = Pos(cur.to.line + diff, cur.to.ch); + } else if (from <= cur.to.line) { + ok = false; + break + } + } + if (!ok) { + array.splice(0, i + 1); + i = 0; + } + } + } + + function rebaseHist(hist, change) { + var from = change.from.line, to = change.to.line, diff = change.text.length - (to - from) - 1; + rebaseHistArray(hist.done, from, to, diff); + rebaseHistArray(hist.undone, from, to, diff); + } + + // Utility for applying a change to a line by handle or number, + // returning the number and optionally registering the line as + // changed. + function changeLine(doc, handle, changeType, op) { + var no = handle, line = handle; + if (typeof handle == "number") { line = getLine(doc, clipLine(doc, handle)); } + else { no = lineNo(handle); } + if (no == null) { return null } + if (op(line, no) && doc.cm) { regLineChange(doc.cm, no, changeType); } + return line + } + + // The document is represented as a BTree consisting of leaves, with + // chunk of lines in them, and branches, with up to ten leaves or + // other branch nodes below them. The top node is always a branch + // node, and is the document object itself (meaning it has + // additional methods and properties). + // + // All nodes have parent links. The tree is used both to go from + // line numbers to line objects, and to go from objects to numbers. + // It also indexes by height, and is used to convert between height + // and line object, and to find the total height of the document. + // + // See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html + + function LeafChunk(lines) { + var this$1 = this; + + this.lines = lines; + this.parent = null; + var height = 0; + for (var i = 0; i < lines.length; ++i) { + lines[i].parent = this$1; + height += lines[i].height; + } + this.height = height; + } + + LeafChunk.prototype = { + chunkSize: function() { return this.lines.length }, + + // Remove the n lines at offset 'at'. + removeInner: function(at, n) { + var this$1 = this; + + for (var i = at, e = at + n; i < e; ++i) { + var line = this$1.lines[i]; + this$1.height -= line.height; + cleanUpLine(line); + signalLater(line, "delete"); + } + this.lines.splice(at, n); + }, + + // Helper used to collapse a small branch into a single leaf. + collapse: function(lines) { + lines.push.apply(lines, this.lines); + }, + + // Insert the given array of lines at offset 'at', count them as + // having the given height. + insertInner: function(at, lines, height) { + var this$1 = this; + + this.height += height; + this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at)); + for (var i = 0; i < lines.length; ++i) { lines[i].parent = this$1; } + }, + + // Used to iterate over a part of the tree. + iterN: function(at, n, op) { + var this$1 = this; + + for (var e = at + n; at < e; ++at) + { if (op(this$1.lines[at])) { return true } } + } + }; + + function BranchChunk(children) { + var this$1 = this; + + this.children = children; + var size = 0, height = 0; + for (var i = 0; i < children.length; ++i) { + var ch = children[i]; + size += ch.chunkSize(); height += ch.height; + ch.parent = this$1; + } + this.size = size; + this.height = height; + this.parent = null; + } + + BranchChunk.prototype = { + chunkSize: function() { return this.size }, + + removeInner: function(at, n) { + var this$1 = this; + + this.size -= n; + for (var i = 0; i < this.children.length; ++i) { + var child = this$1.children[i], sz = child.chunkSize(); + if (at < sz) { + var rm = Math.min(n, sz - at), oldHeight = child.height; + child.removeInner(at, rm); + this$1.height -= oldHeight - child.height; + if (sz == rm) { this$1.children.splice(i--, 1); child.parent = null; } + if ((n -= rm) == 0) { break } + at = 0; + } else { at -= sz; } + } + // If the result is smaller than 25 lines, ensure that it is a + // single leaf node. + if (this.size - n < 25 && + (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) { + var lines = []; + this.collapse(lines); + this.children = [new LeafChunk(lines)]; + this.children[0].parent = this; + } + }, + + collapse: function(lines) { + var this$1 = this; + + for (var i = 0; i < this.children.length; ++i) { this$1.children[i].collapse(lines); } + }, + + insertInner: function(at, lines, height) { + var this$1 = this; + + this.size += lines.length; + this.height += height; + for (var i = 0; i < this.children.length; ++i) { + var child = this$1.children[i], sz = child.chunkSize(); + if (at <= sz) { + child.insertInner(at, lines, height); + if (child.lines && child.lines.length > 50) { + // To avoid memory thrashing when child.lines is huge (e.g. first view of a large file), it's never spliced. + // Instead, small slices are taken. They're taken in order because sequential memory accesses are fastest. + var remaining = child.lines.length % 25 + 25; + for (var pos = remaining; pos < child.lines.length;) { + var leaf = new LeafChunk(child.lines.slice(pos, pos += 25)); + child.height -= leaf.height; + this$1.children.splice(++i, 0, leaf); + leaf.parent = this$1; + } + child.lines = child.lines.slice(0, remaining); + this$1.maybeSpill(); + } + break + } + at -= sz; + } + }, + + // When a node has grown, check whether it should be split. + maybeSpill: function() { + if (this.children.length <= 10) { return } + var me = this; + do { + var spilled = me.children.splice(me.children.length - 5, 5); + var sibling = new BranchChunk(spilled); + if (!me.parent) { // Become the parent node + var copy = new BranchChunk(me.children); + copy.parent = me; + me.children = [copy, sibling]; + me = copy; + } else { + me.size -= sibling.size; + me.height -= sibling.height; + var myIndex = indexOf(me.parent.children, me); + me.parent.children.splice(myIndex + 1, 0, sibling); + } + sibling.parent = me.parent; + } while (me.children.length > 10) + me.parent.maybeSpill(); + }, + + iterN: function(at, n, op) { + var this$1 = this; + + for (var i = 0; i < this.children.length; ++i) { + var child = this$1.children[i], sz = child.chunkSize(); + if (at < sz) { + var used = Math.min(n, sz - at); + if (child.iterN(at, used, op)) { return true } + if ((n -= used) == 0) { break } + at = 0; + } else { at -= sz; } + } + } + }; + + // Line widgets are block elements displayed above or below a line. + + var LineWidget = function(doc, node, options) { + var this$1 = this; + + if (options) { for (var opt in options) { if (options.hasOwnProperty(opt)) + { this$1[opt] = options[opt]; } } } + this.doc = doc; + this.node = node; + }; + + LineWidget.prototype.clear = function () { + var this$1 = this; + + var cm = this.doc.cm, ws = this.line.widgets, line = this.line, no = lineNo(line); + if (no == null || !ws) { return } + for (var i = 0; i < ws.length; ++i) { if (ws[i] == this$1) { ws.splice(i--, 1); } } + if (!ws.length) { line.widgets = null; } + var height = widgetHeight(this); + updateLineHeight(line, Math.max(0, line.height - height)); + if (cm) { + runInOp(cm, function () { + adjustScrollWhenAboveVisible(cm, line, -height); + regLineChange(cm, no, "widget"); + }); + signalLater(cm, "lineWidgetCleared", cm, this, no); + } + }; + + LineWidget.prototype.changed = function () { + var this$1 = this; + + var oldH = this.height, cm = this.doc.cm, line = this.line; + this.height = null; + var diff = widgetHeight(this) - oldH; + if (!diff) { return } + if (!lineIsHidden(this.doc, line)) { updateLineHeight(line, line.height + diff); } + if (cm) { + runInOp(cm, function () { + cm.curOp.forceUpdate = true; + adjustScrollWhenAboveVisible(cm, line, diff); + signalLater(cm, "lineWidgetChanged", cm, this$1, lineNo(line)); + }); + } + }; + eventMixin(LineWidget); + + function adjustScrollWhenAboveVisible(cm, line, diff) { + if (heightAtLine(line) < ((cm.curOp && cm.curOp.scrollTop) || cm.doc.scrollTop)) + { addToScrollTop(cm, diff); } + } + + function addLineWidget(doc, handle, node, options) { + var widget = new LineWidget(doc, node, options); + var cm = doc.cm; + if (cm && widget.noHScroll) { cm.display.alignWidgets = true; } + changeLine(doc, handle, "widget", function (line) { + var widgets = line.widgets || (line.widgets = []); + if (widget.insertAt == null) { widgets.push(widget); } + else { widgets.splice(Math.min(widgets.length - 1, Math.max(0, widget.insertAt)), 0, widget); } + widget.line = line; + if (cm && !lineIsHidden(doc, line)) { + var aboveVisible = heightAtLine(line) < doc.scrollTop; + updateLineHeight(line, line.height + widgetHeight(widget)); + if (aboveVisible) { addToScrollTop(cm, widget.height); } + cm.curOp.forceUpdate = true; + } + return true + }); + if (cm) { signalLater(cm, "lineWidgetAdded", cm, widget, typeof handle == "number" ? handle : lineNo(handle)); } + return widget + } + + // TEXTMARKERS + + // Created with markText and setBookmark methods. A TextMarker is a + // handle that can be used to clear or find a marked position in the + // document. Line objects hold arrays (markedSpans) containing + // {from, to, marker} object pointing to such marker objects, and + // indicating that such a marker is present on that line. Multiple + // lines may point to the same marker when it spans across lines. + // The spans will have null for their from/to properties when the + // marker continues beyond the start/end of the line. Markers have + // links back to the lines they currently touch. + + // Collapsed markers have unique ids, in order to be able to order + // them, which is needed for uniquely determining an outer marker + // when they overlap (they may nest, but not partially overlap). + var nextMarkerId = 0; + + var TextMarker = function(doc, type) { + this.lines = []; + this.type = type; + this.doc = doc; + this.id = ++nextMarkerId; + }; + + // Clear the marker. + TextMarker.prototype.clear = function () { + var this$1 = this; + + if (this.explicitlyCleared) { return } + var cm = this.doc.cm, withOp = cm && !cm.curOp; + if (withOp) { startOperation(cm); } + if (hasHandler(this, "clear")) { + var found = this.find(); + if (found) { signalLater(this, "clear", found.from, found.to); } + } + var min = null, max = null; + for (var i = 0; i < this.lines.length; ++i) { + var line = this$1.lines[i]; + var span = getMarkedSpanFor(line.markedSpans, this$1); + if (cm && !this$1.collapsed) { regLineChange(cm, lineNo(line), "text"); } + else if (cm) { + if (span.to != null) { max = lineNo(line); } + if (span.from != null) { min = lineNo(line); } + } + line.markedSpans = removeMarkedSpan(line.markedSpans, span); + if (span.from == null && this$1.collapsed && !lineIsHidden(this$1.doc, line) && cm) + { updateLineHeight(line, textHeight(cm.display)); } + } + if (cm && this.collapsed && !cm.options.lineWrapping) { for (var i$1 = 0; i$1 < this.lines.length; ++i$1) { + var visual = visualLine(this$1.lines[i$1]), len = lineLength(visual); + if (len > cm.display.maxLineLength) { + cm.display.maxLine = visual; + cm.display.maxLineLength = len; + cm.display.maxLineChanged = true; + } + } } + + if (min != null && cm && this.collapsed) { regChange(cm, min, max + 1); } + this.lines.length = 0; + this.explicitlyCleared = true; + if (this.atomic && this.doc.cantEdit) { + this.doc.cantEdit = false; + if (cm) { reCheckSelection(cm.doc); } + } + if (cm) { signalLater(cm, "markerCleared", cm, this, min, max); } + if (withOp) { endOperation(cm); } + if (this.parent) { this.parent.clear(); } + }; + + // Find the position of the marker in the document. Returns a {from, + // to} object by default. Side can be passed to get a specific side + // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the + // Pos objects returned contain a line object, rather than a line + // number (used to prevent looking up the same line twice). + TextMarker.prototype.find = function (side, lineObj) { + var this$1 = this; + + if (side == null && this.type == "bookmark") { side = 1; } + var from, to; + for (var i = 0; i < this.lines.length; ++i) { + var line = this$1.lines[i]; + var span = getMarkedSpanFor(line.markedSpans, this$1); + if (span.from != null) { + from = Pos(lineObj ? line : lineNo(line), span.from); + if (side == -1) { return from } + } + if (span.to != null) { + to = Pos(lineObj ? line : lineNo(line), span.to); + if (side == 1) { return to } + } + } + return from && {from: from, to: to} + }; + + // Signals that the marker's widget changed, and surrounding layout + // should be recomputed. + TextMarker.prototype.changed = function () { + var this$1 = this; + + var pos = this.find(-1, true), widget = this, cm = this.doc.cm; + if (!pos || !cm) { return } + runInOp(cm, function () { + var line = pos.line, lineN = lineNo(pos.line); + var view = findViewForLine(cm, lineN); + if (view) { + clearLineMeasurementCacheFor(view); + cm.curOp.selectionChanged = cm.curOp.forceUpdate = true; + } + cm.curOp.updateMaxLine = true; + if (!lineIsHidden(widget.doc, line) && widget.height != null) { + var oldHeight = widget.height; + widget.height = null; + var dHeight = widgetHeight(widget) - oldHeight; + if (dHeight) + { updateLineHeight(line, line.height + dHeight); } + } + signalLater(cm, "markerChanged", cm, this$1); + }); + }; + + TextMarker.prototype.attachLine = function (line) { + if (!this.lines.length && this.doc.cm) { + var op = this.doc.cm.curOp; + if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1) + { (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this); } + } + this.lines.push(line); + }; + + TextMarker.prototype.detachLine = function (line) { + this.lines.splice(indexOf(this.lines, line), 1); + if (!this.lines.length && this.doc.cm) { + var op = this.doc.cm.curOp + ;(op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this); + } + }; + eventMixin(TextMarker); + + // Create a marker, wire it up to the right lines, and + function markText(doc, from, to, options, type) { + // Shared markers (across linked documents) are handled separately + // (markTextShared will call out to this again, once per + // document). + if (options && options.shared) { return markTextShared(doc, from, to, options, type) } + // Ensure we are in an operation. + if (doc.cm && !doc.cm.curOp) { return operation(doc.cm, markText)(doc, from, to, options, type) } + + var marker = new TextMarker(doc, type), diff = cmp(from, to); + if (options) { copyObj(options, marker, false); } + // Don't connect empty markers unless clearWhenEmpty is false + if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false) + { return marker } + if (marker.replacedWith) { + // Showing up as a widget implies collapsed (widget replaces text) + marker.collapsed = true; + marker.widgetNode = eltP("span", [marker.replacedWith], "CodeMirror-widget"); + if (!options.handleMouseEvents) { marker.widgetNode.setAttribute("cm-ignore-events", "true"); } + if (options.insertLeft) { marker.widgetNode.insertLeft = true; } + } + if (marker.collapsed) { + if (conflictingCollapsedRange(doc, from.line, from, to, marker) || + from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker)) + { throw new Error("Inserting collapsed marker partially overlapping an existing one") } + seeCollapsedSpans(); + } + + if (marker.addToHistory) + { addChangeToHistory(doc, {from: from, to: to, origin: "markText"}, doc.sel, NaN); } + + var curLine = from.line, cm = doc.cm, updateMaxLine; + doc.iter(curLine, to.line + 1, function (line) { + if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine) + { updateMaxLine = true; } + if (marker.collapsed && curLine != from.line) { updateLineHeight(line, 0); } + addMarkedSpan(line, new MarkedSpan(marker, + curLine == from.line ? from.ch : null, + curLine == to.line ? to.ch : null)); + ++curLine; + }); + // lineIsHidden depends on the presence of the spans, so needs a second pass + if (marker.collapsed) { doc.iter(from.line, to.line + 1, function (line) { + if (lineIsHidden(doc, line)) { updateLineHeight(line, 0); } + }); } + + if (marker.clearOnEnter) { on(marker, "beforeCursorEnter", function () { return marker.clear(); }); } + + if (marker.readOnly) { + seeReadOnlySpans(); + if (doc.history.done.length || doc.history.undone.length) + { doc.clearHistory(); } + } + if (marker.collapsed) { + marker.id = ++nextMarkerId; + marker.atomic = true; + } + if (cm) { + // Sync editor state + if (updateMaxLine) { cm.curOp.updateMaxLine = true; } + if (marker.collapsed) + { regChange(cm, from.line, to.line + 1); } + else if (marker.className || marker.startStyle || marker.endStyle || marker.css || + marker.attributes || marker.title) + { for (var i = from.line; i <= to.line; i++) { regLineChange(cm, i, "text"); } } + if (marker.atomic) { reCheckSelection(cm.doc); } + signalLater(cm, "markerAdded", cm, marker); + } + return marker + } + + // SHARED TEXTMARKERS + + // A shared marker spans multiple linked documents. It is + // implemented as a meta-marker-object controlling multiple normal + // markers. + var SharedTextMarker = function(markers, primary) { + var this$1 = this; + + this.markers = markers; + this.primary = primary; + for (var i = 0; i < markers.length; ++i) + { markers[i].parent = this$1; } + }; + + SharedTextMarker.prototype.clear = function () { + var this$1 = this; + + if (this.explicitlyCleared) { return } + this.explicitlyCleared = true; + for (var i = 0; i < this.markers.length; ++i) + { this$1.markers[i].clear(); } + signalLater(this, "clear"); + }; + + SharedTextMarker.prototype.find = function (side, lineObj) { + return this.primary.find(side, lineObj) + }; + eventMixin(SharedTextMarker); + + function markTextShared(doc, from, to, options, type) { + options = copyObj(options); + options.shared = false; + var markers = [markText(doc, from, to, options, type)], primary = markers[0]; + var widget = options.widgetNode; + linkedDocs(doc, function (doc) { + if (widget) { options.widgetNode = widget.cloneNode(true); } + markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type)); + for (var i = 0; i < doc.linked.length; ++i) + { if (doc.linked[i].isParent) { return } } + primary = lst(markers); + }); + return new SharedTextMarker(markers, primary) + } + + function findSharedMarkers(doc) { + return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())), function (m) { return m.parent; }) + } + + function copySharedMarkers(doc, markers) { + for (var i = 0; i < markers.length; i++) { + var marker = markers[i], pos = marker.find(); + var mFrom = doc.clipPos(pos.from), mTo = doc.clipPos(pos.to); + if (cmp(mFrom, mTo)) { + var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type); + marker.markers.push(subMark); + subMark.parent = marker; + } + } + } + + function detachSharedMarkers(markers) { + var loop = function ( i ) { + var marker = markers[i], linked = [marker.primary.doc]; + linkedDocs(marker.primary.doc, function (d) { return linked.push(d); }); + for (var j = 0; j < marker.markers.length; j++) { + var subMarker = marker.markers[j]; + if (indexOf(linked, subMarker.doc) == -1) { + subMarker.parent = null; + marker.markers.splice(j--, 1); + } + } + }; + + for (var i = 0; i < markers.length; i++) loop( i ); + } + + var nextDocId = 0; + var Doc = function(text, mode, firstLine, lineSep, direction) { + if (!(this instanceof Doc)) { return new Doc(text, mode, firstLine, lineSep, direction) } + if (firstLine == null) { firstLine = 0; } + + BranchChunk.call(this, [new LeafChunk([new Line("", null)])]); + this.first = firstLine; + this.scrollTop = this.scrollLeft = 0; + this.cantEdit = false; + this.cleanGeneration = 1; + this.modeFrontier = this.highlightFrontier = firstLine; + var start = Pos(firstLine, 0); + this.sel = simpleSelection(start); + this.history = new History(null); + this.id = ++nextDocId; + this.modeOption = mode; + this.lineSep = lineSep; + this.direction = (direction == "rtl") ? "rtl" : "ltr"; + this.extend = false; + + if (typeof text == "string") { text = this.splitLines(text); } + updateDoc(this, {from: start, to: start, text: text}); + setSelection(this, simpleSelection(start), sel_dontScroll); + }; + + Doc.prototype = createObj(BranchChunk.prototype, { + constructor: Doc, + // Iterate over the document. Supports two forms -- with only one + // argument, it calls that for each line in the document. With + // three, it iterates over the range given by the first two (with + // the second being non-inclusive). + iter: function(from, to, op) { + if (op) { this.iterN(from - this.first, to - from, op); } + else { this.iterN(this.first, this.first + this.size, from); } + }, + + // Non-public interface for adding and removing lines. + insert: function(at, lines) { + var height = 0; + for (var i = 0; i < lines.length; ++i) { height += lines[i].height; } + this.insertInner(at - this.first, lines, height); + }, + remove: function(at, n) { this.removeInner(at - this.first, n); }, + + // From here, the methods are part of the public interface. Most + // are also available from CodeMirror (editor) instances. + + getValue: function(lineSep) { + var lines = getLines(this, this.first, this.first + this.size); + if (lineSep === false) { return lines } + return lines.join(lineSep || this.lineSeparator()) + }, + setValue: docMethodOp(function(code) { + var top = Pos(this.first, 0), last = this.first + this.size - 1; + makeChange(this, {from: top, to: Pos(last, getLine(this, last).text.length), + text: this.splitLines(code), origin: "setValue", full: true}, true); + if (this.cm) { scrollToCoords(this.cm, 0, 0); } + setSelection(this, simpleSelection(top), sel_dontScroll); + }), + replaceRange: function(code, from, to, origin) { + from = clipPos(this, from); + to = to ? clipPos(this, to) : from; + replaceRange(this, code, from, to, origin); + }, + getRange: function(from, to, lineSep) { + var lines = getBetween(this, clipPos(this, from), clipPos(this, to)); + if (lineSep === false) { return lines } + return lines.join(lineSep || this.lineSeparator()) + }, + + getLine: function(line) {var l = this.getLineHandle(line); return l && l.text}, + + getLineHandle: function(line) {if (isLine(this, line)) { return getLine(this, line) }}, + getLineNumber: function(line) {return lineNo(line)}, + + getLineHandleVisualStart: function(line) { + if (typeof line == "number") { line = getLine(this, line); } + return visualLine(line) + }, + + lineCount: function() {return this.size}, + firstLine: function() {return this.first}, + lastLine: function() {return this.first + this.size - 1}, + + clipPos: function(pos) {return clipPos(this, pos)}, + + getCursor: function(start) { + var range$$1 = this.sel.primary(), pos; + if (start == null || start == "head") { pos = range$$1.head; } + else if (start == "anchor") { pos = range$$1.anchor; } + else if (start == "end" || start == "to" || start === false) { pos = range$$1.to(); } + else { pos = range$$1.from(); } + return pos + }, + listSelections: function() { return this.sel.ranges }, + somethingSelected: function() {return this.sel.somethingSelected()}, + + setCursor: docMethodOp(function(line, ch, options) { + setSimpleSelection(this, clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line), null, options); + }), + setSelection: docMethodOp(function(anchor, head, options) { + setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options); + }), + extendSelection: docMethodOp(function(head, other, options) { + extendSelection(this, clipPos(this, head), other && clipPos(this, other), options); + }), + extendSelections: docMethodOp(function(heads, options) { + extendSelections(this, clipPosArray(this, heads), options); + }), + extendSelectionsBy: docMethodOp(function(f, options) { + var heads = map(this.sel.ranges, f); + extendSelections(this, clipPosArray(this, heads), options); + }), + setSelections: docMethodOp(function(ranges, primary, options) { + var this$1 = this; + + if (!ranges.length) { return } + var out = []; + for (var i = 0; i < ranges.length; i++) + { out[i] = new Range(clipPos(this$1, ranges[i].anchor), + clipPos(this$1, ranges[i].head)); } + if (primary == null) { primary = Math.min(ranges.length - 1, this.sel.primIndex); } + setSelection(this, normalizeSelection(this.cm, out, primary), options); + }), + addSelection: docMethodOp(function(anchor, head, options) { + var ranges = this.sel.ranges.slice(0); + ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor))); + setSelection(this, normalizeSelection(this.cm, ranges, ranges.length - 1), options); + }), + + getSelection: function(lineSep) { + var this$1 = this; + + var ranges = this.sel.ranges, lines; + for (var i = 0; i < ranges.length; i++) { + var sel = getBetween(this$1, ranges[i].from(), ranges[i].to()); + lines = lines ? lines.concat(sel) : sel; + } + if (lineSep === false) { return lines } + else { return lines.join(lineSep || this.lineSeparator()) } + }, + getSelections: function(lineSep) { + var this$1 = this; + + var parts = [], ranges = this.sel.ranges; + for (var i = 0; i < ranges.length; i++) { + var sel = getBetween(this$1, ranges[i].from(), ranges[i].to()); + if (lineSep !== false) { sel = sel.join(lineSep || this$1.lineSeparator()); } + parts[i] = sel; + } + return parts + }, + replaceSelection: function(code, collapse, origin) { + var dup = []; + for (var i = 0; i < this.sel.ranges.length; i++) + { dup[i] = code; } + this.replaceSelections(dup, collapse, origin || "+input"); + }, + replaceSelections: docMethodOp(function(code, collapse, origin) { + var this$1 = this; + + var changes = [], sel = this.sel; + for (var i = 0; i < sel.ranges.length; i++) { + var range$$1 = sel.ranges[i]; + changes[i] = {from: range$$1.from(), to: range$$1.to(), text: this$1.splitLines(code[i]), origin: origin}; + } + var newSel = collapse && collapse != "end" && computeReplacedSel(this, changes, collapse); + for (var i$1 = changes.length - 1; i$1 >= 0; i$1--) + { makeChange(this$1, changes[i$1]); } + if (newSel) { setSelectionReplaceHistory(this, newSel); } + else if (this.cm) { ensureCursorVisible(this.cm); } + }), + undo: docMethodOp(function() {makeChangeFromHistory(this, "undo");}), + redo: docMethodOp(function() {makeChangeFromHistory(this, "redo");}), + undoSelection: docMethodOp(function() {makeChangeFromHistory(this, "undo", true);}), + redoSelection: docMethodOp(function() {makeChangeFromHistory(this, "redo", true);}), + + setExtending: function(val) {this.extend = val;}, + getExtending: function() {return this.extend}, + + historySize: function() { + var hist = this.history, done = 0, undone = 0; + for (var i = 0; i < hist.done.length; i++) { if (!hist.done[i].ranges) { ++done; } } + for (var i$1 = 0; i$1 < hist.undone.length; i$1++) { if (!hist.undone[i$1].ranges) { ++undone; } } + return {undo: done, redo: undone} + }, + clearHistory: function() {this.history = new History(this.history.maxGeneration);}, + + markClean: function() { + this.cleanGeneration = this.changeGeneration(true); + }, + changeGeneration: function(forceSplit) { + if (forceSplit) + { this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null; } + return this.history.generation + }, + isClean: function (gen) { + return this.history.generation == (gen || this.cleanGeneration) + }, + + getHistory: function() { + return {done: copyHistoryArray(this.history.done), + undone: copyHistoryArray(this.history.undone)} + }, + setHistory: function(histData) { + var hist = this.history = new History(this.history.maxGeneration); + hist.done = copyHistoryArray(histData.done.slice(0), null, true); + hist.undone = copyHistoryArray(histData.undone.slice(0), null, true); + }, + + setGutterMarker: docMethodOp(function(line, gutterID, value) { + return changeLine(this, line, "gutter", function (line) { + var markers = line.gutterMarkers || (line.gutterMarkers = {}); + markers[gutterID] = value; + if (!value && isEmpty(markers)) { line.gutterMarkers = null; } + return true + }) + }), + + clearGutter: docMethodOp(function(gutterID) { + var this$1 = this; + + this.iter(function (line) { + if (line.gutterMarkers && line.gutterMarkers[gutterID]) { + changeLine(this$1, line, "gutter", function () { + line.gutterMarkers[gutterID] = null; + if (isEmpty(line.gutterMarkers)) { line.gutterMarkers = null; } + return true + }); + } + }); + }), + + lineInfo: function(line) { + var n; + if (typeof line == "number") { + if (!isLine(this, line)) { return null } + n = line; + line = getLine(this, line); + if (!line) { return null } + } else { + n = lineNo(line); + if (n == null) { return null } + } + return {line: n, handle: line, text: line.text, gutterMarkers: line.gutterMarkers, + textClass: line.textClass, bgClass: line.bgClass, wrapClass: line.wrapClass, + widgets: line.widgets} + }, + + addLineClass: docMethodOp(function(handle, where, cls) { + return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) { + var prop = where == "text" ? "textClass" + : where == "background" ? "bgClass" + : where == "gutter" ? "gutterClass" : "wrapClass"; + if (!line[prop]) { line[prop] = cls; } + else if (classTest(cls).test(line[prop])) { return false } + else { line[prop] += " " + cls; } + return true + }) + }), + removeLineClass: docMethodOp(function(handle, where, cls) { + return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) { + var prop = where == "text" ? "textClass" + : where == "background" ? "bgClass" + : where == "gutter" ? "gutterClass" : "wrapClass"; + var cur = line[prop]; + if (!cur) { return false } + else if (cls == null) { line[prop] = null; } + else { + var found = cur.match(classTest(cls)); + if (!found) { return false } + var end = found.index + found[0].length; + line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null; + } + return true + }) + }), + + addLineWidget: docMethodOp(function(handle, node, options) { + return addLineWidget(this, handle, node, options) + }), + removeLineWidget: function(widget) { widget.clear(); }, + + markText: function(from, to, options) { + return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || "range") + }, + setBookmark: function(pos, options) { + var realOpts = {replacedWith: options && (options.nodeType == null ? options.widget : options), + insertLeft: options && options.insertLeft, + clearWhenEmpty: false, shared: options && options.shared, + handleMouseEvents: options && options.handleMouseEvents}; + pos = clipPos(this, pos); + return markText(this, pos, pos, realOpts, "bookmark") + }, + findMarksAt: function(pos) { + pos = clipPos(this, pos); + var markers = [], spans = getLine(this, pos.line).markedSpans; + if (spans) { for (var i = 0; i < spans.length; ++i) { + var span = spans[i]; + if ((span.from == null || span.from <= pos.ch) && + (span.to == null || span.to >= pos.ch)) + { markers.push(span.marker.parent || span.marker); } + } } + return markers + }, + findMarks: function(from, to, filter) { + from = clipPos(this, from); to = clipPos(this, to); + var found = [], lineNo$$1 = from.line; + this.iter(from.line, to.line + 1, function (line) { + var spans = line.markedSpans; + if (spans) { for (var i = 0; i < spans.length; i++) { + var span = spans[i]; + if (!(span.to != null && lineNo$$1 == from.line && from.ch >= span.to || + span.from == null && lineNo$$1 != from.line || + span.from != null && lineNo$$1 == to.line && span.from >= to.ch) && + (!filter || filter(span.marker))) + { found.push(span.marker.parent || span.marker); } + } } + ++lineNo$$1; + }); + return found + }, + getAllMarks: function() { + var markers = []; + this.iter(function (line) { + var sps = line.markedSpans; + if (sps) { for (var i = 0; i < sps.length; ++i) + { if (sps[i].from != null) { markers.push(sps[i].marker); } } } + }); + return markers + }, + + posFromIndex: function(off) { + var ch, lineNo$$1 = this.first, sepSize = this.lineSeparator().length; + this.iter(function (line) { + var sz = line.text.length + sepSize; + if (sz > off) { ch = off; return true } + off -= sz; + ++lineNo$$1; + }); + return clipPos(this, Pos(lineNo$$1, ch)) + }, + indexFromPos: function (coords) { + coords = clipPos(this, coords); + var index = coords.ch; + if (coords.line < this.first || coords.ch < 0) { return 0 } + var sepSize = this.lineSeparator().length; + this.iter(this.first, coords.line, function (line) { // iter aborts when callback returns a truthy value + index += line.text.length + sepSize; + }); + return index + }, + + copy: function(copyHistory) { + var doc = new Doc(getLines(this, this.first, this.first + this.size), + this.modeOption, this.first, this.lineSep, this.direction); + doc.scrollTop = this.scrollTop; doc.scrollLeft = this.scrollLeft; + doc.sel = this.sel; + doc.extend = false; + if (copyHistory) { + doc.history.undoDepth = this.history.undoDepth; + doc.setHistory(this.getHistory()); + } + return doc + }, + + linkedDoc: function(options) { + if (!options) { options = {}; } + var from = this.first, to = this.first + this.size; + if (options.from != null && options.from > from) { from = options.from; } + if (options.to != null && options.to < to) { to = options.to; } + var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep, this.direction); + if (options.sharedHist) { copy.history = this.history + ; }(this.linked || (this.linked = [])).push({doc: copy, sharedHist: options.sharedHist}); + copy.linked = [{doc: this, isParent: true, sharedHist: options.sharedHist}]; + copySharedMarkers(copy, findSharedMarkers(this)); + return copy + }, + unlinkDoc: function(other) { + var this$1 = this; + + if (other instanceof CodeMirror) { other = other.doc; } + if (this.linked) { for (var i = 0; i < this.linked.length; ++i) { + var link = this$1.linked[i]; + if (link.doc != other) { continue } + this$1.linked.splice(i, 1); + other.unlinkDoc(this$1); + detachSharedMarkers(findSharedMarkers(this$1)); + break + } } + // If the histories were shared, split them again + if (other.history == this.history) { + var splitIds = [other.id]; + linkedDocs(other, function (doc) { return splitIds.push(doc.id); }, true); + other.history = new History(null); + other.history.done = copyHistoryArray(this.history.done, splitIds); + other.history.undone = copyHistoryArray(this.history.undone, splitIds); + } + }, + iterLinkedDocs: function(f) {linkedDocs(this, f);}, + + getMode: function() {return this.mode}, + getEditor: function() {return this.cm}, + + splitLines: function(str) { + if (this.lineSep) { return str.split(this.lineSep) } + return splitLinesAuto(str) + }, + lineSeparator: function() { return this.lineSep || "\n" }, + + setDirection: docMethodOp(function (dir) { + if (dir != "rtl") { dir = "ltr"; } + if (dir == this.direction) { return } + this.direction = dir; + this.iter(function (line) { return line.order = null; }); + if (this.cm) { directionChanged(this.cm); } + }) + }); + + // Public alias. + Doc.prototype.eachLine = Doc.prototype.iter; + + // Kludge to work around strange IE behavior where it'll sometimes + // re-fire a series of drag-related events right after the drop (#1551) + var lastDrop = 0; + + function onDrop(e) { + var cm = this; + clearDragCursor(cm); + if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) + { return } + e_preventDefault(e); + if (ie) { lastDrop = +new Date; } + var pos = posFromMouse(cm, e, true), files = e.dataTransfer.files; + if (!pos || cm.isReadOnly()) { return } + // Might be a file drop, in which case we simply extract the text + // and insert it. + if (files && files.length && window.FileReader && window.File) { + var n = files.length, text = Array(n), read = 0; + var loadFile = function (file, i) { + if (cm.options.allowDropFileTypes && + indexOf(cm.options.allowDropFileTypes, file.type) == -1) + { return } + + var reader = new FileReader; + reader.onload = operation(cm, function () { + var content = reader.result; + if (/[\x00-\x08\x0e-\x1f]{2}/.test(content)) { content = ""; } + text[i] = content; + if (++read == n) { + pos = clipPos(cm.doc, pos); + var change = {from: pos, to: pos, + text: cm.doc.splitLines(text.join(cm.doc.lineSeparator())), + origin: "paste"}; + makeChange(cm.doc, change); + setSelectionReplaceHistory(cm.doc, simpleSelection(pos, changeEnd(change))); + } + }); + reader.readAsText(file); + }; + for (var i = 0; i < n; ++i) { loadFile(files[i], i); } + } else { // Normal drop + // Don't do a replace if the drop happened inside of the selected text. + if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) { + cm.state.draggingText(e); + // Ensure the editor is re-focused + setTimeout(function () { return cm.display.input.focus(); }, 20); + return + } + try { + var text$1 = e.dataTransfer.getData("Text"); + if (text$1) { + var selected; + if (cm.state.draggingText && !cm.state.draggingText.copy) + { selected = cm.listSelections(); } + setSelectionNoUndo(cm.doc, simpleSelection(pos, pos)); + if (selected) { for (var i$1 = 0; i$1 < selected.length; ++i$1) + { replaceRange(cm.doc, "", selected[i$1].anchor, selected[i$1].head, "drag"); } } + cm.replaceSelection(text$1, "around", "paste"); + cm.display.input.focus(); + } + } + catch(e){} + } + } + + function onDragStart(cm, e) { + if (ie && (!cm.state.draggingText || +new Date - lastDrop < 100)) { e_stop(e); return } + if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) { return } + + e.dataTransfer.setData("Text", cm.getSelection()); + e.dataTransfer.effectAllowed = "copyMove"; + + // Use dummy image instead of default browsers image. + // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there. + if (e.dataTransfer.setDragImage && !safari) { + var img = elt("img", null, null, "position: fixed; left: 0; top: 0;"); + img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; + if (presto) { + img.width = img.height = 1; + cm.display.wrapper.appendChild(img); + // Force a relayout, or Opera won't use our image for some obscure reason + img._top = img.offsetTop; + } + e.dataTransfer.setDragImage(img, 0, 0); + if (presto) { img.parentNode.removeChild(img); } + } + } + + function onDragOver(cm, e) { + var pos = posFromMouse(cm, e); + if (!pos) { return } + var frag = document.createDocumentFragment(); + drawSelectionCursor(cm, pos, frag); + if (!cm.display.dragCursor) { + cm.display.dragCursor = elt("div", null, "CodeMirror-cursors CodeMirror-dragcursors"); + cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv); + } + removeChildrenAndAdd(cm.display.dragCursor, frag); + } + + function clearDragCursor(cm) { + if (cm.display.dragCursor) { + cm.display.lineSpace.removeChild(cm.display.dragCursor); + cm.display.dragCursor = null; + } + } + + // These must be handled carefully, because naively registering a + // handler for each editor will cause the editors to never be + // garbage collected. + + function forEachCodeMirror(f) { + if (!document.getElementsByClassName) { return } + var byClass = document.getElementsByClassName("CodeMirror"), editors = []; + for (var i = 0; i < byClass.length; i++) { + var cm = byClass[i].CodeMirror; + if (cm) { editors.push(cm); } + } + if (editors.length) { editors[0].operation(function () { + for (var i = 0; i < editors.length; i++) { f(editors[i]); } + }); } + } + + var globalsRegistered = false; + function ensureGlobalHandlers() { + if (globalsRegistered) { return } + registerGlobalHandlers(); + globalsRegistered = true; + } + function registerGlobalHandlers() { + // When the window resizes, we need to refresh active editors. + var resizeTimer; + on(window, "resize", function () { + if (resizeTimer == null) { resizeTimer = setTimeout(function () { + resizeTimer = null; + forEachCodeMirror(onResize); + }, 100); } + }); + // When the window loses focus, we want to show the editor as blurred + on(window, "blur", function () { return forEachCodeMirror(onBlur); }); + } + // Called when the window resizes + function onResize(cm) { + var d = cm.display; + // Might be a text scaling operation, clear size caches. + d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null; + d.scrollbarsClipped = false; + cm.setSize(); + } + + var keyNames = { + 3: "Pause", 8: "Backspace", 9: "Tab", 13: "Enter", 16: "Shift", 17: "Ctrl", 18: "Alt", + 19: "Pause", 20: "CapsLock", 27: "Esc", 32: "Space", 33: "PageUp", 34: "PageDown", 35: "End", + 36: "Home", 37: "Left", 38: "Up", 39: "Right", 40: "Down", 44: "PrintScrn", 45: "Insert", + 46: "Delete", 59: ";", 61: "=", 91: "Mod", 92: "Mod", 93: "Mod", + 106: "*", 107: "=", 109: "-", 110: ".", 111: "/", 145: "ScrollLock", + 173: "-", 186: ";", 187: "=", 188: ",", 189: "-", 190: ".", 191: "/", 192: "`", 219: "[", 220: "\\", + 221: "]", 222: "'", 63232: "Up", 63233: "Down", 63234: "Left", 63235: "Right", 63272: "Delete", + 63273: "Home", 63275: "End", 63276: "PageUp", 63277: "PageDown", 63302: "Insert" + }; + + // Number keys + for (var i = 0; i < 10; i++) { keyNames[i + 48] = keyNames[i + 96] = String(i); } + // Alphabetic keys + for (var i$1 = 65; i$1 <= 90; i$1++) { keyNames[i$1] = String.fromCharCode(i$1); } + // Function keys + for (var i$2 = 1; i$2 <= 12; i$2++) { keyNames[i$2 + 111] = keyNames[i$2 + 63235] = "F" + i$2; } + + var keyMap = {}; + + keyMap.basic = { + "Left": "goCharLeft", "Right": "goCharRight", "Up": "goLineUp", "Down": "goLineDown", + "End": "goLineEnd", "Home": "goLineStartSmart", "PageUp": "goPageUp", "PageDown": "goPageDown", + "Delete": "delCharAfter", "Backspace": "delCharBefore", "Shift-Backspace": "delCharBefore", + "Tab": "defaultTab", "Shift-Tab": "indentAuto", + "Enter": "newlineAndIndent", "Insert": "toggleOverwrite", + "Esc": "singleSelection" + }; + // Note that the save and find-related commands aren't defined by + // default. User code or addons can define them. Unknown commands + // are simply ignored. + keyMap.pcDefault = { + "Ctrl-A": "selectAll", "Ctrl-D": "deleteLine", "Ctrl-Z": "undo", "Shift-Ctrl-Z": "redo", "Ctrl-Y": "redo", + "Ctrl-Home": "goDocStart", "Ctrl-End": "goDocEnd", "Ctrl-Up": "goLineUp", "Ctrl-Down": "goLineDown", + "Ctrl-Left": "goGroupLeft", "Ctrl-Right": "goGroupRight", "Alt-Left": "goLineStart", "Alt-Right": "goLineEnd", + "Ctrl-Backspace": "delGroupBefore", "Ctrl-Delete": "delGroupAfter", "Ctrl-S": "save", "Ctrl-F": "find", + "Ctrl-G": "findNext", "Shift-Ctrl-G": "findPrev", "Shift-Ctrl-F": "replace", "Shift-Ctrl-R": "replaceAll", + "Ctrl-[": "indentLess", "Ctrl-]": "indentMore", + "Ctrl-U": "undoSelection", "Shift-Ctrl-U": "redoSelection", "Alt-U": "redoSelection", + "fallthrough": "basic" + }; + // Very basic readline/emacs-style bindings, which are standard on Mac. + keyMap.emacsy = { + "Ctrl-F": "goCharRight", "Ctrl-B": "goCharLeft", "Ctrl-P": "goLineUp", "Ctrl-N": "goLineDown", + "Alt-F": "goWordRight", "Alt-B": "goWordLeft", "Ctrl-A": "goLineStart", "Ctrl-E": "goLineEnd", + "Ctrl-V": "goPageDown", "Shift-Ctrl-V": "goPageUp", "Ctrl-D": "delCharAfter", "Ctrl-H": "delCharBefore", + "Alt-D": "delWordAfter", "Alt-Backspace": "delWordBefore", "Ctrl-K": "killLine", "Ctrl-T": "transposeChars", + "Ctrl-O": "openLine" + }; + keyMap.macDefault = { + "Cmd-A": "selectAll", "Cmd-D": "deleteLine", "Cmd-Z": "undo", "Shift-Cmd-Z": "redo", "Cmd-Y": "redo", + "Cmd-Home": "goDocStart", "Cmd-Up": "goDocStart", "Cmd-End": "goDocEnd", "Cmd-Down": "goDocEnd", "Alt-Left": "goGroupLeft", + "Alt-Right": "goGroupRight", "Cmd-Left": "goLineLeft", "Cmd-Right": "goLineRight", "Alt-Backspace": "delGroupBefore", + "Ctrl-Alt-Backspace": "delGroupAfter", "Alt-Delete": "delGroupAfter", "Cmd-S": "save", "Cmd-F": "find", + "Cmd-G": "findNext", "Shift-Cmd-G": "findPrev", "Cmd-Alt-F": "replace", "Shift-Cmd-Alt-F": "replaceAll", + "Cmd-[": "indentLess", "Cmd-]": "indentMore", "Cmd-Backspace": "delWrappedLineLeft", "Cmd-Delete": "delWrappedLineRight", + "Cmd-U": "undoSelection", "Shift-Cmd-U": "redoSelection", "Ctrl-Up": "goDocStart", "Ctrl-Down": "goDocEnd", + "fallthrough": ["basic", "emacsy"] + }; + keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault; + + // KEYMAP DISPATCH + + function normalizeKeyName(name) { + var parts = name.split(/-(?!$)/); + name = parts[parts.length - 1]; + var alt, ctrl, shift, cmd; + for (var i = 0; i < parts.length - 1; i++) { + var mod = parts[i]; + if (/^(cmd|meta|m)$/i.test(mod)) { cmd = true; } + else if (/^a(lt)?$/i.test(mod)) { alt = true; } + else if (/^(c|ctrl|control)$/i.test(mod)) { ctrl = true; } + else if (/^s(hift)?$/i.test(mod)) { shift = true; } + else { throw new Error("Unrecognized modifier name: " + mod) } + } + if (alt) { name = "Alt-" + name; } + if (ctrl) { name = "Ctrl-" + name; } + if (cmd) { name = "Cmd-" + name; } + if (shift) { name = "Shift-" + name; } + return name + } + + // This is a kludge to keep keymaps mostly working as raw objects + // (backwards compatibility) while at the same time support features + // like normalization and multi-stroke key bindings. It compiles a + // new normalized keymap, and then updates the old object to reflect + // this. + function normalizeKeyMap(keymap) { + var copy = {}; + for (var keyname in keymap) { if (keymap.hasOwnProperty(keyname)) { + var value = keymap[keyname]; + if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) { continue } + if (value == "...") { delete keymap[keyname]; continue } + + var keys = map(keyname.split(" "), normalizeKeyName); + for (var i = 0; i < keys.length; i++) { + var val = (void 0), name = (void 0); + if (i == keys.length - 1) { + name = keys.join(" "); + val = value; + } else { + name = keys.slice(0, i + 1).join(" "); + val = "..."; + } + var prev = copy[name]; + if (!prev) { copy[name] = val; } + else if (prev != val) { throw new Error("Inconsistent bindings for " + name) } + } + delete keymap[keyname]; + } } + for (var prop in copy) { keymap[prop] = copy[prop]; } + return keymap + } + + function lookupKey(key, map$$1, handle, context) { + map$$1 = getKeyMap(map$$1); + var found = map$$1.call ? map$$1.call(key, context) : map$$1[key]; + if (found === false) { return "nothing" } + if (found === "...") { return "multi" } + if (found != null && handle(found)) { return "handled" } + + if (map$$1.fallthrough) { + if (Object.prototype.toString.call(map$$1.fallthrough) != "[object Array]") + { return lookupKey(key, map$$1.fallthrough, handle, context) } + for (var i = 0; i < map$$1.fallthrough.length; i++) { + var result = lookupKey(key, map$$1.fallthrough[i], handle, context); + if (result) { return result } + } + } + } + + // Modifier key presses don't count as 'real' key presses for the + // purpose of keymap fallthrough. + function isModifierKey(value) { + var name = typeof value == "string" ? value : keyNames[value.keyCode]; + return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod" + } + + function addModifierNames(name, event, noShift) { + var base = name; + if (event.altKey && base != "Alt") { name = "Alt-" + name; } + if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != "Ctrl") { name = "Ctrl-" + name; } + if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != "Cmd") { name = "Cmd-" + name; } + if (!noShift && event.shiftKey && base != "Shift") { name = "Shift-" + name; } + return name + } + + // Look up the name of a key as indicated by an event object. + function keyName(event, noShift) { + if (presto && event.keyCode == 34 && event["char"]) { return false } + var name = keyNames[event.keyCode]; + if (name == null || event.altGraphKey) { return false } + // Ctrl-ScrollLock has keyCode 3, same as Ctrl-Pause, + // so we'll use event.code when available (Chrome 48+, FF 38+, Safari 10.1+) + if (event.keyCode == 3 && event.code) { name = event.code; } + return addModifierNames(name, event, noShift) + } + + function getKeyMap(val) { + return typeof val == "string" ? keyMap[val] : val + } + + // Helper for deleting text near the selection(s), used to implement + // backspace, delete, and similar functionality. + function deleteNearSelection(cm, compute) { + var ranges = cm.doc.sel.ranges, kill = []; + // Build up a set of ranges to kill first, merging overlapping + // ranges. + for (var i = 0; i < ranges.length; i++) { + var toKill = compute(ranges[i]); + while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) { + var replaced = kill.pop(); + if (cmp(replaced.from, toKill.from) < 0) { + toKill.from = replaced.from; + break + } + } + kill.push(toKill); + } + // Next, remove those actual ranges. + runInOp(cm, function () { + for (var i = kill.length - 1; i >= 0; i--) + { replaceRange(cm.doc, "", kill[i].from, kill[i].to, "+delete"); } + ensureCursorVisible(cm); + }); + } + + function moveCharLogically(line, ch, dir) { + var target = skipExtendingChars(line.text, ch + dir, dir); + return target < 0 || target > line.text.length ? null : target + } + + function moveLogically(line, start, dir) { + var ch = moveCharLogically(line, start.ch, dir); + return ch == null ? null : new Pos(start.line, ch, dir < 0 ? "after" : "before") + } + + function endOfLine(visually, cm, lineObj, lineNo, dir) { + if (visually) { + var order = getOrder(lineObj, cm.doc.direction); + if (order) { + var part = dir < 0 ? lst(order) : order[0]; + var moveInStorageOrder = (dir < 0) == (part.level == 1); + var sticky = moveInStorageOrder ? "after" : "before"; + var ch; + // With a wrapped rtl chunk (possibly spanning multiple bidi parts), + // it could be that the last bidi part is not on the last visual line, + // since visual lines contain content order-consecutive chunks. + // Thus, in rtl, we are looking for the first (content-order) character + // in the rtl chunk that is on the last line (that is, the same line + // as the last (content-order) character). + if (part.level > 0 || cm.doc.direction == "rtl") { + var prep = prepareMeasureForLine(cm, lineObj); + ch = dir < 0 ? lineObj.text.length - 1 : 0; + var targetTop = measureCharPrepared(cm, prep, ch).top; + ch = findFirst(function (ch) { return measureCharPrepared(cm, prep, ch).top == targetTop; }, (dir < 0) == (part.level == 1) ? part.from : part.to - 1, ch); + if (sticky == "before") { ch = moveCharLogically(lineObj, ch, 1); } + } else { ch = dir < 0 ? part.to : part.from; } + return new Pos(lineNo, ch, sticky) + } + } + return new Pos(lineNo, dir < 0 ? lineObj.text.length : 0, dir < 0 ? "before" : "after") + } + + function moveVisually(cm, line, start, dir) { + var bidi = getOrder(line, cm.doc.direction); + if (!bidi) { return moveLogically(line, start, dir) } + if (start.ch >= line.text.length) { + start.ch = line.text.length; + start.sticky = "before"; + } else if (start.ch <= 0) { + start.ch = 0; + start.sticky = "after"; + } + var partPos = getBidiPartAt(bidi, start.ch, start.sticky), part = bidi[partPos]; + if (cm.doc.direction == "ltr" && part.level % 2 == 0 && (dir > 0 ? part.to > start.ch : part.from < start.ch)) { + // Case 1: We move within an ltr part in an ltr editor. Even with wrapped lines, + // nothing interesting happens. + return moveLogically(line, start, dir) + } + + var mv = function (pos, dir) { return moveCharLogically(line, pos instanceof Pos ? pos.ch : pos, dir); }; + var prep; + var getWrappedLineExtent = function (ch) { + if (!cm.options.lineWrapping) { return {begin: 0, end: line.text.length} } + prep = prep || prepareMeasureForLine(cm, line); + return wrappedLineExtentChar(cm, line, prep, ch) + }; + var wrappedLineExtent = getWrappedLineExtent(start.sticky == "before" ? mv(start, -1) : start.ch); + + if (cm.doc.direction == "rtl" || part.level == 1) { + var moveInStorageOrder = (part.level == 1) == (dir < 0); + var ch = mv(start, moveInStorageOrder ? 1 : -1); + if (ch != null && (!moveInStorageOrder ? ch >= part.from && ch >= wrappedLineExtent.begin : ch <= part.to && ch <= wrappedLineExtent.end)) { + // Case 2: We move within an rtl part or in an rtl editor on the same visual line + var sticky = moveInStorageOrder ? "before" : "after"; + return new Pos(start.line, ch, sticky) + } + } + + // Case 3: Could not move within this bidi part in this visual line, so leave + // the current bidi part + + var searchInVisualLine = function (partPos, dir, wrappedLineExtent) { + var getRes = function (ch, moveInStorageOrder) { return moveInStorageOrder + ? new Pos(start.line, mv(ch, 1), "before") + : new Pos(start.line, ch, "after"); }; + + for (; partPos >= 0 && partPos < bidi.length; partPos += dir) { + var part = bidi[partPos]; + var moveInStorageOrder = (dir > 0) == (part.level != 1); + var ch = moveInStorageOrder ? wrappedLineExtent.begin : mv(wrappedLineExtent.end, -1); + if (part.from <= ch && ch < part.to) { return getRes(ch, moveInStorageOrder) } + ch = moveInStorageOrder ? part.from : mv(part.to, -1); + if (wrappedLineExtent.begin <= ch && ch < wrappedLineExtent.end) { return getRes(ch, moveInStorageOrder) } + } + }; + + // Case 3a: Look for other bidi parts on the same visual line + var res = searchInVisualLine(partPos + dir, dir, wrappedLineExtent); + if (res) { return res } + + // Case 3b: Look for other bidi parts on the next visual line + var nextCh = dir > 0 ? wrappedLineExtent.end : mv(wrappedLineExtent.begin, -1); + if (nextCh != null && !(dir > 0 && nextCh == line.text.length)) { + res = searchInVisualLine(dir > 0 ? 0 : bidi.length - 1, dir, getWrappedLineExtent(nextCh)); + if (res) { return res } + } + + // Case 4: Nowhere to move + return null + } + + // Commands are parameter-less actions that can be performed on an + // editor, mostly used for keybindings. + var commands = { + selectAll: selectAll, + singleSelection: function (cm) { return cm.setSelection(cm.getCursor("anchor"), cm.getCursor("head"), sel_dontScroll); }, + killLine: function (cm) { return deleteNearSelection(cm, function (range) { + if (range.empty()) { + var len = getLine(cm.doc, range.head.line).text.length; + if (range.head.ch == len && range.head.line < cm.lastLine()) + { return {from: range.head, to: Pos(range.head.line + 1, 0)} } + else + { return {from: range.head, to: Pos(range.head.line, len)} } + } else { + return {from: range.from(), to: range.to()} + } + }); }, + deleteLine: function (cm) { return deleteNearSelection(cm, function (range) { return ({ + from: Pos(range.from().line, 0), + to: clipPos(cm.doc, Pos(range.to().line + 1, 0)) + }); }); }, + delLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { return ({ + from: Pos(range.from().line, 0), to: range.from() + }); }); }, + delWrappedLineLeft: function (cm) { return deleteNearSelection(cm, function (range) { + var top = cm.charCoords(range.head, "div").top + 5; + var leftPos = cm.coordsChar({left: 0, top: top}, "div"); + return {from: leftPos, to: range.from()} + }); }, + delWrappedLineRight: function (cm) { return deleteNearSelection(cm, function (range) { + var top = cm.charCoords(range.head, "div").top + 5; + var rightPos = cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div"); + return {from: range.from(), to: rightPos } + }); }, + undo: function (cm) { return cm.undo(); }, + redo: function (cm) { return cm.redo(); }, + undoSelection: function (cm) { return cm.undoSelection(); }, + redoSelection: function (cm) { return cm.redoSelection(); }, + goDocStart: function (cm) { return cm.extendSelection(Pos(cm.firstLine(), 0)); }, + goDocEnd: function (cm) { return cm.extendSelection(Pos(cm.lastLine())); }, + goLineStart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStart(cm, range.head.line); }, + {origin: "+move", bias: 1} + ); }, + goLineStartSmart: function (cm) { return cm.extendSelectionsBy(function (range) { return lineStartSmart(cm, range.head); }, + {origin: "+move", bias: 1} + ); }, + goLineEnd: function (cm) { return cm.extendSelectionsBy(function (range) { return lineEnd(cm, range.head.line); }, + {origin: "+move", bias: -1} + ); }, + goLineRight: function (cm) { return cm.extendSelectionsBy(function (range) { + var top = cm.cursorCoords(range.head, "div").top + 5; + return cm.coordsChar({left: cm.display.lineDiv.offsetWidth + 100, top: top}, "div") + }, sel_move); }, + goLineLeft: function (cm) { return cm.extendSelectionsBy(function (range) { + var top = cm.cursorCoords(range.head, "div").top + 5; + return cm.coordsChar({left: 0, top: top}, "div") + }, sel_move); }, + goLineLeftSmart: function (cm) { return cm.extendSelectionsBy(function (range) { + var top = cm.cursorCoords(range.head, "div").top + 5; + var pos = cm.coordsChar({left: 0, top: top}, "div"); + if (pos.ch < cm.getLine(pos.line).search(/\S/)) { return lineStartSmart(cm, range.head) } + return pos + }, sel_move); }, + goLineUp: function (cm) { return cm.moveV(-1, "line"); }, + goLineDown: function (cm) { return cm.moveV(1, "line"); }, + goPageUp: function (cm) { return cm.moveV(-1, "page"); }, + goPageDown: function (cm) { return cm.moveV(1, "page"); }, + goCharLeft: function (cm) { return cm.moveH(-1, "char"); }, + goCharRight: function (cm) { return cm.moveH(1, "char"); }, + goColumnLeft: function (cm) { return cm.moveH(-1, "column"); }, + goColumnRight: function (cm) { return cm.moveH(1, "column"); }, + goWordLeft: function (cm) { return cm.moveH(-1, "word"); }, + goGroupRight: function (cm) { return cm.moveH(1, "group"); }, + goGroupLeft: function (cm) { return cm.moveH(-1, "group"); }, + goWordRight: function (cm) { return cm.moveH(1, "word"); }, + delCharBefore: function (cm) { return cm.deleteH(-1, "char"); }, + delCharAfter: function (cm) { return cm.deleteH(1, "char"); }, + delWordBefore: function (cm) { return cm.deleteH(-1, "word"); }, + delWordAfter: function (cm) { return cm.deleteH(1, "word"); }, + delGroupBefore: function (cm) { return cm.deleteH(-1, "group"); }, + delGroupAfter: function (cm) { return cm.deleteH(1, "group"); }, + indentAuto: function (cm) { return cm.indentSelection("smart"); }, + indentMore: function (cm) { return cm.indentSelection("add"); }, + indentLess: function (cm) { return cm.indentSelection("subtract"); }, + insertTab: function (cm) { return cm.replaceSelection("\t"); }, + insertSoftTab: function (cm) { + var spaces = [], ranges = cm.listSelections(), tabSize = cm.options.tabSize; + for (var i = 0; i < ranges.length; i++) { + var pos = ranges[i].from(); + var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize); + spaces.push(spaceStr(tabSize - col % tabSize)); + } + cm.replaceSelections(spaces); + }, + defaultTab: function (cm) { + if (cm.somethingSelected()) { cm.indentSelection("add"); } + else { cm.execCommand("insertTab"); } + }, + // Swap the two chars left and right of each selection's head. + // Move cursor behind the two swapped characters afterwards. + // + // Doesn't consider line feeds a character. + // Doesn't scan more than one line above to find a character. + // Doesn't do anything on an empty line. + // Doesn't do anything with non-empty selections. + transposeChars: function (cm) { return runInOp(cm, function () { + var ranges = cm.listSelections(), newSel = []; + for (var i = 0; i < ranges.length; i++) { + if (!ranges[i].empty()) { continue } + var cur = ranges[i].head, line = getLine(cm.doc, cur.line).text; + if (line) { + if (cur.ch == line.length) { cur = new Pos(cur.line, cur.ch - 1); } + if (cur.ch > 0) { + cur = new Pos(cur.line, cur.ch + 1); + cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2), + Pos(cur.line, cur.ch - 2), cur, "+transpose"); + } else if (cur.line > cm.doc.first) { + var prev = getLine(cm.doc, cur.line - 1).text; + if (prev) { + cur = new Pos(cur.line, 1); + cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() + + prev.charAt(prev.length - 1), + Pos(cur.line - 1, prev.length - 1), cur, "+transpose"); + } + } + } + newSel.push(new Range(cur, cur)); + } + cm.setSelections(newSel); + }); }, + newlineAndIndent: function (cm) { return runInOp(cm, function () { + var sels = cm.listSelections(); + for (var i = sels.length - 1; i >= 0; i--) + { cm.replaceRange(cm.doc.lineSeparator(), sels[i].anchor, sels[i].head, "+input"); } + sels = cm.listSelections(); + for (var i$1 = 0; i$1 < sels.length; i$1++) + { cm.indentLine(sels[i$1].from().line, null, true); } + ensureCursorVisible(cm); + }); }, + openLine: function (cm) { return cm.replaceSelection("\n", "start"); }, + toggleOverwrite: function (cm) { return cm.toggleOverwrite(); } + }; + + + function lineStart(cm, lineN) { + var line = getLine(cm.doc, lineN); + var visual = visualLine(line); + if (visual != line) { lineN = lineNo(visual); } + return endOfLine(true, cm, visual, lineN, 1) + } + function lineEnd(cm, lineN) { + var line = getLine(cm.doc, lineN); + var visual = visualLineEnd(line); + if (visual != line) { lineN = lineNo(visual); } + return endOfLine(true, cm, line, lineN, -1) + } + function lineStartSmart(cm, pos) { + var start = lineStart(cm, pos.line); + var line = getLine(cm.doc, start.line); + var order = getOrder(line, cm.doc.direction); + if (!order || order[0].level == 0) { + var firstNonWS = Math.max(0, line.text.search(/\S/)); + var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch; + return Pos(start.line, inWS ? 0 : firstNonWS, start.sticky) + } + return start + } + + // Run a handler that was bound to a key. + function doHandleBinding(cm, bound, dropShift) { + if (typeof bound == "string") { + bound = commands[bound]; + if (!bound) { return false } + } + // Ensure previous input has been read, so that the handler sees a + // consistent view of the document + cm.display.input.ensurePolled(); + var prevShift = cm.display.shift, done = false; + try { + if (cm.isReadOnly()) { cm.state.suppressEdits = true; } + if (dropShift) { cm.display.shift = false; } + done = bound(cm) != Pass; + } finally { + cm.display.shift = prevShift; + cm.state.suppressEdits = false; + } + return done + } + + function lookupKeyForEditor(cm, name, handle) { + for (var i = 0; i < cm.state.keyMaps.length; i++) { + var result = lookupKey(name, cm.state.keyMaps[i], handle, cm); + if (result) { return result } + } + return (cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm)) + || lookupKey(name, cm.options.keyMap, handle, cm) + } + + // Note that, despite the name, this function is also used to check + // for bound mouse clicks. + + var stopSeq = new Delayed; + + function dispatchKey(cm, name, e, handle) { + var seq = cm.state.keySeq; + if (seq) { + if (isModifierKey(name)) { return "handled" } + if (/\'$/.test(name)) + { cm.state.keySeq = null; } + else + { stopSeq.set(50, function () { + if (cm.state.keySeq == seq) { + cm.state.keySeq = null; + cm.display.input.reset(); + } + }); } + if (dispatchKeyInner(cm, seq + " " + name, e, handle)) { return true } + } + return dispatchKeyInner(cm, name, e, handle) + } + + function dispatchKeyInner(cm, name, e, handle) { + var result = lookupKeyForEditor(cm, name, handle); + + if (result == "multi") + { cm.state.keySeq = name; } + if (result == "handled") + { signalLater(cm, "keyHandled", cm, name, e); } + + if (result == "handled" || result == "multi") { + e_preventDefault(e); + restartBlink(cm); + } + + return !!result + } + + // Handle a key from the keydown event. + function handleKeyBinding(cm, e) { + var name = keyName(e, true); + if (!name) { return false } + + if (e.shiftKey && !cm.state.keySeq) { + // First try to resolve full name (including 'Shift-'). Failing + // that, see if there is a cursor-motion command (starting with + // 'go') bound to the keyname without 'Shift-'. + return dispatchKey(cm, "Shift-" + name, e, function (b) { return doHandleBinding(cm, b, true); }) + || dispatchKey(cm, name, e, function (b) { + if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion) + { return doHandleBinding(cm, b) } + }) + } else { + return dispatchKey(cm, name, e, function (b) { return doHandleBinding(cm, b); }) + } + } + + // Handle a key from the keypress event + function handleCharBinding(cm, e, ch) { + return dispatchKey(cm, "'" + ch + "'", e, function (b) { return doHandleBinding(cm, b, true); }) + } + + var lastStoppedKey = null; + function onKeyDown(e) { + var cm = this; + cm.curOp.focus = activeElt(); + if (signalDOMEvent(cm, e)) { return } + // IE does strange things with escape. + if (ie && ie_version < 11 && e.keyCode == 27) { e.returnValue = false; } + var code = e.keyCode; + cm.display.shift = code == 16 || e.shiftKey; + var handled = handleKeyBinding(cm, e); + if (presto) { + lastStoppedKey = handled ? code : null; + // Opera has no cut event... we try to at least catch the key combo + if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey)) + { cm.replaceSelection("", null, "cut"); } + } + + // Turn mouse into crosshair when Alt is held on Mac. + if (code == 18 && !/\bCodeMirror-crosshair\b/.test(cm.display.lineDiv.className)) + { showCrossHair(cm); } + } + + function showCrossHair(cm) { + var lineDiv = cm.display.lineDiv; + addClass(lineDiv, "CodeMirror-crosshair"); + + function up(e) { + if (e.keyCode == 18 || !e.altKey) { + rmClass(lineDiv, "CodeMirror-crosshair"); + off(document, "keyup", up); + off(document, "mouseover", up); + } + } + on(document, "keyup", up); + on(document, "mouseover", up); + } + + function onKeyUp(e) { + if (e.keyCode == 16) { this.doc.sel.shift = false; } + signalDOMEvent(this, e); + } + + function onKeyPress(e) { + var cm = this; + if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) { return } + var keyCode = e.keyCode, charCode = e.charCode; + if (presto && keyCode == lastStoppedKey) {lastStoppedKey = null; e_preventDefault(e); return} + if ((presto && (!e.which || e.which < 10)) && handleKeyBinding(cm, e)) { return } + var ch = String.fromCharCode(charCode == null ? keyCode : charCode); + // Some browsers fire keypress events for backspace + if (ch == "\x08") { return } + if (handleCharBinding(cm, e, ch)) { return } + cm.display.input.onKeyPress(e); + } + + var DOUBLECLICK_DELAY = 400; + + var PastClick = function(time, pos, button) { + this.time = time; + this.pos = pos; + this.button = button; + }; + + PastClick.prototype.compare = function (time, pos, button) { + return this.time + DOUBLECLICK_DELAY > time && + cmp(pos, this.pos) == 0 && button == this.button + }; + + var lastClick, lastDoubleClick; + function clickRepeat(pos, button) { + var now = +new Date; + if (lastDoubleClick && lastDoubleClick.compare(now, pos, button)) { + lastClick = lastDoubleClick = null; + return "triple" + } else if (lastClick && lastClick.compare(now, pos, button)) { + lastDoubleClick = new PastClick(now, pos, button); + lastClick = null; + return "double" + } else { + lastClick = new PastClick(now, pos, button); + lastDoubleClick = null; + return "single" + } + } + + // A mouse down can be a single click, double click, triple click, + // start of selection drag, start of text drag, new cursor + // (ctrl-click), rectangle drag (alt-drag), or xwin + // middle-click-paste. Or it might be a click on something we should + // not interfere with, such as a scrollbar or widget. + function onMouseDown(e) { + var cm = this, display = cm.display; + if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) { return } + display.input.ensurePolled(); + display.shift = e.shiftKey; + + if (eventInWidget(display, e)) { + if (!webkit) { + // Briefly turn off draggability, to allow widgets to do + // normal dragging things. + display.scroller.draggable = false; + setTimeout(function () { return display.scroller.draggable = true; }, 100); + } + return + } + if (clickInGutter(cm, e)) { return } + var pos = posFromMouse(cm, e), button = e_button(e), repeat = pos ? clickRepeat(pos, button) : "single"; + window.focus(); + + // #3261: make sure, that we're not starting a second selection + if (button == 1 && cm.state.selectingText) + { cm.state.selectingText(e); } + + if (pos && handleMappedButton(cm, button, pos, repeat, e)) { return } + + if (button == 1) { + if (pos) { leftButtonDown(cm, pos, repeat, e); } + else if (e_target(e) == display.scroller) { e_preventDefault(e); } + } else if (button == 2) { + if (pos) { extendSelection(cm.doc, pos); } + setTimeout(function () { return display.input.focus(); }, 20); + } else if (button == 3) { + if (captureRightClick) { cm.display.input.onContextMenu(e); } + else { delayBlurEvent(cm); } + } + } + + function handleMappedButton(cm, button, pos, repeat, event) { + var name = "Click"; + if (repeat == "double") { name = "Double" + name; } + else if (repeat == "triple") { name = "Triple" + name; } + name = (button == 1 ? "Left" : button == 2 ? "Middle" : "Right") + name; + + return dispatchKey(cm, addModifierNames(name, event), event, function (bound) { + if (typeof bound == "string") { bound = commands[bound]; } + if (!bound) { return false } + var done = false; + try { + if (cm.isReadOnly()) { cm.state.suppressEdits = true; } + done = bound(cm, pos) != Pass; + } finally { + cm.state.suppressEdits = false; + } + return done + }) + } + + function configureMouse(cm, repeat, event) { + var option = cm.getOption("configureMouse"); + var value = option ? option(cm, repeat, event) : {}; + if (value.unit == null) { + var rect = chromeOS ? event.shiftKey && event.metaKey : event.altKey; + value.unit = rect ? "rectangle" : repeat == "single" ? "char" : repeat == "double" ? "word" : "line"; + } + if (value.extend == null || cm.doc.extend) { value.extend = cm.doc.extend || event.shiftKey; } + if (value.addNew == null) { value.addNew = mac ? event.metaKey : event.ctrlKey; } + if (value.moveOnDrag == null) { value.moveOnDrag = !(mac ? event.altKey : event.ctrlKey); } + return value + } + + function leftButtonDown(cm, pos, repeat, event) { + if (ie) { setTimeout(bind(ensureFocus, cm), 0); } + else { cm.curOp.focus = activeElt(); } + + var behavior = configureMouse(cm, repeat, event); + + var sel = cm.doc.sel, contained; + if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() && + repeat == "single" && (contained = sel.contains(pos)) > -1 && + (cmp((contained = sel.ranges[contained]).from(), pos) < 0 || pos.xRel > 0) && + (cmp(contained.to(), pos) > 0 || pos.xRel < 0)) + { leftButtonStartDrag(cm, event, pos, behavior); } + else + { leftButtonSelect(cm, event, pos, behavior); } + } + + // Start a text drag. When it ends, see if any dragging actually + // happen, and treat as a click if it didn't. + function leftButtonStartDrag(cm, event, pos, behavior) { + var display = cm.display, moved = false; + var dragEnd = operation(cm, function (e) { + if (webkit) { display.scroller.draggable = false; } + cm.state.draggingText = false; + off(display.wrapper.ownerDocument, "mouseup", dragEnd); + off(display.wrapper.ownerDocument, "mousemove", mouseMove); + off(display.scroller, "dragstart", dragStart); + off(display.scroller, "drop", dragEnd); + if (!moved) { + e_preventDefault(e); + if (!behavior.addNew) + { extendSelection(cm.doc, pos, null, null, behavior.extend); } + // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081) + if (webkit || ie && ie_version == 9) + { setTimeout(function () {display.wrapper.ownerDocument.body.focus(); display.input.focus();}, 20); } + else + { display.input.focus(); } + } + }); + var mouseMove = function(e2) { + moved = moved || Math.abs(event.clientX - e2.clientX) + Math.abs(event.clientY - e2.clientY) >= 10; + }; + var dragStart = function () { return moved = true; }; + // Let the drag handler handle this. + if (webkit) { display.scroller.draggable = true; } + cm.state.draggingText = dragEnd; + dragEnd.copy = !behavior.moveOnDrag; + // IE's approach to draggable + if (display.scroller.dragDrop) { display.scroller.dragDrop(); } + on(display.wrapper.ownerDocument, "mouseup", dragEnd); + on(display.wrapper.ownerDocument, "mousemove", mouseMove); + on(display.scroller, "dragstart", dragStart); + on(display.scroller, "drop", dragEnd); + + delayBlurEvent(cm); + setTimeout(function () { return display.input.focus(); }, 20); + } + + function rangeForUnit(cm, pos, unit) { + if (unit == "char") { return new Range(pos, pos) } + if (unit == "word") { return cm.findWordAt(pos) } + if (unit == "line") { return new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))) } + var result = unit(cm, pos); + return new Range(result.from, result.to) + } + + // Normal selection, as opposed to text dragging. + function leftButtonSelect(cm, event, start, behavior) { + var display = cm.display, doc = cm.doc; + e_preventDefault(event); + + var ourRange, ourIndex, startSel = doc.sel, ranges = startSel.ranges; + if (behavior.addNew && !behavior.extend) { + ourIndex = doc.sel.contains(start); + if (ourIndex > -1) + { ourRange = ranges[ourIndex]; } + else + { ourRange = new Range(start, start); } + } else { + ourRange = doc.sel.primary(); + ourIndex = doc.sel.primIndex; + } + + if (behavior.unit == "rectangle") { + if (!behavior.addNew) { ourRange = new Range(start, start); } + start = posFromMouse(cm, event, true, true); + ourIndex = -1; + } else { + var range$$1 = rangeForUnit(cm, start, behavior.unit); + if (behavior.extend) + { ourRange = extendRange(ourRange, range$$1.anchor, range$$1.head, behavior.extend); } + else + { ourRange = range$$1; } + } + + if (!behavior.addNew) { + ourIndex = 0; + setSelection(doc, new Selection([ourRange], 0), sel_mouse); + startSel = doc.sel; + } else if (ourIndex == -1) { + ourIndex = ranges.length; + setSelection(doc, normalizeSelection(cm, ranges.concat([ourRange]), ourIndex), + {scroll: false, origin: "*mouse"}); + } else if (ranges.length > 1 && ranges[ourIndex].empty() && behavior.unit == "char" && !behavior.extend) { + setSelection(doc, normalizeSelection(cm, ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0), + {scroll: false, origin: "*mouse"}); + startSel = doc.sel; + } else { + replaceOneSelection(doc, ourIndex, ourRange, sel_mouse); + } + + var lastPos = start; + function extendTo(pos) { + if (cmp(lastPos, pos) == 0) { return } + lastPos = pos; + + if (behavior.unit == "rectangle") { + var ranges = [], tabSize = cm.options.tabSize; + var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize); + var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize); + var left = Math.min(startCol, posCol), right = Math.max(startCol, posCol); + for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line)); + line <= end; line++) { + var text = getLine(doc, line).text, leftPos = findColumn(text, left, tabSize); + if (left == right) + { ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos))); } + else if (text.length > leftPos) + { ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize)))); } + } + if (!ranges.length) { ranges.push(new Range(start, start)); } + setSelection(doc, normalizeSelection(cm, startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex), + {origin: "*mouse", scroll: false}); + cm.scrollIntoView(pos); + } else { + var oldRange = ourRange; + var range$$1 = rangeForUnit(cm, pos, behavior.unit); + var anchor = oldRange.anchor, head; + if (cmp(range$$1.anchor, anchor) > 0) { + head = range$$1.head; + anchor = minPos(oldRange.from(), range$$1.anchor); + } else { + head = range$$1.anchor; + anchor = maxPos(oldRange.to(), range$$1.head); + } + var ranges$1 = startSel.ranges.slice(0); + ranges$1[ourIndex] = bidiSimplify(cm, new Range(clipPos(doc, anchor), head)); + setSelection(doc, normalizeSelection(cm, ranges$1, ourIndex), sel_mouse); + } + } + + var editorSize = display.wrapper.getBoundingClientRect(); + // Used to ensure timeout re-tries don't fire when another extend + // happened in the meantime (clearTimeout isn't reliable -- at + // least on Chrome, the timeouts still happen even when cleared, + // if the clear happens after their scheduled firing time). + var counter = 0; + + function extend(e) { + var curCount = ++counter; + var cur = posFromMouse(cm, e, true, behavior.unit == "rectangle"); + if (!cur) { return } + if (cmp(cur, lastPos) != 0) { + cm.curOp.focus = activeElt(); + extendTo(cur); + var visible = visibleLines(display, doc); + if (cur.line >= visible.to || cur.line < visible.from) + { setTimeout(operation(cm, function () {if (counter == curCount) { extend(e); }}), 150); } + } else { + var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0; + if (outside) { setTimeout(operation(cm, function () { + if (counter != curCount) { return } + display.scroller.scrollTop += outside; + extend(e); + }), 50); } + } + } + + function done(e) { + cm.state.selectingText = false; + counter = Infinity; + // If e is null or undefined we interpret this as someone trying + // to explicitly cancel the selection rather than the user + // letting go of the mouse button. + if (e) { + e_preventDefault(e); + display.input.focus(); + } + off(display.wrapper.ownerDocument, "mousemove", move); + off(display.wrapper.ownerDocument, "mouseup", up); + doc.history.lastSelOrigin = null; + } + + var move = operation(cm, function (e) { + if (e.buttons === 0 || !e_button(e)) { done(e); } + else { extend(e); } + }); + var up = operation(cm, done); + cm.state.selectingText = up; + on(display.wrapper.ownerDocument, "mousemove", move); + on(display.wrapper.ownerDocument, "mouseup", up); + } + + // Used when mouse-selecting to adjust the anchor to the proper side + // of a bidi jump depending on the visual position of the head. + function bidiSimplify(cm, range$$1) { + var anchor = range$$1.anchor; + var head = range$$1.head; + var anchorLine = getLine(cm.doc, anchor.line); + if (cmp(anchor, head) == 0 && anchor.sticky == head.sticky) { return range$$1 } + var order = getOrder(anchorLine); + if (!order) { return range$$1 } + var index = getBidiPartAt(order, anchor.ch, anchor.sticky), part = order[index]; + if (part.from != anchor.ch && part.to != anchor.ch) { return range$$1 } + var boundary = index + ((part.from == anchor.ch) == (part.level != 1) ? 0 : 1); + if (boundary == 0 || boundary == order.length) { return range$$1 } + + // Compute the relative visual position of the head compared to the + // anchor (<0 is to the left, >0 to the right) + var leftSide; + if (head.line != anchor.line) { + leftSide = (head.line - anchor.line) * (cm.doc.direction == "ltr" ? 1 : -1) > 0; + } else { + var headIndex = getBidiPartAt(order, head.ch, head.sticky); + var dir = headIndex - index || (head.ch - anchor.ch) * (part.level == 1 ? -1 : 1); + if (headIndex == boundary - 1 || headIndex == boundary) + { leftSide = dir < 0; } + else + { leftSide = dir > 0; } + } + + var usePart = order[boundary + (leftSide ? -1 : 0)]; + var from = leftSide == (usePart.level == 1); + var ch = from ? usePart.from : usePart.to, sticky = from ? "after" : "before"; + return anchor.ch == ch && anchor.sticky == sticky ? range$$1 : new Range(new Pos(anchor.line, ch, sticky), head) + } + + + // Determines whether an event happened in the gutter, and fires the + // handlers for the corresponding event. + function gutterEvent(cm, e, type, prevent) { + var mX, mY; + if (e.touches) { + mX = e.touches[0].clientX; + mY = e.touches[0].clientY; + } else { + try { mX = e.clientX; mY = e.clientY; } + catch(e) { return false } + } + if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) { return false } + if (prevent) { e_preventDefault(e); } + + var display = cm.display; + var lineBox = display.lineDiv.getBoundingClientRect(); + + if (mY > lineBox.bottom || !hasHandler(cm, type)) { return e_defaultPrevented(e) } + mY -= lineBox.top - display.viewOffset; + + for (var i = 0; i < cm.display.gutterSpecs.length; ++i) { + var g = display.gutters.childNodes[i]; + if (g && g.getBoundingClientRect().right >= mX) { + var line = lineAtHeight(cm.doc, mY); + var gutter = cm.display.gutterSpecs[i]; + signal(cm, type, cm, line, gutter.className, e); + return e_defaultPrevented(e) + } + } + } + + function clickInGutter(cm, e) { + return gutterEvent(cm, e, "gutterClick", true) + } + + // CONTEXT MENU HANDLING + + // To make the context menu work, we need to briefly unhide the + // textarea (making it as unobtrusive as possible) to let the + // right-click take effect on it. + function onContextMenu(cm, e) { + if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) { return } + if (signalDOMEvent(cm, e, "contextmenu")) { return } + if (!captureRightClick) { cm.display.input.onContextMenu(e); } + } + + function contextMenuInGutter(cm, e) { + if (!hasHandler(cm, "gutterContextMenu")) { return false } + return gutterEvent(cm, e, "gutterContextMenu", false) + } + + function themeChanged(cm) { + cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") + + cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-"); + clearCaches(cm); + } + + var Init = {toString: function(){return "CodeMirror.Init"}}; + + var defaults = {}; + var optionHandlers = {}; + + function defineOptions(CodeMirror) { + var optionHandlers = CodeMirror.optionHandlers; + + function option(name, deflt, handle, notOnInit) { + CodeMirror.defaults[name] = deflt; + if (handle) { optionHandlers[name] = + notOnInit ? function (cm, val, old) {if (old != Init) { handle(cm, val, old); }} : handle; } + } + + CodeMirror.defineOption = option; + + // Passed to option handlers when there is no old value. + CodeMirror.Init = Init; + + // These two are, on init, called from the constructor because they + // have to be initialized before the editor can start at all. + option("value", "", function (cm, val) { return cm.setValue(val); }, true); + option("mode", null, function (cm, val) { + cm.doc.modeOption = val; + loadMode(cm); + }, true); + + option("indentUnit", 2, loadMode, true); + option("indentWithTabs", false); + option("smartIndent", true); + option("tabSize", 4, function (cm) { + resetModeState(cm); + clearCaches(cm); + regChange(cm); + }, true); + + option("lineSeparator", null, function (cm, val) { + cm.doc.lineSep = val; + if (!val) { return } + var newBreaks = [], lineNo = cm.doc.first; + cm.doc.iter(function (line) { + for (var pos = 0;;) { + var found = line.text.indexOf(val, pos); + if (found == -1) { break } + pos = found + val.length; + newBreaks.push(Pos(lineNo, found)); + } + lineNo++; + }); + for (var i = newBreaks.length - 1; i >= 0; i--) + { replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length)); } + }); + option("specialChars", /[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b-\u200f\u2028\u2029\ufeff\ufff9-\ufffc]/g, function (cm, val, old) { + cm.state.specialChars = new RegExp(val.source + (val.test("\t") ? "" : "|\t"), "g"); + if (old != Init) { cm.refresh(); } + }); + option("specialCharPlaceholder", defaultSpecialCharPlaceholder, function (cm) { return cm.refresh(); }, true); + option("electricChars", true); + option("inputStyle", mobile ? "contenteditable" : "textarea", function () { + throw new Error("inputStyle can not (yet) be changed in a running editor") // FIXME + }, true); + option("spellcheck", false, function (cm, val) { return cm.getInputField().spellcheck = val; }, true); + option("autocorrect", false, function (cm, val) { return cm.getInputField().autocorrect = val; }, true); + option("autocapitalize", false, function (cm, val) { return cm.getInputField().autocapitalize = val; }, true); + option("rtlMoveVisually", !windows); + option("wholeLineUpdateBefore", true); + + option("theme", "default", function (cm) { + themeChanged(cm); + updateGutters(cm); + }, true); + option("keyMap", "default", function (cm, val, old) { + var next = getKeyMap(val); + var prev = old != Init && getKeyMap(old); + if (prev && prev.detach) { prev.detach(cm, next); } + if (next.attach) { next.attach(cm, prev || null); } + }); + option("extraKeys", null); + option("configureMouse", null); + + option("lineWrapping", false, wrappingChanged, true); + option("gutters", [], function (cm, val) { + cm.display.gutterSpecs = getGutters(val, cm.options.lineNumbers); + updateGutters(cm); + }, true); + option("fixedGutter", true, function (cm, val) { + cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0"; + cm.refresh(); + }, true); + option("coverGutterNextToScrollbar", false, function (cm) { return updateScrollbars(cm); }, true); + option("scrollbarStyle", "native", function (cm) { + initScrollbars(cm); + updateScrollbars(cm); + cm.display.scrollbars.setScrollTop(cm.doc.scrollTop); + cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft); + }, true); + option("lineNumbers", false, function (cm, val) { + cm.display.gutterSpecs = getGutters(cm.options.gutters, val); + updateGutters(cm); + }, true); + option("firstLineNumber", 1, updateGutters, true); + option("lineNumberFormatter", function (integer) { return integer; }, updateGutters, true); + option("showCursorWhenSelecting", false, updateSelection, true); + + option("resetSelectionOnContextMenu", true); + option("lineWiseCopyCut", true); + option("pasteLinesPerSelection", true); + option("selectionsMayTouch", false); + + option("readOnly", false, function (cm, val) { + if (val == "nocursor") { + onBlur(cm); + cm.display.input.blur(); + } + cm.display.input.readOnlyChanged(val); + }); + option("disableInput", false, function (cm, val) {if (!val) { cm.display.input.reset(); }}, true); + option("dragDrop", true, dragDropChanged); + option("allowDropFileTypes", null); + + option("cursorBlinkRate", 530); + option("cursorScrollMargin", 0); + option("cursorHeight", 1, updateSelection, true); + option("singleCursorHeightPerLine", true, updateSelection, true); + option("workTime", 100); + option("workDelay", 100); + option("flattenSpans", true, resetModeState, true); + option("addModeClass", false, resetModeState, true); + option("pollInterval", 100); + option("undoDepth", 200, function (cm, val) { return cm.doc.history.undoDepth = val; }); + option("historyEventDelay", 1250); + option("viewportMargin", 10, function (cm) { return cm.refresh(); }, true); + option("maxHighlightLength", 10000, resetModeState, true); + option("moveInputWithCursor", true, function (cm, val) { + if (!val) { cm.display.input.resetPosition(); } + }); + + option("tabindex", null, function (cm, val) { return cm.display.input.getField().tabIndex = val || ""; }); + option("autofocus", null); + option("direction", "ltr", function (cm, val) { return cm.doc.setDirection(val); }, true); + option("phrases", null); + } + + function dragDropChanged(cm, value, old) { + var wasOn = old && old != Init; + if (!value != !wasOn) { + var funcs = cm.display.dragFunctions; + var toggle = value ? on : off; + toggle(cm.display.scroller, "dragstart", funcs.start); + toggle(cm.display.scroller, "dragenter", funcs.enter); + toggle(cm.display.scroller, "dragover", funcs.over); + toggle(cm.display.scroller, "dragleave", funcs.leave); + toggle(cm.display.scroller, "drop", funcs.drop); + } + } + + function wrappingChanged(cm) { + if (cm.options.lineWrapping) { + addClass(cm.display.wrapper, "CodeMirror-wrap"); + cm.display.sizer.style.minWidth = ""; + cm.display.sizerWidth = null; + } else { + rmClass(cm.display.wrapper, "CodeMirror-wrap"); + findMaxLine(cm); + } + estimateLineHeights(cm); + regChange(cm); + clearCaches(cm); + setTimeout(function () { return updateScrollbars(cm); }, 100); + } + + // A CodeMirror instance represents an editor. This is the object + // that user code is usually dealing with. + + function CodeMirror(place, options) { + var this$1 = this; + + if (!(this instanceof CodeMirror)) { return new CodeMirror(place, options) } + + this.options = options = options ? copyObj(options) : {}; + // Determine effective options based on given values and defaults. + copyObj(defaults, options, false); + + var doc = options.value; + if (typeof doc == "string") { doc = new Doc(doc, options.mode, null, options.lineSeparator, options.direction); } + else if (options.mode) { doc.modeOption = options.mode; } + this.doc = doc; + + var input = new CodeMirror.inputStyles[options.inputStyle](this); + var display = this.display = new Display(place, doc, input, options); + display.wrapper.CodeMirror = this; + themeChanged(this); + if (options.lineWrapping) + { this.display.wrapper.className += " CodeMirror-wrap"; } + initScrollbars(this); + + this.state = { + keyMaps: [], // stores maps added by addKeyMap + overlays: [], // highlighting overlays, as added by addOverlay + modeGen: 0, // bumped when mode/overlay changes, used to invalidate highlighting info + overwrite: false, + delayingBlurEvent: false, + focused: false, + suppressEdits: false, // used to disable editing during key handlers when in readOnly mode + pasteIncoming: -1, cutIncoming: -1, // help recognize paste/cut edits in input.poll + selectingText: false, + draggingText: false, + highlight: new Delayed(), // stores highlight worker timeout + keySeq: null, // Unfinished key sequence + specialChars: null + }; + + if (options.autofocus && !mobile) { display.input.focus(); } + + // Override magic textarea content restore that IE sometimes does + // on our hidden textarea on reload + if (ie && ie_version < 11) { setTimeout(function () { return this$1.display.input.reset(true); }, 20); } + + registerEventHandlers(this); + ensureGlobalHandlers(); + + startOperation(this); + this.curOp.forceUpdate = true; + attachDoc(this, doc); + + if ((options.autofocus && !mobile) || this.hasFocus()) + { setTimeout(bind(onFocus, this), 20); } + else + { onBlur(this); } + + for (var opt in optionHandlers) { if (optionHandlers.hasOwnProperty(opt)) + { optionHandlers[opt](this$1, options[opt], Init); } } + maybeUpdateLineNumberWidth(this); + if (options.finishInit) { options.finishInit(this); } + for (var i = 0; i < initHooks.length; ++i) { initHooks[i](this$1); } + endOperation(this); + // Suppress optimizelegibility in Webkit, since it breaks text + // measuring on line wrapping boundaries. + if (webkit && options.lineWrapping && + getComputedStyle(display.lineDiv).textRendering == "optimizelegibility") + { display.lineDiv.style.textRendering = "auto"; } + } + + // The default configuration options. + CodeMirror.defaults = defaults; + // Functions to run when options are changed. + CodeMirror.optionHandlers = optionHandlers; + + // Attach the necessary event handlers when initializing the editor + function registerEventHandlers(cm) { + var d = cm.display; + on(d.scroller, "mousedown", operation(cm, onMouseDown)); + // Older IE's will not fire a second mousedown for a double click + if (ie && ie_version < 11) + { on(d.scroller, "dblclick", operation(cm, function (e) { + if (signalDOMEvent(cm, e)) { return } + var pos = posFromMouse(cm, e); + if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) { return } + e_preventDefault(e); + var word = cm.findWordAt(pos); + extendSelection(cm.doc, word.anchor, word.head); + })); } + else + { on(d.scroller, "dblclick", function (e) { return signalDOMEvent(cm, e) || e_preventDefault(e); }); } + // Some browsers fire contextmenu *after* opening the menu, at + // which point we can't mess with it anymore. Context menu is + // handled in onMouseDown for these browsers. + on(d.scroller, "contextmenu", function (e) { return onContextMenu(cm, e); }); + + // Used to suppress mouse event handling when a touch happens + var touchFinished, prevTouch = {end: 0}; + function finishTouch() { + if (d.activeTouch) { + touchFinished = setTimeout(function () { return d.activeTouch = null; }, 1000); + prevTouch = d.activeTouch; + prevTouch.end = +new Date; + } + } + function isMouseLikeTouchEvent(e) { + if (e.touches.length != 1) { return false } + var touch = e.touches[0]; + return touch.radiusX <= 1 && touch.radiusY <= 1 + } + function farAway(touch, other) { + if (other.left == null) { return true } + var dx = other.left - touch.left, dy = other.top - touch.top; + return dx * dx + dy * dy > 20 * 20 + } + on(d.scroller, "touchstart", function (e) { + if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e) && !clickInGutter(cm, e)) { + d.input.ensurePolled(); + clearTimeout(touchFinished); + var now = +new Date; + d.activeTouch = {start: now, moved: false, + prev: now - prevTouch.end <= 300 ? prevTouch : null}; + if (e.touches.length == 1) { + d.activeTouch.left = e.touches[0].pageX; + d.activeTouch.top = e.touches[0].pageY; + } + } + }); + on(d.scroller, "touchmove", function () { + if (d.activeTouch) { d.activeTouch.moved = true; } + }); + on(d.scroller, "touchend", function (e) { + var touch = d.activeTouch; + if (touch && !eventInWidget(d, e) && touch.left != null && + !touch.moved && new Date - touch.start < 300) { + var pos = cm.coordsChar(d.activeTouch, "page"), range; + if (!touch.prev || farAway(touch, touch.prev)) // Single tap + { range = new Range(pos, pos); } + else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) // Double tap + { range = cm.findWordAt(pos); } + else // Triple tap + { range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))); } + cm.setSelection(range.anchor, range.head); + cm.focus(); + e_preventDefault(e); + } + finishTouch(); + }); + on(d.scroller, "touchcancel", finishTouch); + + // Sync scrolling between fake scrollbars and real scrollable + // area, ensure viewport is updated when scrolling. + on(d.scroller, "scroll", function () { + if (d.scroller.clientHeight) { + updateScrollTop(cm, d.scroller.scrollTop); + setScrollLeft(cm, d.scroller.scrollLeft, true); + signal(cm, "scroll", cm); + } + }); + + // Listen to wheel events in order to try and update the viewport on time. + on(d.scroller, "mousewheel", function (e) { return onScrollWheel(cm, e); }); + on(d.scroller, "DOMMouseScroll", function (e) { return onScrollWheel(cm, e); }); + + // Prevent wrapper from ever scrolling + on(d.wrapper, "scroll", function () { return d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; }); + + d.dragFunctions = { + enter: function (e) {if (!signalDOMEvent(cm, e)) { e_stop(e); }}, + over: function (e) {if (!signalDOMEvent(cm, e)) { onDragOver(cm, e); e_stop(e); }}, + start: function (e) { return onDragStart(cm, e); }, + drop: operation(cm, onDrop), + leave: function (e) {if (!signalDOMEvent(cm, e)) { clearDragCursor(cm); }} + }; + + var inp = d.input.getField(); + on(inp, "keyup", function (e) { return onKeyUp.call(cm, e); }); + on(inp, "keydown", operation(cm, onKeyDown)); + on(inp, "keypress", operation(cm, onKeyPress)); + on(inp, "focus", function (e) { return onFocus(cm, e); }); + on(inp, "blur", function (e) { return onBlur(cm, e); }); + } + + var initHooks = []; + CodeMirror.defineInitHook = function (f) { return initHooks.push(f); }; + + // Indent the given line. The how parameter can be "smart", + // "add"/null, "subtract", or "prev". When aggressive is false + // (typically set to true for forced single-line indents), empty + // lines are not indented, and places where the mode returns Pass + // are left alone. + function indentLine(cm, n, how, aggressive) { + var doc = cm.doc, state; + if (how == null) { how = "add"; } + if (how == "smart") { + // Fall back to "prev" when the mode doesn't have an indentation + // method. + if (!doc.mode.indent) { how = "prev"; } + else { state = getContextBefore(cm, n).state; } + } + + var tabSize = cm.options.tabSize; + var line = getLine(doc, n), curSpace = countColumn(line.text, null, tabSize); + if (line.stateAfter) { line.stateAfter = null; } + var curSpaceString = line.text.match(/^\s*/)[0], indentation; + if (!aggressive && !/\S/.test(line.text)) { + indentation = 0; + how = "not"; + } else if (how == "smart") { + indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text); + if (indentation == Pass || indentation > 150) { + if (!aggressive) { return } + how = "prev"; + } + } + if (how == "prev") { + if (n > doc.first) { indentation = countColumn(getLine(doc, n-1).text, null, tabSize); } + else { indentation = 0; } + } else if (how == "add") { + indentation = curSpace + cm.options.indentUnit; + } else if (how == "subtract") { + indentation = curSpace - cm.options.indentUnit; + } else if (typeof how == "number") { + indentation = curSpace + how; + } + indentation = Math.max(0, indentation); + + var indentString = "", pos = 0; + if (cm.options.indentWithTabs) + { for (var i = Math.floor(indentation / tabSize); i; --i) {pos += tabSize; indentString += "\t";} } + if (pos < indentation) { indentString += spaceStr(indentation - pos); } + + if (indentString != curSpaceString) { + replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), "+input"); + line.stateAfter = null; + return true + } else { + // Ensure that, if the cursor was in the whitespace at the start + // of the line, it is moved to the end of that space. + for (var i$1 = 0; i$1 < doc.sel.ranges.length; i$1++) { + var range = doc.sel.ranges[i$1]; + if (range.head.line == n && range.head.ch < curSpaceString.length) { + var pos$1 = Pos(n, curSpaceString.length); + replaceOneSelection(doc, i$1, new Range(pos$1, pos$1)); + break + } + } + } + } + + // This will be set to a {lineWise: bool, text: [string]} object, so + // that, when pasting, we know what kind of selections the copied + // text was made out of. + var lastCopied = null; + + function setLastCopied(newLastCopied) { + lastCopied = newLastCopied; + } + + function applyTextInput(cm, inserted, deleted, sel, origin) { + var doc = cm.doc; + cm.display.shift = false; + if (!sel) { sel = doc.sel; } + + var recent = +new Date - 200; + var paste = origin == "paste" || cm.state.pasteIncoming > recent; + var textLines = splitLinesAuto(inserted), multiPaste = null; + // When pasting N lines into N selections, insert one line per selection + if (paste && sel.ranges.length > 1) { + if (lastCopied && lastCopied.text.join("\n") == inserted) { + if (sel.ranges.length % lastCopied.text.length == 0) { + multiPaste = []; + for (var i = 0; i < lastCopied.text.length; i++) + { multiPaste.push(doc.splitLines(lastCopied.text[i])); } + } + } else if (textLines.length == sel.ranges.length && cm.options.pasteLinesPerSelection) { + multiPaste = map(textLines, function (l) { return [l]; }); + } + } + + var updateInput = cm.curOp.updateInput; + // Normal behavior is to insert the new text into every selection + for (var i$1 = sel.ranges.length - 1; i$1 >= 0; i$1--) { + var range$$1 = sel.ranges[i$1]; + var from = range$$1.from(), to = range$$1.to(); + if (range$$1.empty()) { + if (deleted && deleted > 0) // Handle deletion + { from = Pos(from.line, from.ch - deleted); } + else if (cm.state.overwrite && !paste) // Handle overwrite + { to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length)); } + else if (paste && lastCopied && lastCopied.lineWise && lastCopied.text.join("\n") == inserted) + { from = to = Pos(from.line, 0); } + } + var changeEvent = {from: from, to: to, text: multiPaste ? multiPaste[i$1 % multiPaste.length] : textLines, + origin: origin || (paste ? "paste" : cm.state.cutIncoming > recent ? "cut" : "+input")}; + makeChange(cm.doc, changeEvent); + signalLater(cm, "inputRead", cm, changeEvent); + } + if (inserted && !paste) + { triggerElectric(cm, inserted); } + + ensureCursorVisible(cm); + if (cm.curOp.updateInput < 2) { cm.curOp.updateInput = updateInput; } + cm.curOp.typing = true; + cm.state.pasteIncoming = cm.state.cutIncoming = -1; + } + + function handlePaste(e, cm) { + var pasted = e.clipboardData && e.clipboardData.getData("Text"); + if (pasted) { + e.preventDefault(); + if (!cm.isReadOnly() && !cm.options.disableInput) + { runInOp(cm, function () { return applyTextInput(cm, pasted, 0, null, "paste"); }); } + return true + } + } + + function triggerElectric(cm, inserted) { + // When an 'electric' character is inserted, immediately trigger a reindent + if (!cm.options.electricChars || !cm.options.smartIndent) { return } + var sel = cm.doc.sel; + + for (var i = sel.ranges.length - 1; i >= 0; i--) { + var range$$1 = sel.ranges[i]; + if (range$$1.head.ch > 100 || (i && sel.ranges[i - 1].head.line == range$$1.head.line)) { continue } + var mode = cm.getModeAt(range$$1.head); + var indented = false; + if (mode.electricChars) { + for (var j = 0; j < mode.electricChars.length; j++) + { if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) { + indented = indentLine(cm, range$$1.head.line, "smart"); + break + } } + } else if (mode.electricInput) { + if (mode.electricInput.test(getLine(cm.doc, range$$1.head.line).text.slice(0, range$$1.head.ch))) + { indented = indentLine(cm, range$$1.head.line, "smart"); } + } + if (indented) { signalLater(cm, "electricInput", cm, range$$1.head.line); } + } + } + + function copyableRanges(cm) { + var text = [], ranges = []; + for (var i = 0; i < cm.doc.sel.ranges.length; i++) { + var line = cm.doc.sel.ranges[i].head.line; + var lineRange = {anchor: Pos(line, 0), head: Pos(line + 1, 0)}; + ranges.push(lineRange); + text.push(cm.getRange(lineRange.anchor, lineRange.head)); + } + return {text: text, ranges: ranges} + } + + function disableBrowserMagic(field, spellcheck, autocorrect, autocapitalize) { + field.setAttribute("autocorrect", autocorrect ? "" : "off"); + field.setAttribute("autocapitalize", autocapitalize ? "" : "off"); + field.setAttribute("spellcheck", !!spellcheck); + } + + function hiddenTextarea() { + var te = elt("textarea", null, null, "position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none"); + var div = elt("div", [te], null, "overflow: hidden; position: relative; width: 3px; height: 0px;"); + // The textarea is kept positioned near the cursor to prevent the + // fact that it'll be scrolled into view on input from scrolling + // our fake cursor out of view. On webkit, when wrap=off, paste is + // very slow. So make the area wide instead. + if (webkit) { te.style.width = "1000px"; } + else { te.setAttribute("wrap", "off"); } + // If border: 0; -- iOS fails to open keyboard (issue #1287) + if (ios) { te.style.border = "1px solid black"; } + disableBrowserMagic(te); + return div + } + + // The publicly visible API. Note that methodOp(f) means + // 'wrap f in an operation, performed on its `this` parameter'. + + // This is not the complete set of editor methods. Most of the + // methods defined on the Doc type are also injected into + // CodeMirror.prototype, for backwards compatibility and + // convenience. + + function addEditorMethods(CodeMirror) { + var optionHandlers = CodeMirror.optionHandlers; + + var helpers = CodeMirror.helpers = {}; + + CodeMirror.prototype = { + constructor: CodeMirror, + focus: function(){window.focus(); this.display.input.focus();}, + + setOption: function(option, value) { + var options = this.options, old = options[option]; + if (options[option] == value && option != "mode") { return } + options[option] = value; + if (optionHandlers.hasOwnProperty(option)) + { operation(this, optionHandlers[option])(this, value, old); } + signal(this, "optionChange", this, option); + }, + + getOption: function(option) {return this.options[option]}, + getDoc: function() {return this.doc}, + + addKeyMap: function(map$$1, bottom) { + this.state.keyMaps[bottom ? "push" : "unshift"](getKeyMap(map$$1)); + }, + removeKeyMap: function(map$$1) { + var maps = this.state.keyMaps; + for (var i = 0; i < maps.length; ++i) + { if (maps[i] == map$$1 || maps[i].name == map$$1) { + maps.splice(i, 1); + return true + } } + }, + + addOverlay: methodOp(function(spec, options) { + var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec); + if (mode.startState) { throw new Error("Overlays may not be stateful.") } + insertSorted(this.state.overlays, + {mode: mode, modeSpec: spec, opaque: options && options.opaque, + priority: (options && options.priority) || 0}, + function (overlay) { return overlay.priority; }); + this.state.modeGen++; + regChange(this); + }), + removeOverlay: methodOp(function(spec) { + var this$1 = this; + + var overlays = this.state.overlays; + for (var i = 0; i < overlays.length; ++i) { + var cur = overlays[i].modeSpec; + if (cur == spec || typeof spec == "string" && cur.name == spec) { + overlays.splice(i, 1); + this$1.state.modeGen++; + regChange(this$1); + return + } + } + }), + + indentLine: methodOp(function(n, dir, aggressive) { + if (typeof dir != "string" && typeof dir != "number") { + if (dir == null) { dir = this.options.smartIndent ? "smart" : "prev"; } + else { dir = dir ? "add" : "subtract"; } + } + if (isLine(this.doc, n)) { indentLine(this, n, dir, aggressive); } + }), + indentSelection: methodOp(function(how) { + var this$1 = this; + + var ranges = this.doc.sel.ranges, end = -1; + for (var i = 0; i < ranges.length; i++) { + var range$$1 = ranges[i]; + if (!range$$1.empty()) { + var from = range$$1.from(), to = range$$1.to(); + var start = Math.max(end, from.line); + end = Math.min(this$1.lastLine(), to.line - (to.ch ? 0 : 1)) + 1; + for (var j = start; j < end; ++j) + { indentLine(this$1, j, how); } + var newRanges = this$1.doc.sel.ranges; + if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0) + { replaceOneSelection(this$1.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll); } + } else if (range$$1.head.line > end) { + indentLine(this$1, range$$1.head.line, how, true); + end = range$$1.head.line; + if (i == this$1.doc.sel.primIndex) { ensureCursorVisible(this$1); } + } + } + }), + + // Fetch the parser token for a given character. Useful for hacks + // that want to inspect the mode state (say, for completion). + getTokenAt: function(pos, precise) { + return takeToken(this, pos, precise) + }, + + getLineTokens: function(line, precise) { + return takeToken(this, Pos(line), precise, true) + }, + + getTokenTypeAt: function(pos) { + pos = clipPos(this.doc, pos); + var styles = getLineStyles(this, getLine(this.doc, pos.line)); + var before = 0, after = (styles.length - 1) / 2, ch = pos.ch; + var type; + if (ch == 0) { type = styles[2]; } + else { for (;;) { + var mid = (before + after) >> 1; + if ((mid ? styles[mid * 2 - 1] : 0) >= ch) { after = mid; } + else if (styles[mid * 2 + 1] < ch) { before = mid + 1; } + else { type = styles[mid * 2 + 2]; break } + } } + var cut = type ? type.indexOf("overlay ") : -1; + return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1) + }, + + getModeAt: function(pos) { + var mode = this.doc.mode; + if (!mode.innerMode) { return mode } + return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode + }, + + getHelper: function(pos, type) { + return this.getHelpers(pos, type)[0] + }, + + getHelpers: function(pos, type) { + var this$1 = this; + + var found = []; + if (!helpers.hasOwnProperty(type)) { return found } + var help = helpers[type], mode = this.getModeAt(pos); + if (typeof mode[type] == "string") { + if (help[mode[type]]) { found.push(help[mode[type]]); } + } else if (mode[type]) { + for (var i = 0; i < mode[type].length; i++) { + var val = help[mode[type][i]]; + if (val) { found.push(val); } + } + } else if (mode.helperType && help[mode.helperType]) { + found.push(help[mode.helperType]); + } else if (help[mode.name]) { + found.push(help[mode.name]); + } + for (var i$1 = 0; i$1 < help._global.length; i$1++) { + var cur = help._global[i$1]; + if (cur.pred(mode, this$1) && indexOf(found, cur.val) == -1) + { found.push(cur.val); } + } + return found + }, + + getStateAfter: function(line, precise) { + var doc = this.doc; + line = clipLine(doc, line == null ? doc.first + doc.size - 1: line); + return getContextBefore(this, line + 1, precise).state + }, + + cursorCoords: function(start, mode) { + var pos, range$$1 = this.doc.sel.primary(); + if (start == null) { pos = range$$1.head; } + else if (typeof start == "object") { pos = clipPos(this.doc, start); } + else { pos = start ? range$$1.from() : range$$1.to(); } + return cursorCoords(this, pos, mode || "page") + }, + + charCoords: function(pos, mode) { + return charCoords(this, clipPos(this.doc, pos), mode || "page") + }, + + coordsChar: function(coords, mode) { + coords = fromCoordSystem(this, coords, mode || "page"); + return coordsChar(this, coords.left, coords.top) + }, + + lineAtHeight: function(height, mode) { + height = fromCoordSystem(this, {top: height, left: 0}, mode || "page").top; + return lineAtHeight(this.doc, height + this.display.viewOffset) + }, + heightAtLine: function(line, mode, includeWidgets) { + var end = false, lineObj; + if (typeof line == "number") { + var last = this.doc.first + this.doc.size - 1; + if (line < this.doc.first) { line = this.doc.first; } + else if (line > last) { line = last; end = true; } + lineObj = getLine(this.doc, line); + } else { + lineObj = line; + } + return intoCoordSystem(this, lineObj, {top: 0, left: 0}, mode || "page", includeWidgets || end).top + + (end ? this.doc.height - heightAtLine(lineObj) : 0) + }, + + defaultTextHeight: function() { return textHeight(this.display) }, + defaultCharWidth: function() { return charWidth(this.display) }, + + getViewport: function() { return {from: this.display.viewFrom, to: this.display.viewTo}}, + + addWidget: function(pos, node, scroll, vert, horiz) { + var display = this.display; + pos = cursorCoords(this, clipPos(this.doc, pos)); + var top = pos.bottom, left = pos.left; + node.style.position = "absolute"; + node.setAttribute("cm-ignore-events", "true"); + this.display.input.setUneditable(node); + display.sizer.appendChild(node); + if (vert == "over") { + top = pos.top; + } else if (vert == "above" || vert == "near") { + var vspace = Math.max(display.wrapper.clientHeight, this.doc.height), + hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth); + // Default to positioning above (if specified and possible); otherwise default to positioning below + if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight) + { top = pos.top - node.offsetHeight; } + else if (pos.bottom + node.offsetHeight <= vspace) + { top = pos.bottom; } + if (left + node.offsetWidth > hspace) + { left = hspace - node.offsetWidth; } + } + node.style.top = top + "px"; + node.style.left = node.style.right = ""; + if (horiz == "right") { + left = display.sizer.clientWidth - node.offsetWidth; + node.style.right = "0px"; + } else { + if (horiz == "left") { left = 0; } + else if (horiz == "middle") { left = (display.sizer.clientWidth - node.offsetWidth) / 2; } + node.style.left = left + "px"; + } + if (scroll) + { scrollIntoView(this, {left: left, top: top, right: left + node.offsetWidth, bottom: top + node.offsetHeight}); } + }, + + triggerOnKeyDown: methodOp(onKeyDown), + triggerOnKeyPress: methodOp(onKeyPress), + triggerOnKeyUp: onKeyUp, + triggerOnMouseDown: methodOp(onMouseDown), + + execCommand: function(cmd) { + if (commands.hasOwnProperty(cmd)) + { return commands[cmd].call(null, this) } + }, + + triggerElectric: methodOp(function(text) { triggerElectric(this, text); }), + + findPosH: function(from, amount, unit, visually) { + var this$1 = this; + + var dir = 1; + if (amount < 0) { dir = -1; amount = -amount; } + var cur = clipPos(this.doc, from); + for (var i = 0; i < amount; ++i) { + cur = findPosH(this$1.doc, cur, dir, unit, visually); + if (cur.hitSide) { break } + } + return cur + }, + + moveH: methodOp(function(dir, unit) { + var this$1 = this; + + this.extendSelectionsBy(function (range$$1) { + if (this$1.display.shift || this$1.doc.extend || range$$1.empty()) + { return findPosH(this$1.doc, range$$1.head, dir, unit, this$1.options.rtlMoveVisually) } + else + { return dir < 0 ? range$$1.from() : range$$1.to() } + }, sel_move); + }), + + deleteH: methodOp(function(dir, unit) { + var sel = this.doc.sel, doc = this.doc; + if (sel.somethingSelected()) + { doc.replaceSelection("", null, "+delete"); } + else + { deleteNearSelection(this, function (range$$1) { + var other = findPosH(doc, range$$1.head, dir, unit, false); + return dir < 0 ? {from: other, to: range$$1.head} : {from: range$$1.head, to: other} + }); } + }), + + findPosV: function(from, amount, unit, goalColumn) { + var this$1 = this; + + var dir = 1, x = goalColumn; + if (amount < 0) { dir = -1; amount = -amount; } + var cur = clipPos(this.doc, from); + for (var i = 0; i < amount; ++i) { + var coords = cursorCoords(this$1, cur, "div"); + if (x == null) { x = coords.left; } + else { coords.left = x; } + cur = findPosV(this$1, coords, dir, unit); + if (cur.hitSide) { break } + } + return cur + }, + + moveV: methodOp(function(dir, unit) { + var this$1 = this; + + var doc = this.doc, goals = []; + var collapse = !this.display.shift && !doc.extend && doc.sel.somethingSelected(); + doc.extendSelectionsBy(function (range$$1) { + if (collapse) + { return dir < 0 ? range$$1.from() : range$$1.to() } + var headPos = cursorCoords(this$1, range$$1.head, "div"); + if (range$$1.goalColumn != null) { headPos.left = range$$1.goalColumn; } + goals.push(headPos.left); + var pos = findPosV(this$1, headPos, dir, unit); + if (unit == "page" && range$$1 == doc.sel.primary()) + { addToScrollTop(this$1, charCoords(this$1, pos, "div").top - headPos.top); } + return pos + }, sel_move); + if (goals.length) { for (var i = 0; i < doc.sel.ranges.length; i++) + { doc.sel.ranges[i].goalColumn = goals[i]; } } + }), + + // Find the word at the given position (as returned by coordsChar). + findWordAt: function(pos) { + var doc = this.doc, line = getLine(doc, pos.line).text; + var start = pos.ch, end = pos.ch; + if (line) { + var helper = this.getHelper(pos, "wordChars"); + if ((pos.sticky == "before" || end == line.length) && start) { --start; } else { ++end; } + var startChar = line.charAt(start); + var check = isWordChar(startChar, helper) + ? function (ch) { return isWordChar(ch, helper); } + : /\s/.test(startChar) ? function (ch) { return /\s/.test(ch); } + : function (ch) { return (!/\s/.test(ch) && !isWordChar(ch)); }; + while (start > 0 && check(line.charAt(start - 1))) { --start; } + while (end < line.length && check(line.charAt(end))) { ++end; } + } + return new Range(Pos(pos.line, start), Pos(pos.line, end)) + }, + + toggleOverwrite: function(value) { + if (value != null && value == this.state.overwrite) { return } + if (this.state.overwrite = !this.state.overwrite) + { addClass(this.display.cursorDiv, "CodeMirror-overwrite"); } + else + { rmClass(this.display.cursorDiv, "CodeMirror-overwrite"); } + + signal(this, "overwriteToggle", this, this.state.overwrite); + }, + hasFocus: function() { return this.display.input.getField() == activeElt() }, + isReadOnly: function() { return !!(this.options.readOnly || this.doc.cantEdit) }, + + scrollTo: methodOp(function (x, y) { scrollToCoords(this, x, y); }), + getScrollInfo: function() { + var scroller = this.display.scroller; + return {left: scroller.scrollLeft, top: scroller.scrollTop, + height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight, + width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth, + clientHeight: displayHeight(this), clientWidth: displayWidth(this)} + }, + + scrollIntoView: methodOp(function(range$$1, margin) { + if (range$$1 == null) { + range$$1 = {from: this.doc.sel.primary().head, to: null}; + if (margin == null) { margin = this.options.cursorScrollMargin; } + } else if (typeof range$$1 == "number") { + range$$1 = {from: Pos(range$$1, 0), to: null}; + } else if (range$$1.from == null) { + range$$1 = {from: range$$1, to: null}; + } + if (!range$$1.to) { range$$1.to = range$$1.from; } + range$$1.margin = margin || 0; + + if (range$$1.from.line != null) { + scrollToRange(this, range$$1); + } else { + scrollToCoordsRange(this, range$$1.from, range$$1.to, range$$1.margin); + } + }), + + setSize: methodOp(function(width, height) { + var this$1 = this; + + var interpret = function (val) { return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val; }; + if (width != null) { this.display.wrapper.style.width = interpret(width); } + if (height != null) { this.display.wrapper.style.height = interpret(height); } + if (this.options.lineWrapping) { clearLineMeasurementCache(this); } + var lineNo$$1 = this.display.viewFrom; + this.doc.iter(lineNo$$1, this.display.viewTo, function (line) { + if (line.widgets) { for (var i = 0; i < line.widgets.length; i++) + { if (line.widgets[i].noHScroll) { regLineChange(this$1, lineNo$$1, "widget"); break } } } + ++lineNo$$1; + }); + this.curOp.forceUpdate = true; + signal(this, "refresh", this); + }), + + operation: function(f){return runInOp(this, f)}, + startOperation: function(){return startOperation(this)}, + endOperation: function(){return endOperation(this)}, + + refresh: methodOp(function() { + var oldHeight = this.display.cachedTextHeight; + regChange(this); + this.curOp.forceUpdate = true; + clearCaches(this); + scrollToCoords(this, this.doc.scrollLeft, this.doc.scrollTop); + updateGutterSpace(this.display); + if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5) + { estimateLineHeights(this); } + signal(this, "refresh", this); + }), + + swapDoc: methodOp(function(doc) { + var old = this.doc; + old.cm = null; + // Cancel the current text selection if any (#5821) + if (this.state.selectingText) { this.state.selectingText(); } + attachDoc(this, doc); + clearCaches(this); + this.display.input.reset(); + scrollToCoords(this, doc.scrollLeft, doc.scrollTop); + this.curOp.forceScroll = true; + signalLater(this, "swapDoc", this, old); + return old + }), + + phrase: function(phraseText) { + var phrases = this.options.phrases; + return phrases && Object.prototype.hasOwnProperty.call(phrases, phraseText) ? phrases[phraseText] : phraseText + }, + + getInputField: function(){return this.display.input.getField()}, + getWrapperElement: function(){return this.display.wrapper}, + getScrollerElement: function(){return this.display.scroller}, + getGutterElement: function(){return this.display.gutters} + }; + eventMixin(CodeMirror); + + CodeMirror.registerHelper = function(type, name, value) { + if (!helpers.hasOwnProperty(type)) { helpers[type] = CodeMirror[type] = {_global: []}; } + helpers[type][name] = value; + }; + CodeMirror.registerGlobalHelper = function(type, name, predicate, value) { + CodeMirror.registerHelper(type, name, value); + helpers[type]._global.push({pred: predicate, val: value}); + }; + } + + // Used for horizontal relative motion. Dir is -1 or 1 (left or + // right), unit can be "char", "column" (like char, but doesn't + // cross line boundaries), "word" (across next word), or "group" (to + // the start of next group of word or non-word-non-whitespace + // chars). The visually param controls whether, in right-to-left + // text, direction 1 means to move towards the next index in the + // string, or towards the character to the right of the current + // position. The resulting position will have a hitSide=true + // property if it reached the end of the document. + function findPosH(doc, pos, dir, unit, visually) { + var oldPos = pos; + var origDir = dir; + var lineObj = getLine(doc, pos.line); + function findNextLine() { + var l = pos.line + dir; + if (l < doc.first || l >= doc.first + doc.size) { return false } + pos = new Pos(l, pos.ch, pos.sticky); + return lineObj = getLine(doc, l) + } + function moveOnce(boundToLine) { + var next; + if (visually) { + next = moveVisually(doc.cm, lineObj, pos, dir); + } else { + next = moveLogically(lineObj, pos, dir); + } + if (next == null) { + if (!boundToLine && findNextLine()) + { pos = endOfLine(visually, doc.cm, lineObj, pos.line, dir); } + else + { return false } + } else { + pos = next; + } + return true + } + + if (unit == "char") { + moveOnce(); + } else if (unit == "column") { + moveOnce(true); + } else if (unit == "word" || unit == "group") { + var sawType = null, group = unit == "group"; + var helper = doc.cm && doc.cm.getHelper(pos, "wordChars"); + for (var first = true;; first = false) { + if (dir < 0 && !moveOnce(!first)) { break } + var cur = lineObj.text.charAt(pos.ch) || "\n"; + var type = isWordChar(cur, helper) ? "w" + : group && cur == "\n" ? "n" + : !group || /\s/.test(cur) ? null + : "p"; + if (group && !first && !type) { type = "s"; } + if (sawType && sawType != type) { + if (dir < 0) {dir = 1; moveOnce(); pos.sticky = "after";} + break + } + + if (type) { sawType = type; } + if (dir > 0 && !moveOnce(!first)) { break } + } + } + var result = skipAtomic(doc, pos, oldPos, origDir, true); + if (equalCursorPos(oldPos, result)) { result.hitSide = true; } + return result + } + + // For relative vertical movement. Dir may be -1 or 1. Unit can be + // "page" or "line". The resulting position will have a hitSide=true + // property if it reached the end of the document. + function findPosV(cm, pos, dir, unit) { + var doc = cm.doc, x = pos.left, y; + if (unit == "page") { + var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight); + var moveAmount = Math.max(pageSize - .5 * textHeight(cm.display), 3); + y = (dir > 0 ? pos.bottom : pos.top) + dir * moveAmount; + + } else if (unit == "line") { + y = dir > 0 ? pos.bottom + 3 : pos.top - 3; + } + var target; + for (;;) { + target = coordsChar(cm, x, y); + if (!target.outside) { break } + if (dir < 0 ? y <= 0 : y >= doc.height) { target.hitSide = true; break } + y += dir * 5; + } + return target + } + + // CONTENTEDITABLE INPUT STYLE + + var ContentEditableInput = function(cm) { + this.cm = cm; + this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null; + this.polling = new Delayed(); + this.composing = null; + this.gracePeriod = false; + this.readDOMTimeout = null; + }; + + ContentEditableInput.prototype.init = function (display) { + var this$1 = this; + + var input = this, cm = input.cm; + var div = input.div = display.lineDiv; + disableBrowserMagic(div, cm.options.spellcheck, cm.options.autocorrect, cm.options.autocapitalize); + + on(div, "paste", function (e) { + if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { return } + // IE doesn't fire input events, so we schedule a read for the pasted content in this way + if (ie_version <= 11) { setTimeout(operation(cm, function () { return this$1.updateFromDOM(); }), 20); } + }); + + on(div, "compositionstart", function (e) { + this$1.composing = {data: e.data, done: false}; + }); + on(div, "compositionupdate", function (e) { + if (!this$1.composing) { this$1.composing = {data: e.data, done: false}; } + }); + on(div, "compositionend", function (e) { + if (this$1.composing) { + if (e.data != this$1.composing.data) { this$1.readFromDOMSoon(); } + this$1.composing.done = true; + } + }); + + on(div, "touchstart", function () { return input.forceCompositionEnd(); }); + + on(div, "input", function () { + if (!this$1.composing) { this$1.readFromDOMSoon(); } + }); + + function onCopyCut(e) { + if (signalDOMEvent(cm, e)) { return } + if (cm.somethingSelected()) { + setLastCopied({lineWise: false, text: cm.getSelections()}); + if (e.type == "cut") { cm.replaceSelection("", null, "cut"); } + } else if (!cm.options.lineWiseCopyCut) { + return + } else { + var ranges = copyableRanges(cm); + setLastCopied({lineWise: true, text: ranges.text}); + if (e.type == "cut") { + cm.operation(function () { + cm.setSelections(ranges.ranges, 0, sel_dontScroll); + cm.replaceSelection("", null, "cut"); + }); + } + } + if (e.clipboardData) { + e.clipboardData.clearData(); + var content = lastCopied.text.join("\n"); + // iOS exposes the clipboard API, but seems to discard content inserted into it + e.clipboardData.setData("Text", content); + if (e.clipboardData.getData("Text") == content) { + e.preventDefault(); + return + } + } + // Old-fashioned briefly-focus-a-textarea hack + var kludge = hiddenTextarea(), te = kludge.firstChild; + cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild); + te.value = lastCopied.text.join("\n"); + var hadFocus = document.activeElement; + selectInput(te); + setTimeout(function () { + cm.display.lineSpace.removeChild(kludge); + hadFocus.focus(); + if (hadFocus == div) { input.showPrimarySelection(); } + }, 50); + } + on(div, "copy", onCopyCut); + on(div, "cut", onCopyCut); + }; + + ContentEditableInput.prototype.prepareSelection = function () { + var result = prepareSelection(this.cm, false); + result.focus = this.cm.state.focused; + return result + }; + + ContentEditableInput.prototype.showSelection = function (info, takeFocus) { + if (!info || !this.cm.display.view.length) { return } + if (info.focus || takeFocus) { this.showPrimarySelection(); } + this.showMultipleSelections(info); + }; + + ContentEditableInput.prototype.getSelection = function () { + return this.cm.display.wrapper.ownerDocument.getSelection() + }; + + ContentEditableInput.prototype.showPrimarySelection = function () { + var sel = this.getSelection(), cm = this.cm, prim = cm.doc.sel.primary(); + var from = prim.from(), to = prim.to(); + + if (cm.display.viewTo == cm.display.viewFrom || from.line >= cm.display.viewTo || to.line < cm.display.viewFrom) { + sel.removeAllRanges(); + return + } + + var curAnchor = domToPos(cm, sel.anchorNode, sel.anchorOffset); + var curFocus = domToPos(cm, sel.focusNode, sel.focusOffset); + if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad && + cmp(minPos(curAnchor, curFocus), from) == 0 && + cmp(maxPos(curAnchor, curFocus), to) == 0) + { return } + + var view = cm.display.view; + var start = (from.line >= cm.display.viewFrom && posToDOM(cm, from)) || + {node: view[0].measure.map[2], offset: 0}; + var end = to.line < cm.display.viewTo && posToDOM(cm, to); + if (!end) { + var measure = view[view.length - 1].measure; + var map$$1 = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map; + end = {node: map$$1[map$$1.length - 1], offset: map$$1[map$$1.length - 2] - map$$1[map$$1.length - 3]}; + } + + if (!start || !end) { + sel.removeAllRanges(); + return + } + + var old = sel.rangeCount && sel.getRangeAt(0), rng; + try { rng = range(start.node, start.offset, end.offset, end.node); } + catch(e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible + if (rng) { + if (!gecko && cm.state.focused) { + sel.collapse(start.node, start.offset); + if (!rng.collapsed) { + sel.removeAllRanges(); + sel.addRange(rng); + } + } else { + sel.removeAllRanges(); + sel.addRange(rng); + } + if (old && sel.anchorNode == null) { sel.addRange(old); } + else if (gecko) { this.startGracePeriod(); } + } + this.rememberSelection(); + }; + + ContentEditableInput.prototype.startGracePeriod = function () { + var this$1 = this; + + clearTimeout(this.gracePeriod); + this.gracePeriod = setTimeout(function () { + this$1.gracePeriod = false; + if (this$1.selectionChanged()) + { this$1.cm.operation(function () { return this$1.cm.curOp.selectionChanged = true; }); } + }, 20); + }; + + ContentEditableInput.prototype.showMultipleSelections = function (info) { + removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors); + removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection); + }; + + ContentEditableInput.prototype.rememberSelection = function () { + var sel = this.getSelection(); + this.lastAnchorNode = sel.anchorNode; this.lastAnchorOffset = sel.anchorOffset; + this.lastFocusNode = sel.focusNode; this.lastFocusOffset = sel.focusOffset; + }; + + ContentEditableInput.prototype.selectionInEditor = function () { + var sel = this.getSelection(); + if (!sel.rangeCount) { return false } + var node = sel.getRangeAt(0).commonAncestorContainer; + return contains(this.div, node) + }; + + ContentEditableInput.prototype.focus = function () { + if (this.cm.options.readOnly != "nocursor") { + if (!this.selectionInEditor()) + { this.showSelection(this.prepareSelection(), true); } + this.div.focus(); + } + }; + ContentEditableInput.prototype.blur = function () { this.div.blur(); }; + ContentEditableInput.prototype.getField = function () { return this.div }; + + ContentEditableInput.prototype.supportsTouch = function () { return true }; + + ContentEditableInput.prototype.receivedFocus = function () { + var input = this; + if (this.selectionInEditor()) + { this.pollSelection(); } + else + { runInOp(this.cm, function () { return input.cm.curOp.selectionChanged = true; }); } + + function poll() { + if (input.cm.state.focused) { + input.pollSelection(); + input.polling.set(input.cm.options.pollInterval, poll); + } + } + this.polling.set(this.cm.options.pollInterval, poll); + }; + + ContentEditableInput.prototype.selectionChanged = function () { + var sel = this.getSelection(); + return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset || + sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset + }; + + ContentEditableInput.prototype.pollSelection = function () { + if (this.readDOMTimeout != null || this.gracePeriod || !this.selectionChanged()) { return } + var sel = this.getSelection(), cm = this.cm; + // On Android Chrome (version 56, at least), backspacing into an + // uneditable block element will put the cursor in that element, + // and then, because it's not editable, hide the virtual keyboard. + // Because Android doesn't allow us to actually detect backspace + // presses in a sane way, this code checks for when that happens + // and simulates a backspace press in this case. + if (android && chrome && this.cm.display.gutterSpecs.length && isInGutter(sel.anchorNode)) { + this.cm.triggerOnKeyDown({type: "keydown", keyCode: 8, preventDefault: Math.abs}); + this.blur(); + this.focus(); + return + } + if (this.composing) { return } + this.rememberSelection(); + var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset); + var head = domToPos(cm, sel.focusNode, sel.focusOffset); + if (anchor && head) { runInOp(cm, function () { + setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll); + if (anchor.bad || head.bad) { cm.curOp.selectionChanged = true; } + }); } + }; + + ContentEditableInput.prototype.pollContent = function () { + if (this.readDOMTimeout != null) { + clearTimeout(this.readDOMTimeout); + this.readDOMTimeout = null; + } + + var cm = this.cm, display = cm.display, sel = cm.doc.sel.primary(); + var from = sel.from(), to = sel.to(); + if (from.ch == 0 && from.line > cm.firstLine()) + { from = Pos(from.line - 1, getLine(cm.doc, from.line - 1).length); } + if (to.ch == getLine(cm.doc, to.line).text.length && to.line < cm.lastLine()) + { to = Pos(to.line + 1, 0); } + if (from.line < display.viewFrom || to.line > display.viewTo - 1) { return false } + + var fromIndex, fromLine, fromNode; + if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) { + fromLine = lineNo(display.view[0].line); + fromNode = display.view[0].node; + } else { + fromLine = lineNo(display.view[fromIndex].line); + fromNode = display.view[fromIndex - 1].node.nextSibling; + } + var toIndex = findViewIndex(cm, to.line); + var toLine, toNode; + if (toIndex == display.view.length - 1) { + toLine = display.viewTo - 1; + toNode = display.lineDiv.lastChild; + } else { + toLine = lineNo(display.view[toIndex + 1].line) - 1; + toNode = display.view[toIndex + 1].node.previousSibling; + } + + if (!fromNode) { return false } + var newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine)); + var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length)); + while (newText.length > 1 && oldText.length > 1) { + if (lst(newText) == lst(oldText)) { newText.pop(); oldText.pop(); toLine--; } + else if (newText[0] == oldText[0]) { newText.shift(); oldText.shift(); fromLine++; } + else { break } + } + + var cutFront = 0, cutEnd = 0; + var newTop = newText[0], oldTop = oldText[0], maxCutFront = Math.min(newTop.length, oldTop.length); + while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront)) + { ++cutFront; } + var newBot = lst(newText), oldBot = lst(oldText); + var maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0), + oldBot.length - (oldText.length == 1 ? cutFront : 0)); + while (cutEnd < maxCutEnd && + newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) + { ++cutEnd; } + // Try to move start of change to start of selection if ambiguous + if (newText.length == 1 && oldText.length == 1 && fromLine == from.line) { + while (cutFront && cutFront > from.ch && + newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) { + cutFront--; + cutEnd++; + } + } + + newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd).replace(/^\u200b+/, ""); + newText[0] = newText[0].slice(cutFront).replace(/\u200b+$/, ""); + + var chFrom = Pos(fromLine, cutFront); + var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0); + if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) { + replaceRange(cm.doc, newText, chFrom, chTo, "+input"); + return true + } + }; + + ContentEditableInput.prototype.ensurePolled = function () { + this.forceCompositionEnd(); + }; + ContentEditableInput.prototype.reset = function () { + this.forceCompositionEnd(); + }; + ContentEditableInput.prototype.forceCompositionEnd = function () { + if (!this.composing) { return } + clearTimeout(this.readDOMTimeout); + this.composing = null; + this.updateFromDOM(); + this.div.blur(); + this.div.focus(); + }; + ContentEditableInput.prototype.readFromDOMSoon = function () { + var this$1 = this; + + if (this.readDOMTimeout != null) { return } + this.readDOMTimeout = setTimeout(function () { + this$1.readDOMTimeout = null; + if (this$1.composing) { + if (this$1.composing.done) { this$1.composing = null; } + else { return } + } + this$1.updateFromDOM(); + }, 80); + }; + + ContentEditableInput.prototype.updateFromDOM = function () { + var this$1 = this; + + if (this.cm.isReadOnly() || !this.pollContent()) + { runInOp(this.cm, function () { return regChange(this$1.cm); }); } + }; + + ContentEditableInput.prototype.setUneditable = function (node) { + node.contentEditable = "false"; + }; + + ContentEditableInput.prototype.onKeyPress = function (e) { + if (e.charCode == 0 || this.composing) { return } + e.preventDefault(); + if (!this.cm.isReadOnly()) + { operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0); } + }; + + ContentEditableInput.prototype.readOnlyChanged = function (val) { + this.div.contentEditable = String(val != "nocursor"); + }; + + ContentEditableInput.prototype.onContextMenu = function () {}; + ContentEditableInput.prototype.resetPosition = function () {}; + + ContentEditableInput.prototype.needsContentAttribute = true; + + function posToDOM(cm, pos) { + var view = findViewForLine(cm, pos.line); + if (!view || view.hidden) { return null } + var line = getLine(cm.doc, pos.line); + var info = mapFromLineView(view, line, pos.line); + + var order = getOrder(line, cm.doc.direction), side = "left"; + if (order) { + var partPos = getBidiPartAt(order, pos.ch); + side = partPos % 2 ? "right" : "left"; + } + var result = nodeAndOffsetInLineMap(info.map, pos.ch, side); + result.offset = result.collapse == "right" ? result.end : result.start; + return result + } + + function isInGutter(node) { + for (var scan = node; scan; scan = scan.parentNode) + { if (/CodeMirror-gutter-wrapper/.test(scan.className)) { return true } } + return false + } + + function badPos(pos, bad) { if (bad) { pos.bad = true; } return pos } + + function domTextBetween(cm, from, to, fromLine, toLine) { + var text = "", closing = false, lineSep = cm.doc.lineSeparator(), extraLinebreak = false; + function recognizeMarker(id) { return function (marker) { return marker.id == id; } } + function close() { + if (closing) { + text += lineSep; + if (extraLinebreak) { text += lineSep; } + closing = extraLinebreak = false; + } + } + function addText(str) { + if (str) { + close(); + text += str; + } + } + function walk(node) { + if (node.nodeType == 1) { + var cmText = node.getAttribute("cm-text"); + if (cmText) { + addText(cmText); + return + } + var markerID = node.getAttribute("cm-marker"), range$$1; + if (markerID) { + var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID)); + if (found.length && (range$$1 = found[0].find(0))) + { addText(getBetween(cm.doc, range$$1.from, range$$1.to).join(lineSep)); } + return + } + if (node.getAttribute("contenteditable") == "false") { return } + var isBlock = /^(pre|div|p|li|table|br)$/i.test(node.nodeName); + if (!/^br$/i.test(node.nodeName) && node.textContent.length == 0) { return } + + if (isBlock) { close(); } + for (var i = 0; i < node.childNodes.length; i++) + { walk(node.childNodes[i]); } + + if (/^(pre|p)$/i.test(node.nodeName)) { extraLinebreak = true; } + if (isBlock) { closing = true; } + } else if (node.nodeType == 3) { + addText(node.nodeValue.replace(/\u200b/g, "").replace(/\u00a0/g, " ")); + } + } + for (;;) { + walk(from); + if (from == to) { break } + from = from.nextSibling; + extraLinebreak = false; + } + return text + } + + function domToPos(cm, node, offset) { + var lineNode; + if (node == cm.display.lineDiv) { + lineNode = cm.display.lineDiv.childNodes[offset]; + if (!lineNode) { return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true) } + node = null; offset = 0; + } else { + for (lineNode = node;; lineNode = lineNode.parentNode) { + if (!lineNode || lineNode == cm.display.lineDiv) { return null } + if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) { break } + } + } + for (var i = 0; i < cm.display.view.length; i++) { + var lineView = cm.display.view[i]; + if (lineView.node == lineNode) + { return locateNodeInLineView(lineView, node, offset) } + } + } + + function locateNodeInLineView(lineView, node, offset) { + var wrapper = lineView.text.firstChild, bad = false; + if (!node || !contains(wrapper, node)) { return badPos(Pos(lineNo(lineView.line), 0), true) } + if (node == wrapper) { + bad = true; + node = wrapper.childNodes[offset]; + offset = 0; + if (!node) { + var line = lineView.rest ? lst(lineView.rest) : lineView.line; + return badPos(Pos(lineNo(line), line.text.length), bad) + } + } + + var textNode = node.nodeType == 3 ? node : null, topNode = node; + if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) { + textNode = node.firstChild; + if (offset) { offset = textNode.nodeValue.length; } + } + while (topNode.parentNode != wrapper) { topNode = topNode.parentNode; } + var measure = lineView.measure, maps = measure.maps; + + function find(textNode, topNode, offset) { + for (var i = -1; i < (maps ? maps.length : 0); i++) { + var map$$1 = i < 0 ? measure.map : maps[i]; + for (var j = 0; j < map$$1.length; j += 3) { + var curNode = map$$1[j + 2]; + if (curNode == textNode || curNode == topNode) { + var line = lineNo(i < 0 ? lineView.line : lineView.rest[i]); + var ch = map$$1[j] + offset; + if (offset < 0 || curNode != textNode) { ch = map$$1[j + (offset ? 1 : 0)]; } + return Pos(line, ch) + } + } + } + } + var found = find(textNode, topNode, offset); + if (found) { return badPos(found, bad) } + + // FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems + for (var after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) { + found = find(after, after.firstChild, 0); + if (found) + { return badPos(Pos(found.line, found.ch - dist), bad) } + else + { dist += after.textContent.length; } + } + for (var before = topNode.previousSibling, dist$1 = offset; before; before = before.previousSibling) { + found = find(before, before.firstChild, -1); + if (found) + { return badPos(Pos(found.line, found.ch + dist$1), bad) } + else + { dist$1 += before.textContent.length; } + } + } + + // TEXTAREA INPUT STYLE + + var TextareaInput = function(cm) { + this.cm = cm; + // See input.poll and input.reset + this.prevInput = ""; + + // Flag that indicates whether we expect input to appear real soon + // now (after some event like 'keypress' or 'input') and are + // polling intensively. + this.pollingFast = false; + // Self-resetting timeout for the poller + this.polling = new Delayed(); + // Used to work around IE issue with selection being forgotten when focus moves away from textarea + this.hasSelection = false; + this.composing = null; + }; + + TextareaInput.prototype.init = function (display) { + var this$1 = this; + + var input = this, cm = this.cm; + this.createField(display); + var te = this.textarea; + + display.wrapper.insertBefore(this.wrapper, display.wrapper.firstChild); + + // Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore) + if (ios) { te.style.width = "0px"; } + + on(te, "input", function () { + if (ie && ie_version >= 9 && this$1.hasSelection) { this$1.hasSelection = null; } + input.poll(); + }); + + on(te, "paste", function (e) { + if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { return } + + cm.state.pasteIncoming = +new Date; + input.fastPoll(); + }); + + function prepareCopyCut(e) { + if (signalDOMEvent(cm, e)) { return } + if (cm.somethingSelected()) { + setLastCopied({lineWise: false, text: cm.getSelections()}); + } else if (!cm.options.lineWiseCopyCut) { + return + } else { + var ranges = copyableRanges(cm); + setLastCopied({lineWise: true, text: ranges.text}); + if (e.type == "cut") { + cm.setSelections(ranges.ranges, null, sel_dontScroll); + } else { + input.prevInput = ""; + te.value = ranges.text.join("\n"); + selectInput(te); + } + } + if (e.type == "cut") { cm.state.cutIncoming = +new Date; } + } + on(te, "cut", prepareCopyCut); + on(te, "copy", prepareCopyCut); + + on(display.scroller, "paste", function (e) { + if (eventInWidget(display, e) || signalDOMEvent(cm, e)) { return } + if (!te.dispatchEvent) { + cm.state.pasteIncoming = +new Date; + input.focus(); + return + } + + // Pass the `paste` event to the textarea so it's handled by its event listener. + var event = new Event("paste"); + event.clipboardData = e.clipboardData; + te.dispatchEvent(event); + }); + + // Prevent normal selection in the editor (we handle our own) + on(display.lineSpace, "selectstart", function (e) { + if (!eventInWidget(display, e)) { e_preventDefault(e); } + }); + + on(te, "compositionstart", function () { + var start = cm.getCursor("from"); + if (input.composing) { input.composing.range.clear(); } + input.composing = { + start: start, + range: cm.markText(start, cm.getCursor("to"), {className: "CodeMirror-composing"}) + }; + }); + on(te, "compositionend", function () { + if (input.composing) { + input.poll(); + input.composing.range.clear(); + input.composing = null; + } + }); + }; + + TextareaInput.prototype.createField = function (_display) { + // Wraps and hides input textarea + this.wrapper = hiddenTextarea(); + // The semihidden textarea that is focused when the editor is + // focused, and receives input. + this.textarea = this.wrapper.firstChild; + }; + + TextareaInput.prototype.prepareSelection = function () { + // Redraw the selection and/or cursor + var cm = this.cm, display = cm.display, doc = cm.doc; + var result = prepareSelection(cm); + + // Move the hidden textarea near the cursor to prevent scrolling artifacts + if (cm.options.moveInputWithCursor) { + var headPos = cursorCoords(cm, doc.sel.primary().head, "div"); + var wrapOff = display.wrapper.getBoundingClientRect(), lineOff = display.lineDiv.getBoundingClientRect(); + result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10, + headPos.top + lineOff.top - wrapOff.top)); + result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10, + headPos.left + lineOff.left - wrapOff.left)); + } + + return result + }; + + TextareaInput.prototype.showSelection = function (drawn) { + var cm = this.cm, display = cm.display; + removeChildrenAndAdd(display.cursorDiv, drawn.cursors); + removeChildrenAndAdd(display.selectionDiv, drawn.selection); + if (drawn.teTop != null) { + this.wrapper.style.top = drawn.teTop + "px"; + this.wrapper.style.left = drawn.teLeft + "px"; + } + }; + + // Reset the input to correspond to the selection (or to be empty, + // when not typing and nothing is selected) + TextareaInput.prototype.reset = function (typing) { + if (this.contextMenuPending || this.composing) { return } + var cm = this.cm; + if (cm.somethingSelected()) { + this.prevInput = ""; + var content = cm.getSelection(); + this.textarea.value = content; + if (cm.state.focused) { selectInput(this.textarea); } + if (ie && ie_version >= 9) { this.hasSelection = content; } + } else if (!typing) { + this.prevInput = this.textarea.value = ""; + if (ie && ie_version >= 9) { this.hasSelection = null; } + } + }; + + TextareaInput.prototype.getField = function () { return this.textarea }; + + TextareaInput.prototype.supportsTouch = function () { return false }; + + TextareaInput.prototype.focus = function () { + if (this.cm.options.readOnly != "nocursor" && (!mobile || activeElt() != this.textarea)) { + try { this.textarea.focus(); } + catch (e) {} // IE8 will throw if the textarea is display: none or not in DOM + } + }; + + TextareaInput.prototype.blur = function () { this.textarea.blur(); }; + + TextareaInput.prototype.resetPosition = function () { + this.wrapper.style.top = this.wrapper.style.left = 0; + }; + + TextareaInput.prototype.receivedFocus = function () { this.slowPoll(); }; + + // Poll for input changes, using the normal rate of polling. This + // runs as long as the editor is focused. + TextareaInput.prototype.slowPoll = function () { + var this$1 = this; + + if (this.pollingFast) { return } + this.polling.set(this.cm.options.pollInterval, function () { + this$1.poll(); + if (this$1.cm.state.focused) { this$1.slowPoll(); } + }); + }; + + // When an event has just come in that is likely to add or change + // something in the input textarea, we poll faster, to ensure that + // the change appears on the screen quickly. + TextareaInput.prototype.fastPoll = function () { + var missed = false, input = this; + input.pollingFast = true; + function p() { + var changed = input.poll(); + if (!changed && !missed) {missed = true; input.polling.set(60, p);} + else {input.pollingFast = false; input.slowPoll();} + } + input.polling.set(20, p); + }; + + // Read input from the textarea, and update the document to match. + // When something is selected, it is present in the textarea, and + // selected (unless it is huge, in which case a placeholder is + // used). When nothing is selected, the cursor sits after previously + // seen text (can be empty), which is stored in prevInput (we must + // not reset the textarea when typing, because that breaks IME). + TextareaInput.prototype.poll = function () { + var this$1 = this; + + var cm = this.cm, input = this.textarea, prevInput = this.prevInput; + // Since this is called a *lot*, try to bail out as cheaply as + // possible when it is clear that nothing happened. hasSelection + // will be the case when there is a lot of text in the textarea, + // in which case reading its value would be expensive. + if (this.contextMenuPending || !cm.state.focused || + (hasSelection(input) && !prevInput && !this.composing) || + cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq) + { return false } + + var text = input.value; + // If nothing changed, bail. + if (text == prevInput && !cm.somethingSelected()) { return false } + // Work around nonsensical selection resetting in IE9/10, and + // inexplicable appearance of private area unicode characters on + // some key combos in Mac (#2689). + if (ie && ie_version >= 9 && this.hasSelection === text || + mac && /[\uf700-\uf7ff]/.test(text)) { + cm.display.input.reset(); + return false + } + + if (cm.doc.sel == cm.display.selForContextMenu) { + var first = text.charCodeAt(0); + if (first == 0x200b && !prevInput) { prevInput = "\u200b"; } + if (first == 0x21da) { this.reset(); return this.cm.execCommand("undo") } + } + // Find the part of the input that is actually new + var same = 0, l = Math.min(prevInput.length, text.length); + while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) { ++same; } + + runInOp(cm, function () { + applyTextInput(cm, text.slice(same), prevInput.length - same, + null, this$1.composing ? "*compose" : null); + + // Don't leave long text in the textarea, since it makes further polling slow + if (text.length > 1000 || text.indexOf("\n") > -1) { input.value = this$1.prevInput = ""; } + else { this$1.prevInput = text; } + + if (this$1.composing) { + this$1.composing.range.clear(); + this$1.composing.range = cm.markText(this$1.composing.start, cm.getCursor("to"), + {className: "CodeMirror-composing"}); + } + }); + return true + }; + + TextareaInput.prototype.ensurePolled = function () { + if (this.pollingFast && this.poll()) { this.pollingFast = false; } + }; + + TextareaInput.prototype.onKeyPress = function () { + if (ie && ie_version >= 9) { this.hasSelection = null; } + this.fastPoll(); + }; + + TextareaInput.prototype.onContextMenu = function (e) { + var input = this, cm = input.cm, display = cm.display, te = input.textarea; + if (input.contextMenuPending) { input.contextMenuPending(); } + var pos = posFromMouse(cm, e), scrollPos = display.scroller.scrollTop; + if (!pos || presto) { return } // Opera is difficult. + + // Reset the current text selection only if the click is done outside of the selection + // and 'resetSelectionOnContextMenu' option is true. + var reset = cm.options.resetSelectionOnContextMenu; + if (reset && cm.doc.sel.contains(pos) == -1) + { operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll); } + + var oldCSS = te.style.cssText, oldWrapperCSS = input.wrapper.style.cssText; + var wrapperBox = input.wrapper.offsetParent.getBoundingClientRect(); + input.wrapper.style.cssText = "position: static"; + te.style.cssText = "position: absolute; width: 30px; height: 30px;\n top: " + (e.clientY - wrapperBox.top - 5) + "px; left: " + (e.clientX - wrapperBox.left - 5) + "px;\n z-index: 1000; background: " + (ie ? "rgba(255, 255, 255, .05)" : "transparent") + ";\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);"; + var oldScrollY; + if (webkit) { oldScrollY = window.scrollY; } // Work around Chrome issue (#2712) + display.input.focus(); + if (webkit) { window.scrollTo(null, oldScrollY); } + display.input.reset(); + // Adds "Select all" to context menu in FF + if (!cm.somethingSelected()) { te.value = input.prevInput = " "; } + input.contextMenuPending = rehide; + display.selForContextMenu = cm.doc.sel; + clearTimeout(display.detectingSelectAll); + + // Select-all will be greyed out if there's nothing to select, so + // this adds a zero-width space so that we can later check whether + // it got selected. + function prepareSelectAllHack() { + if (te.selectionStart != null) { + var selected = cm.somethingSelected(); + var extval = "\u200b" + (selected ? te.value : ""); + te.value = "\u21da"; // Used to catch context-menu undo + te.value = extval; + input.prevInput = selected ? "" : "\u200b"; + te.selectionStart = 1; te.selectionEnd = extval.length; + // Re-set this, in case some other handler touched the + // selection in the meantime. + display.selForContextMenu = cm.doc.sel; + } + } + function rehide() { + if (input.contextMenuPending != rehide) { return } + input.contextMenuPending = false; + input.wrapper.style.cssText = oldWrapperCSS; + te.style.cssText = oldCSS; + if (ie && ie_version < 9) { display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos); } + + // Try to detect the user choosing select-all + if (te.selectionStart != null) { + if (!ie || (ie && ie_version < 9)) { prepareSelectAllHack(); } + var i = 0, poll = function () { + if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 && + te.selectionEnd > 0 && input.prevInput == "\u200b") { + operation(cm, selectAll)(cm); + } else if (i++ < 10) { + display.detectingSelectAll = setTimeout(poll, 500); + } else { + display.selForContextMenu = null; + display.input.reset(); + } + }; + display.detectingSelectAll = setTimeout(poll, 200); + } + } + + if (ie && ie_version >= 9) { prepareSelectAllHack(); } + if (captureRightClick) { + e_stop(e); + var mouseup = function () { + off(window, "mouseup", mouseup); + setTimeout(rehide, 20); + }; + on(window, "mouseup", mouseup); + } else { + setTimeout(rehide, 50); + } + }; + + TextareaInput.prototype.readOnlyChanged = function (val) { + if (!val) { this.reset(); } + this.textarea.disabled = val == "nocursor"; + }; + + TextareaInput.prototype.setUneditable = function () {}; + + TextareaInput.prototype.needsContentAttribute = false; + + function fromTextArea(textarea, options) { + options = options ? copyObj(options) : {}; + options.value = textarea.value; + if (!options.tabindex && textarea.tabIndex) + { options.tabindex = textarea.tabIndex; } + if (!options.placeholder && textarea.placeholder) + { options.placeholder = textarea.placeholder; } + // Set autofocus to true if this textarea is focused, or if it has + // autofocus and no other element is focused. + if (options.autofocus == null) { + var hasFocus = activeElt(); + options.autofocus = hasFocus == textarea || + textarea.getAttribute("autofocus") != null && hasFocus == document.body; + } + + function save() {textarea.value = cm.getValue();} + + var realSubmit; + if (textarea.form) { + on(textarea.form, "submit", save); + // Deplorable hack to make the submit method do the right thing. + if (!options.leaveSubmitMethodAlone) { + var form = textarea.form; + realSubmit = form.submit; + try { + var wrappedSubmit = form.submit = function () { + save(); + form.submit = realSubmit; + form.submit(); + form.submit = wrappedSubmit; + }; + } catch(e) {} + } + } + + options.finishInit = function (cm) { + cm.save = save; + cm.getTextArea = function () { return textarea; }; + cm.toTextArea = function () { + cm.toTextArea = isNaN; // Prevent this from being ran twice + save(); + textarea.parentNode.removeChild(cm.getWrapperElement()); + textarea.style.display = ""; + if (textarea.form) { + off(textarea.form, "submit", save); + if (typeof textarea.form.submit == "function") + { textarea.form.submit = realSubmit; } + } + }; + }; + + textarea.style.display = "none"; + var cm = CodeMirror(function (node) { return textarea.parentNode.insertBefore(node, textarea.nextSibling); }, + options); + return cm + } + + function addLegacyProps(CodeMirror) { + CodeMirror.off = off; + CodeMirror.on = on; + CodeMirror.wheelEventPixels = wheelEventPixels; + CodeMirror.Doc = Doc; + CodeMirror.splitLines = splitLinesAuto; + CodeMirror.countColumn = countColumn; + CodeMirror.findColumn = findColumn; + CodeMirror.isWordChar = isWordCharBasic; + CodeMirror.Pass = Pass; + CodeMirror.signal = signal; + CodeMirror.Line = Line; + CodeMirror.changeEnd = changeEnd; + CodeMirror.scrollbarModel = scrollbarModel; + CodeMirror.Pos = Pos; + CodeMirror.cmpPos = cmp; + CodeMirror.modes = modes; + CodeMirror.mimeModes = mimeModes; + CodeMirror.resolveMode = resolveMode; + CodeMirror.getMode = getMode; + CodeMirror.modeExtensions = modeExtensions; + CodeMirror.extendMode = extendMode; + CodeMirror.copyState = copyState; + CodeMirror.startState = startState; + CodeMirror.innerMode = innerMode; + CodeMirror.commands = commands; + CodeMirror.keyMap = keyMap; + CodeMirror.keyName = keyName; + CodeMirror.isModifierKey = isModifierKey; + CodeMirror.lookupKey = lookupKey; + CodeMirror.normalizeKeyMap = normalizeKeyMap; + CodeMirror.StringStream = StringStream; + CodeMirror.SharedTextMarker = SharedTextMarker; + CodeMirror.TextMarker = TextMarker; + CodeMirror.LineWidget = LineWidget; + CodeMirror.e_preventDefault = e_preventDefault; + CodeMirror.e_stopPropagation = e_stopPropagation; + CodeMirror.e_stop = e_stop; + CodeMirror.addClass = addClass; + CodeMirror.contains = contains; + CodeMirror.rmClass = rmClass; + CodeMirror.keyNames = keyNames; + } + + // EDITOR CONSTRUCTOR + + defineOptions(CodeMirror); + + addEditorMethods(CodeMirror); + + // Set up methods on CodeMirror's prototype to redirect to the editor's document. + var dontDelegate = "iter insert remove copy getEditor constructor".split(" "); + for (var prop in Doc.prototype) { if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0) + { CodeMirror.prototype[prop] = (function(method) { + return function() {return method.apply(this.doc, arguments)} + })(Doc.prototype[prop]); } } + + eventMixin(Doc); + CodeMirror.inputStyles = {"textarea": TextareaInput, "contenteditable": ContentEditableInput}; + + // Extra arguments are stored as the mode's dependencies, which is + // used by (legacy) mechanisms like loadmode.js to automatically + // load a mode. (Preferred mechanism is the require/define calls.) + CodeMirror.defineMode = function(name/*, mode, …*/) { + if (!CodeMirror.defaults.mode && name != "null") { CodeMirror.defaults.mode = name; } + defineMode.apply(this, arguments); + }; + + CodeMirror.defineMIME = defineMIME; + + // Minimal default mode. + CodeMirror.defineMode("null", function () { return ({token: function (stream) { return stream.skipToEnd(); }}); }); + CodeMirror.defineMIME("text/plain", "null"); + + // EXTENSIONS + + CodeMirror.defineExtension = function (name, func) { + CodeMirror.prototype[name] = func; + }; + CodeMirror.defineDocExtension = function (name, func) { + Doc.prototype[name] = func; + }; + + CodeMirror.fromTextArea = fromTextArea; + + addLegacyProps(CodeMirror); + + CodeMirror.version = "5.48.4"; + + return CodeMirror; + +}))); +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://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"; + +CodeMirror.defineMode('shell', function() { + + var words = {}; + function define(style, dict) { + for(var i = 0; i < dict.length; i++) { + words[dict[i]] = style; + } + }; + + var commonAtoms = ["true", "false"]; + var commonKeywords = ["if", "then", "do", "else", "elif", "while", "until", "for", "in", "esac", "fi", + "fin", "fil", "done", "exit", "set", "unset", "export", "function"]; + var commonCommands = ["ab", "awk", "bash", "beep", "cat", "cc", "cd", "chown", "chmod", "chroot", "clear", + "cp", "curl", "cut", "diff", "echo", "find", "gawk", "gcc", "get", "git", "grep", "hg", "kill", "killall", + "ln", "ls", "make", "mkdir", "openssl", "mv", "nc", "nl", "node", "npm", "ping", "ps", "restart", "rm", + "rmdir", "sed", "service", "sh", "shopt", "shred", "source", "sort", "sleep", "ssh", "start", "stop", + "su", "sudo", "svn", "tee", "telnet", "top", "touch", "vi", "vim", "wall", "wc", "wget", "who", "write", + "yes", "zsh"]; + + CodeMirror.registerHelper("hintWords", "shell", commonAtoms.concat(commonKeywords, commonCommands)); + + define('atom', commonAtoms); + define('keyword', commonKeywords); + define('builtin', commonCommands); + + function tokenBase(stream, state) { + if (stream.eatSpace()) return null; + + var sol = stream.sol(); + var ch = stream.next(); + + if (ch === '\\') { + stream.next(); + return null; + } + if (ch === '\'' || ch === '"' || ch === '`') { + state.tokens.unshift(tokenString(ch, ch === "`" ? "quote" : "string")); + return tokenize(stream, state); + } + if (ch === '#') { + if (sol && stream.eat('!')) { + stream.skipToEnd(); + return 'meta'; // 'comment'? + } + stream.skipToEnd(); + return 'comment'; + } + if (ch === '$') { + state.tokens.unshift(tokenDollar); + return tokenize(stream, state); + } + if (ch === '+' || ch === '=') { + return 'operator'; + } + if (ch === '-') { + stream.eat('-'); + stream.eatWhile(/\w/); + return 'attribute'; + } + if (/\d/.test(ch)) { + stream.eatWhile(/\d/); + if(stream.eol() || !/\w/.test(stream.peek())) { + return 'number'; + } + } + stream.eatWhile(/[\w-]/); + var cur = stream.current(); + if (stream.peek() === '=' && /\w+/.test(cur)) return 'def'; + return words.hasOwnProperty(cur) ? words[cur] : null; + } + + function tokenString(quote, style) { + var close = quote == "(" ? ")" : quote == "{" ? "}" : quote + return function(stream, state) { + var next, escaped = false; + while ((next = stream.next()) != null) { + if (next === close && !escaped) { + state.tokens.shift(); + break; + } else if (next === '$' && !escaped && quote !== "'" && stream.peek() != close) { + escaped = true; + stream.backUp(1); + state.tokens.unshift(tokenDollar); + break; + } else if (!escaped && quote !== close && next === quote) { + state.tokens.unshift(tokenString(quote, style)) + return tokenize(stream, state) + } else if (!escaped && /['"]/.test(next) && !/['"]/.test(quote)) { + state.tokens.unshift(tokenStringStart(next, "string")); + stream.backUp(1); + break; + } + escaped = !escaped && next === '\\'; + } + return style; + }; + }; + + function tokenStringStart(quote, style) { + return function(stream, state) { + state.tokens[0] = tokenString(quote, style) + stream.next() + return tokenize(stream, state) + } + } + + var tokenDollar = function(stream, state) { + if (state.tokens.length > 1) stream.eat('$'); + var ch = stream.next() + if (/['"({]/.test(ch)) { + state.tokens[0] = tokenString(ch, ch == "(" ? "quote" : ch == "{" ? "def" : "string"); + return tokenize(stream, state); + } + if (!/\d/.test(ch)) stream.eatWhile(/\w/); + state.tokens.shift(); + return 'def'; + }; + + function tokenize(stream, state) { + return (state.tokens[0] || tokenBase) (stream, state); + }; + + return { + startState: function() {return {tokens:[]};}, + token: function(stream, state) { + return tokenize(stream, state); + }, + closeBrackets: "()[]{}''\"\"``", + lineComment: '#', + fold: "brace" + }; +}); + +CodeMirror.defineMIME('text/x-sh', 'shell'); +// Apache uses a slightly different Media Type for Shell scripts +// http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types +CodeMirror.defineMIME('application/x-sh', 'shell'); + +}); +/* + * Editor.md + * + * @file editormd.js + * @version v1.5.0 + * @description Open source online markdown editor. + * @license MIT License + * @author Pandao + * {@link https://github.com/pandao/editor.md} + * @updateTime 2015-06-09 + */ + + +;(function(factory) { + "use strict"; + + // CommonJS/Node.js + if (typeof require === "function" && typeof exports === "object" && typeof module === "object") + { + module.exports = factory; + } + else if (typeof define === "function") // AMD/CMD/Sea.js + { + if (define.amd) // for Require.js + { + /* Require.js define replace */ + } + else + { + define(["jquery"], factory); // for Sea.js + } + } + else + { + window.editormd = factory(); + } + +}(function() { + + /* Require.js assignment replace */ + + "use strict"; + + var $ = (typeof (jQuery) !== "undefined") ? jQuery : Zepto; + + if (typeof ($) === "undefined") { + return ; + } + + /** + * editormd + * + * @param {String} id 编辑器的ID + * @param {Object} options 配置选项 Key/Value + * @returns {Object} editormd 返回editormd对象 + */ + + var editormd = function (id, options) { + return new editormd.fn.init(id, options); + }; + + editormd.title = editormd.$name = "Editor.md"; + editormd.version = "1.5.0"; + editormd.homePage = "https://pandao.github.io/editor.md/"; + editormd.classPrefix = "editormd-"; + + editormd.toolbarModes = { + full : [ + "undo", "redo", "|", + "bold", "del", "italic", "quote", "ucwords", "uppercase", "lowercase", "|", + "h1", "h2", "h3", "h4", "h5", "h6", "|", + "list-ul", "list-ol", "hr", "|", + "link", "reference-link", "image", "code", "preformatted-text", "code-block", "table", "datetime", "emoji", "html-entities", "pagebreak", "|", + "goto-line", "watch", "preview", "fullscreen", "clear", "search", "|", + "help", "info" + ], + simple : [ + "undo", "redo", "|", + "bold", "del", "italic", "quote", "uppercase", "lowercase", "|", + "h1", "h2", "h3", "h4", "h5", "h6", "|", + "list-ul", "list-ol", "hr", "|", + "watch", "preview", "fullscreen", "|", + "help", "info" + ], + mini : [ + "undo", "redo", "|", + "watch", "preview", "|", + "help", "info" + ] + }; + + editormd.defaults = { + mode : "gfm", //gfm or markdown + name : "", // Form element name + value : "", // value for CodeMirror, if mode not gfm/markdown + theme : "", // Editor.md self themes, before v1.5.0 is CodeMirror theme, default empty + editorTheme : "default", // Editor area, this is CodeMirror theme at v1.5.0 + previewTheme : "", // Preview area theme, default empty + markdown : "", // Markdown source code + appendMarkdown : "", // if in init textarea value not empty, append markdown to textarea + width : "100%", + height : "100%", + path : "./lib/", // Dependents module file directory + pluginPath : "", // If this empty, default use settings.path + "../plugins/" + delay : 300, // Delay parse markdown to html, Uint : ms + autoLoadModules : true, // Automatic load dependent module files + watch : true, + placeholder : "Enjoy Markdown! coding now...", + gotoLine : true, + codeFold : false, + autoHeight : false, + autoFocus : true, + autoCloseTags : true, + searchReplace : true, + syncScrolling : true, // true | false | "single", default true + readOnly : false, + tabSize : 4, + indentUnit : 4, + lineNumbers : true, + lineWrapping : true, + autoCloseBrackets : true, + showTrailingSpace : true, + matchBrackets : true, + indentWithTabs : true, + styleSelectedText : true, + matchWordHighlight : true, // options: true, false, "onselected" + styleActiveLine : true, // Highlight the current line + dialogLockScreen : true, + dialogShowMask : true, + dialogDraggable : true, + dialogMaskBgColor : "#fff", + dialogMaskOpacity : 0.1, + fontSize : "13px", + saveHTMLToTextarea : false, + disabledKeyMaps : [], + + onload : function() {}, + onresize : function() {}, + onchange : function() {}, + onwatch : null, + onunwatch : null, + onpreviewing : function() {}, + onpreviewed : function() {}, + onfullscreen : function() {}, + onfullscreenExit : function() {}, + onscroll : function() {}, + onpreviewscroll : function() {}, + + imageUpload : false, + imageFormats : ["jpg", "jpeg", "gif", "png", "bmp", "webp"], + imageUploadURL : "", + crossDomainUpload : false, + uploadCallbackURL : "", + + toc : true, // Table of contents + tocm : false, // Using [TOCM], auto create ToC dropdown menu + tocTitle : "", // for ToC dropdown menu btn + tocDropdown : false, + tocContainer : "", + tocStartLevel : 1, // Said from H1 to create ToC + htmlDecode : false, // Open the HTML tag identification + pageBreak : true, // Enable parse page break [========] + atLink : true, // for @link + emailLink : true, // for email address auto link + taskList : false, // Enable Github Flavored Markdown task lists + emoji : false, // :emoji: , Support Github emoji, Twitter Emoji (Twemoji); + // Support FontAwesome icon emoji :fa-xxx: > Using fontAwesome icon web fonts; + // Support Editor.md logo icon emoji :editormd-logo: :editormd-logo-1x: > 1~8x; + tex : false, // TeX(LaTeX), based on KaTeX + flowChart : false, // flowChart.js only support IE9+ + sequenceDiagram : false, // sequenceDiagram.js only support IE9+ + previewCodeHighlight : true, + + toolbar : true, // show/hide toolbar + toolbarAutoFixed : true, // on window scroll auto fixed position + toolbarIcons : "full", + toolbarTitles : {}, + toolbarHandlers : { + ucwords : function() { + return editormd.toolbarHandlers.ucwords; + }, + lowercase : function() { + return editormd.toolbarHandlers.lowercase; + } + }, + toolbarCustomIcons : { // using html tag create toolbar icon, unused default <a> tag. + lowercase : "<a href=\"javascript:;\" title=\"Lowercase\" unselectable=\"on\"><i class=\"fa\" name=\"lowercase\" style=\"font-size:24px;margin-top: -10px;\">a</i></a>", + "ucwords" : "<a href=\"javascript:;\" title=\"ucwords\" unselectable=\"on\"><i class=\"fa\" name=\"ucwords\" style=\"font-size:20px;margin-top: -3px;\">Aa</i></a>" + }, + toolbarIconsClass : { + undo : "fa-undo", + redo : "fa-repeat", + bold : "fa-bold", + del : "fa-strikethrough", + italic : "fa-italic", + quote : "fa-quote-left", + uppercase : "fa-font", + h1 : editormd.classPrefix + "bold", + h2 : editormd.classPrefix + "bold", + h3 : editormd.classPrefix + "bold", + h4 : editormd.classPrefix + "bold", + h5 : editormd.classPrefix + "bold", + h6 : editormd.classPrefix + "bold", + "list-ul" : "fa-list-ul", + "list-ol" : "fa-list-ol", + hr : "fa-minus", + link : "fa-link", + "reference-link" : "fa-anchor", + image : "fa-picture-o", + code : "fa-code", + "preformatted-text" : "fa-file-code-o", + "code-block" : "fa-file-code-o", + table : "fa-table", + datetime : "fa-clock-o", + emoji : "fa-smile-o", + "html-entities" : "fa-copyright", + pagebreak : "fa-newspaper-o", + "goto-line" : "fa-terminal", // fa-crosshairs + watch : "fa-eye-slash", + unwatch : "fa-eye", + preview : "fa-desktop", + search : "fa-search", + fullscreen : "fa-arrows-alt", + clear : "fa-eraser", + help : "fa-question-circle", + info : "fa-info-circle" + }, + toolbarIconTexts : {}, + + lang : { + name : "zh-cn", + description : "开源在线Markdown编辑器<br/>Open source online Markdown editor.", + tocTitle : "目录", + toolbar : { + undo : "撤销(Ctrl+Z)", + redo : "重做(Ctrl+Y)", + bold : "粗体", + del : "删除线", + italic : "斜体", + quote : "引用", + ucwords : "将每个单词首字母转成大写", + uppercase : "将所选转换成大写", + lowercase : "将所选转换成小写", + h1 : "标题1", + h2 : "标题2", + h3 : "标题3", + h4 : "标题4", + h5 : "标题5", + h6 : "标题6", + "list-ul" : "无序列表", + "list-ol" : "有序列表", + hr : "横线", + link : "链接", + "reference-link" : "引用链接", + image : "添加图片", + code : "行内代码", + "preformatted-text" : "预格式文本 / 代码块(缩进风格)", + "code-block" : "代码块(多语言风格)", + table : "添加表格", + datetime : "日期时间", + emoji : "Emoji表情", + "html-entities" : "HTML实体字符", + pagebreak : "插入分页符", + "goto-line" : "跳转到行", + watch : "关闭实时预览", + unwatch : "开启实时预览", + preview : "全窗口预览HTML(按 Shift + ESC还原)", + fullscreen : "全屏(按ESC还原)", + clear : "清空", + search : "搜索", + help : "使用帮助", + info : "关于" + editormd.title + }, + buttons : { + enter : "确定", + cancel : "取消", + close : "关闭" + }, + dialog : { + link : { + title : "添加链接", + url : "链接地址", + urlTitle : "链接标题", + urlEmpty : "错误:请填写链接地址。" + }, + referenceLink : { + title : "添加引用链接", + name : "引用名称", + url : "链接地址", + urlId : "链接ID", + urlTitle : "链接标题", + nameEmpty: "错误:引用链接的名称不能为空。", + idEmpty : "错误:请填写引用链接的ID。", + urlEmpty : "错误:请填写引用链接的URL地址。" + }, + image : { + title : "添加图片", + url : "图片地址", + link : "图片链接", + alt : "图片描述", + uploadButton : "本地上传", + imageURLEmpty : "错误:图片地址不能为空。", + uploadFileEmpty : "错误:上传的图片不能为空。", + formatNotAllowed : "错误:只允许上传图片文件,允许上传的图片文件格式有:" + }, + preformattedText : { + title : "添加预格式文本或代码块", + emptyAlert : "错误:请填写预格式文本或代码的内容。" + }, + codeBlock : { + title : "添加代码块", + selectLabel : "代码语言:", + selectDefaultText : "请选择代码语言", + otherLanguage : "其他语言", + unselectedLanguageAlert : "错误:请选择代码所属的语言类型。", + codeEmptyAlert : "错误:请填写代码内容。" + }, + htmlEntities : { + title : "HTML 实体字符" + }, + help : { + title : "使用帮助" + } + } + } + }; + + editormd.classNames = { + tex : editormd.classPrefix + "tex" + }; + + editormd.dialogZindex = 99999; + + editormd.$katex = null; + editormd.$marked = null; + editormd.$CodeMirror = null; + editormd.$prettyPrint = null; + + var timer, flowchartTimer; + + editormd.prototype = editormd.fn = { + state : { + watching : false, + loaded : false, + preview : false, + fullscreen : false + }, + + /** + * 构造函数/实例初始化 + * Constructor / instance initialization + * + * @param {String} id 编辑器的ID + * @param {Object} [options={}] 配置选项 Key/Value + * @returns {editormd} 返回editormd的实例对象 + */ + + init : function (id, options) { + + options = options || {}; + + if (typeof id === "object") + { + options = id; + } + + var _this = this; + var classPrefix = this.classPrefix = editormd.classPrefix; + var settings = this.settings = $.extend(true, editormd.defaults, options); + + id = (typeof id === "object") ? settings.id : id; + + var editor = this.editor = $("#" + id); + + this.id = id; + this.lang = settings.lang; + + var classNames = this.classNames = { + textarea : { + html : classPrefix + "html-textarea", + markdown : classPrefix + "markdown-textarea" + } + }; + + settings.pluginPath = (settings.pluginPath === "") ? settings.path + "../plugins/" : settings.pluginPath; + + this.state.watching = (settings.watch) ? true : false; + + if ( !editor.hasClass("editormd") ) { + editor.addClass("editormd"); + } + + editor.css({ + width : (typeof settings.width === "number") ? settings.width + "px" : settings.width, + height : (typeof settings.height === "number") ? settings.height + "px" : settings.height + }); + + if (settings.autoHeight) + { + editor.css("height", "auto"); + } + + var markdownTextarea = this.markdownTextarea = editor.children("textarea"); + + if (markdownTextarea.length < 1) + { + editor.append("<textarea></textarea>"); + markdownTextarea = this.markdownTextarea = editor.children("textarea"); + } + + markdownTextarea.addClass(classNames.textarea.markdown).attr("placeholder", settings.placeholder); + + if (typeof markdownTextarea.attr("name") === "undefined" || markdownTextarea.attr("name") === "") + { + markdownTextarea.attr("name", (settings.name !== "") ? settings.name : id + "-markdown-doc"); + } + + var appendElements = [ + (!settings.readOnly) ? "<a href=\"javascript:;\" class=\"fa fa-close " + classPrefix + "preview-close-btn\"></a>" : "", + ( (settings.saveHTMLToTextarea) ? "<textarea class=\"" + classNames.textarea.html + "\" name=\"" + id + "-html-code\"></textarea>" : "" ), + "<div class=\"" + classPrefix + "preview\"><div class=\"markdown-body " + classPrefix + "preview-container\"></div></div>", + "<div class=\"" + classPrefix + "container-mask\" style=\"display:block;\"></div>", + "<div class=\"" + classPrefix + "mask\"></div>" + ].join("\n"); + + editor.append(appendElements).addClass(classPrefix + "vertical"); + + if (settings.theme !== "") + { + editor.addClass(classPrefix + "theme-" + settings.theme); + } + + this.mask = editor.children("." + classPrefix + "mask"); + this.containerMask = editor.children("." + classPrefix + "container-mask"); + + if (settings.markdown !== "") + { + markdownTextarea.val(settings.markdown); + } + + if (settings.appendMarkdown !== "") + { + markdownTextarea.val(markdownTextarea.val() + settings.appendMarkdown); + } + + this.htmlTextarea = editor.children("." + classNames.textarea.html); + this.preview = editor.children("." + classPrefix + "preview"); + this.previewContainer = this.preview.children("." + classPrefix + "preview-container"); + + if (settings.previewTheme !== "") + { + this.preview.addClass(classPrefix + "preview-theme-" + settings.previewTheme); + } + + if (typeof define === "function" && define.amd) + { + if (typeof katex !== "undefined") + { + editormd.$katex = katex; + } + + if (settings.searchReplace && !settings.readOnly) + { + editormd.loadCSS(settings.path + "codemirror/addon/dialog/dialog"); + editormd.loadCSS(settings.path + "codemirror/addon/search/matchesonscrollbar"); + } + } + + if ((typeof define === "function" && define.amd) || !settings.autoLoadModules) + { + if (typeof CodeMirror !== "undefined") { + editormd.$CodeMirror = CodeMirror; + } + + if (typeof marked !== "undefined") { + editormd.$marked = marked; + } + + this.setCodeMirror().setToolbar().loadedDisplay(); + } + else + { + this.loadQueues(); + } + + return this; + }, + + /** + * 所需组件加载队列 + * Required components loading queue + * + * @returns {editormd} 返回editormd的实例对象 + */ + + loadQueues : function() { + var _this = this; + var settings = this.settings; + var loadPath = settings.path; + + var loadFlowChartOrSequenceDiagram = function() { + + if (editormd.isIE8) + { + _this.loadedDisplay(); + + return ; + } + + if (settings.flowChart || settings.sequenceDiagram) + { + editormd.loadScript(loadPath + "raphael.min", function() { + + editormd.loadScript(loadPath + "underscore.min", function() { + + if (!settings.flowChart && settings.sequenceDiagram) + { + editormd.loadScript(loadPath + "sequence-diagram.min", function() { + _this.loadedDisplay(); + }); + } + else if (settings.flowChart && !settings.sequenceDiagram) + { + editormd.loadScript(loadPath + "flowchart.min", function() { + editormd.loadScript(loadPath + "jquery.flowchart.min", function() { + _this.loadedDisplay(); + }); + }); + } + else if (settings.flowChart && settings.sequenceDiagram) + { + editormd.loadScript(loadPath + "flowchart.min", function() { + editormd.loadScript(loadPath + "jquery.flowchart.min", function() { + editormd.loadScript(loadPath + "sequence-diagram.min", function() { + _this.loadedDisplay(); + }); + }); + }); + } + }); + + }); + } + else + { + _this.loadedDisplay(); + } + }; + + editormd.loadCSS(loadPath + "codemirror/codemirror.min"); + + if (settings.searchReplace && !settings.readOnly) + { + editormd.loadCSS(loadPath + "codemirror/addon/dialog/dialog"); + editormd.loadCSS(loadPath + "codemirror/addon/search/matchesonscrollbar"); + } + + if (settings.codeFold) + { + editormd.loadCSS(loadPath + "codemirror/addon/fold/foldgutter"); + } + + editormd.loadScript(loadPath + "codemirror/codemirror.min", function() { + editormd.$CodeMirror = CodeMirror; + + editormd.loadScript(loadPath + "codemirror/modes.min", function() { + + editormd.loadScript(loadPath + "codemirror/addons.min", function() { + + _this.setCodeMirror(); + + if (settings.mode !== "gfm" && settings.mode !== "markdown") + { + _this.loadedDisplay(); + + return false; + } + + _this.setToolbar(); + + editormd.loadScript(loadPath + "marked.min", function() { + + editormd.$marked = marked; + + if (settings.previewCodeHighlight) + { + editormd.loadScript(loadPath + "prettify.min", function() { + loadFlowChartOrSequenceDiagram(); + }); + } + else + { + loadFlowChartOrSequenceDiagram(); + } + }); + + }); + + }); + + }); + + return this; + }, + + /** + * 设置 Editor.md 的整体主题,主要是工具栏 + * Setting Editor.md theme + * + * @returns {editormd} 返回editormd的实例对象 + */ + + setTheme : function(theme) { + var editor = this.editor; + var oldTheme = this.settings.theme; + var themePrefix = this.classPrefix + "theme-"; + + editor.removeClass(themePrefix + oldTheme).addClass(themePrefix + theme); + + this.settings.theme = theme; + + return this; + }, + + /** + * 设置 CodeMirror(编辑区)的主题 + * Setting CodeMirror (Editor area) theme + * + * @returns {editormd} 返回editormd的实例对象 + */ + + setEditorTheme : function(theme) { + var settings = this.settings; + settings.editorTheme = theme; + + if (theme !== "default") + { + editormd.loadCSS(settings.path + "codemirror/theme/" + settings.editorTheme); + } + + this.cm.setOption("theme", theme); + + return this; + }, + + /** + * setEditorTheme() 的别名 + * setEditorTheme() alias + * + * @returns {editormd} 返回editormd的实例对象 + */ + + setCodeMirrorTheme : function (theme) { + this.setEditorTheme(theme); + + return this; + }, + + /** + * 设置 Editor.md 的主题 + * Setting Editor.md theme + * + * @returns {editormd} 返回editormd的实例对象 + */ + + setPreviewTheme : function(theme) { + var preview = this.preview; + var oldTheme = this.settings.previewTheme; + var themePrefix = this.classPrefix + "preview-theme-"; + + preview.removeClass(themePrefix + oldTheme).addClass(themePrefix + theme); + + this.settings.previewTheme = theme; + + return this; + }, + + /** + * 配置和初始化CodeMirror组件 + * CodeMirror initialization + * + * @returns {editormd} 返回editormd的实例对象 + */ + + setCodeMirror : function() { + var settings = this.settings; + var editor = this.editor; + + if (settings.editorTheme !== "default") + { + editormd.loadCSS(settings.path + "codemirror/theme/" + settings.editorTheme); + } + + var codeMirrorConfig = { + mode : settings.mode, + theme : settings.editorTheme, + tabSize : settings.tabSize, + dragDrop : false, + autofocus : settings.autoFocus, + autoCloseTags : settings.autoCloseTags, + readOnly : (settings.readOnly) ? "nocursor" : false, + indentUnit : settings.indentUnit, + lineNumbers : settings.lineNumbers, + lineWrapping : settings.lineWrapping, + extraKeys : { + "Ctrl-Q": function(cm) { + cm.foldCode(cm.getCursor()); + } + }, + foldGutter : settings.codeFold, + gutters : ["CodeMirror-linenumbers", "CodeMirror-foldgutter"], + matchBrackets : settings.matchBrackets, + indentWithTabs : settings.indentWithTabs, + styleActiveLine : settings.styleActiveLine, + styleSelectedText : settings.styleSelectedText, + autoCloseBrackets : settings.autoCloseBrackets, + showTrailingSpace : settings.showTrailingSpace, + highlightSelectionMatches : ( (!settings.matchWordHighlight) ? false : { showToken: (settings.matchWordHighlight === "onselected") ? false : /\w/ } ) + }; + + this.codeEditor = this.cm = editormd.$CodeMirror.fromTextArea(this.markdownTextarea[0], codeMirrorConfig); + this.codeMirror = this.cmElement = editor.children(".CodeMirror"); + + if (settings.value !== "") + { + this.cm.setValue(settings.value); + } + + this.codeMirror.css({ + fontSize : settings.fontSize, + width : (!settings.watch) ? "100%" : "50%" + }); + + if (settings.autoHeight) + { + this.codeMirror.css("height", "auto"); + this.cm.setOption("viewportMargin", Infinity); + } + + if (!settings.lineNumbers) + { + this.codeMirror.find(".CodeMirror-gutters").css("border-right", "none"); + } + + return this; + }, + + /** + * 获取CodeMirror的配置选项 + * Get CodeMirror setting options + * + * @returns {Mixed} return CodeMirror setting option value + */ + + getCodeMirrorOption : function(key) { + return this.cm.getOption(key); + }, + + /** + * 配置和重配置CodeMirror的选项 + * CodeMirror setting options / resettings + * + * @returns {editormd} 返回editormd的实例对象 + */ + + setCodeMirrorOption : function(key, value) { + + this.cm.setOption(key, value); + + return this; + }, + + /** + * 添加 CodeMirror 键盘快捷键 + * Add CodeMirror keyboard shortcuts key map + * + * @returns {editormd} 返回editormd的实例对象 + */ + + addKeyMap : function(map, bottom) { + this.cm.addKeyMap(map, bottom); + + return this; + }, + + /** + * 移除 CodeMirror 键盘快捷键 + * Remove CodeMirror keyboard shortcuts key map + * + * @returns {editormd} 返回editormd的实例对象 + */ + + removeKeyMap : function(map) { + this.cm.removeKeyMap(map); + + return this; + }, + + /** + * 跳转到指定的行 + * Goto CodeMirror line + * + * @param {String|Intiger} line line number or "first"|"last" + * @returns {editormd} 返回editormd的实例对象 + */ + + gotoLine : function (line) { + + var settings = this.settings; + + if (!settings.gotoLine) + { + return this; + } + + var cm = this.cm; + var editor = this.editor; + var count = cm.lineCount(); + var preview = this.preview; + + if (typeof line === "string") + { + if(line === "last") + { + line = count; + } + + if (line === "first") + { + line = 1; + } + } + + if (typeof line !== "number") + { + alert("Error: The line number must be an integer."); + return this; + } + + line = parseInt(line) - 1; + + if (line > count) + { + alert("Error: The line number range 1-" + count); + + return this; + } + + cm.setCursor( {line : line, ch : 0} ); + + var scrollInfo = cm.getScrollInfo(); + var clientHeight = scrollInfo.clientHeight; + var coords = cm.charCoords({line : line, ch : 0}, "local"); + + cm.scrollTo(null, (coords.top + coords.bottom - clientHeight) / 2); + + if (settings.watch) + { + var cmScroll = this.codeMirror.find(".CodeMirror-scroll")[0]; + var height = $(cmScroll).height(); + var scrollTop = cmScroll.scrollTop; + var percent = (scrollTop / cmScroll.scrollHeight); + + if (scrollTop === 0) + { + preview.scrollTop(0); + } + else if (scrollTop + height >= cmScroll.scrollHeight - 16) + { + preview.scrollTop(preview[0].scrollHeight); + } + else + { + preview.scrollTop(preview[0].scrollHeight * percent); + } + } + + cm.focus(); + + return this; + }, + + /** + * 扩展当前实例对象,可同时设置多个或者只设置一个 + * Extend editormd instance object, can mutil setting. + * + * @returns {editormd} this(editormd instance object.) + */ + + extend : function() { + if (typeof arguments[1] !== "undefined") + { + if (typeof arguments[1] === "function") + { + arguments[1] = $.proxy(arguments[1], this); + } + + this[arguments[0]] = arguments[1]; + } + + if (typeof arguments[0] === "object" && typeof arguments[0].length === "undefined") + { + $.extend(true, this, arguments[0]); + } + + return this; + }, + + /** + * 设置或扩展当前实例对象,单个设置 + * Extend editormd instance object, one by one + * + * @param {String|Object} key option key + * @param {String|Object} value option value + * @returns {editormd} this(editormd instance object.) + */ + + set : function (key, value) { + + if (typeof value !== "undefined" && typeof value === "function") + { + value = $.proxy(value, this); + } + + this[key] = value; + + return this; + }, + + /** + * 重新配置 + * Resetting editor options + * + * @param {String|Object} key option key + * @param {String|Object} value option value + * @returns {editormd} this(editormd instance object.) + */ + + config : function(key, value) { + var settings = this.settings; + + if (typeof key === "object") + { + settings = $.extend(true, settings, key); + } + + if (typeof key === "string") + { + settings[key] = value; + } + + this.settings = settings; + this.recreate(); + + return this; + }, + + /** + * 注册事件处理方法 + * Bind editor event handle + * + * @param {String} eventType event type + * @param {Function} callback 回调函数 + * @returns {editormd} this(editormd instance object.) + */ + + on : function(eventType, callback) { + var settings = this.settings; + + if (typeof settings["on" + eventType] !== "undefined") + { + settings["on" + eventType] = $.proxy(callback, this); + } + + return this; + }, + + /** + * 解除事件处理方法 + * Unbind editor event handle + * + * @param {String} eventType event type + * @returns {editormd} this(editormd instance object.) + */ + + off : function(eventType) { + var settings = this.settings; + + if (typeof settings["on" + eventType] !== "undefined") + { + settings["on" + eventType] = function(){}; + } + + return this; + }, + + /** + * 显示工具栏 + * Display toolbar + * + * @param {Function} [callback=function(){}] 回调函数 + * @returns {editormd} 返回editormd的实例对象 + */ + + showToolbar : function(callback) { + var settings = this.settings; + + if(settings.readOnly) { + return this; + } + + if (settings.toolbar && (this.toolbar.length < 1 || this.toolbar.find("." + this.classPrefix + "menu").html() === "") ) + { + this.setToolbar(); + } + + settings.toolbar = true; + + this.toolbar.show(); + this.resize(); + + $.proxy(callback || function(){}, this)(); + + return this; + }, + + /** + * 隐藏工具栏 + * Hide toolbar + * + * @param {Function} [callback=function(){}] 回调函数 + * @returns {editormd} this(editormd instance object.) + */ + + hideToolbar : function(callback) { + var settings = this.settings; + + settings.toolbar = false; + this.toolbar.hide(); + this.resize(); + + $.proxy(callback || function(){}, this)(); + + return this; + }, + + /** + * 页面滚动时工具栏的固定定位 + * Set toolbar in window scroll auto fixed position + * + * @returns {editormd} 返回editormd的实例对象 + */ + + setToolbarAutoFixed : function(fixed) { + + var state = this.state; + var editor = this.editor; + var toolbar = this.toolbar; + var settings = this.settings; + + if (typeof fixed !== "undefined") + { + settings.toolbarAutoFixed = fixed; + } + + var autoFixedHandle = function(){ + var $window = $(window); + var top = $window.scrollTop(); + + if (!settings.toolbarAutoFixed) + { + return false; + } + + if (top - editor.offset().top > 10 && top < editor.height()) + { + toolbar.css({ + position : "fixed", + width : editor.width() + "px", + left : ($window.width() - editor.width()) / 2 + "px" + }); + } + else + { + toolbar.css({ + position : "absolute", + width : "100%", + left : 0 + }); + } + }; + + if (!state.fullscreen && !state.preview && settings.toolbar && settings.toolbarAutoFixed) + { + $(window).bind("scroll", autoFixedHandle); + } + + return this; + }, + + /** + * 配置和初始化工具栏 + * Set toolbar and Initialization + * + * @returns {editormd} 返回editormd的实例对象 + */ + + setToolbar : function() { + var settings = this.settings; + + if(settings.readOnly) { + return this; + } + + var editor = this.editor; + var preview = this.preview; + var classPrefix = this.classPrefix; + + var toolbar = this.toolbar = editor.children("." + classPrefix + "toolbar"); + + if (settings.toolbar && toolbar.length < 1) + { + var toolbarHTML = "<div class=\"" + classPrefix + "toolbar\"><div class=\"" + classPrefix + "toolbar-container\"><ul class=\"" + classPrefix + "menu\"></ul></div></div>"; + + editor.append(toolbarHTML); + toolbar = this.toolbar = editor.children("." + classPrefix + "toolbar"); + } + + if (!settings.toolbar) + { + toolbar.hide(); + + return this; + } + + toolbar.show(); + + var icons = (typeof settings.toolbarIcons === "function") ? settings.toolbarIcons() + : ((typeof settings.toolbarIcons === "string") ? editormd.toolbarModes[settings.toolbarIcons] : settings.toolbarIcons); + + var toolbarMenu = toolbar.find("." + this.classPrefix + "menu"), menu = ""; + var pullRight = false; + + for (var i = 0, len = icons.length; i < len; i++) + { + var name = icons[i]; + + if (name === "||") + { + pullRight = true; + } + else if (name === "|") + { + menu += "<li class=\"divider\" unselectable=\"on\">|</li>"; + } + else + { + var isHeader = (/h(\d)/.test(name)); + var index = name; + + if (name === "watch" && !settings.watch) { + index = "unwatch"; + } + + var title = settings.lang.toolbar[index]; + var iconTexts = settings.toolbarIconTexts[index]; + var iconClass = settings.toolbarIconsClass[index]; + + title = (typeof title === "undefined") ? "" : title; + iconTexts = (typeof iconTexts === "undefined") ? "" : iconTexts; + iconClass = (typeof iconClass === "undefined") ? "" : iconClass; + + var menuItem = pullRight ? "<li class=\"pull-right\">" : "<li>"; + + if (typeof settings.toolbarCustomIcons[name] !== "undefined" && typeof settings.toolbarCustomIcons[name] !== "function") + { + menuItem += settings.toolbarCustomIcons[name]; + } + else + { + menuItem += "<a href=\"javascript:;\" title=\"" + title + "\" unselectable=\"on\">"; + menuItem += "<i class=\"fa " + iconClass + "\" name=\""+name+"\" unselectable=\"on\">"+((isHeader) ? name.toUpperCase() : ( (iconClass === "") ? iconTexts : "") ) + "</i>"; + menuItem += "</a>"; + } + + menuItem += "</li>"; + + menu = pullRight ? menuItem + menu : menu + menuItem; + } + } + + toolbarMenu.html(menu); + + toolbarMenu.find("[title=\"Lowercase\"]").attr("title", settings.lang.toolbar.lowercase); + toolbarMenu.find("[title=\"ucwords\"]").attr("title", settings.lang.toolbar.ucwords); + + this.setToolbarHandler(); + this.setToolbarAutoFixed(); + + return this; + }, + + /** + * 工具栏图标事件处理对象序列 + * Get toolbar icons event handlers + * + * @param {Object} cm CodeMirror的实例对象 + * @param {String} name 要获取的事件处理器名称 + * @returns {Object} 返回处理对象序列 + */ + + dialogLockScreen : function() { + $.proxy(editormd.dialogLockScreen, this)(); + + return this; + }, + + dialogShowMask : function(dialog) { + $.proxy(editormd.dialogShowMask, this)(dialog); + + return this; + }, + + getToolbarHandles : function(name) { + var toolbarHandlers = this.toolbarHandlers = editormd.toolbarHandlers; + + return (name && typeof toolbarIconHandlers[name] !== "undefined") ? toolbarHandlers[name] : toolbarHandlers; + }, + + /** + * 工具栏图标事件处理器 + * Bind toolbar icons event handle + * + * @returns {editormd} 返回editormd的实例对象 + */ + + setToolbarHandler : function() { + var _this = this; + var settings = this.settings; + + if (!settings.toolbar || settings.readOnly) { + return this; + } + + var toolbar = this.toolbar; + var cm = this.cm; + var classPrefix = this.classPrefix; + var toolbarIcons = this.toolbarIcons = toolbar.find("." + classPrefix + "menu > li > a"); + var toolbarIconHandlers = this.getToolbarHandles(); + + toolbarIcons.bind(editormd.mouseOrTouch("click", "touchend"), function(event) { + + var icon = $(this).children(".fa"); + var name = icon.attr("name"); + var cursor = cm.getCursor(); + var selection = cm.getSelection(); + + if (name === "") { + return ; + } + + _this.activeIcon = icon; + + if (typeof toolbarIconHandlers[name] !== "undefined") + { + $.proxy(toolbarIconHandlers[name], _this)(cm); + } + else + { + if (typeof settings.toolbarHandlers[name] !== "undefined") + { + $.proxy(settings.toolbarHandlers[name], _this)(cm, icon, cursor, selection); + } + } + + if (name !== "link" && name !== "reference-link" && name !== "image" && name !== "code-block" && + name !== "preformatted-text" && name !== "watch" && name !== "preview" && name !== "search" && name !== "fullscreen" && name !== "info") + { + cm.focus(); + } + + return false; + + }); + + return this; + }, + + /** + * 动态创建对话框 + * Creating custom dialogs + * + * @param {Object} options 配置项键值对 Key/Value + * @returns {dialog} 返回创建的dialog的jQuery实例对象 + */ + + createDialog : function(options) { + return $.proxy(editormd.createDialog, this)(options); + }, + + /** + * 创建关于Editor.md的对话框 + * Create about Editor.md dialog + * + * @returns {editormd} 返回editormd的实例对象 + */ + + createInfoDialog : function() { + var _this = this; + var editor = this.editor; + var classPrefix = this.classPrefix; + + var infoDialogHTML = [ + "<div class=\"" + classPrefix + "dialog " + classPrefix + "dialog-info\" style=\"\">", + "<div class=\"" + classPrefix + "dialog-container\">", + "<h1><i class=\"editormd-logo editormd-logo-lg editormd-logo-color\"></i> " + editormd.title + "<small>v" + editormd.version + "</small></h1>", + "<p>" + this.lang.description + "</p>", + "<p style=\"margin: 10px 0 20px 0;\"><a href=\"" + editormd.homePage + "\" target=\"_blank\">" + editormd.homePage + " <i class=\"fa fa-external-link\"></i></a></p>", + "<p style=\"font-size: 0.85em;\">Copyright © 2015 <a href=\"https://github.com/pandao\" target=\"_blank\" class=\"hover-link\">Pandao</a>, The <a href=\"https://github.com/pandao/editor.md/blob/master/LICENSE\" target=\"_blank\" class=\"hover-link\">MIT</a> License.</p>", + "</div>", + "<a href=\"javascript:;\" class=\"fa fa-close " + classPrefix + "dialog-close\"></a>", + "</div>" + ].join("\n"); + + editor.append(infoDialogHTML); + + var infoDialog = this.infoDialog = editor.children("." + classPrefix + "dialog-info"); + + infoDialog.find("." + classPrefix + "dialog-close").bind(editormd.mouseOrTouch("click", "touchend"), function() { + _this.hideInfoDialog(); + }); + + infoDialog.css("border", (editormd.isIE8) ? "1px solid #ddd" : "").css("z-index", editormd.dialogZindex).show(); + + this.infoDialogPosition(); + + return this; + }, + + /** + * 关于Editor.md对话居中定位 + * Editor.md dialog position handle + * + * @returns {editormd} 返回editormd的实例对象 + */ + + infoDialogPosition : function() { + var infoDialog = this.infoDialog; + + var _infoDialogPosition = function() { + infoDialog.css({ + top : ($(window).height() - infoDialog.height()) / 2 + "px", + left : ($(window).width() - infoDialog.width()) / 2 + "px" + }); + }; + + _infoDialogPosition(); + + $(window).resize(_infoDialogPosition); + + return this; + }, + + /** + * 显示关于Editor.md + * Display about Editor.md dialog + * + * @returns {editormd} 返回editormd的实例对象 + */ + + showInfoDialog : function() { + + $("html,body").css("overflow-x", "hidden"); + + var _this = this; + var editor = this.editor; + var settings = this.settings; + var infoDialog = this.infoDialog = editor.children("." + this.classPrefix + "dialog-info"); + + if (infoDialog.length < 1) + { + this.createInfoDialog(); + } + + this.lockScreen(true); + + this.mask.css({ + opacity : settings.dialogMaskOpacity, + backgroundColor : settings.dialogMaskBgColor + }).show(); + + infoDialog.css("z-index", editormd.dialogZindex).show(); + + this.infoDialogPosition(); + + return this; + }, + + /** + * 隐藏关于Editor.md + * Hide about Editor.md dialog + * + * @returns {editormd} 返回editormd的实例对象 + */ + + hideInfoDialog : function() { + $("html,body").css("overflow-x", ""); + this.infoDialog.hide(); + this.mask.hide(); + this.lockScreen(false); + + return this; + }, + + /** + * 锁屏 + * lock screen + * + * @param {Boolean} lock Boolean 布尔值,是否锁屏 + * @returns {editormd} 返回editormd的实例对象 + */ + + lockScreen : function(lock) { + editormd.lockScreen(lock); + this.resize(); + + return this; + }, + + /** + * 编辑器界面重建,用于动态语言包或模块加载等 + * Recreate editor + * + * @returns {editormd} 返回editormd的实例对象 + */ + + recreate : function() { + var _this = this; + var editor = this.editor; + var settings = this.settings; + + this.codeMirror.remove(); + + this.setCodeMirror(); + + if (!settings.readOnly) + { + if (editor.find(".editormd-dialog").length > 0) { + editor.find(".editormd-dialog").remove(); + } + + if (settings.toolbar) + { + this.getToolbarHandles(); + this.setToolbar(); + } + } + + this.loadedDisplay(true); + + return this; + }, + + /** + * 高亮预览HTML的pre代码部分 + * highlight of preview codes + * + * @returns {editormd} 返回editormd的实例对象 + */ + + previewCodeHighlight : function() { + var settings = this.settings; + var previewContainer = this.previewContainer; + + if (settings.previewCodeHighlight) + { + previewContainer.find("pre").addClass("prettyprint linenums"); + + if (typeof prettyPrint !== "undefined") + { + prettyPrint(); + } + } + + return this; + }, + + /** + * 解析TeX(KaTeX)科学公式 + * TeX(KaTeX) Renderer + * + * @returns {editormd} 返回editormd的实例对象 + */ + + katexRender : function() { + + if (timer === null) + { + return this; + } + + this.previewContainer.find("." + editormd.classNames.tex).each(function(){ + var tex = $(this); + editormd.$katex.render(tex.text(), tex[0]); + + tex.find(".katex").css("font-size", "1.6em"); + }); + + return this; + }, + + /** + * 解析和渲染流程图及时序图 + * FlowChart and SequenceDiagram Renderer + * + * @returns {editormd} 返回editormd的实例对象 + */ + + flowChartAndSequenceDiagramRender : function() { + var $this = this; + var settings = this.settings; + var previewContainer = this.previewContainer; + + if (editormd.isIE8) { + return this; + } + + if (settings.flowChart) { + if (flowchartTimer === null) { + return this; + } + + previewContainer.find(".flowchart").flowChart(); + } + + if (settings.sequenceDiagram) { + previewContainer.find(".sequence-diagram").sequenceDiagram({theme: "simple"}); + } + + var preview = $this.preview; + var codeMirror = $this.codeMirror; + var codeView = codeMirror.find(".CodeMirror-scroll"); + + var height = codeView.height(); + var scrollTop = codeView.scrollTop(); + var percent = (scrollTop / codeView[0].scrollHeight); + var tocHeight = 0; + + preview.find(".markdown-toc-list").each(function(){ + tocHeight += $(this).height(); + }); + + var tocMenuHeight = preview.find(".editormd-toc-menu").height(); + tocMenuHeight = (!tocMenuHeight) ? 0 : tocMenuHeight; + + if (scrollTop === 0) + { + preview.scrollTop(0); + } + else if (scrollTop + height >= codeView[0].scrollHeight - 16) + { + preview.scrollTop(preview[0].scrollHeight); + } + else + { + preview.scrollTop((preview[0].scrollHeight + tocHeight + tocMenuHeight) * percent); + } + + return this; + }, + + /** + * 注册键盘快捷键处理 + * Register CodeMirror keyMaps (keyboard shortcuts). + * + * @param {Object} keyMap KeyMap key/value {"(Ctrl/Shift/Alt)-Key" : function(){}} + * @returns {editormd} return this + */ + + registerKeyMaps : function(keyMap) { + + var _this = this; + var cm = this.cm; + var settings = this.settings; + var toolbarHandlers = editormd.toolbarHandlers; + var disabledKeyMaps = settings.disabledKeyMaps; + + keyMap = keyMap || null; + + if (keyMap) + { + for (var i in keyMap) + { + if ($.inArray(i, disabledKeyMaps) < 0) + { + var map = {}; + map[i] = keyMap[i]; + + cm.addKeyMap(keyMap); + } + } + } + else + { + for (var k in editormd.keyMaps) + { + var _keyMap = editormd.keyMaps[k]; + var handle = (typeof _keyMap === "string") ? $.proxy(toolbarHandlers[_keyMap], _this) : $.proxy(_keyMap, _this); + + if ($.inArray(k, ["F9", "F10", "F11"]) < 0 && $.inArray(k, disabledKeyMaps) < 0) + { + var _map = {}; + _map[k] = handle; + + cm.addKeyMap(_map); + } + } + + $(window).keydown(function(event) { + + var keymaps = { + "120" : "F9", + "121" : "F10", + "122" : "F11" + }; + + if ( $.inArray(keymaps[event.keyCode], disabledKeyMaps) < 0 ) + { + switch (event.keyCode) + { + case 120: + $.proxy(toolbarHandlers["watch"], _this)(); + return false; + break; + + case 121: + $.proxy(toolbarHandlers["preview"], _this)(); + return false; + break; + + case 122: + $.proxy(toolbarHandlers["fullscreen"], _this)(); + return false; + break; + + default: + break; + } + } + }); + } + + return this; + }, + + /** + * 绑定同步滚动 + * + * @returns {editormd} return this + */ + + bindScrollEvent : function() { + + var _this = this; + var preview = this.preview; + var settings = this.settings; + var codeMirror = this.codeMirror; + var mouseOrTouch = editormd.mouseOrTouch; + + if (!settings.syncScrolling) { + return this; + } + + var cmBindScroll = function() { + codeMirror.find(".CodeMirror-scroll").bind(mouseOrTouch("scroll", "touchmove"), function(event) { + var height = $(this).height(); + var scrollTop = $(this).scrollTop(); + var percent = (scrollTop / $(this)[0].scrollHeight); + + var tocHeight = 0; + + preview.find(".markdown-toc-list").each(function(){ + tocHeight += $(this).height(); + }); + + var tocMenuHeight = preview.find(".editormd-toc-menu").height(); + tocMenuHeight = (!tocMenuHeight) ? 0 : tocMenuHeight; + + if (scrollTop === 0) + { + preview.scrollTop(0); + } + else if (scrollTop + height >= $(this)[0].scrollHeight - 16) + { + preview.scrollTop(preview[0].scrollHeight); + } + else + { + preview.scrollTop((preview[0].scrollHeight + tocHeight + tocMenuHeight) * percent); + } + + $.proxy(settings.onscroll, _this)(event); + }); + }; + + var cmUnbindScroll = function() { + codeMirror.find(".CodeMirror-scroll").unbind(mouseOrTouch("scroll", "touchmove")); + }; + + var previewBindScroll = function() { + + preview.bind(mouseOrTouch("scroll", "touchmove"), function(event) { + var height = $(this).height(); + var scrollTop = $(this).scrollTop(); + var percent = (scrollTop / $(this)[0].scrollHeight); + var codeView = codeMirror.find(".CodeMirror-scroll"); + + if(scrollTop === 0) + { + codeView.scrollTop(0); + } + else if (scrollTop + height >= $(this)[0].scrollHeight) + { + codeView.scrollTop(codeView[0].scrollHeight); + } + else + { + codeView.scrollTop(codeView[0].scrollHeight * percent); + } + + $.proxy(settings.onpreviewscroll, _this)(event); + }); + + }; + + var previewUnbindScroll = function() { + preview.unbind(mouseOrTouch("scroll", "touchmove")); + }; + + codeMirror.bind({ + mouseover : cmBindScroll, + mouseout : cmUnbindScroll, + touchstart : cmBindScroll, + touchend : cmUnbindScroll + }); + + if (settings.syncScrolling === "single") { + return this; + } + + preview.bind({ + mouseover : previewBindScroll, + mouseout : previewUnbindScroll, + touchstart : previewBindScroll, + touchend : previewUnbindScroll + }); + + return this; + }, + + bindChangeEvent : function() { + + var _this = this; + var cm = this.cm; + var settings = this.settings; + + if (!settings.syncScrolling) { + return this; + } + + cm.on("change", function(_cm, changeObj) { + + if (settings.watch) + { + _this.previewContainer.css("padding", settings.autoHeight ? "20px 20px 50px 40px" : "20px"); + } + + timer = setTimeout(function() { + clearTimeout(timer); + _this.save(); + timer = null; + }, settings.delay); + }); + + return this; + }, + + /** + * 加载队列完成之后的显示处理 + * Display handle of the module queues loaded after. + * + * @param {Boolean} recreate 是否为重建编辑器 + * @returns {editormd} 返回editormd的实例对象 + */ + + loadedDisplay : function(recreate) { + + recreate = recreate || false; + + var _this = this; + var editor = this.editor; + var preview = this.preview; + var settings = this.settings; + + this.containerMask.hide(); + + this.save(); + + if (settings.watch) { + preview.show(); + } + + editor.data("oldWidth", editor.width()).data("oldHeight", editor.height()); // 为了兼容Zepto + + this.resize(); + this.registerKeyMaps(); + + $(window).resize(function(){ + _this.resize(); + }); + + this.bindScrollEvent().bindChangeEvent(); + + if (!recreate) + { + $.proxy(settings.onload, this)(); + } + + this.state.loaded = true; + + return this; + }, + + /** + * 设置编辑器的宽度 + * Set editor width + * + * @param {Number|String} width 编辑器宽度值 + * @returns {editormd} 返回editormd的实例对象 + */ + + width : function(width) { + + this.editor.css("width", (typeof width === "number") ? width + "px" : width); + this.resize(); + + return this; + }, + + /** + * 设置编辑器的高度 + * Set editor height + * + * @param {Number|String} height 编辑器高度值 + * @returns {editormd} 返回editormd的实例对象 + */ + + height : function(height) { + + this.editor.css("height", (typeof height === "number") ? height + "px" : height); + this.resize(); + + return this; + }, + + /** + * 调整编辑器的尺寸和布局 + * Resize editor layout + * + * @param {Number|String} [width=null] 编辑器宽度值 + * @param {Number|String} [height=null] 编辑器高度值 + * @returns {editormd} 返回editormd的实例对象 + */ + + resize : function(width, height) { + + width = width || null; + height = height || null; + + var state = this.state; + var editor = this.editor; + var preview = this.preview; + var toolbar = this.toolbar; + var settings = this.settings; + var codeMirror = this.codeMirror; + + if (width) + { + editor.css("width", (typeof width === "number") ? width + "px" : width); + } + + if (settings.autoHeight && !state.fullscreen && !state.preview) + { + editor.css("height", "auto"); + codeMirror.css("height", "auto"); + } + else + { + if (height) + { + editor.css("height", (typeof height === "number") ? height + "px" : height); + } + + if (state.fullscreen) + { + editor.height($(window).height()); + } + + if (settings.toolbar && !settings.readOnly) + { + codeMirror.css("margin-top", toolbar.height() + 1).height(editor.height() - toolbar.height()); + } + else + { + codeMirror.css("margin-top", 0).height(editor.height()); + } + } + + if(settings.watch) + { + codeMirror.width(editor.width() / 2); + preview.width((!state.preview) ? editor.width() / 2 : editor.width()); + + this.previewContainer.css("padding", settings.autoHeight ? "20px 20px 50px 40px" : "20px"); + + if (settings.toolbar && !settings.readOnly) + { + preview.css("top", toolbar.height() + 1); + } + else + { + preview.css("top", 0); + } + + if (settings.autoHeight && !state.fullscreen && !state.preview) + { + preview.height(""); + } + else + { + var previewHeight = (settings.toolbar && !settings.readOnly) ? editor.height() - toolbar.height() : editor.height(); + + preview.height(previewHeight); + } + } + else + { + codeMirror.width(editor.width()); + preview.hide(); + } + + if (state.loaded) + { + $.proxy(settings.onresize, this)(); + } + + return this; + }, + + /** + * 解析和保存Markdown代码 + * Parse & Saving Markdown source code + * + * @returns {editormd} 返回editormd的实例对象 + */ + + save : function() { + + if (timer === null) + { + return this; + } + + var _this = this; + var state = this.state; + var settings = this.settings; + var cm = this.cm; + var cmValue = cm.getValue(); + var previewContainer = this.previewContainer; + + if (settings.mode !== "gfm" && settings.mode !== "markdown") + { + this.markdownTextarea.val(cmValue); + + return this; + } + + var marked = editormd.$marked; + var markdownToC = this.markdownToC = []; + var rendererOptions = this.markedRendererOptions = { + toc : settings.toc, + tocm : settings.tocm, + tocStartLevel : settings.tocStartLevel, + pageBreak : settings.pageBreak, + taskList : settings.taskList, + emoji : settings.emoji, + tex : settings.tex, + atLink : settings.atLink, // for @link + emailLink : settings.emailLink, // for mail address auto link + flowChart : settings.flowChart, + sequenceDiagram : settings.sequenceDiagram, + previewCodeHighlight : settings.previewCodeHighlight, + }; + + var markedOptions = this.markedOptions = { + renderer : editormd.markedRenderer(markdownToC, rendererOptions), + gfm : true, + tables : true, + breaks : true, + pedantic : false, + sanitize : (settings.htmlDecode) ? false : true, // 关闭忽略HTML标签,即开启识别HTML标签,默认为false + smartLists : true, + smartypants : true + }; + + marked.setOptions(markedOptions); + + var newMarkdownDoc = editormd.$marked(cmValue, markedOptions); + + //console.info("cmValue", cmValue, newMarkdownDoc); + + newMarkdownDoc = editormd.filterHTMLTags(newMarkdownDoc, settings.htmlDecode); + + //console.error("cmValue", cmValue, newMarkdownDoc); + + this.markdownTextarea.text(cmValue); + + cm.save(); + + if (settings.saveHTMLToTextarea) + { + this.htmlTextarea.text(newMarkdownDoc); + } + + if(settings.watch || (!settings.watch && state.preview)) + { + previewContainer.html(newMarkdownDoc); + + this.previewCodeHighlight(); + + if (settings.toc) + { + var tocContainer = (settings.tocContainer === "") ? previewContainer : $(settings.tocContainer); + var tocMenu = tocContainer.find("." + this.classPrefix + "toc-menu"); + + tocContainer.attr("previewContainer", (settings.tocContainer === "") ? "true" : "false"); + + if (settings.tocContainer !== "" && tocMenu.length > 0) + { + tocMenu.remove(); + } + + editormd.markdownToCRenderer(markdownToC, tocContainer, settings.tocDropdown, settings.tocStartLevel); + + if (settings.tocDropdown || tocContainer.find("." + this.classPrefix + "toc-menu").length > 0) + { + editormd.tocDropdownMenu(tocContainer, (settings.tocTitle !== "") ? settings.tocTitle : this.lang.tocTitle); + } + + if (settings.tocContainer !== "") + { + previewContainer.find(".markdown-toc").css("border", "none"); + } + } + + if (settings.tex) + { + if (!editormd.kaTeXLoaded && settings.autoLoadModules) + { + editormd.loadKaTeX(function() { + editormd.$katex = katex; + editormd.kaTeXLoaded = true; + _this.katexRender(); + }); + } + else + { + editormd.$katex = katex; + this.katexRender(); + } + } + + if (settings.flowChart || settings.sequenceDiagram) + { + flowchartTimer = setTimeout(function(){ + clearTimeout(flowchartTimer); + _this.flowChartAndSequenceDiagramRender(); + flowchartTimer = null; + }, 10); + } + + if (state.loaded) + { + $.proxy(settings.onchange, this)(); + } + } + + return this; + }, + + /** + * 聚焦光标位置 + * Focusing the cursor position + * + * @returns {editormd} 返回editormd的实例对象 + */ + + focus : function() { + this.cm.focus(); + + return this; + }, + + /** + * 设置光标的位置 + * Set cursor position + * + * @param {Object} cursor 要设置的光标位置键值对象,例:{line:1, ch:0} + * @returns {editormd} 返回editormd的实例对象 + */ + + setCursor : function(cursor) { + this.cm.setCursor(cursor); + + return this; + }, + + /** + * 获取当前光标的位置 + * Get the current position of the cursor + * + * @returns {Cursor} 返回一个光标Cursor对象 + */ + + getCursor : function() { + return this.cm.getCursor(); + }, + + /** + * 设置光标选中的范围 + * Set cursor selected ranges + * + * @param {Object} from 开始位置的光标键值对象,例:{line:1, ch:0} + * @param {Object} to 结束位置的光标键值对象,例:{line:1, ch:0} + * @returns {editormd} 返回editormd的实例对象 + */ + + setSelection : function(from, to) { + + this.cm.setSelection(from, to); + + return this; + }, + + /** + * 获取光标选中的文本 + * Get the texts from cursor selected + * + * @returns {String} 返回选中文本的字符串形式 + */ + + getSelection : function() { + return this.cm.getSelection(); + }, + + /** + * 设置光标选中的文本范围 + * Set the cursor selection ranges + * + * @param {Array} ranges cursor selection ranges array + * @returns {Array} return this + */ + + setSelections : function(ranges) { + this.cm.setSelections(ranges); + + return this; + }, + + /** + * 获取光标选中的文本范围 + * Get the cursor selection ranges + * + * @returns {Array} return selection ranges array + */ + + getSelections : function() { + return this.cm.getSelections(); + }, + + /** + * 替换当前光标选中的文本或在当前光标处插入新字符 + * Replace the text at the current cursor selected or insert a new character at the current cursor position + * + * @param {String} value 要插入的字符值 + * @returns {editormd} 返回editormd的实例对象 + */ + + replaceSelection : function(value) { + this.cm.replaceSelection(value); + + return this; + }, + + /** + * 在当前光标处插入新字符 + * Insert a new character at the current cursor position + * + * 同replaceSelection()方法 + * With the replaceSelection() method + * + * @param {String} value 要插入的字符值 + * @returns {editormd} 返回editormd的实例对象 + */ + + insertValue : function(value) { + this.replaceSelection(value); + + return this; + }, + + /** + * 追加markdown + * append Markdown to editor + * + * @param {String} md 要追加的markdown源文档 + * @returns {editormd} 返回editormd的实例对象 + */ + + appendMarkdown : function(md) { + var settings = this.settings; + var cm = this.cm; + + cm.setValue(cm.getValue() + md); + + return this; + }, + + /** + * 设置和传入编辑器的markdown源文档 + * Set Markdown source document + * + * @param {String} md 要传入的markdown源文档 + * @returns {editormd} 返回editormd的实例对象 + */ + + setMarkdown : function(md) { + this.cm.setValue(md || this.settings.markdown); + + return this; + }, + + /** + * 获取编辑器的markdown源文档 + * Set Editor.md markdown/CodeMirror value + * + * @returns {editormd} 返回editormd的实例对象 + */ + + getMarkdown : function() { + return this.cm.getValue(); + }, + + /** + * 获取编辑器的源文档 + * Get CodeMirror value + * + * @returns {editormd} 返回editormd的实例对象 + */ + + getValue : function() { + return this.cm.getValue(); + }, + + /** + * 设置编辑器的源文档 + * Set CodeMirror value + * + * @param {String} value set code/value/string/text + * @returns {editormd} 返回editormd的实例对象 + */ + + setValue : function(value) { + this.cm.setValue(value); + + return this; + }, + + /** + * 清空编辑器 + * Empty CodeMirror editor container + * + * @returns {editormd} 返回editormd的实例对象 + */ + + clear : function() { + this.cm.setValue(""); + + return this; + }, + + /** + * 获取解析后存放在Textarea的HTML源码 + * Get parsed html code from Textarea + * + * @returns {String} 返回HTML源码 + */ + + getHTML : function() { + if (!this.settings.saveHTMLToTextarea) + { + alert("Error: settings.saveHTMLToTextarea == false"); + + return false; + } + + return this.htmlTextarea.val(); + }, + + /** + * getHTML()的别名 + * getHTML (alias) + * + * @returns {String} Return html code 返回HTML源码 + */ + + getTextareaSavedHTML : function() { + return this.getHTML(); + }, + + /** + * 获取预览窗口的HTML源码 + * Get html from preview container + * + * @returns {editormd} 返回editormd的实例对象 + */ + + getPreviewedHTML : function() { + if (!this.settings.watch) + { + alert("Error: settings.watch == false"); + + return false; + } + + return this.previewContainer.html(); + }, + + /** + * 开启实时预览 + * Enable real-time watching + * + * @returns {editormd} 返回editormd的实例对象 + */ + + watch : function(callback) { + var settings = this.settings; + + if ($.inArray(settings.mode, ["gfm", "markdown"]) < 0) + { + return this; + } + + this.state.watching = settings.watch = true; + this.preview.show(); + + if (this.toolbar) + { + var watchIcon = settings.toolbarIconsClass.watch; + var unWatchIcon = settings.toolbarIconsClass.unwatch; + + var icon = this.toolbar.find(".fa[name=watch]"); + icon.parent().attr("title", settings.lang.toolbar.watch); + icon.removeClass(unWatchIcon).addClass(watchIcon); + } + + this.codeMirror.css("border-right", "1px solid #ddd").width(this.editor.width() / 2); + + timer = 0; + + this.save().resize(); + + if (!settings.onwatch) + { + settings.onwatch = callback || function() {}; + } + + $.proxy(settings.onwatch, this)(); + + return this; + }, + + /** + * 关闭实时预览 + * Disable real-time watching + * + * @returns {editormd} 返回editormd的实例对象 + */ + + unwatch : function(callback) { + var settings = this.settings; + this.state.watching = settings.watch = false; + this.preview.hide(); + + if (this.toolbar) + { + var watchIcon = settings.toolbarIconsClass.watch; + var unWatchIcon = settings.toolbarIconsClass.unwatch; + + var icon = this.toolbar.find(".fa[name=watch]"); + icon.parent().attr("title", settings.lang.toolbar.unwatch); + icon.removeClass(watchIcon).addClass(unWatchIcon); + } + + this.codeMirror.css("border-right", "none").width(this.editor.width()); + + this.resize(); + + if (!settings.onunwatch) + { + settings.onunwatch = callback || function() {}; + } + + $.proxy(settings.onunwatch, this)(); + + return this; + }, + + /** + * 显示编辑器 + * Show editor + * + * @param {Function} [callback=function()] 回调函数 + * @returns {editormd} 返回editormd的实例对象 + */ + + show : function(callback) { + callback = callback || function() {}; + + var _this = this; + this.editor.show(0, function() { + $.proxy(callback, _this)(); + }); + + return this; + }, + + /** + * 隐藏编辑器 + * Hide editor + * + * @param {Function} [callback=function()] 回调函数 + * @returns {editormd} 返回editormd的实例对象 + */ + + hide : function(callback) { + callback = callback || function() {}; + + var _this = this; + this.editor.hide(0, function() { + $.proxy(callback, _this)(); + }); + + return this; + }, + + /** + * 隐藏编辑器部分,只预览HTML + * Enter preview html state + * + * @returns {editormd} 返回editormd的实例对象 + */ + + previewing : function() { + + var _this = this; + var editor = this.editor; + var preview = this.preview; + var toolbar = this.toolbar; + var settings = this.settings; + var codeMirror = this.codeMirror; + var previewContainer = this.previewContainer; + + if ($.inArray(settings.mode, ["gfm", "markdown"]) < 0) { + return this; + } + + if (settings.toolbar && toolbar) { + toolbar.toggle(); + toolbar.find(".fa[name=preview]").toggleClass("active"); + } + + codeMirror.toggle(); + + var escHandle = function(event) { + if (event.shiftKey && event.keyCode === 27) { + _this.previewed(); + } + }; + + if (codeMirror.css("display") === "none") // 为了兼容Zepto,而不使用codeMirror.is(":hidden") + { + this.state.preview = true; + + if (this.state.fullscreen) { + preview.css("background", "#fff"); + } + + editor.find("." + this.classPrefix + "preview-close-btn").show().bind(editormd.mouseOrTouch("click", "touchend"), function(){ + _this.previewed(); + }); + + if (!settings.watch) + { + this.save(); + } + else + { + previewContainer.css("padding", ""); + } + + previewContainer.addClass(this.classPrefix + "preview-active"); + + preview.show().css({ + position : "", + top : 0, + width : editor.width(), + height : (settings.autoHeight && !this.state.fullscreen) ? "auto" : editor.height() + }); + + if (this.state.loaded) + { + $.proxy(settings.onpreviewing, this)(); + } + + $(window).bind("keyup", escHandle); + } + else + { + $(window).unbind("keyup", escHandle); + this.previewed(); + } + }, + + /** + * 显示编辑器部分,退出只预览HTML + * Exit preview html state + * + * @returns {editormd} 返回editormd的实例对象 + */ + + previewed : function() { + + var editor = this.editor; + var preview = this.preview; + var toolbar = this.toolbar; + var settings = this.settings; + var previewContainer = this.previewContainer; + var previewCloseBtn = editor.find("." + this.classPrefix + "preview-close-btn"); + + this.state.preview = false; + + this.codeMirror.show(); + + if (settings.toolbar) { + toolbar.show(); + } + + preview[(settings.watch) ? "show" : "hide"](); + + previewCloseBtn.hide().unbind(editormd.mouseOrTouch("click", "touchend")); + + previewContainer.removeClass(this.classPrefix + "preview-active"); + + if (settings.watch) + { + previewContainer.css("padding", "20px"); + } + + preview.css({ + background : null, + position : "absolute", + width : editor.width() / 2, + height : (settings.autoHeight && !this.state.fullscreen) ? "auto" : editor.height() - toolbar.height(), + top : (settings.toolbar) ? toolbar.height() : 0 + }); + + if (this.state.loaded) + { + $.proxy(settings.onpreviewed, this)(); + } + + return this; + }, + + /** + * 编辑器全屏显示 + * Fullscreen show + * + * @returns {editormd} 返回editormd的实例对象 + */ + + fullscreen : function() { + + var _this = this; + var state = this.state; + var editor = this.editor; + var preview = this.preview; + var toolbar = this.toolbar; + var settings = this.settings; + var fullscreenClass = this.classPrefix + "fullscreen"; + + if (toolbar) { + toolbar.find(".fa[name=fullscreen]").parent().toggleClass("active"); + } + + var escHandle = function(event) { + if (!event.shiftKey && event.keyCode === 27) + { + if (state.fullscreen) + { + _this.fullscreenExit(); + } + } + }; + + if (!editor.hasClass(fullscreenClass)) + { + state.fullscreen = true; + + $("html,body").css("overflow", "hidden"); + + editor.css({ + width : $(window).width(), + height : $(window).height() + }).addClass(fullscreenClass); + + this.resize(); + + $.proxy(settings.onfullscreen, this)(); + + $(window).bind("keyup", escHandle); + } + else + { + $(window).unbind("keyup", escHandle); + this.fullscreenExit(); + } + + return this; + }, + + /** + * 编辑器退出全屏显示 + * Exit fullscreen state + * + * @returns {editormd} 返回editormd的实例对象 + */ + + fullscreenExit : function() { + + var editor = this.editor; + var settings = this.settings; + var toolbar = this.toolbar; + var fullscreenClass = this.classPrefix + "fullscreen"; + + this.state.fullscreen = false; + + if (toolbar) { + toolbar.find(".fa[name=fullscreen]").parent().removeClass("active"); + } + + $("html,body").css("overflow", ""); + + editor.css({ + width : editor.data("oldWidth"), + height : editor.data("oldHeight") + }).removeClass(fullscreenClass); + + this.resize(); + + $.proxy(settings.onfullscreenExit, this)(); + + return this; + }, + + /** + * 加载并执行插件 + * Load and execute the plugin + * + * @param {String} name plugin name / function name + * @param {String} path plugin load path + * @returns {editormd} 返回editormd的实例对象 + */ + + executePlugin : function(name, path) { + + var _this = this; + var cm = this.cm; + var settings = this.settings; + + path = settings.pluginPath + path; + + if (typeof define === "function") + { + if (typeof this[name] === "undefined") + { + alert("Error: " + name + " plugin is not found, you are not load this plugin."); + + return this; + } + + this[name](cm); + + return this; + } + + if ($.inArray(path, editormd.loadFiles.plugin) < 0) + { + editormd.loadPlugin(path, function() { + editormd.loadPlugins[name] = _this[name]; + _this[name](cm); + }); + } + else + { + $.proxy(editormd.loadPlugins[name], this)(cm); + } + + return this; + }, + + /** + * 搜索替换 + * Search & replace + * + * @param {String} command CodeMirror serach commands, "find, fintNext, fintPrev, clearSearch, replace, replaceAll" + * @returns {editormd} return this + */ + + search : function(command) { + var settings = this.settings; + + if (!settings.searchReplace) + { + alert("Error: settings.searchReplace == false"); + return this; + } + + if (!settings.readOnly) + { + this.cm.execCommand(command || "find"); + } + + return this; + }, + + searchReplace : function() { + this.search("replace"); + + return this; + }, + + searchReplaceAll : function() { + this.search("replaceAll"); + + return this; + } + }; + + editormd.fn.init.prototype = editormd.fn; + + /** + * 锁屏 + * lock screen when dialog opening + * + * @returns {void} + */ + + editormd.dialogLockScreen = function() { + var settings = this.settings || {dialogLockScreen : true}; + + if (settings.dialogLockScreen) + { + $("html,body").css("overflow", "hidden"); + this.resize(); + } + }; + + /** + * 显示透明背景层 + * Display mask layer when dialog opening + * + * @param {Object} dialog dialog jQuery object + * @returns {void} + */ + + editormd.dialogShowMask = function(dialog) { + var editor = this.editor; + var settings = this.settings || {dialogShowMask : true}; + + dialog.css({ + top : ($(window).height() - dialog.height()) / 2 + "px", + left : ($(window).width() - dialog.width()) / 2 + "px" + }); + + if (settings.dialogShowMask) { + editor.children("." + this.classPrefix + "mask").css("z-index", parseInt(dialog.css("z-index")) - 1).show(); + } + }; + + editormd.toolbarHandlers = { + undo : function() { + this.cm.undo(); + }, + + redo : function() { + this.cm.redo(); + }, + + bold : function() { + var cm = this.cm; + var cursor = cm.getCursor(); + var selection = cm.getSelection(); + + cm.replaceSelection("**" + selection + "**"); + + if(selection === "") { + cm.setCursor(cursor.line, cursor.ch + 2); + } + }, + + del : function() { + var cm = this.cm; + var cursor = cm.getCursor(); + var selection = cm.getSelection(); + + cm.replaceSelection("~~" + selection + "~~"); + + if(selection === "") { + cm.setCursor(cursor.line, cursor.ch + 2); + } + }, + + italic : function() { + var cm = this.cm; + var cursor = cm.getCursor(); + var selection = cm.getSelection(); + + cm.replaceSelection("*" + selection + "*"); + + if(selection === "") { + cm.setCursor(cursor.line, cursor.ch + 1); + } + }, + + quote : function() { + var cm = this.cm; + var cursor = cm.getCursor(); + var selection = cm.getSelection(); + + if (cursor.ch !== 0) + { + cm.setCursor(cursor.line, 0); + cm.replaceSelection("> " + selection); + cm.setCursor(cursor.line, cursor.ch + 2); + } + else + { + cm.replaceSelection("> " + selection); + } + + //cm.replaceSelection("> " + selection); + //cm.setCursor(cursor.line, (selection === "") ? cursor.ch + 2 : cursor.ch + selection.length + 2); + }, + + ucfirst : function() { + var cm = this.cm; + var selection = cm.getSelection(); + var selections = cm.listSelections(); + + cm.replaceSelection(editormd.firstUpperCase(selection)); + cm.setSelections(selections); + }, + + ucwords : function() { + var cm = this.cm; + var selection = cm.getSelection(); + var selections = cm.listSelections(); + + cm.replaceSelection(editormd.wordsFirstUpperCase(selection)); + cm.setSelections(selections); + }, + + uppercase : function() { + var cm = this.cm; + var selection = cm.getSelection(); + var selections = cm.listSelections(); + + cm.replaceSelection(selection.toUpperCase()); + cm.setSelections(selections); + }, + + lowercase : function() { + var cm = this.cm; + var cursor = cm.getCursor(); + var selection = cm.getSelection(); + var selections = cm.listSelections(); + + cm.replaceSelection(selection.toLowerCase()); + cm.setSelections(selections); + }, + + h1 : function() { + var cm = this.cm; + var cursor = cm.getCursor(); + var selection = cm.getSelection(); + + if (cursor.ch !== 0) + { + cm.setCursor(cursor.line, 0); + cm.replaceSelection("# " + selection); + cm.setCursor(cursor.line, cursor.ch + 2); + } + else + { + cm.replaceSelection("# " + selection); + } + }, + + h2 : function() { + var cm = this.cm; + var cursor = cm.getCursor(); + var selection = cm.getSelection(); + + if (cursor.ch !== 0) + { + cm.setCursor(cursor.line, 0); + cm.replaceSelection("## " + selection); + cm.setCursor(cursor.line, cursor.ch + 3); + } + else + { + cm.replaceSelection("## " + selection); + } + }, + + h3 : function() { + var cm = this.cm; + var cursor = cm.getCursor(); + var selection = cm.getSelection(); + + if (cursor.ch !== 0) + { + cm.setCursor(cursor.line, 0); + cm.replaceSelection("### " + selection); + cm.setCursor(cursor.line, cursor.ch + 4); + } + else + { + cm.replaceSelection("### " + selection); + } + }, + + h4 : function() { + var cm = this.cm; + var cursor = cm.getCursor(); + var selection = cm.getSelection(); + + if (cursor.ch !== 0) + { + cm.setCursor(cursor.line, 0); + cm.replaceSelection("#### " + selection); + cm.setCursor(cursor.line, cursor.ch + 5); + } + else + { + cm.replaceSelection("#### " + selection); + } + }, + + h5 : function() { + var cm = this.cm; + var cursor = cm.getCursor(); + var selection = cm.getSelection(); + + if (cursor.ch !== 0) + { + cm.setCursor(cursor.line, 0); + cm.replaceSelection("##### " + selection); + cm.setCursor(cursor.line, cursor.ch + 6); + } + else + { + cm.replaceSelection("##### " + selection); + } + }, + + h6 : function() { + var cm = this.cm; + var cursor = cm.getCursor(); + var selection = cm.getSelection(); + + if (cursor.ch !== 0) + { + cm.setCursor(cursor.line, 0); + cm.replaceSelection("###### " + selection); + cm.setCursor(cursor.line, cursor.ch + 7); + } + else + { + cm.replaceSelection("###### " + selection); + } + }, + + "list-ul" : function() { + var cm = this.cm; + var cursor = cm.getCursor(); + var selection = cm.getSelection(); + + if (selection === "") + { + cm.replaceSelection("- " + selection); + } + else + { + var selectionText = selection.split("\n"); + + for (var i = 0, len = selectionText.length; i < len; i++) + { + selectionText[i] = (selectionText[i] === "") ? "" : "- " + selectionText[i]; + } + + cm.replaceSelection(selectionText.join("\n")); + } + }, + + "list-ol" : function() { + var cm = this.cm; + var cursor = cm.getCursor(); + var selection = cm.getSelection(); + + if(selection === "") + { + cm.replaceSelection("1. " + selection); + } + else + { + var selectionText = selection.split("\n"); + + for (var i = 0, len = selectionText.length; i < len; i++) + { + selectionText[i] = (selectionText[i] === "") ? "" : (i+1) + ". " + selectionText[i]; + } + + cm.replaceSelection(selectionText.join("\n")); + } + }, + + hr : function() { + var cm = this.cm; + var cursor = cm.getCursor(); + var selection = cm.getSelection(); + + cm.replaceSelection(((cursor.ch !== 0) ? "\n\n" : "\n") + "------------\n\n"); + }, + + tex : function() { + if (!this.settings.tex) + { + alert("settings.tex === false"); + return this; + } + + var cm = this.cm; + var cursor = cm.getCursor(); + var selection = cm.getSelection(); + + cm.replaceSelection("$$" + selection + "$$"); + + if(selection === "") { + cm.setCursor(cursor.line, cursor.ch + 2); + } + }, + + link : function() { + this.executePlugin("linkDialog", "link-dialog/link-dialog"); + }, + + "reference-link" : function() { + this.executePlugin("referenceLinkDialog", "reference-link-dialog/reference-link-dialog"); + }, + + pagebreak : function() { + if (!this.settings.pageBreak) + { + alert("settings.pageBreak === false"); + return this; + } + + var cm = this.cm; + var selection = cm.getSelection(); + + cm.replaceSelection("\r\n[========]\r\n"); + }, + + image : function() { + this.executePlugin("imageDialog", "image-dialog/image-dialog"); + }, + + code : function() { + var cm = this.cm; + var cursor = cm.getCursor(); + var selection = cm.getSelection(); + + cm.replaceSelection("`" + selection + "`"); + + if (selection === "") { + cm.setCursor(cursor.line, cursor.ch + 1); + } + }, + + "code-block" : function() { + this.executePlugin("codeBlockDialog", "code-block-dialog/code-block-dialog"); + }, + + "preformatted-text" : function() { + this.executePlugin("preformattedTextDialog", "preformatted-text-dialog/preformatted-text-dialog"); + }, + + table : function() { + this.executePlugin("tableDialog", "table-dialog/table-dialog"); + }, + + datetime : function() { + var cm = this.cm; + var selection = cm.getSelection(); + var date = new Date(); + var langName = this.settings.lang.name; + var datefmt = editormd.dateFormat() + " " + editormd.dateFormat((langName === "zh-cn" || langName === "zh-tw") ? "cn-week-day" : "week-day"); + + cm.replaceSelection(datefmt); + }, + + emoji : function() { + this.executePlugin("emojiDialog", "emoji-dialog/emoji-dialog"); + }, + + "html-entities" : function() { + this.executePlugin("htmlEntitiesDialog", "html-entities-dialog/html-entities-dialog"); + }, + + "goto-line" : function() { + this.executePlugin("gotoLineDialog", "goto-line-dialog/goto-line-dialog"); + }, + + watch : function() { + this[this.settings.watch ? "unwatch" : "watch"](); + }, + + preview : function() { + this.previewing(); + }, + + fullscreen : function() { + this.fullscreen(); + }, + + clear : function() { + this.clear(); + }, + + search : function() { + this.search(); + }, + + help : function() { + this.executePlugin("helpDialog", "help-dialog/help-dialog"); + }, + + info : function() { + this.showInfoDialog(); + } + }; + + editormd.keyMaps = { + "Ctrl-1" : "h1", + "Ctrl-2" : "h2", + "Ctrl-3" : "h3", + "Ctrl-4" : "h4", + "Ctrl-5" : "h5", + "Ctrl-6" : "h6", + "Ctrl-B" : "bold", // if this is string == editormd.toolbarHandlers.xxxx + "Ctrl-D" : "datetime", + + "Ctrl-E" : function() { // emoji + var cm = this.cm; + var cursor = cm.getCursor(); + var selection = cm.getSelection(); + + if (!this.settings.emoji) + { + alert("Error: settings.emoji == false"); + return ; + } + + cm.replaceSelection(":" + selection + ":"); + + if (selection === "") { + cm.setCursor(cursor.line, cursor.ch + 1); + } + }, + "Ctrl-Alt-G" : "goto-line", + "Ctrl-H" : "hr", + "Ctrl-I" : "italic", + "Ctrl-K" : "code", + + "Ctrl-L" : function() { + var cm = this.cm; + var cursor = cm.getCursor(); + var selection = cm.getSelection(); + + var title = (selection === "") ? "" : " \""+selection+"\""; + + cm.replaceSelection("[" + selection + "]("+title+")"); + + if (selection === "") { + cm.setCursor(cursor.line, cursor.ch + 1); + } + }, + "Ctrl-U" : "list-ul", + + "Shift-Ctrl-A" : function() { + var cm = this.cm; + var cursor = cm.getCursor(); + var selection = cm.getSelection(); + + if (!this.settings.atLink) + { + alert("Error: settings.atLink == false"); + return ; + } + + cm.replaceSelection("@" + selection); + + if (selection === "") { + cm.setCursor(cursor.line, cursor.ch + 1); + } + }, + + "Shift-Ctrl-C" : "code", + "Shift-Ctrl-Q" : "quote", + "Shift-Ctrl-S" : "del", + "Shift-Ctrl-K" : "tex", // KaTeX + + "Shift-Alt-C" : function() { + var cm = this.cm; + var cursor = cm.getCursor(); + var selection = cm.getSelection(); + + cm.replaceSelection(["```", selection, "```"].join("\n")); + + if (selection === "") { + cm.setCursor(cursor.line, cursor.ch + 3); + } + }, + + "Shift-Ctrl-Alt-C" : "code-block", + "Shift-Ctrl-H" : "html-entities", + "Shift-Alt-H" : "help", + "Shift-Ctrl-E" : "emoji", + "Shift-Ctrl-U" : "uppercase", + "Shift-Alt-U" : "ucwords", + "Shift-Ctrl-Alt-U" : "ucfirst", + "Shift-Alt-L" : "lowercase", + + "Shift-Ctrl-I" : function() { + var cm = this.cm; + var cursor = cm.getCursor(); + var selection = cm.getSelection(); + + var title = (selection === "") ? "" : " \""+selection+"\""; + + cm.replaceSelection(""); + + if (selection === "") { + cm.setCursor(cursor.line, cursor.ch + 4); + } + }, + + "Shift-Ctrl-Alt-I" : "image", + "Shift-Ctrl-L" : "link", + "Shift-Ctrl-O" : "list-ol", + "Shift-Ctrl-P" : "preformatted-text", + "Shift-Ctrl-T" : "table", + "Shift-Alt-P" : "pagebreak", + "F9" : "watch", + "F10" : "preview", + "F11" : "fullscreen", + }; + + /** + * 清除字符串两边的空格 + * Clear the space of strings both sides. + * + * @param {String} str string + * @returns {String} trimed string + */ + + var trim = function(str) { + return (!String.prototype.trim) ? str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, "") : str.trim(); + }; + + editormd.trim = trim; + + /** + * 所有单词首字母大写 + * Words first to uppercase + * + * @param {String} str string + * @returns {String} string + */ + + var ucwords = function (str) { + return str.toLowerCase().replace(/\b(\w)|\s(\w)/g, function($1) { + return $1.toUpperCase(); + }); + }; + + editormd.ucwords = editormd.wordsFirstUpperCase = ucwords; + + /** + * 字符串首字母大写 + * Only string first char to uppercase + * + * @param {String} str string + * @returns {String} string + */ + + var firstUpperCase = function(str) { + return str.toLowerCase().replace(/\b(\w)/, function($1){ + return $1.toUpperCase(); + }); + }; + + var ucfirst = firstUpperCase; + + editormd.firstUpperCase = editormd.ucfirst = firstUpperCase; + + editormd.urls = { + atLinkBase : "https://github.com/" + }; + + editormd.regexs = { + atLink : /@(\w+)/g, + email : /(\w+)@(\w+)\.(\w+)\.?(\w+)?/g, + emailLink : /(mailto:)?([\w\.\_]+)@(\w+)\.(\w+)\.?(\w+)?/g, + emoji : /:([\w\+-]+):/g, + emojiDatetime : /(\d{2}:\d{2}:\d{2})/g, + twemoji : /:(tw-([\w]+)-?(\w+)?):/g, + fontAwesome : /:(fa-([\w]+)(-(\w+)){0,}):/g, + editormdLogo : /:(editormd-logo-?(\w+)?):/g, + pageBreak : /^\[[=]{8,}\]$/ + }; + + // Emoji graphics files url path + editormd.emoji = { + path : "http://www.emoji-cheat-sheet.com/graphics/emojis/", + ext : ".png" + }; + + // Twitter Emoji (Twemoji) graphics files url path + editormd.twemoji = { + path : "http://twemoji.maxcdn.com/36x36/", + ext : ".png" + }; + + /** + * 自定义marked的解析器 + * Custom Marked renderer rules + * + * @param {Array} markdownToC 传入用于接收TOC的数组 + * @returns {Renderer} markedRenderer 返回marked的Renderer自定义对象 + */ + + editormd.markedRenderer = function(markdownToC, options) { + var defaults = { + toc : true, // Table of contents + tocm : false, + tocStartLevel : 1, // Said from H1 to create ToC + pageBreak : true, + atLink : true, // for @link + emailLink : true, // for mail address auto link + taskList : false, // Enable Github Flavored Markdown task lists + emoji : false, // :emoji: , Support Twemoji, fontAwesome, Editor.md logo emojis. + tex : false, // TeX(LaTeX), based on KaTeX + flowChart : false, // flowChart.js only support IE9+ + sequenceDiagram : false, // sequenceDiagram.js only support IE9+ + }; + + var settings = $.extend(defaults, options || {}); + var marked = editormd.$marked; + var markedRenderer = new marked.Renderer(); + markdownToC = markdownToC || []; + + var regexs = editormd.regexs; + var atLinkReg = regexs.atLink; + var emojiReg = regexs.emoji; + var emailReg = regexs.email; + var emailLinkReg = regexs.emailLink; + var twemojiReg = regexs.twemoji; + var faIconReg = regexs.fontAwesome; + var editormdLogoReg = regexs.editormdLogo; + var pageBreakReg = regexs.pageBreak; + + markedRenderer.emoji = function(text) { + + text = text.replace(editormd.regexs.emojiDatetime, function($1) { + return $1.replace(/:/g, ":"); + }); + + var matchs = text.match(emojiReg); + + if (!matchs || !settings.emoji) { + return text; + } + + for (var i = 0, len = matchs.length; i < len; i++) + { + if (matchs[i] === ":+1:") { + matchs[i] = ":\\+1:"; + } + + text = text.replace(new RegExp(matchs[i]), function($1, $2){ + var faMatchs = $1.match(faIconReg); + var name = $1.replace(/:/g, ""); + + if (faMatchs) + { + for (var fa = 0, len1 = faMatchs.length; fa < len1; fa++) + { + var faName = faMatchs[fa].replace(/:/g, ""); + + return "<i class=\"fa " + faName + " fa-emoji\" title=\"" + faName.replace("fa-", "") + "\"></i>"; + } + } + else + { + var emdlogoMathcs = $1.match(editormdLogoReg); + var twemojiMatchs = $1.match(twemojiReg); + + if (emdlogoMathcs) + { + for (var x = 0, len2 = emdlogoMathcs.length; x < len2; x++) + { + var logoName = emdlogoMathcs[x].replace(/:/g, ""); + return "<i class=\"" + logoName + "\" title=\"Editor.md logo (" + logoName + ")\"></i>"; + } + } + else if (twemojiMatchs) + { + for (var t = 0, len3 = twemojiMatchs.length; t < len3; t++) + { + var twe = twemojiMatchs[t].replace(/:/g, "").replace("tw-", ""); + return "<img src=\"" + editormd.twemoji.path + twe + editormd.twemoji.ext + "\" title=\"twemoji-" + twe + "\" alt=\"twemoji-" + twe + "\" class=\"emoji twemoji\" />"; + } + } + else + { + var src = (name === "+1") ? "plus1" : name; + src = (src === "black_large_square") ? "black_square" : src; + src = (src === "moon") ? "waxing_gibbous_moon" : src; + + return "<img src=\"" + editormd.emoji.path + src + editormd.emoji.ext + "\" class=\"emoji\" title=\":" + name + ":\" alt=\":" + name + ":\" />"; + } + } + }); + } + + return text; + }; + + markedRenderer.atLink = function(text) { + + if (atLinkReg.test(text)) + { + if (settings.atLink) + { + text = text.replace(emailReg, function($1, $2, $3, $4) { + return $1.replace(/@/g, "_#_@_#_"); + }); + + text = text.replace(atLinkReg, function($1, $2) { + return "<a href=\"" + editormd.urls.atLinkBase + "" + $2 + "\" title=\"@" + $2 + "\" class=\"at-link\">" + $1 + "</a>"; + }).replace(/_#_@_#_/g, "@"); + } + + if (settings.emailLink) + { + text = text.replace(emailLinkReg, function($1, $2, $3, $4, $5) { + return (!$2 && $.inArray($5, "jpg|jpeg|png|gif|webp|ico|icon|pdf".split("|")) < 0) ? "<a href=\"mailto:" + $1 + "\">"+$1+"</a>" : $1; + }); + } + + return text; + } + + return text; + }; + + markedRenderer.link = function (href, title, text) { + + if (this.options.sanitize) { + try { + var prot = decodeURIComponent(unescape(href)).replace(/[^\w:]/g,"").toLowerCase(); + } catch(e) { + return ""; + } + + if (prot.indexOf("javascript:") === 0) { + return ""; + } + } + + var out = "<a href=\"" + href + "\""; + + if (atLinkReg.test(title) || atLinkReg.test(text)) + { + if (title) + { + out += " title=\"" + title.replace(/@/g, "@"); + } + + return out + "\">" + text.replace(/@/g, "@") + "</a>"; + } + + if (title) { + out += " title=\"" + title + "\""; + } + + out += ">" + text + "</a>"; + + return out; + }; + + markedRenderer.heading = function(text, level, raw) { + + var linkText = text; + var hasLinkReg = /\s*\<a\s*href\=\"(.*)\"\s*([^\>]*)\>(.*)\<\/a\>\s*/; + var getLinkTextReg = /\s*\<a\s*([^\>]+)\>([^\>]*)\<\/a\>\s*/g; + + if (hasLinkReg.test(text)) + { + var tempText = []; + text = text.split(/\<a\s*([^\>]+)\>([^\>]*)\<\/a\>/); + + for (var i = 0, len = text.length; i < len; i++) + { + tempText.push(text[i].replace(/\s*href\=\"(.*)\"\s*/g, "")); + } + + text = tempText.join(" "); + } + + text = trim(text); + + var escapedText = text.toLowerCase().replace(/[^\w]+/g, "-"); + var toc = { + text : text, + level : level, + slug : escapedText + }; + + var isChinese = /^[\u4e00-\u9fa5]+$/.test(text); + var id = (isChinese) ? escape(text).replace(/\%/g, "") : text.toLowerCase().replace(/[^\w]+/g, "-"); + + markdownToC.push(toc); + + var headingHTML = "<h" + level + " id=\"h"+ level + "-" + this.options.headerPrefix + id +"\">"; + + headingHTML += "<a name=\"" + text + "\" class=\"reference-link\"></a>"; + headingHTML += "<span class=\"header-link octicon octicon-link\"></span>"; + headingHTML += (hasLinkReg) ? this.atLink(this.emoji(linkText)) : this.atLink(this.emoji(text)); + headingHTML += "</h" + level + ">"; + + return headingHTML; + }; + + markedRenderer.pageBreak = function(text) { + if (pageBreakReg.test(text) && settings.pageBreak) + { + text = "<hr style=\"page-break-after:always;\" class=\"page-break editormd-page-break\" />"; + } + + return text; + }; + + markedRenderer.paragraph = function(text) { + var isTeXInline = /\$\$(.*)\$\$/g.test(text); + var isTeXLine = /^\$\$(.*)\$\$$/.test(text); + var isTeXAddClass = (isTeXLine) ? " class=\"" + editormd.classNames.tex + "\"" : ""; + var isToC = (settings.tocm) ? /^(\[TOC\]|\[TOCM\])$/.test(text) : /^\[TOC\]$/.test(text); + var isToCMenu = /^\[TOCM\]$/.test(text); + + if (!isTeXLine && isTeXInline) + { + text = text.replace(/(\$\$([^\$]*)\$\$)+/g, function($1, $2) { + return "<span class=\"" + editormd.classNames.tex + "\">" + $2.replace(/\$/g, "") + "</span>"; + }); + } + else + { + text = (isTeXLine) ? text.replace(/\$/g, "") : text; + } + + var tocHTML = "<div class=\"markdown-toc editormd-markdown-toc\">" + text + "</div>"; + + return (isToC) ? ( (isToCMenu) ? "<div class=\"editormd-toc-menu\">" + tocHTML + "</div><br/>" : tocHTML ) + : ( (pageBreakReg.test(text)) ? this.pageBreak(text) : "<p" + isTeXAddClass + ">" + this.atLink(this.emoji(text)) + "</p>\n" ); + }; + + markedRenderer.code = function (code, lang, escaped) { + + if (lang === "seq" || lang === "sequence") + { + return "<div class=\"sequence-diagram\">" + code + "</div>"; + } + else if ( lang === "flow") + { + return "<div class=\"flowchart\">" + code + "</div>"; + } + else if ( lang === "math" || lang === "latex" || lang === "katex") + { + return "<p class=\"" + editormd.classNames.tex + "\">" + code + "</p>"; + } + else + { + + return marked.Renderer.prototype.code.apply(this, arguments); + } + }; + + markedRenderer.tablecell = function(content, flags) { + var type = (flags.header) ? "th" : "td"; + var tag = (flags.align) ? "<" + type +" style=\"text-align:" + flags.align + "\">" : "<" + type + ">"; + + return tag + this.atLink(this.emoji(content)) + "</" + type + ">\n"; + }; + + markedRenderer.listitem = function(text) { + if (settings.taskList && /^\s*\[[x\s]\]\s*/.test(text)) + { + text = text.replace(/^\s*\[\s\]\s*/, "<input type=\"checkbox\" class=\"task-list-item-checkbox\" /> ") + .replace(/^\s*\[x\]\s*/, "<input type=\"checkbox\" class=\"task-list-item-checkbox\" checked disabled /> "); + + return "<li style=\"list-style: none;\">" + this.atLink(this.emoji(text)) + "</li>"; + } + else + { + return "<li>" + this.atLink(this.emoji(text)) + "</li>"; + } + }; + + return markedRenderer; + }; + + /** + * + * 生成TOC(Table of Contents) + * Creating ToC (Table of Contents) + * + * @param {Array} toc 从marked获取的TOC数组列表 + * @param {Element} container 插入TOC的容器元素 + * @param {Integer} startLevel Hx 起始层级 + * @returns {Object} tocContainer 返回ToC列表容器层的jQuery对象元素 + */ + + editormd.markdownToCRenderer = function(toc, container, tocDropdown, startLevel) { + + var html = ""; + var lastLevel = 0; + var classPrefix = this.classPrefix; + + startLevel = startLevel || 1; + + for (var i = 0, len = toc.length; i < len; i++) + { + var text = toc[i].text; + var level = toc[i].level; + + if (level < startLevel) { + continue; + } + + if (level > lastLevel) + { + html += ""; + } + else if (level < lastLevel) + { + html += (new Array(lastLevel - level + 2)).join("</ul></li>"); + } + else + { + html += "</ul></li>"; + } + + html += "<li><a class=\"toc-level-" + level + "\" href=\"#" + text + "\" level=\"" + level + "\">" + text + "</a><ul>"; + lastLevel = level; + } + + var tocContainer = container.find(".markdown-toc"); + + if ((tocContainer.length < 1 && container.attr("previewContainer") === "false")) + { + var tocHTML = "<div class=\"markdown-toc " + classPrefix + "markdown-toc\"></div>"; + + tocHTML = (tocDropdown) ? "<div class=\"" + classPrefix + "toc-menu\">" + tocHTML + "</div>" : tocHTML; + + container.html(tocHTML); + + tocContainer = container.find(".markdown-toc"); + } + + if (tocDropdown) + { + tocContainer.wrap("<div class=\"" + classPrefix + "toc-menu\"></div><br/>"); + } + + tocContainer.html("<ul class=\"markdown-toc-list\"></ul>").children(".markdown-toc-list").html(html.replace(/\r?\n?\<ul\>\<\/ul\>/g, "")); + + return tocContainer; + }; + + /** + * + * 生成TOC下拉菜单 + * Creating ToC dropdown menu + * + * @param {Object} container 插入TOC的容器jQuery对象元素 + * @param {String} tocTitle ToC title + * @returns {Object} return toc-menu object + */ + + editormd.tocDropdownMenu = function(container, tocTitle) { + + tocTitle = tocTitle || "Table of Contents"; + + var zindex = 400; + var tocMenus = container.find("." + this.classPrefix + "toc-menu"); + + tocMenus.each(function() { + var $this = $(this); + var toc = $this.children(".markdown-toc"); + var icon = "<i class=\"fa fa-angle-down\"></i>"; + var btn = "<a href=\"javascript:;\" class=\"toc-menu-btn\">" + icon + tocTitle + "</a>"; + var menu = toc.children("ul"); + var list = menu.find("li"); + + toc.append(btn); + + list.first().before("<li><h1>" + tocTitle + " " + icon + "</h1></li>"); + + $this.mouseover(function(){ + menu.show(); + + list.each(function(){ + var li = $(this); + var ul = li.children("ul"); + + if (ul.html() === "") + { + ul.remove(); + } + + if (ul.length > 0 && ul.html() !== "") + { + var firstA = li.children("a").first(); + + if (firstA.children(".fa").length < 1) + { + firstA.append( $(icon).css({ float:"right", paddingTop:"4px" }) ); + } + } + + li.mouseover(function(){ + ul.css("z-index", zindex).show(); + zindex += 1; + }).mouseleave(function(){ + ul.hide(); + }); + }); + }).mouseleave(function(){ + menu.hide(); + }); + }); + + return tocMenus; + }; + + /** + * 简单地过滤指定的HTML标签 + * Filter custom html tags + * + * @param {String} html 要过滤HTML + * @param {String} filters 要过滤的标签 + * @returns {String} html 返回过滤的HTML + */ + + editormd.filterHTMLTags = function(html, filters) { + + if (typeof html !== "string") { + html = new String(html); + } + + if (typeof filters !== "string") { + return html; + } + + var expression = filters.split("|"); + var filterTags = expression[0].split(","); + var attrs = expression[1]; + + for (var i = 0, len = filterTags.length; i < len; i++) + { + var tag = filterTags[i]; + + html = html.replace(new RegExp("\<\s*" + tag + "\s*([^\>]*)\>([^\>]*)\<\s*\/" + tag + "\s*\>", "igm"), ""); + } + + //return html; + + if (typeof attrs !== "undefined") + { + var htmlTagRegex = /\<(\w+)\s*([^\>]*)\>([^\>]*)\<\/(\w+)\>/ig; + + if (attrs === "*") + { + html = html.replace(htmlTagRegex, function($1, $2, $3, $4, $5) { + return "<" + $2 + ">" + $4 + "</" + $5 + ">"; + }); + } + else if (attrs === "on*") + { + html = html.replace(htmlTagRegex, function($1, $2, $3, $4, $5) { + var el = $("<" + $2 + ">" + $4 + "</" + $5 + ">"); + var _attrs = $($1)[0].attributes; + var $attrs = {}; + + $.each(_attrs, function(i, e) { + if (e.nodeName !== '"') $attrs[e.nodeName] = e.nodeValue; + }); + + $.each($attrs, function(i) { + if (i.indexOf("on") === 0) { + delete $attrs[i]; + } + }); + + el.attr($attrs); + + var text = (typeof el[1] !== "undefined") ? $(el[1]).text() : ""; + + return el[0].outerHTML + text; + }); + } + else + { + html = html.replace(htmlTagRegex, function($1, $2, $3, $4) { + var filterAttrs = attrs.split(","); + var el = $($1); + el.html($4); + + $.each(filterAttrs, function(i) { + el.attr(filterAttrs[i], null); + }); + + return el[0].outerHTML; + }); + } + } + + return html; + }; + + /** + * 将Markdown文档解析为HTML用于前台显示 + * Parse Markdown to HTML for Font-end preview. + * + * @param {String} id 用于显示HTML的对象ID + * @param {Object} [options={}] 配置选项,可选 + * @returns {Object} div 返回jQuery对象元素 + */ + + editormd.markdownToHTML = function(id, options) { + var defaults = { + gfm : true, + toc : true, + tocm : false, + tocStartLevel : 1, + tocTitle : "目录", + tocDropdown : false, + tocContainer : "", + markdown : "", + markdownSourceCode : false, + htmlDecode : false, + autoLoadKaTeX : true, + pageBreak : true, + atLink : true, // for @link + emailLink : true, // for mail address auto link + tex : false, + taskList : false, // Github Flavored Markdown task lists + emoji : false, + flowChart : false, + sequenceDiagram : false, + previewCodeHighlight : true + }; + + editormd.$marked = marked; + + var div = $("#" + id); + var settings = div.settings = $.extend(true, defaults, options || {}); + var saveTo = div.find("textarea"); + + if (saveTo.length < 1) + { + div.append("<textarea></textarea>"); + saveTo = div.find("textarea"); + } + + var markdownDoc = (settings.markdown === "") ? saveTo.val() : settings.markdown; + var markdownToC = []; + + var rendererOptions = { + toc : settings.toc, + tocm : settings.tocm, + tocStartLevel : settings.tocStartLevel, + taskList : settings.taskList, + emoji : settings.emoji, + tex : settings.tex, + pageBreak : settings.pageBreak, + atLink : settings.atLink, // for @link + emailLink : settings.emailLink, // for mail address auto link + flowChart : settings.flowChart, + sequenceDiagram : settings.sequenceDiagram, + previewCodeHighlight : settings.previewCodeHighlight, + }; + + var markedOptions = { + renderer : editormd.markedRenderer(markdownToC, rendererOptions), + gfm : settings.gfm, + tables : true, + breaks : true, + pedantic : false, + sanitize : (settings.htmlDecode) ? false : true, // 是否忽略HTML标签,即是否开启HTML标签解析,为了安全性,默认不开启 + smartLists : true, + smartypants : true + }; + + markdownDoc = new String(markdownDoc); + + var markdownParsed = marked(markdownDoc, markedOptions); + + markdownParsed = editormd.filterHTMLTags(markdownParsed, settings.htmlDecode); + + if (settings.markdownSourceCode) { + saveTo.text(markdownDoc); + } else { + saveTo.remove(); + } + + div.addClass("markdown-body " + this.classPrefix + "html-preview").append(markdownParsed); + + var tocContainer = (settings.tocContainer !== "") ? $(settings.tocContainer) : div; + + if (settings.tocContainer !== "") + { + tocContainer.attr("previewContainer", false); + } + + if (settings.toc) + { + div.tocContainer = this.markdownToCRenderer(markdownToC, tocContainer, settings.tocDropdown, settings.tocStartLevel); + + if (settings.tocDropdown || div.find("." + this.classPrefix + "toc-menu").length > 0) + { + this.tocDropdownMenu(div, settings.tocTitle); + } + + if (settings.tocContainer !== "") + { + div.find(".editormd-toc-menu, .editormd-markdown-toc").remove(); + } + } + + if (settings.previewCodeHighlight) + { + div.find("pre").addClass("prettyprint linenums"); + prettyPrint(); + } + + if (!editormd.isIE8) + { + if (settings.flowChart) { + div.find(".flowchart").flowChart(); + } + + if (settings.sequenceDiagram) { + div.find(".sequence-diagram").sequenceDiagram({theme: "simple"}); + } + } + + if (settings.tex) + { + var katexHandle = function() { + div.find("." + editormd.classNames.tex).each(function(){ + var tex = $(this); + katex.render(tex.html().replace(/</g, "<").replace(/>/g, ">"), tex[0]); + tex.find(".katex").css("font-size", "1.6em"); + }); + }; + + if (settings.autoLoadKaTeX && !editormd.$katex && !editormd.kaTeXLoaded) + { + this.loadKaTeX(function() { + editormd.$katex = katex; + editormd.kaTeXLoaded = true; + katexHandle(); + }); + } + else + { + katexHandle(); + } + } + + div.getMarkdown = function() { + return saveTo.val(); + }; + + return div; + }; + + // Editor.md themes, change toolbar themes etc. + // added @1.5.0 + editormd.themes = ["default", "dark"]; + + // Preview area themes + // added @1.5.0 + editormd.previewThemes = ["default", "dark"]; + + // CodeMirror / editor area themes + // @1.5.0 rename -> editorThemes, old version -> themes + editormd.editorThemes = [ + "default", "3024-day", "3024-night", + "ambiance", "ambiance-mobile", + "base16-dark", "base16-light", "blackboard", + "cobalt", + "eclipse", "elegant", "erlang-dark", + "lesser-dark", + "mbo", "mdn-like", "midnight", "monokai", + "neat", "neo", "night", + "paraiso-dark", "paraiso-light", "pastel-on-dark", + "rubyblue", + "solarized", + "the-matrix", "tomorrow-night-eighties", "twilight", + "vibrant-ink", + "xq-dark", "xq-light" + ]; + + editormd.loadPlugins = {}; + + editormd.loadFiles = { + js : [], + css : [], + plugin : [] + }; + + /** + * 动态加载Editor.md插件,但不立即执行 + * Load editor.md plugins + * + * @param {String} fileName 插件文件路径 + * @param {Function} [callback=function()] 加载成功后执行的回调函数 + * @param {String} [into="head"] 嵌入页面的位置 + */ + + editormd.loadPlugin = function(fileName, callback, into) { + callback = callback || function() {}; + + this.loadScript(fileName, function() { + editormd.loadFiles.plugin.push(fileName); + callback(); + }, into); + }; + + /** + * 动态加载CSS文件的方法 + * Load css file method + * + * @param {String} fileName CSS文件名 + * @param {Function} [callback=function()] 加载成功后执行的回调函数 + * @param {String} [into="head"] 嵌入页面的位置 + */ + + editormd.loadCSS = function(fileName, callback, into) { + into = into || "head"; + callback = callback || function() {}; + + var css = document.createElement("link"); + css.type = "text/css"; + css.rel = "stylesheet"; + css.onload = css.onreadystatechange = function() { + editormd.loadFiles.css.push(fileName); + callback(); + }; + + css.href = fileName + ".css"; + + if(into === "head") { + document.getElementsByTagName("head")[0].appendChild(css); + } else { + document.body.appendChild(css); + } + }; + + editormd.isIE = (navigator.appName == "Microsoft Internet Explorer"); + editormd.isIE8 = (editormd.isIE && navigator.appVersion.match(/8./i) == "8."); + + /** + * 动态加载JS文件的方法 + * Load javascript file method + * + * @param {String} fileName JS文件名 + * @param {Function} [callback=function()] 加载成功后执行的回调函数 + * @param {String} [into="head"] 嵌入页面的位置 + */ + + editormd.loadScript = function(fileName, callback, into) { + + into = into || "head"; + callback = callback || function() {}; + + var script = null; + script = document.createElement("script"); + script.id = fileName.replace(/[\./]+/g, "-"); + script.type = "text/javascript"; + script.src = fileName + ".js"; + + if (editormd.isIE8) + { + script.onreadystatechange = function() { + if(script.readyState) + { + if (script.readyState === "loaded" || script.readyState === "complete") + { + script.onreadystatechange = null; + editormd.loadFiles.js.push(fileName); + callback(); + } + } + }; + } + else + { + script.onload = function() { + editormd.loadFiles.js.push(fileName); + callback(); + }; + } + + if (into === "head") { + document.getElementsByTagName("head")[0].appendChild(script); + } else { + document.body.appendChild(script); + } + }; + + // 使用国外的CDN,加载速度有时会很慢,或者自定义URL + // You can custom KaTeX load url. + editormd.katexURL = { + css : "//cdnjs.cloudflare.com/ajax/libs/KaTeX/0.3.0/katex.min", + js : "//cdnjs.cloudflare.com/ajax/libs/KaTeX/0.3.0/katex.min" + }; + + editormd.kaTeXLoaded = false; + + /** + * 加载KaTeX文件 + * load KaTeX files + * + * @param {Function} [callback=function()] 加载成功后执行的回调函数 + */ + + editormd.loadKaTeX = function (callback) { + editormd.loadCSS(editormd.katexURL.css, function(){ + editormd.loadScript(editormd.katexURL.js, callback || function(){}); + }); + }; + + /** + * 锁屏 + * lock screen + * + * @param {Boolean} lock Boolean 布尔值,是否锁屏 + * @returns {void} + */ + + editormd.lockScreen = function(lock) { + $("html,body").css("overflow", (lock) ? "hidden" : ""); + }; + + /** + * 动态创建对话框 + * Creating custom dialogs + * + * @param {Object} options 配置项键值对 Key/Value + * @returns {dialog} 返回创建的dialog的jQuery实例对象 + */ + + editormd.createDialog = function(options) { + var defaults = { + name : "", + width : 420, + height: 240, + title : "", + drag : true, + closed : true, + content : "", + mask : true, + maskStyle : { + backgroundColor : "#fff", + opacity : 0.1 + }, + lockScreen : true, + footer : true, + buttons : false + }; + + options = $.extend(true, defaults, options); + + var $this = this; + var editor = this.editor; + var classPrefix = editormd.classPrefix; + var guid = (new Date()).getTime(); + var dialogName = ( (options.name === "") ? classPrefix + "dialog-" + guid : options.name); + var mouseOrTouch = editormd.mouseOrTouch; + + var html = "<div class=\"" + classPrefix + "dialog " + dialogName + "\">"; + + if (options.title !== "") + { + html += "<div class=\"" + classPrefix + "dialog-header\"" + ( (options.drag) ? " style=\"cursor: move;\"" : "" ) + ">"; + html += "<strong class=\"" + classPrefix + "dialog-title\">" + options.title + "</strong>"; + html += "</div>"; + } + + if (options.closed) + { + html += "<a href=\"javascript:;\" class=\"fa fa-close " + classPrefix + "dialog-close\"></a>"; + } + + html += "<div class=\"" + classPrefix + "dialog-container\">" + options.content; + + if (options.footer || typeof options.footer === "string") + { + html += "<div class=\"" + classPrefix + "dialog-footer\">" + ( (typeof options.footer === "boolean") ? "" : options.footer) + "</div>"; + } + + html += "</div>"; + + html += "<div class=\"" + classPrefix + "dialog-mask " + classPrefix + "dialog-mask-bg\"></div>"; + html += "<div class=\"" + classPrefix + "dialog-mask " + classPrefix + "dialog-mask-con\"></div>"; + html += "</div>"; + + editor.append(html); + + var dialog = editor.find("." + dialogName); + + dialog.lockScreen = function(lock) { + if (options.lockScreen) + { + $("html,body").css("overflow", (lock) ? "hidden" : ""); + $this.resize(); + } + + return dialog; + }; + + dialog.showMask = function() { + if (options.mask) + { + editor.find("." + classPrefix + "mask").css(options.maskStyle).css("z-index", editormd.dialogZindex - 1).show(); + } + return dialog; + }; + + dialog.hideMask = function() { + if (options.mask) + { + editor.find("." + classPrefix + "mask").hide(); + } + + return dialog; + }; + + dialog.loading = function(show) { + var loading = dialog.find("." + classPrefix + "dialog-mask"); + loading[(show) ? "show" : "hide"](); + + return dialog; + }; + + dialog.lockScreen(true).showMask(); + + dialog.show().css({ + zIndex : editormd.dialogZindex, + border : (editormd.isIE8) ? "1px solid #ddd" : "", + width : (typeof options.width === "number") ? options.width + "px" : options.width, + height : (typeof options.height === "number") ? options.height + "px" : options.height + }); + + var dialogPosition = function(){ + dialog.css({ + top : ($(window).height() - dialog.height()) / 2 + "px", + left : ($(window).width() - dialog.width()) / 2 + "px" + }); + }; + + dialogPosition(); + + $(window).resize(dialogPosition); + + dialog.children("." + classPrefix + "dialog-close").bind(mouseOrTouch("click", "touchend"), function() { + dialog.hide().lockScreen(false).hideMask(); + }); + + if (typeof options.buttons === "object") + { + var footer = dialog.footer = dialog.find("." + classPrefix + "dialog-footer"); + + for (var key in options.buttons) + { + var btn = options.buttons[key]; + var btnClassName = classPrefix + key + "-btn"; + + footer.append("<button class=\"" + classPrefix + "btn " + btnClassName + "\">" + btn[0] + "</button>"); + btn[1] = $.proxy(btn[1], dialog); + footer.children("." + btnClassName).bind(mouseOrTouch("click", "touchend"), btn[1]); + } + } + + if (options.title !== "" && options.drag) + { + var posX, posY; + var dialogHeader = dialog.children("." + classPrefix + "dialog-header"); + + if (!options.mask) { + dialogHeader.bind(mouseOrTouch("click", "touchend"), function(){ + editormd.dialogZindex += 2; + dialog.css("z-index", editormd.dialogZindex); + }); + } + + dialogHeader.mousedown(function(e) { + e = e || window.event; //IE + posX = e.clientX - parseInt(dialog[0].style.left); + posY = e.clientY - parseInt(dialog[0].style.top); + + document.onmousemove = moveAction; + }); + + var userCanSelect = function (obj) { + obj.removeClass(classPrefix + "user-unselect").off("selectstart"); + }; + + var userUnselect = function (obj) { + obj.addClass(classPrefix + "user-unselect").on("selectstart", function(event) { // selectstart for IE + return false; + }); + }; + + var moveAction = function (e) { + e = e || window.event; //IE + + var left, top, nowLeft = parseInt(dialog[0].style.left), nowTop = parseInt(dialog[0].style.top); + + if( nowLeft >= 0 ) { + if( nowLeft + dialog.width() <= $(window).width()) { + left = e.clientX - posX; + } else { + left = $(window).width() - dialog.width(); + document.onmousemove = null; + } + } else { + left = 0; + document.onmousemove = null; + } + + if( nowTop >= 0 ) { + top = e.clientY - posY; + } else { + top = 0; + document.onmousemove = null; + } + + + document.onselectstart = function() { + return false; + }; + + userUnselect($("body")); + userUnselect(dialog); + dialog[0].style.left = left + "px"; + dialog[0].style.top = top + "px"; + }; + + document.onmouseup = function() { + userCanSelect($("body")); + userCanSelect(dialog); + + document.onselectstart = null; + document.onmousemove = null; + }; + + dialogHeader.touchDraggable = function() { + var offset = null; + var start = function(e) { + var orig = e.originalEvent; + var pos = $(this).parent().position(); + + offset = { + x : orig.changedTouches[0].pageX - pos.left, + y : orig.changedTouches[0].pageY - pos.top + }; + }; + + var move = function(e) { + e.preventDefault(); + var orig = e.originalEvent; + + $(this).parent().css({ + top : orig.changedTouches[0].pageY - offset.y, + left : orig.changedTouches[0].pageX - offset.x + }); + }; + + this.bind("touchstart", start).bind("touchmove", move); + }; + + dialogHeader.touchDraggable(); + } + + editormd.dialogZindex += 2; + + return dialog; + }; + + /** + * 鼠标和触摸事件的判断/选择方法 + * MouseEvent or TouchEvent type switch + * + * @param {String} [mouseEventType="click"] 供选择的鼠标事件 + * @param {String} [touchEventType="touchend"] 供选择的触摸事件 + * @returns {String} EventType 返回事件类型名称 + */ + + editormd.mouseOrTouch = function(mouseEventType, touchEventType) { + mouseEventType = mouseEventType || "click"; + touchEventType = touchEventType || "touchend"; + + var eventType = mouseEventType; + + try { + document.createEvent("TouchEvent"); + eventType = touchEventType; + } catch(e) {} + + return eventType; + }; + + /** + * 日期时间的格式化方法 + * Datetime format method + * + * @param {String} [format=""] 日期时间的格式,类似PHP的格式 + * @returns {String} datefmt 返回格式化后的日期时间字符串 + */ + + editormd.dateFormat = function(format) { + format = format || ""; + + var addZero = function(d) { + return (d < 10) ? "0" + d : d; + }; + + var date = new Date(); + var year = date.getFullYear(); + var year2 = year.toString().slice(2, 4); + var month = addZero(date.getMonth() + 1); + var day = addZero(date.getDate()); + var weekDay = date.getDay(); + var hour = addZero(date.getHours()); + var min = addZero(date.getMinutes()); + var second = addZero(date.getSeconds()); + var ms = addZero(date.getMilliseconds()); + var datefmt = ""; + + var ymd = year2 + "-" + month + "-" + day; + var fymd = year + "-" + month + "-" + day; + var hms = hour + ":" + min + ":" + second; + + switch (format) + { + case "UNIX Time" : + datefmt = date.getTime(); + break; + + case "UTC" : + datefmt = date.toUTCString(); + break; + + case "yy" : + datefmt = year2; + break; + + case "year" : + case "yyyy" : + datefmt = year; + break; + + case "month" : + case "mm" : + datefmt = month; + break; + + case "cn-week-day" : + case "cn-wd" : + var cnWeekDays = ["日", "一", "二", "三", "四", "五", "六"]; + datefmt = "星期" + cnWeekDays[weekDay]; + break; + + case "week-day" : + case "wd" : + var weekDays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; + datefmt = weekDays[weekDay]; + break; + + case "day" : + case "dd" : + datefmt = day; + break; + + case "hour" : + case "hh" : + datefmt = hour; + break; + + case "min" : + case "ii" : + datefmt = min; + break; + + case "second" : + case "ss" : + datefmt = second; + break; + + case "ms" : + datefmt = ms; + break; + + case "yy-mm-dd" : + datefmt = ymd; + break; + + case "yyyy-mm-dd" : + datefmt = fymd; + break; + + case "yyyy-mm-dd h:i:s ms" : + case "full + ms" : + datefmt = fymd + " " + hms + " " + ms; + break; + + case "full" : + case "yyyy-mm-dd h:i:s" : + default: + datefmt = fymd + " " + hms; + break; + } + + return datefmt; + }; + + return editormd; + +})); +(function(){ + var factory = function (exports) { + var lang = { + name : "zh-tw", + description : "開源在線Markdown編輯器<br/>Open source online Markdown editor.", + tocTitle : "目錄", + toolbar : { + undo : "撤銷(Ctrl+Z)", + redo : "重做(Ctrl+Y)", + bold : "粗體", + del : "刪除線", + italic : "斜體", + quote : "引用", + ucwords : "將所選的每個單詞首字母轉成大寫", + uppercase : "將所選文本轉成大寫", + lowercase : "將所選文本轉成小寫", + h1 : "標題1", + h2 : "標題2", + h3 : "標題3", + h4 : "標題4", + h5 : "標題5", + h6 : "標題6", + "list-ul" : "無序列表", + "list-ol" : "有序列表", + hr : "横线", + link : "链接", + "reference-link" : "引用鏈接", + image : "圖片", + code : "行內代碼", + "preformatted-text" : "預格式文本 / 代碼塊(縮進風格)", + "code-block" : "代碼塊(多語言風格)", + table : "添加表格", + datetime : "日期時間", + emoji : "Emoji 表情", + "html-entities" : "HTML 實體字符", + pagebreak : "插入分頁符", + watch : "關閉實時預覽", + unwatch : "開啟實時預覽", + preview : "全窗口預覽HTML(按 Shift + ESC 退出)", + fullscreen : "全屏(按 ESC 退出)", + clear : "清空", + search : "搜尋", + help : "使用幫助", + info : "關於" + exports.title + }, + buttons : { + enter : "確定", + cancel : "取消", + close : "關閉" + }, + dialog : { + link : { + title : "添加鏈接", + url : "鏈接地址", + urlTitle : "鏈接標題", + urlEmpty : "錯誤:請填寫鏈接地址。" + }, + referenceLink : { + title : "添加引用鏈接", + name : "引用名稱", + url : "鏈接地址", + urlId : "鏈接ID", + urlTitle : "鏈接標題", + nameEmpty: "錯誤:引用鏈接的名稱不能為空。", + idEmpty : "錯誤:請填寫引用鏈接的ID。", + urlEmpty : "錯誤:請填寫引用鏈接的URL地址。" + }, + image : { + title : "添加圖片", + url : "圖片地址", + link : "圖片鏈接", + alt : "圖片描述", + uploadButton : "本地上傳", + imageURLEmpty : "錯誤:圖片地址不能為空。", + uploadFileEmpty : "錯誤:上傳的圖片不能為空!", + formatNotAllowed : "錯誤:只允許上傳圖片文件,允許上傳的圖片文件格式有:" + }, + preformattedText : { + title : "添加預格式文本或代碼塊", + emptyAlert : "錯誤:請填寫預格式文本或代碼的內容。" + }, + codeBlock : { + title : "添加代碼塊", + selectLabel : "代碼語言:", + selectDefaultText : "請語言代碼語言", + otherLanguage : "其他語言", + unselectedLanguageAlert : "錯誤:請選擇代碼所屬的語言類型。", + codeEmptyAlert : "錯誤:請填寫代碼內容。" + }, + htmlEntities : { + title : "HTML實體字符" + }, + help : { + title : "使用幫助" + } + } + }; + + exports.defaults.lang = lang; + }; + + // CommonJS/Node.js + if (typeof require === "function" && typeof exports === "object" && typeof module === "object") + { + module.exports = factory; + } + else if (typeof define === "function") // AMD/CMD/Sea.js + { + if (define.amd) { // for Require.js + + define(["editormd"], function(editormd) { + factory(editormd); + }); + + } else { // for Sea.js + define(function(require) { + var editormd = require("../editormd"); + factory(editormd); + }); + } + } + else + { + factory(window.editormd); + } + +})(); +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.dragula = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ +'use strict'; + +var cache = {}; +var start = '(?:^|\\s)'; +var end = '(?:\\s|$)'; + +function lookupClass (className) { + var cached = cache[className]; + if (cached) { + cached.lastIndex = 0; + } else { + cache[className] = cached = new RegExp(start + className + end, 'g'); + } + return cached; +} + +function addClass (el, className) { + var current = el.className; + if (!current.length) { + el.className = className; + } else if (!lookupClass(className).test(current)) { + el.className += ' ' + className; + } +} + +function rmClass (el, className) { + el.className = el.className.replace(lookupClass(className), ' ').trim(); +} + +module.exports = { + add: addClass, + rm: rmClass +}; + +},{}],2:[function(require,module,exports){ +(function (global){ +'use strict'; + +var emitter = require('contra/emitter'); +var crossvent = require('crossvent'); +var classes = require('./classes'); +var doc = document; +var documentElement = doc.documentElement; + +function dragula (initialContainers, options) { + var len = arguments.length; + if (len === 1 && Array.isArray(initialContainers) === false) { + options = initialContainers; + initialContainers = []; + } + var _mirror; // mirror image + var _source; // source container + var _item; // item being dragged + var _offsetX; // reference x + var _offsetY; // reference y + var _moveX; // reference move x + var _moveY; // reference move y + var _initialSibling; // reference sibling when grabbed + var _currentSibling; // reference sibling now + var _copy; // item used for copying + var _renderTimer; // timer for setTimeout renderMirrorImage + var _lastDropTarget = null; // last container item was over + var _grabbed; // holds mousedown context until first mousemove + + var o = options || {}; + if (o.moves === void 0) { o.moves = always; } + if (o.accepts === void 0) { o.accepts = always; } + if (o.invalid === void 0) { o.invalid = invalidTarget; } + if (o.containers === void 0) { o.containers = initialContainers || []; } + if (o.isContainer === void 0) { o.isContainer = never; } + if (o.copy === void 0) { o.copy = false; } + if (o.copySortSource === void 0) { o.copySortSource = false; } + if (o.revertOnSpill === void 0) { o.revertOnSpill = false; } + if (o.removeOnSpill === void 0) { o.removeOnSpill = false; } + if (o.direction === void 0) { o.direction = 'vertical'; } + if (o.ignoreInputTextSelection === void 0) { o.ignoreInputTextSelection = true; } + if (o.mirrorContainer === void 0) { o.mirrorContainer = doc.body; } + + var drake = emitter({ + containers: o.containers, + start: manualStart, + end: end, + cancel: cancel, + remove: remove, + destroy: destroy, + canMove: canMove, + dragging: false + }); + + if (o.removeOnSpill === true) { + drake.on('over', spillOver).on('out', spillOut); + } + + events(); + + return drake; + + function isContainer (el) { + return drake.containers.indexOf(el) !== -1 || o.isContainer(el); + } + + function events (remove) { + var op = remove ? 'remove' : 'add'; + touchy(documentElement, op, 'mousedown', grab); + touchy(documentElement, op, 'mouseup', release); + } + + function eventualMovements (remove) { + var op = remove ? 'remove' : 'add'; + touchy(documentElement, op, 'mousemove', startBecauseMouseMoved); + } + + function movements (remove) { + var op = remove ? 'remove' : 'add'; + crossvent[op](documentElement, 'selectstart', preventGrabbed); // IE8 + crossvent[op](documentElement, 'click', preventGrabbed); + } + + function destroy () { + events(true); + release({}); + } + + function preventGrabbed (e) { + if (_grabbed) { + e.preventDefault(); + } + } + + function grab (e) { + _moveX = e.clientX; + _moveY = e.clientY; + + var ignore = whichMouseButton(e) !== 1 || e.metaKey || e.ctrlKey; + if (ignore) { + return; // we only care about honest-to-god left clicks and touch events + } + var item = e.target; + var context = canStart(item); + if (!context) { + return; + } + _grabbed = context; + eventualMovements(); + if (e.type === 'mousedown') { + if (isInput(item)) { // see also: https://github.com/bevacqua/dragula/issues/208 + item.focus(); // fixes https://github.com/bevacqua/dragula/issues/176 + } else { + e.preventDefault(); // fixes https://github.com/bevacqua/dragula/issues/155 + } + } + } + + function startBecauseMouseMoved (e) { + if (!_grabbed) { + return; + } + if (whichMouseButton(e) === 0) { + release({}); + return; // when text is selected on an input and then dragged, mouseup doesn't fire. this is our only hope + } + // truthy check fixes #239, equality fixes #207 + if (e.clientX !== void 0 && e.clientX === _moveX && e.clientY !== void 0 && e.clientY === _moveY) { + return; + } + if (o.ignoreInputTextSelection) { + var clientX = getCoord('clientX', e); + var clientY = getCoord('clientY', e); + var elementBehindCursor = doc.elementFromPoint(clientX, clientY); + if (isInput(elementBehindCursor)) { + return; + } + } + + var grabbed = _grabbed; // call to end() unsets _grabbed + eventualMovements(true); + movements(); + end(); + start(grabbed); + + var offset = getOffset(_item); + _offsetX = getCoord('pageX', e) - offset.left; + _offsetY = getCoord('pageY', e) - offset.top; + + classes.add(_copy || _item, 'gu-transit'); + renderMirrorImage(); + drag(e); + } + + function canStart (item) { + if (drake.dragging && _mirror) { + return; + } + if (isContainer(item)) { + return; // don't drag container itself + } + var handle = item; + while (getParent(item) && isContainer(getParent(item)) === false) { + if (o.invalid(item, handle)) { + return; + } + item = getParent(item); // drag target should be a top element + if (!item) { + return; + } + } + var source = getParent(item); + if (!source) { + return; + } + if (o.invalid(item, handle)) { + return; + } + + var movable = o.moves(item, source, handle, nextEl(item)); + if (!movable) { + return; + } + + return { + item: item, + source: source + }; + } + + function canMove (item) { + return !!canStart(item); + } + + function manualStart (item) { + var context = canStart(item); + if (context) { + start(context); + } + } + + function start (context) { + if (isCopy(context.item, context.source)) { + _copy = context.item.cloneNode(true); + drake.emit('cloned', _copy, context.item, 'copy'); + } + + _source = context.source; + _item = context.item; + _initialSibling = _currentSibling = nextEl(context.item); + + drake.dragging = true; + drake.emit('drag', _item, _source); + } + + function invalidTarget () { + return false; + } + + function end () { + if (!drake.dragging) { + return; + } + var item = _copy || _item; + drop(item, getParent(item)); + } + + function ungrab () { + _grabbed = false; + eventualMovements(true); + movements(true); + } + + function release (e) { + ungrab(); + + if (!drake.dragging) { + return; + } + var item = _copy || _item; + var clientX = getCoord('clientX', e); + var clientY = getCoord('clientY', e); + var elementBehindCursor = getElementBehindPoint(_mirror, clientX, clientY); + var dropTarget = findDropTarget(elementBehindCursor, clientX, clientY); + if (dropTarget && ((_copy && o.copySortSource) || (!_copy || dropTarget !== _source))) { + drop(item, dropTarget); + } else if (o.removeOnSpill) { + remove(); + } else { + cancel(); + } + } + + function drop (item, target) { + var parent = getParent(item); + if (_copy && o.copySortSource && target === _source) { + parent.removeChild(_item); + } + if (isInitialPlacement(target)) { + drake.emit('cancel', item, _source, _source); + } else { + drake.emit('drop', item, target, _source, _currentSibling); + } + cleanup(); + } + + function remove () { + if (!drake.dragging) { + return; + } + var item = _copy || _item; + var parent = getParent(item); + if (parent) { + parent.removeChild(item); + } + drake.emit(_copy ? 'cancel' : 'remove', item, parent, _source); + cleanup(); + } + + function cancel (revert) { + if (!drake.dragging) { + return; + } + var reverts = arguments.length > 0 ? revert : o.revertOnSpill; + var item = _copy || _item; + var parent = getParent(item); + var initial = isInitialPlacement(parent); + if (initial === false && reverts) { + if (_copy) { + if (parent) { + parent.removeChild(_copy); + } + } else { + _source.insertBefore(item, _initialSibling); + } + } + if (initial || reverts) { + drake.emit('cancel', item, _source, _source); + } else { + drake.emit('drop', item, parent, _source, _currentSibling); + } + cleanup(); + } + + function cleanup () { + var item = _copy || _item; + ungrab(); + removeMirrorImage(); + if (item) { + classes.rm(item, 'gu-transit'); + } + if (_renderTimer) { + clearTimeout(_renderTimer); + } + drake.dragging = false; + if (_lastDropTarget) { + drake.emit('out', item, _lastDropTarget, _source); + } + drake.emit('dragend', item); + _source = _item = _copy = _initialSibling = _currentSibling = _renderTimer = _lastDropTarget = null; + } + + function isInitialPlacement (target, s) { + var sibling; + if (s !== void 0) { + sibling = s; + } else if (_mirror) { + sibling = _currentSibling; + } else { + sibling = nextEl(_copy || _item); + } + return target === _source && sibling === _initialSibling; + } + + function findDropTarget (elementBehindCursor, clientX, clientY) { + var target = elementBehindCursor; + while (target && !accepted()) { + target = getParent(target); + } + return target; + + function accepted () { + var droppable = isContainer(target); + if (droppable === false) { + return false; + } + + var immediate = getImmediateChild(target, elementBehindCursor); + var reference = getReference(target, immediate, clientX, clientY); + var initial = isInitialPlacement(target, reference); + if (initial) { + return true; // should always be able to drop it right back where it was + } + return o.accepts(_item, target, _source, reference); + } + } + + function drag (e) { + if (!_mirror) { + return; + } + e.preventDefault(); + + var clientX = getCoord('clientX', e); + var clientY = getCoord('clientY', e); + var x = clientX - _offsetX; + var y = clientY - _offsetY; + + _mirror.style.left = x + 'px'; + _mirror.style.top = y + 'px'; + + var item = _copy || _item; + var elementBehindCursor = getElementBehindPoint(_mirror, clientX, clientY); + var dropTarget = findDropTarget(elementBehindCursor, clientX, clientY); + var changed = dropTarget !== null && dropTarget !== _lastDropTarget; + if (changed || dropTarget === null) { + out(); + _lastDropTarget = dropTarget; + over(); + } + var parent = getParent(item); + if (dropTarget === _source && _copy && !o.copySortSource) { + if (parent) { + parent.removeChild(item); + } + return; + } + var reference; + var immediate = getImmediateChild(dropTarget, elementBehindCursor); + if (immediate !== null) { + reference = getReference(dropTarget, immediate, clientX, clientY); + } else if (o.revertOnSpill === true && !_copy) { + reference = _initialSibling; + dropTarget = _source; + } else { + if (_copy && parent) { + parent.removeChild(item); + } + return; + } + if ( + (reference === null && changed) || + reference !== item && + reference !== nextEl(item) + ) { + _currentSibling = reference; + dropTarget.insertBefore(item, reference); + drake.emit('shadow', item, dropTarget, _source); + } + function moved (type) { drake.emit(type, item, _lastDropTarget, _source); } + function over () { if (changed) { moved('over'); } } + function out () { if (_lastDropTarget) { moved('out'); } } + } + + function spillOver (el) { + classes.rm(el, 'gu-hide'); + } + + function spillOut (el) { + if (drake.dragging) { classes.add(el, 'gu-hide'); } + } + + function renderMirrorImage () { + if (_mirror) { + return; + } + var rect = _item.getBoundingClientRect(); + _mirror = _item.cloneNode(true); + _mirror.style.width = getRectWidth(rect) + 'px'; + _mirror.style.height = getRectHeight(rect) + 'px'; + classes.rm(_mirror, 'gu-transit'); + classes.add(_mirror, 'gu-mirror'); + o.mirrorContainer.appendChild(_mirror); + touchy(documentElement, 'add', 'mousemove', drag); + classes.add(o.mirrorContainer, 'gu-unselectable'); + drake.emit('cloned', _mirror, _item, 'mirror'); + } + + function removeMirrorImage () { + if (_mirror) { + classes.rm(o.mirrorContainer, 'gu-unselectable'); + touchy(documentElement, 'remove', 'mousemove', drag); + getParent(_mirror).removeChild(_mirror); + _mirror = null; + } + } + + function getImmediateChild (dropTarget, target) { + var immediate = target; + while (immediate !== dropTarget && getParent(immediate) !== dropTarget) { + immediate = getParent(immediate); + } + if (immediate === documentElement) { + return null; + } + return immediate; + } + + function getReference (dropTarget, target, x, y) { + var horizontal = o.direction === 'horizontal'; + var reference = target !== dropTarget ? inside() : outside(); + return reference; + + function outside () { // slower, but able to figure out any position + var len = dropTarget.children.length; + var i; + var el; + var rect; + for (i = 0; i < len; i++) { + el = dropTarget.children[i]; + rect = el.getBoundingClientRect(); + if (horizontal && (rect.left + rect.width / 2) > x) { return el; } + if (!horizontal && (rect.top + rect.height / 2) > y) { return el; } + } + return null; + } + + function inside () { // faster, but only available if dropped inside a child element + var rect = target.getBoundingClientRect(); + if (horizontal) { + return resolve(x > rect.left + getRectWidth(rect) / 2); + } + return resolve(y > rect.top + getRectHeight(rect) / 2); + } + + function resolve (after) { + return after ? nextEl(target) : target; + } + } + + function isCopy (item, container) { + return typeof o.copy === 'boolean' ? o.copy : o.copy(item, container); + } +} + +function touchy (el, op, type, fn) { + var touch = { + mouseup: 'touchend', + mousedown: 'touchstart', + mousemove: 'touchmove' + }; + var pointers = { + mouseup: 'pointerup', + mousedown: 'pointerdown', + mousemove: 'pointermove' + }; + var microsoft = { + mouseup: 'MSPointerUp', + mousedown: 'MSPointerDown', + mousemove: 'MSPointerMove' + }; + if (global.navigator.pointerEnabled) { + crossvent[op](el, pointers[type], fn); + } else if (global.navigator.msPointerEnabled) { + crossvent[op](el, microsoft[type], fn); + } else { + crossvent[op](el, touch[type], fn); + crossvent[op](el, type, fn); + } +} + +function whichMouseButton (e) { + if (e.touches !== void 0) { return e.touches.length; } + if (e.which !== void 0 && e.which !== 0) { return e.which; } // see https://github.com/bevacqua/dragula/issues/261 + if (e.buttons !== void 0) { return e.buttons; } + var button = e.button; + if (button !== void 0) { // see https://github.com/jquery/jquery/blob/99e8ff1baa7ae341e94bb89c3e84570c7c3ad9ea/src/event.js#L573-L575 + return button & 1 ? 1 : button & 2 ? 3 : (button & 4 ? 2 : 0); + } +} + +function getOffset (el) { + var rect = el.getBoundingClientRect(); + return { + left: rect.left + getScroll('scrollLeft', 'pageXOffset'), + top: rect.top + getScroll('scrollTop', 'pageYOffset') + }; +} + +function getScroll (scrollProp, offsetProp) { + if (typeof global[offsetProp] !== 'undefined') { + return global[offsetProp]; + } + if (documentElement.clientHeight) { + return documentElement[scrollProp]; + } + return doc.body[scrollProp]; +} + +function getElementBehindPoint (point, x, y) { + var p = point || {}; + var state = p.className; + var el; + p.className += ' gu-hide'; + el = doc.elementFromPoint(x, y); + p.className = state; + return el; +} + +function never () { return false; } +function always () { return true; } +function getRectWidth (rect) { return rect.width || (rect.right - rect.left); } +function getRectHeight (rect) { return rect.height || (rect.bottom - rect.top); } +function getParent (el) { return el.parentNode === doc ? null : el.parentNode; } +function isInput (el) { return el.tagName === 'INPUT' || el.tagName === 'TEXTAREA' || el.tagName === 'SELECT' || isEditable(el); } +function isEditable (el) { + if (!el) { return false; } // no parents were editable + if (el.contentEditable === 'false') { return false; } // stop the lookup + if (el.contentEditable === 'true') { return true; } // found a contentEditable element in the chain + return isEditable(getParent(el)); // contentEditable is set to 'inherit' +} + +function nextEl (el) { + return el.nextElementSibling || manually(); + function manually () { + var sibling = el; + do { + sibling = sibling.nextSibling; + } while (sibling && sibling.nodeType !== 1); + return sibling; + } +} + +function getEventHost (e) { + // on touchend event, we have to use `e.changedTouches` + // see http://stackoverflow.com/questions/7192563/touchend-event-properties + // see https://github.com/bevacqua/dragula/issues/34 + if (e.targetTouches && e.targetTouches.length) { + return e.targetTouches[0]; + } + if (e.changedTouches && e.changedTouches.length) { + return e.changedTouches[0]; + } + return e; +} + +function getCoord (coord, e) { + var host = getEventHost(e); + var missMap = { + pageX: 'clientX', // IE8 + pageY: 'clientY' // IE8 + }; + if (coord in missMap && !(coord in host) && missMap[coord] in host) { + coord = missMap[coord]; + } + return host[coord]; +} + +module.exports = dragula; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./classes":1,"contra/emitter":5,"crossvent":6}],3:[function(require,module,exports){ +module.exports = function atoa (a, n) { return Array.prototype.slice.call(a, n); } + +},{}],4:[function(require,module,exports){ +'use strict'; + +var ticky = require('ticky'); + +module.exports = function debounce (fn, args, ctx) { + if (!fn) { return; } + ticky(function run () { + fn.apply(ctx || null, args || []); + }); +}; + +},{"ticky":9}],5:[function(require,module,exports){ +'use strict'; + +var atoa = require('atoa'); +var debounce = require('./debounce'); + +module.exports = function emitter (thing, options) { + var opts = options || {}; + var evt = {}; + if (thing === undefined) { thing = {}; } + thing.on = function (type, fn) { + if (!evt[type]) { + evt[type] = [fn]; + } else { + evt[type].push(fn); + } + return thing; + }; + thing.once = function (type, fn) { + fn._once = true; // thing.off(fn) still works! + thing.on(type, fn); + return thing; + }; + thing.off = function (type, fn) { + var c = arguments.length; + if (c === 1) { + delete evt[type]; + } else if (c === 0) { + evt = {}; + } else { + var et = evt[type]; + if (!et) { return thing; } + et.splice(et.indexOf(fn), 1); + } + return thing; + }; + thing.emit = function () { + var args = atoa(arguments); + return thing.emitterSnapshot(args.shift()).apply(this, args); + }; + thing.emitterSnapshot = function (type) { + var et = (evt[type] || []).slice(0); + return function () { + var args = atoa(arguments); + var ctx = this || thing; + if (type === 'error' && opts.throws !== false && !et.length) { throw args.length === 1 ? args[0] : args; } + et.forEach(function emitter (listen) { + if (opts.async) { debounce(listen, args, ctx); } else { listen.apply(ctx, args); } + if (listen._once) { thing.off(type, listen); } + }); + return thing; + }; + }; + return thing; +}; + +},{"./debounce":4,"atoa":3}],6:[function(require,module,exports){ +(function (global){ +'use strict'; + +var customEvent = require('custom-event'); +var eventmap = require('./eventmap'); +var doc = global.document; +var addEvent = addEventEasy; +var removeEvent = removeEventEasy; +var hardCache = []; + +if (!global.addEventListener) { + addEvent = addEventHard; + removeEvent = removeEventHard; +} + +module.exports = { + add: addEvent, + remove: removeEvent, + fabricate: fabricateEvent +}; + +function addEventEasy (el, type, fn, capturing) { + return el.addEventListener(type, fn, capturing); +} + +function addEventHard (el, type, fn) { + return el.attachEvent('on' + type, wrap(el, type, fn)); +} + +function removeEventEasy (el, type, fn, capturing) { + return el.removeEventListener(type, fn, capturing); +} + +function removeEventHard (el, type, fn) { + var listener = unwrap(el, type, fn); + if (listener) { + return el.detachEvent('on' + type, listener); + } +} + +function fabricateEvent (el, type, model) { + var e = eventmap.indexOf(type) === -1 ? makeCustomEvent() : makeClassicEvent(); + if (el.dispatchEvent) { + el.dispatchEvent(e); + } else { + el.fireEvent('on' + type, e); + } + function makeClassicEvent () { + var e; + if (doc.createEvent) { + e = doc.createEvent('Event'); + e.initEvent(type, true, true); + } else if (doc.createEventObject) { + e = doc.createEventObject(); + } + return e; + } + function makeCustomEvent () { + return new customEvent(type, { detail: model }); + } +} + +function wrapperFactory (el, type, fn) { + return function wrapper (originalEvent) { + var e = originalEvent || global.event; + e.target = e.target || e.srcElement; + e.preventDefault = e.preventDefault || function preventDefault () { e.returnValue = false; }; + e.stopPropagation = e.stopPropagation || function stopPropagation () { e.cancelBubble = true; }; + e.which = e.which || e.keyCode; + fn.call(el, e); + }; +} + +function wrap (el, type, fn) { + var wrapper = unwrap(el, type, fn) || wrapperFactory(el, type, fn); + hardCache.push({ + wrapper: wrapper, + element: el, + type: type, + fn: fn + }); + return wrapper; +} + +function unwrap (el, type, fn) { + var i = find(el, type, fn); + if (i) { + var wrapper = hardCache[i].wrapper; + hardCache.splice(i, 1); // free up a tad of memory + return wrapper; + } +} + +function find (el, type, fn) { + var i, item; + for (i = 0; i < hardCache.length; i++) { + item = hardCache[i]; + if (item.element === el && item.type === type && item.fn === fn) { + return i; + } + } +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./eventmap":7,"custom-event":8}],7:[function(require,module,exports){ +(function (global){ +'use strict'; + +var eventmap = []; +var eventname = ''; +var ron = /^on/; + +for (eventname in global) { + if (ron.test(eventname)) { + eventmap.push(eventname.slice(2)); + } +} + +module.exports = eventmap; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{}],8:[function(require,module,exports){ +(function (global){ + +var NativeCustomEvent = global.CustomEvent; + +function useNative () { + try { + var p = new NativeCustomEvent('cat', { detail: { foo: 'bar' } }); + return 'cat' === p.type && 'bar' === p.detail.foo; + } catch (e) { + } + return false; +} + +/** + * Cross-browser `CustomEvent` constructor. + * + * https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent.CustomEvent + * + * @public + */ + +module.exports = useNative() ? NativeCustomEvent : + +// IE >= 9 +'function' === typeof document.createEvent ? function CustomEvent (type, params) { + var e = document.createEvent('CustomEvent'); + if (params) { + e.initCustomEvent(type, params.bubbles, params.cancelable, params.detail); + } else { + e.initCustomEvent(type, false, false, void 0); + } + return e; +} : + +// IE <= 8 +function CustomEvent (type, params) { + var e = document.createEventObject(); + e.type = type; + if (params) { + e.bubbles = Boolean(params.bubbles); + e.cancelable = Boolean(params.cancelable); + e.detail = params.detail; + } else { + e.bubbles = false; + e.cancelable = false; + e.detail = void 0; + } + return e; +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{}],9:[function(require,module,exports){ +var si = typeof setImmediate === 'function', tick; +if (si) { + tick = function (fn) { setImmediate(fn); }; +} else { + tick = function (fn) { setTimeout(fn, 0); }; +} + +module.exports = tick; +},{}]},{},[2])(2) +}); +//# sourceMappingURL=data:application/json;charset:utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJjbGFzc2VzLmpzIiwiZHJhZ3VsYS5qcyIsIm5vZGVfbW9kdWxlcy9hdG9hL2F0b2EuanMiLCJub2RlX21vZHVsZXMvY29udHJhL2RlYm91bmNlLmpzIiwibm9kZV9tb2R1bGVzL2NvbnRyYS9lbWl0dGVyLmpzIiwibm9kZV9tb2R1bGVzL2Nyb3NzdmVudC9zcmMvY3Jvc3N2ZW50LmpzIiwibm9kZV9tb2R1bGVzL2Nyb3NzdmVudC9zcmMvZXZlbnRtYXAuanMiLCJub2RlX21vZHVsZXMvY3VzdG9tLWV2ZW50L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3RpY2t5L3RpY2t5LWJyb3dzZXIuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDakNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2htQkE7QUFDQTs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUN0REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ3JHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDaERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitvK1wiJ1wiKTt0aHJvdyBmLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30pIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgY2FjaGUgPSB7fTtcbnZhciBzdGFydCA9ICcoPzpefFxcXFxzKSc7XG52YXIgZW5kID0gJyg/OlxcXFxzfCQpJztcblxuZnVuY3Rpb24gbG9va3VwQ2xhc3MgKGNsYXNzTmFtZSkge1xuICB2YXIgY2FjaGVkID0gY2FjaGVbY2xhc3NOYW1lXTtcbiAgaWYgKGNhY2hlZCkge1xuICAgIGNhY2hlZC5sYXN0SW5kZXggPSAwO1xuICB9IGVsc2Uge1xuICAgIGNhY2hlW2NsYXNzTmFtZV0gPSBjYWNoZWQgPSBuZXcgUmVnRXhwKHN0YXJ0ICsgY2xhc3NOYW1lICsgZW5kLCAnZycpO1xuICB9XG4gIHJldHVybiBjYWNoZWQ7XG59XG5cbmZ1bmN0aW9uIGFkZENsYXNzIChlbCwgY2xhc3NOYW1lKSB7XG4gIHZhciBjdXJyZW50ID0gZWwuY2xhc3NOYW1lO1xuICBpZiAoIWN1cnJlbnQubGVuZ3RoKSB7XG4gICAgZWwuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuICB9IGVsc2UgaWYgKCFsb29rdXBDbGFzcyhjbGFzc05hbWUpLnRlc3QoY3VycmVudCkpIHtcbiAgICBlbC5jbGFzc05hbWUgKz0gJyAnICsgY2xhc3NOYW1lO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJtQ2xhc3MgKGVsLCBjbGFzc05hbWUpIHtcbiAgZWwuY2xhc3NOYW1lID0gZWwuY2xhc3NOYW1lLnJlcGxhY2UobG9va3VwQ2xhc3MoY2xhc3NOYW1lKSwgJyAnKS50cmltKCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBhZGQ6IGFkZENsYXNzLFxuICBybTogcm1DbGFzc1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGVtaXR0ZXIgPSByZXF1aXJlKCdjb250cmEvZW1pdHRlcicpO1xudmFyIGNyb3NzdmVudCA9IHJlcXVpcmUoJ2Nyb3NzdmVudCcpO1xudmFyIGNsYXNzZXMgPSByZXF1aXJlKCcuL2NsYXNzZXMnKTtcbnZhciBkb2MgPSBkb2N1bWVudDtcbnZhciBkb2N1bWVudEVsZW1lbnQgPSBkb2MuZG9jdW1lbnRFbGVtZW50O1xuXG5mdW5jdGlvbiBkcmFndWxhIChpbml0aWFsQ29udGFpbmVycywgb3B0aW9ucykge1xuICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgaWYgKGxlbiA9PT0gMSAmJiBBcnJheS5pc0FycmF5KGluaXRpYWxDb250YWluZXJzKSA9PT0gZmFsc2UpIHtcbiAgICBvcHRpb25zID0gaW5pdGlhbENvbnRhaW5lcnM7XG4gICAgaW5pdGlhbENvbnRhaW5lcnMgPSBbXTtcbiAgfVxuICB2YXIgX21pcnJvcjsgLy8gbWlycm9yIGltYWdlXG4gIHZhciBfc291cmNlOyAvLyBzb3VyY2UgY29udGFpbmVyXG4gIHZhciBfaXRlbTsgLy8gaXRlbSBiZWluZyBkcmFnZ2VkXG4gIHZhciBfb2Zmc2V0WDsgLy8gcmVmZXJlbmNlIHhcbiAgdmFyIF9vZmZzZXRZOyAvLyByZWZlcmVuY2UgeVxuICB2YXIgX21vdmVYOyAvLyByZWZlcmVuY2UgbW92ZSB4XG4gIHZhciBfbW92ZVk7IC8vIHJlZmVyZW5jZSBtb3ZlIHlcbiAgdmFyIF9pbml0aWFsU2libGluZzsgLy8gcmVmZXJlbmNlIHNpYmxpbmcgd2hlbiBncmFiYmVkXG4gIHZhciBfY3VycmVudFNpYmxpbmc7IC8vIHJlZmVyZW5jZSBzaWJsaW5nIG5vd1xuICB2YXIgX2NvcHk7IC8vIGl0ZW0gdXNlZCBmb3IgY29weWluZ1xuICB2YXIgX3JlbmRlclRpbWVyOyAvLyB0aW1lciBmb3Igc2V0VGltZW91dCByZW5kZXJNaXJyb3JJbWFnZVxuICB2YXIgX2xhc3REcm9wVGFyZ2V0ID0gbnVsbDsgLy8gbGFzdCBjb250YWluZXIgaXRlbSB3YXMgb3ZlclxuICB2YXIgX2dyYWJiZWQ7IC8vIGhvbGRzIG1vdXNlZG93biBjb250ZXh0IHVudGlsIGZpcnN0IG1vdXNlbW92ZVxuXG4gIHZhciBvID0gb3B0aW9ucyB8fCB7fTtcbiAgaWYgKG8ubW92ZXMgPT09IHZvaWQgMCkgeyBvLm1vdmVzID0gYWx3YXlzOyB9XG4gIGlmIChvLmFjY2VwdHMgPT09IHZvaWQgMCkgeyBvLmFjY2VwdHMgPSBhbHdheXM7IH1cbiAgaWYgKG8uaW52YWxpZCA9PT0gdm9pZCAwKSB7IG8uaW52YWxpZCA9IGludmFsaWRUYXJnZXQ7IH1cbiAgaWYgKG8uY29udGFpbmVycyA9PT0gdm9pZCAwKSB7IG8uY29udGFpbmVycyA9IGluaXRpYWxDb250YWluZXJzIHx8IFtdOyB9XG4gIGlmIChvLmlzQ29udGFpbmVyID09PSB2b2lkIDApIHsgby5pc0NvbnRhaW5lciA9IG5ldmVyOyB9XG4gIGlmIChvLmNvcHkgPT09IHZvaWQgMCkgeyBvLmNvcHkgPSBmYWxzZTsgfVxuICBpZiAoby5jb3B5U29ydFNvdXJjZSA9PT0gdm9pZCAwKSB7IG8uY29weVNvcnRTb3VyY2UgPSBmYWxzZTsgfVxuICBpZiAoby5yZXZlcnRPblNwaWxsID09PSB2b2lkIDApIHsgby5yZXZlcnRPblNwaWxsID0gZmFsc2U7IH1cbiAgaWYgKG8ucmVtb3ZlT25TcGlsbCA9PT0gdm9pZCAwKSB7IG8ucmVtb3ZlT25TcGlsbCA9IGZhbHNlOyB9XG4gIGlmIChvLmRpcmVjdGlvbiA9PT0gdm9pZCAwKSB7IG8uZGlyZWN0aW9uID0gJ3ZlcnRpY2FsJzsgfVxuICBpZiAoby5pZ25vcmVJbnB1dFRleHRTZWxlY3Rpb24gPT09IHZvaWQgMCkgeyBvLmlnbm9yZUlucHV0VGV4dFNlbGVjdGlvbiA9IHRydWU7IH1cbiAgaWYgKG8ubWlycm9yQ29udGFpbmVyID09PSB2b2lkIDApIHsgby5taXJyb3JDb250YWluZXIgPSBkb2MuYm9keTsgfVxuXG4gIHZhciBkcmFrZSA9IGVtaXR0ZXIoe1xuICAgIGNvbnRhaW5lcnM6IG8uY29udGFpbmVycyxcbiAgICBzdGFydDogbWFudWFsU3RhcnQsXG4gICAgZW5kOiBlbmQsXG4gICAgY2FuY2VsOiBjYW5jZWwsXG4gICAgcmVtb3ZlOiByZW1vdmUsXG4gICAgZGVzdHJveTogZGVzdHJveSxcbiAgICBjYW5Nb3ZlOiBjYW5Nb3ZlLFxuICAgIGRyYWdnaW5nOiBmYWxzZVxuICB9KTtcblxuICBpZiAoby5yZW1vdmVPblNwaWxsID09PSB0cnVlKSB7XG4gICAgZHJha2Uub24oJ292ZXInLCBzcGlsbE92ZXIpLm9uKCdvdXQnLCBzcGlsbE91dCk7XG4gIH1cblxuICBldmVudHMoKTtcblxuICByZXR1cm4gZHJha2U7XG5cbiAgZnVuY3Rpb24gaXNDb250YWluZXIgKGVsKSB7XG4gICAgcmV0dXJuIGRyYWtlLmNvbnRhaW5lcnMuaW5kZXhPZihlbCkgIT09IC0xIHx8IG8uaXNDb250YWluZXIoZWwpO1xuICB9XG5cbiAgZnVuY3Rpb24gZXZlbnRzIChyZW1vdmUpIHtcbiAgICB2YXIgb3AgPSByZW1vdmUgPyAncmVtb3ZlJyA6ICdhZGQnO1xuICAgIHRvdWNoeShkb2N1bWVudEVsZW1lbnQsIG9wLCAnbW91c2Vkb3duJywgZ3JhYik7XG4gICAgdG91Y2h5KGRvY3VtZW50RWxlbWVudCwgb3AsICdtb3VzZXVwJywgcmVsZWFzZSk7XG4gIH1cblxuICBmdW5jdGlvbiBldmVudHVhbE1vdmVtZW50cyAocmVtb3ZlKSB7XG4gICAgdmFyIG9wID0gcmVtb3ZlID8gJ3JlbW92ZScgOiAnYWRkJztcbiAgICB0b3VjaHkoZG9jdW1lbnRFbGVtZW50LCBvcCwgJ21vdXNlbW92ZScsIHN0YXJ0QmVjYXVzZU1vdXNlTW92ZWQpO1xuICB9XG5cbiAgZnVuY3Rpb24gbW92ZW1lbnRzIChyZW1vdmUpIHtcbiAgICB2YXIgb3AgPSByZW1vdmUgPyAncmVtb3ZlJyA6ICdhZGQnO1xuICAgIGNyb3NzdmVudFtvcF0oZG9jdW1lbnRFbGVtZW50LCAnc2VsZWN0c3RhcnQnLCBwcmV2ZW50R3JhYmJlZCk7IC8vIElFOFxuICAgIGNyb3NzdmVudFtvcF0oZG9jdW1lbnRFbGVtZW50LCAnY2xpY2snLCBwcmV2ZW50R3JhYmJlZCk7XG4gIH1cblxuICBmdW5jdGlvbiBkZXN0cm95ICgpIHtcbiAgICBldmVudHModHJ1ZSk7XG4gICAgcmVsZWFzZSh7fSk7XG4gIH1cblxuICBmdW5jdGlvbiBwcmV2ZW50R3JhYmJlZCAoZSkge1xuICAgIGlmIChfZ3JhYmJlZCkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdyYWIgKGUpIHtcbiAgICBfbW92ZVggPSBlLmNsaWVudFg7XG4gICAgX21vdmVZID0gZS5jbGllbnRZO1xuXG4gICAgdmFyIGlnbm9yZSA9IHdoaWNoTW91c2VCdXR0b24oZSkgIT09IDEgfHwgZS5tZXRhS2V5IHx8IGUuY3RybEtleTtcbiAgICBpZiAoaWdub3JlKSB7XG4gICAgICByZXR1cm47IC8vIHdlIG9ubHkgY2FyZSBhYm91dCBob25lc3QtdG8tZ29kIGxlZnQgY2xpY2tzIGFuZCB0b3VjaCBldmVudHNcbiAgICB9XG4gICAgdmFyIGl0ZW0gPSBlLnRhcmdldDtcbiAgICB2YXIgY29udGV4dCA9IGNhblN0YXJ0KGl0ZW0pO1xuICAgIGlmICghY29udGV4dCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBfZ3JhYmJlZCA9IGNvbnRleHQ7XG4gICAgZXZlbnR1YWxNb3ZlbWVudHMoKTtcbiAgICBpZiAoZS50eXBlID09PSAnbW91c2Vkb3duJykge1xuICAgICAgaWYgKGlzSW5wdXQoaXRlbSkpIHsgLy8gc2VlIGFsc286IGh0dHBzOi8vZ2l0aHViLmNvbS9iZXZhY3F1YS9kcmFndWxhL2lzc3Vlcy8yMDhcbiAgICAgICAgaXRlbS5mb2N1cygpOyAvLyBmaXhlcyBodHRwczovL2dpdGh1Yi5jb20vYmV2YWNxdWEvZHJhZ3VsYS9pc3N1ZXMvMTc2XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7IC8vIGZpeGVzIGh0dHBzOi8vZ2l0aHViLmNvbS9iZXZhY3F1YS9kcmFndWxhL2lzc3Vlcy8xNTVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdGFydEJlY2F1c2VNb3VzZU1vdmVkIChlKSB7XG4gICAgaWYgKCFfZ3JhYmJlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAod2hpY2hNb3VzZUJ1dHRvbihlKSA9PT0gMCkge1xuICAgICAgcmVsZWFzZSh7fSk7XG4gICAgICByZXR1cm47IC8vIHdoZW4gdGV4dCBpcyBzZWxlY3RlZCBvbiBhbiBpbnB1dCBhbmQgdGhlbiBkcmFnZ2VkLCBtb3VzZXVwIGRvZXNuJ3QgZmlyZS4gdGhpcyBpcyBvdXIgb25seSBob3BlXG4gICAgfVxuICAgIC8vIHRydXRoeSBjaGVjayBmaXhlcyAjMjM5LCBlcXVhbGl0eSBmaXhlcyAjMjA3XG4gICAgaWYgKGUuY2xpZW50WCAhPT0gdm9pZCAwICYmIGUuY2xpZW50WCA9PT0gX21vdmVYICYmIGUuY2xpZW50WSAhPT0gdm9pZCAwICYmIGUuY2xpZW50WSA9PT0gX21vdmVZKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChvLmlnbm9yZUlucHV0VGV4dFNlbGVjdGlvbikge1xuICAgICAgdmFyIGNsaWVudFggPSBnZXRDb29yZCgnY2xpZW50WCcsIGUpO1xuICAgICAgdmFyIGNsaWVudFkgPSBnZXRDb29yZCgnY2xpZW50WScsIGUpO1xuICAgICAgdmFyIGVsZW1lbnRCZWhpbmRDdXJzb3IgPSBkb2MuZWxlbWVudEZyb21Qb2ludChjbGllbnRYLCBjbGllbnRZKTtcbiAgICAgIGlmIChpc0lucHV0KGVsZW1lbnRCZWhpbmRDdXJzb3IpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZ3JhYmJlZCA9IF9ncmFiYmVkOyAvLyBjYWxsIHRvIGVuZCgpIHVuc2V0cyBfZ3JhYmJlZFxuICAgIGV2ZW50dWFsTW92ZW1lbnRzKHRydWUpO1xuICAgIG1vdmVtZW50cygpO1xuICAgIGVuZCgpO1xuICAgIHN0YXJ0KGdyYWJiZWQpO1xuXG4gICAgdmFyIG9mZnNldCA9IGdldE9mZnNldChfaXRlbSk7XG4gICAgX29mZnNldFggPSBnZXRDb29yZCgncGFnZVgnLCBlKSAtIG9mZnNldC5sZWZ0O1xuICAgIF9vZmZzZXRZID0gZ2V0Q29vcmQoJ3BhZ2VZJywgZSkgLSBvZmZzZXQudG9wO1xuXG4gICAgY2xhc3Nlcy5hZGQoX2NvcHkgfHwgX2l0ZW0sICdndS10cmFuc2l0Jyk7XG4gICAgcmVuZGVyTWlycm9ySW1hZ2UoKTtcbiAgICBkcmFnKGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuU3RhcnQgKGl0ZW0pIHtcbiAgICBpZiAoZHJha2UuZHJhZ2dpbmcgJiYgX21pcnJvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoaXNDb250YWluZXIoaXRlbSkpIHtcbiAgICAgIHJldHVybjsgLy8gZG9uJ3QgZHJhZyBjb250YWluZXIgaXRzZWxmXG4gICAgfVxuICAgIHZhciBoYW5kbGUgPSBpdGVtO1xuICAgIHdoaWxlIChnZXRQYXJlbnQoaXRlbSkgJiYgaXNDb250YWluZXIoZ2V0UGFyZW50KGl0ZW0pKSA9PT0gZmFsc2UpIHtcbiAgICAgIGlmIChvLmludmFsaWQoaXRlbSwgaGFuZGxlKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpdGVtID0gZ2V0UGFyZW50KGl0ZW0pOyAvLyBkcmFnIHRhcmdldCBzaG91bGQgYmUgYSB0b3AgZWxlbWVudFxuICAgICAgaWYgKCFpdGVtKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFyIHNvdXJjZSA9IGdldFBhcmVudChpdGVtKTtcbiAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoby5pbnZhbGlkKGl0ZW0sIGhhbmRsZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgbW92YWJsZSA9IG8ubW92ZXMoaXRlbSwgc291cmNlLCBoYW5kbGUsIG5leHRFbChpdGVtKSk7XG4gICAgaWYgKCFtb3ZhYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGl0ZW06IGl0ZW0sXG4gICAgICBzb3VyY2U6IHNvdXJjZVxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBjYW5Nb3ZlIChpdGVtKSB7XG4gICAgcmV0dXJuICEhY2FuU3RhcnQoaXRlbSk7XG4gIH1cblxuICBmdW5jdGlvbiBtYW51YWxTdGFydCAoaXRlbSkge1xuICAgIHZhciBjb250ZXh0ID0gY2FuU3RhcnQoaXRlbSk7XG4gICAgaWYgKGNvbnRleHQpIHtcbiAgICAgIHN0YXJ0KGNvbnRleHQpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXJ0IChjb250ZXh0KSB7XG4gICAgaWYgKGlzQ29weShjb250ZXh0Lml0ZW0sIGNvbnRleHQuc291cmNlKSkge1xuICAgICAgX2NvcHkgPSBjb250ZXh0Lml0ZW0uY2xvbmVOb2RlKHRydWUpO1xuICAgICAgZHJha2UuZW1pdCgnY2xvbmVkJywgX2NvcHksIGNvbnRleHQuaXRlbSwgJ2NvcHknKTtcbiAgICB9XG5cbiAgICBfc291cmNlID0gY29udGV4dC5zb3VyY2U7XG4gICAgX2l0ZW0gPSBjb250ZXh0Lml0ZW07XG4gICAgX2luaXRpYWxTaWJsaW5nID0gX2N1cnJlbnRTaWJsaW5nID0gbmV4dEVsKGNvbnRleHQuaXRlbSk7XG5cbiAgICBkcmFrZS5kcmFnZ2luZyA9IHRydWU7XG4gICAgZHJha2UuZW1pdCgnZHJhZycsIF9pdGVtLCBfc291cmNlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGludmFsaWRUYXJnZXQgKCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGVuZCAoKSB7XG4gICAgaWYgKCFkcmFrZS5kcmFnZ2luZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgaXRlbSA9IF9jb3B5IHx8IF9pdGVtO1xuICAgIGRyb3AoaXRlbSwgZ2V0UGFyZW50KGl0ZW0pKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVuZ3JhYiAoKSB7XG4gICAgX2dyYWJiZWQgPSBmYWxzZTtcbiAgICBldmVudHVhbE1vdmVtZW50cyh0cnVlKTtcbiAgICBtb3ZlbWVudHModHJ1ZSk7XG4gIH1cblxuICBmdW5jdGlvbiByZWxlYXNlIChlKSB7XG4gICAgdW5ncmFiKCk7XG5cbiAgICBpZiAoIWRyYWtlLmRyYWdnaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBpdGVtID0gX2NvcHkgfHwgX2l0ZW07XG4gICAgdmFyIGNsaWVudFggPSBnZXRDb29yZCgnY2xpZW50WCcsIGUpO1xuICAgIHZhciBjbGllbnRZID0gZ2V0Q29vcmQoJ2NsaWVudFknLCBlKTtcbiAgICB2YXIgZWxlbWVudEJlaGluZEN1cnNvciA9IGdldEVsZW1lbnRCZWhpbmRQb2ludChfbWlycm9yLCBjbGllbnRYLCBjbGllbnRZKTtcbiAgICB2YXIgZHJvcFRhcmdldCA9IGZpbmREcm9wVGFyZ2V0KGVsZW1lbnRCZWhpbmRDdXJzb3IsIGNsaWVudFgsIGNsaWVudFkpO1xuICAgIGlmIChkcm9wVGFyZ2V0ICYmICgoX2NvcHkgJiYgby5jb3B5U29ydFNvdXJjZSkgfHwgKCFfY29weSB8fCBkcm9wVGFyZ2V0ICE9PSBfc291cmNlKSkpIHtcbiAgICAgIGRyb3AoaXRlbSwgZHJvcFRhcmdldCk7XG4gICAgfSBlbHNlIGlmIChvLnJlbW92ZU9uU3BpbGwpIHtcbiAgICAgIHJlbW92ZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjYW5jZWwoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBkcm9wIChpdGVtLCB0YXJnZXQpIHtcbiAgICB2YXIgcGFyZW50ID0gZ2V0UGFyZW50KGl0ZW0pO1xuICAgIGlmIChfY29weSAmJiBvLmNvcHlTb3J0U291cmNlICYmIHRhcmdldCA9PT0gX3NvdXJjZSkge1xuICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKF9pdGVtKTtcbiAgICB9XG4gICAgaWYgKGlzSW5pdGlhbFBsYWNlbWVudCh0YXJnZXQpKSB7XG4gICAgICBkcmFrZS5lbWl0KCdjYW5jZWwnLCBpdGVtLCBfc291cmNlLCBfc291cmNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZHJha2UuZW1pdCgnZHJvcCcsIGl0ZW0sIHRhcmdldCwgX3NvdXJjZSwgX2N1cnJlbnRTaWJsaW5nKTtcbiAgICB9XG4gICAgY2xlYW51cCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3ZlICgpIHtcbiAgICBpZiAoIWRyYWtlLmRyYWdnaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBpdGVtID0gX2NvcHkgfHwgX2l0ZW07XG4gICAgdmFyIHBhcmVudCA9IGdldFBhcmVudChpdGVtKTtcbiAgICBpZiAocGFyZW50KSB7XG4gICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQoaXRlbSk7XG4gICAgfVxuICAgIGRyYWtlLmVtaXQoX2NvcHkgPyAnY2FuY2VsJyA6ICdyZW1vdmUnLCBpdGVtLCBwYXJlbnQsIF9zb3VyY2UpO1xuICAgIGNsZWFudXAoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNhbmNlbCAocmV2ZXJ0KSB7XG4gICAgaWYgKCFkcmFrZS5kcmFnZ2luZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgcmV2ZXJ0cyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwID8gcmV2ZXJ0IDogby5yZXZlcnRPblNwaWxsO1xuICAgIHZhciBpdGVtID0gX2NvcHkgfHwgX2l0ZW07XG4gICAgdmFyIHBhcmVudCA9IGdldFBhcmVudChpdGVtKTtcbiAgICB2YXIgaW5pdGlhbCA9IGlzSW5pdGlhbFBsYWNlbWVudChwYXJlbnQpO1xuICAgIGlmIChpbml0aWFsID09PSBmYWxzZSAmJiByZXZlcnRzKSB7XG4gICAgICBpZiAoX2NvcHkpIHtcbiAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChfY29weSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9zb3VyY2UuaW5zZXJ0QmVmb3JlKGl0ZW0sIF9pbml0aWFsU2libGluZyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpbml0aWFsIHx8IHJldmVydHMpIHtcbiAgICAgIGRyYWtlLmVtaXQoJ2NhbmNlbCcsIGl0ZW0sIF9zb3VyY2UsIF9zb3VyY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkcmFrZS5lbWl0KCdkcm9wJywgaXRlbSwgcGFyZW50LCBfc291cmNlLCBfY3VycmVudFNpYmxpbmcpO1xuICAgIH1cbiAgICBjbGVhbnVwKCk7XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhbnVwICgpIHtcbiAgICB2YXIgaXRlbSA9IF9jb3B5IHx8IF9pdGVtO1xuICAgIHVuZ3JhYigpO1xuICAgIHJlbW92ZU1pcnJvckltYWdlKCk7XG4gICAgaWYgKGl0ZW0pIHtcbiAgICAgIGNsYXNzZXMucm0oaXRlbSwgJ2d1LXRyYW5zaXQnKTtcbiAgICB9XG4gICAgaWYgKF9yZW5kZXJUaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KF9yZW5kZXJUaW1lcik7XG4gICAgfVxuICAgIGRyYWtlLmRyYWdnaW5nID0gZmFsc2U7XG4gICAgaWYgKF9sYXN0RHJvcFRhcmdldCkge1xuICAgICAgZHJha2UuZW1pdCgnb3V0JywgaXRlbSwgX2xhc3REcm9wVGFyZ2V0LCBfc291cmNlKTtcbiAgICB9XG4gICAgZHJha2UuZW1pdCgnZHJhZ2VuZCcsIGl0ZW0pO1xuICAgIF9zb3VyY2UgPSBfaXRlbSA9IF9jb3B5ID0gX2luaXRpYWxTaWJsaW5nID0gX2N1cnJlbnRTaWJsaW5nID0gX3JlbmRlclRpbWVyID0gX2xhc3REcm9wVGFyZ2V0ID0gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzSW5pdGlhbFBsYWNlbWVudCAodGFyZ2V0LCBzKSB7XG4gICAgdmFyIHNpYmxpbmc7XG4gICAgaWYgKHMgIT09IHZvaWQgMCkge1xuICAgICAgc2libGluZyA9IHM7XG4gICAgfSBlbHNlIGlmIChfbWlycm9yKSB7XG4gICAgICBzaWJsaW5nID0gX2N1cnJlbnRTaWJsaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaWJsaW5nID0gbmV4dEVsKF9jb3B5IHx8IF9pdGVtKTtcbiAgICB9XG4gICAgcmV0dXJuIHRhcmdldCA9PT0gX3NvdXJjZSAmJiBzaWJsaW5nID09PSBfaW5pdGlhbFNpYmxpbmc7XG4gIH1cblxuICBmdW5jdGlvbiBmaW5kRHJvcFRhcmdldCAoZWxlbWVudEJlaGluZEN1cnNvciwgY2xpZW50WCwgY2xpZW50WSkge1xuICAgIHZhciB0YXJnZXQgPSBlbGVtZW50QmVoaW5kQ3Vyc29yO1xuICAgIHdoaWxlICh0YXJnZXQgJiYgIWFjY2VwdGVkKCkpIHtcbiAgICAgIHRhcmdldCA9IGdldFBhcmVudCh0YXJnZXQpO1xuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xuXG4gICAgZnVuY3Rpb24gYWNjZXB0ZWQgKCkge1xuICAgICAgdmFyIGRyb3BwYWJsZSA9IGlzQ29udGFpbmVyKHRhcmdldCk7XG4gICAgICBpZiAoZHJvcHBhYmxlID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHZhciBpbW1lZGlhdGUgPSBnZXRJbW1lZGlhdGVDaGlsZCh0YXJnZXQsIGVsZW1lbnRCZWhpbmRDdXJzb3IpO1xuICAgICAgdmFyIHJlZmVyZW5jZSA9IGdldFJlZmVyZW5jZSh0YXJnZXQsIGltbWVkaWF0ZSwgY2xpZW50WCwgY2xpZW50WSk7XG4gICAgICB2YXIgaW5pdGlhbCA9IGlzSW5pdGlhbFBsYWNlbWVudCh0YXJnZXQsIHJlZmVyZW5jZSk7XG4gICAgICBpZiAoaW5pdGlhbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gc2hvdWxkIGFsd2F5cyBiZSBhYmxlIHRvIGRyb3AgaXQgcmlnaHQgYmFjayB3aGVyZSBpdCB3YXNcbiAgICAgIH1cbiAgICAgIHJldHVybiBvLmFjY2VwdHMoX2l0ZW0sIHRhcmdldCwgX3NvdXJjZSwgcmVmZXJlbmNlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBkcmFnIChlKSB7XG4gICAgaWYgKCFfbWlycm9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgIHZhciBjbGllbnRYID0gZ2V0Q29vcmQoJ2NsaWVudFgnLCBlKTtcbiAgICB2YXIgY2xpZW50WSA9IGdldENvb3JkKCdjbGllbnRZJywgZSk7XG4gICAgdmFyIHggPSBjbGllbnRYIC0gX29mZnNldFg7XG4gICAgdmFyIHkgPSBjbGllbnRZIC0gX29mZnNldFk7XG5cbiAgICBfbWlycm9yLnN0eWxlLmxlZnQgPSB4ICsgJ3B4JztcbiAgICBfbWlycm9yLnN0eWxlLnRvcCA9IHkgKyAncHgnO1xuXG4gICAgdmFyIGl0ZW0gPSBfY29weSB8fCBfaXRlbTtcbiAgICB2YXIgZWxlbWVudEJlaGluZEN1cnNvciA9IGdldEVsZW1lbnRCZWhpbmRQb2ludChfbWlycm9yLCBjbGllbnRYLCBjbGllbnRZKTtcbiAgICB2YXIgZHJvcFRhcmdldCA9IGZpbmREcm9wVGFyZ2V0KGVsZW1lbnRCZWhpbmRDdXJzb3IsIGNsaWVudFgsIGNsaWVudFkpO1xuICAgIHZhciBjaGFuZ2VkID0gZHJvcFRhcmdldCAhPT0gbnVsbCAmJiBkcm9wVGFyZ2V0ICE9PSBfbGFzdERyb3BUYXJnZXQ7XG4gICAgaWYgKGNoYW5nZWQgfHwgZHJvcFRhcmdldCA9PT0gbnVsbCkge1xuICAgICAgb3V0KCk7XG4gICAgICBfbGFzdERyb3BUYXJnZXQgPSBkcm9wVGFyZ2V0O1xuICAgICAgb3ZlcigpO1xuICAgIH1cbiAgICB2YXIgcGFyZW50ID0gZ2V0UGFyZW50KGl0ZW0pO1xuICAgIGlmIChkcm9wVGFyZ2V0ID09PSBfc291cmNlICYmIF9jb3B5ICYmICFvLmNvcHlTb3J0U291cmNlKSB7XG4gICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChpdGVtKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHJlZmVyZW5jZTtcbiAgICB2YXIgaW1tZWRpYXRlID0gZ2V0SW1tZWRpYXRlQ2hpbGQoZHJvcFRhcmdldCwgZWxlbWVudEJlaGluZEN1cnNvcik7XG4gICAgaWYgKGltbWVkaWF0ZSAhPT0gbnVsbCkge1xuICAgICAgcmVmZXJlbmNlID0gZ2V0UmVmZXJlbmNlKGRyb3BUYXJnZXQsIGltbWVkaWF0ZSwgY2xpZW50WCwgY2xpZW50WSk7XG4gICAgfSBlbHNlIGlmIChvLnJldmVydE9uU3BpbGwgPT09IHRydWUgJiYgIV9jb3B5KSB7XG4gICAgICByZWZlcmVuY2UgPSBfaW5pdGlhbFNpYmxpbmc7XG4gICAgICBkcm9wVGFyZ2V0ID0gX3NvdXJjZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKF9jb3B5ICYmIHBhcmVudCkge1xuICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQoaXRlbSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChcbiAgICAgIChyZWZlcmVuY2UgPT09IG51bGwgJiYgY2hhbmdlZCkgfHxcbiAgICAgIHJlZmVyZW5jZSAhPT0gaXRlbSAmJlxuICAgICAgcmVmZXJlbmNlICE9PSBuZXh0RWwoaXRlbSlcbiAgICApIHtcbiAgICAgIF9jdXJyZW50U2libGluZyA9IHJlZmVyZW5jZTtcbiAgICAgIGRyb3BUYXJnZXQuaW5zZXJ0QmVmb3JlKGl0ZW0sIHJlZmVyZW5jZSk7XG4gICAgICBkcmFrZS5lbWl0KCdzaGFkb3cnLCBpdGVtLCBkcm9wVGFyZ2V0LCBfc291cmNlKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gbW92ZWQgKHR5cGUpIHsgZHJha2UuZW1pdCh0eXBlLCBpdGVtLCBfbGFzdERyb3BUYXJnZXQsIF9zb3VyY2UpOyB9XG4gICAgZnVuY3Rpb24gb3ZlciAoKSB7IGlmIChjaGFuZ2VkKSB7IG1vdmVkKCdvdmVyJyk7IH0gfVxuICAgIGZ1bmN0aW9uIG91dCAoKSB7IGlmIChfbGFzdERyb3BUYXJnZXQpIHsgbW92ZWQoJ291dCcpOyB9IH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNwaWxsT3ZlciAoZWwpIHtcbiAgICBjbGFzc2VzLnJtKGVsLCAnZ3UtaGlkZScpO1xuICB9XG5cbiAgZnVuY3Rpb24gc3BpbGxPdXQgKGVsKSB7XG4gICAgaWYgKGRyYWtlLmRyYWdnaW5nKSB7IGNsYXNzZXMuYWRkKGVsLCAnZ3UtaGlkZScpOyB9XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXJNaXJyb3JJbWFnZSAoKSB7XG4gICAgaWYgKF9taXJyb3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHJlY3QgPSBfaXRlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBfbWlycm9yID0gX2l0ZW0uY2xvbmVOb2RlKHRydWUpO1xuICAgIF9taXJyb3Iuc3R5bGUud2lkdGggPSBnZXRSZWN0V2lkdGgocmVjdCkgKyAncHgnO1xuICAgIF9taXJyb3Iuc3R5bGUuaGVpZ2h0ID0gZ2V0UmVjdEhlaWdodChyZWN0KSArICdweCc7XG4gICAgY2xhc3Nlcy5ybShfbWlycm9yLCAnZ3UtdHJhbnNpdCcpO1xuICAgIGNsYXNzZXMuYWRkKF9taXJyb3IsICdndS1taXJyb3InKTtcbiAgICBvLm1pcnJvckNvbnRhaW5lci5hcHBlbmRDaGlsZChfbWlycm9yKTtcbiAgICB0b3VjaHkoZG9jdW1lbnRFbGVtZW50LCAnYWRkJywgJ21vdXNlbW92ZScsIGRyYWcpO1xuICAgIGNsYXNzZXMuYWRkKG8ubWlycm9yQ29udGFpbmVyLCAnZ3UtdW5zZWxlY3RhYmxlJyk7XG4gICAgZHJha2UuZW1pdCgnY2xvbmVkJywgX21pcnJvciwgX2l0ZW0sICdtaXJyb3InKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbW92ZU1pcnJvckltYWdlICgpIHtcbiAgICBpZiAoX21pcnJvcikge1xuICAgICAgY2xhc3Nlcy5ybShvLm1pcnJvckNvbnRhaW5lciwgJ2d1LXVuc2VsZWN0YWJsZScpO1xuICAgICAgdG91Y2h5KGRvY3VtZW50RWxlbWVudCwgJ3JlbW92ZScsICdtb3VzZW1vdmUnLCBkcmFnKTtcbiAgICAgIGdldFBhcmVudChfbWlycm9yKS5yZW1vdmVDaGlsZChfbWlycm9yKTtcbiAgICAgIF9taXJyb3IgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEltbWVkaWF0ZUNoaWxkIChkcm9wVGFyZ2V0LCB0YXJnZXQpIHtcbiAgICB2YXIgaW1tZWRpYXRlID0gdGFyZ2V0O1xuICAgIHdoaWxlIChpbW1lZGlhdGUgIT09IGRyb3BUYXJnZXQgJiYgZ2V0UGFyZW50KGltbWVkaWF0ZSkgIT09IGRyb3BUYXJnZXQpIHtcbiAgICAgIGltbWVkaWF0ZSA9IGdldFBhcmVudChpbW1lZGlhdGUpO1xuICAgIH1cbiAgICBpZiAoaW1tZWRpYXRlID09PSBkb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gaW1tZWRpYXRlO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0UmVmZXJlbmNlIChkcm9wVGFyZ2V0LCB0YXJnZXQsIHgsIHkpIHtcbiAgICB2YXIgaG9yaXpvbnRhbCA9IG8uZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCc7XG4gICAgdmFyIHJlZmVyZW5jZSA9IHRhcmdldCAhPT0gZHJvcFRhcmdldCA/IGluc2lkZSgpIDogb3V0c2lkZSgpO1xuICAgIHJldHVybiByZWZlcmVuY2U7XG5cbiAgICBmdW5jdGlvbiBvdXRzaWRlICgpIHsgLy8gc2xvd2VyLCBidXQgYWJsZSB0byBmaWd1cmUgb3V0IGFueSBwb3NpdGlvblxuICAgICAgdmFyIGxlbiA9IGRyb3BUYXJnZXQuY2hpbGRyZW4ubGVuZ3RoO1xuICAgICAgdmFyIGk7XG4gICAgICB2YXIgZWw7XG4gICAgICB2YXIgcmVjdDtcbiAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBlbCA9IGRyb3BUYXJnZXQuY2hpbGRyZW5baV07XG4gICAgICAgIHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgaWYgKGhvcml6b250YWwgJiYgKHJlY3QubGVmdCArIHJlY3Qud2lkdGggLyAyKSA+IHgpIHsgcmV0dXJuIGVsOyB9XG4gICAgICAgIGlmICghaG9yaXpvbnRhbCAmJiAocmVjdC50b3AgKyByZWN0LmhlaWdodCAvIDIpID4geSkgeyByZXR1cm4gZWw7IH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGluc2lkZSAoKSB7IC8vIGZhc3RlciwgYnV0IG9ubHkgYXZhaWxhYmxlIGlmIGRyb3BwZWQgaW5zaWRlIGEgY2hpbGQgZWxlbWVudFxuICAgICAgdmFyIHJlY3QgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBpZiAoaG9yaXpvbnRhbCkge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZSh4ID4gcmVjdC5sZWZ0ICsgZ2V0UmVjdFdpZHRoKHJlY3QpIC8gMik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzb2x2ZSh5ID4gcmVjdC50b3AgKyBnZXRSZWN0SGVpZ2h0KHJlY3QpIC8gMik7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVzb2x2ZSAoYWZ0ZXIpIHtcbiAgICAgIHJldHVybiBhZnRlciA/IG5leHRFbCh0YXJnZXQpIDogdGFyZ2V0O1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGlzQ29weSAoaXRlbSwgY29udGFpbmVyKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBvLmNvcHkgPT09ICdib29sZWFuJyA/IG8uY29weSA6IG8uY29weShpdGVtLCBjb250YWluZXIpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvdWNoeSAoZWwsIG9wLCB0eXBlLCBmbikge1xuICB2YXIgdG91Y2ggPSB7XG4gICAgbW91c2V1cDogJ3RvdWNoZW5kJyxcbiAgICBtb3VzZWRvd246ICd0b3VjaHN0YXJ0JyxcbiAgICBtb3VzZW1vdmU6ICd0b3VjaG1vdmUnXG4gIH07XG4gIHZhciBwb2ludGVycyA9IHtcbiAgICBtb3VzZXVwOiAncG9pbnRlcnVwJyxcbiAgICBtb3VzZWRvd246ICdwb2ludGVyZG93bicsXG4gICAgbW91c2Vtb3ZlOiAncG9pbnRlcm1vdmUnXG4gIH07XG4gIHZhciBtaWNyb3NvZnQgPSB7XG4gICAgbW91c2V1cDogJ01TUG9pbnRlclVwJyxcbiAgICBtb3VzZWRvd246ICdNU1BvaW50ZXJEb3duJyxcbiAgICBtb3VzZW1vdmU6ICdNU1BvaW50ZXJNb3ZlJ1xuICB9O1xuICBpZiAoZ2xvYmFsLm5hdmlnYXRvci5wb2ludGVyRW5hYmxlZCkge1xuICAgIGNyb3NzdmVudFtvcF0oZWwsIHBvaW50ZXJzW3R5cGVdLCBmbik7XG4gIH0gZWxzZSBpZiAoZ2xvYmFsLm5hdmlnYXRvci5tc1BvaW50ZXJFbmFibGVkKSB7XG4gICAgY3Jvc3N2ZW50W29wXShlbCwgbWljcm9zb2Z0W3R5cGVdLCBmbik7XG4gIH0gZWxzZSB7XG4gICAgY3Jvc3N2ZW50W29wXShlbCwgdG91Y2hbdHlwZV0sIGZuKTtcbiAgICBjcm9zc3ZlbnRbb3BdKGVsLCB0eXBlLCBmbik7XG4gIH1cbn1cblxuZnVuY3Rpb24gd2hpY2hNb3VzZUJ1dHRvbiAoZSkge1xuICBpZiAoZS50b3VjaGVzICE9PSB2b2lkIDApIHsgcmV0dXJuIGUudG91Y2hlcy5sZW5ndGg7IH1cbiAgaWYgKGUud2hpY2ggIT09IHZvaWQgMCAmJiBlLndoaWNoICE9PSAwKSB7IHJldHVybiBlLndoaWNoOyB9IC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vYmV2YWNxdWEvZHJhZ3VsYS9pc3N1ZXMvMjYxXG4gIGlmIChlLmJ1dHRvbnMgIT09IHZvaWQgMCkgeyByZXR1cm4gZS5idXR0b25zOyB9XG4gIHZhciBidXR0b24gPSBlLmJ1dHRvbjtcbiAgaWYgKGJ1dHRvbiAhPT0gdm9pZCAwKSB7IC8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9ibG9iLzk5ZThmZjFiYWE3YWUzNDFlOTRiYjg5YzNlODQ1NzBjN2MzYWQ5ZWEvc3JjL2V2ZW50LmpzI0w1NzMtTDU3NVxuICAgIHJldHVybiBidXR0b24gJiAxID8gMSA6IGJ1dHRvbiAmIDIgPyAzIDogKGJ1dHRvbiAmIDQgPyAyIDogMCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0T2Zmc2V0IChlbCkge1xuICB2YXIgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICByZXR1cm4ge1xuICAgIGxlZnQ6IHJlY3QubGVmdCArIGdldFNjcm9sbCgnc2Nyb2xsTGVmdCcsICdwYWdlWE9mZnNldCcpLFxuICAgIHRvcDogcmVjdC50b3AgKyBnZXRTY3JvbGwoJ3Njcm9sbFRvcCcsICdwYWdlWU9mZnNldCcpXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFNjcm9sbCAoc2Nyb2xsUHJvcCwgb2Zmc2V0UHJvcCkge1xuICBpZiAodHlwZW9mIGdsb2JhbFtvZmZzZXRQcm9wXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gZ2xvYmFsW29mZnNldFByb3BdO1xuICB9XG4gIGlmIChkb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSB7XG4gICAgcmV0dXJuIGRvY3VtZW50RWxlbWVudFtzY3JvbGxQcm9wXTtcbiAgfVxuICByZXR1cm4gZG9jLmJvZHlbc2Nyb2xsUHJvcF07XG59XG5cbmZ1bmN0aW9uIGdldEVsZW1lbnRCZWhpbmRQb2ludCAocG9pbnQsIHgsIHkpIHtcbiAgdmFyIHAgPSBwb2ludCB8fCB7fTtcbiAgdmFyIHN0YXRlID0gcC5jbGFzc05hbWU7XG4gIHZhciBlbDtcbiAgcC5jbGFzc05hbWUgKz0gJyBndS1oaWRlJztcbiAgZWwgPSBkb2MuZWxlbWVudEZyb21Qb2ludCh4LCB5KTtcbiAgcC5jbGFzc05hbWUgPSBzdGF0ZTtcbiAgcmV0dXJuIGVsO1xufVxuXG5mdW5jdGlvbiBuZXZlciAoKSB7IHJldHVybiBmYWxzZTsgfVxuZnVuY3Rpb24gYWx3YXlzICgpIHsgcmV0dXJuIHRydWU7IH1cbmZ1bmN0aW9uIGdldFJlY3RXaWR0aCAocmVjdCkgeyByZXR1cm4gcmVjdC53aWR0aCB8fCAocmVjdC5yaWdodCAtIHJlY3QubGVmdCk7IH1cbmZ1bmN0aW9uIGdldFJlY3RIZWlnaHQgKHJlY3QpIHsgcmV0dXJuIHJlY3QuaGVpZ2h0IHx8IChyZWN0LmJvdHRvbSAtIHJlY3QudG9wKTsgfVxuZnVuY3Rpb24gZ2V0UGFyZW50IChlbCkgeyByZXR1cm4gZWwucGFyZW50Tm9kZSA9PT0gZG9jID8gbnVsbCA6IGVsLnBhcmVudE5vZGU7IH1cbmZ1bmN0aW9uIGlzSW5wdXQgKGVsKSB7IHJldHVybiBlbC50YWdOYW1lID09PSAnSU5QVVQnIHx8IGVsLnRhZ05hbWUgPT09ICdURVhUQVJFQScgfHwgZWwudGFnTmFtZSA9PT0gJ1NFTEVDVCcgfHwgaXNFZGl0YWJsZShlbCk7IH1cbmZ1bmN0aW9uIGlzRWRpdGFibGUgKGVsKSB7XG4gIGlmICghZWwpIHsgcmV0dXJuIGZhbHNlOyB9IC8vIG5vIHBhcmVudHMgd2VyZSBlZGl0YWJsZVxuICBpZiAoZWwuY29udGVudEVkaXRhYmxlID09PSAnZmFsc2UnKSB7IHJldHVybiBmYWxzZTsgfSAvLyBzdG9wIHRoZSBsb29rdXBcbiAgaWYgKGVsLmNvbnRlbnRFZGl0YWJsZSA9PT0gJ3RydWUnKSB7IHJldHVybiB0cnVlOyB9IC8vIGZvdW5kIGEgY29udGVudEVkaXRhYmxlIGVsZW1lbnQgaW4gdGhlIGNoYWluXG4gIHJldHVybiBpc0VkaXRhYmxlKGdldFBhcmVudChlbCkpOyAvLyBjb250ZW50RWRpdGFibGUgaXMgc2V0IHRvICdpbmhlcml0J1xufVxuXG5mdW5jdGlvbiBuZXh0RWwgKGVsKSB7XG4gIHJldHVybiBlbC5uZXh0RWxlbWVudFNpYmxpbmcgfHwgbWFudWFsbHkoKTtcbiAgZnVuY3Rpb24gbWFudWFsbHkgKCkge1xuICAgIHZhciBzaWJsaW5nID0gZWw7XG4gICAgZG8ge1xuICAgICAgc2libGluZyA9IHNpYmxpbmcubmV4dFNpYmxpbmc7XG4gICAgfSB3aGlsZSAoc2libGluZyAmJiBzaWJsaW5nLm5vZGVUeXBlICE9PSAxKTtcbiAgICByZXR1cm4gc2libGluZztcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRFdmVudEhvc3QgKGUpIHtcbiAgLy8gb24gdG91Y2hlbmQgZXZlbnQsIHdlIGhhdmUgdG8gdXNlIGBlLmNoYW5nZWRUb3VjaGVzYFxuICAvLyBzZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy83MTkyNTYzL3RvdWNoZW5kLWV2ZW50LXByb3BlcnRpZXNcbiAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9iZXZhY3F1YS9kcmFndWxhL2lzc3Vlcy8zNFxuICBpZiAoZS50YXJnZXRUb3VjaGVzICYmIGUudGFyZ2V0VG91Y2hlcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gZS50YXJnZXRUb3VjaGVzWzBdO1xuICB9XG4gIGlmIChlLmNoYW5nZWRUb3VjaGVzICYmIGUuY2hhbmdlZFRvdWNoZXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGUuY2hhbmdlZFRvdWNoZXNbMF07XG4gIH1cbiAgcmV0dXJuIGU7XG59XG5cbmZ1bmN0aW9uIGdldENvb3JkIChjb29yZCwgZSkge1xuICB2YXIgaG9zdCA9IGdldEV2ZW50SG9zdChlKTtcbiAgdmFyIG1pc3NNYXAgPSB7XG4gICAgcGFnZVg6ICdjbGllbnRYJywgLy8gSUU4XG4gICAgcGFnZVk6ICdjbGllbnRZJyAvLyBJRThcbiAgfTtcbiAgaWYgKGNvb3JkIGluIG1pc3NNYXAgJiYgIShjb29yZCBpbiBob3N0KSAmJiBtaXNzTWFwW2Nvb3JkXSBpbiBob3N0KSB7XG4gICAgY29vcmQgPSBtaXNzTWFwW2Nvb3JkXTtcbiAgfVxuICByZXR1cm4gaG9zdFtjb29yZF07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gZHJhZ3VsYTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYXRvYSAoYSwgbikgeyByZXR1cm4gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYSwgbik7IH1cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHRpY2t5ID0gcmVxdWlyZSgndGlja3knKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkZWJvdW5jZSAoZm4sIGFyZ3MsIGN0eCkge1xuICBpZiAoIWZuKSB7IHJldHVybjsgfVxuICB0aWNreShmdW5jdGlvbiBydW4gKCkge1xuICAgIGZuLmFwcGx5KGN0eCB8fCBudWxsLCBhcmdzIHx8IFtdKTtcbiAgfSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYXRvYSA9IHJlcXVpcmUoJ2F0b2EnKTtcbnZhciBkZWJvdW5jZSA9IHJlcXVpcmUoJy4vZGVib3VuY2UnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBlbWl0dGVyICh0aGluZywgb3B0aW9ucykge1xuICB2YXIgb3B0cyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBldnQgPSB7fTtcbiAgaWYgKHRoaW5nID09PSB1bmRlZmluZWQpIHsgdGhpbmcgPSB7fTsgfVxuICB0aGluZy5vbiA9IGZ1bmN0aW9uICh0eXBlLCBmbikge1xuICAgIGlmICghZXZ0W3R5cGVdKSB7XG4gICAgICBldnRbdHlwZV0gPSBbZm5dO1xuICAgIH0gZWxzZSB7XG4gICAgICBldnRbdHlwZV0ucHVzaChmbik7XG4gICAgfVxuICAgIHJldHVybiB0aGluZztcbiAgfTtcbiAgdGhpbmcub25jZSA9IGZ1bmN0aW9uICh0eXBlLCBmbikge1xuICAgIGZuLl9vbmNlID0gdHJ1ZTsgLy8gdGhpbmcub2ZmKGZuKSBzdGlsbCB3b3JrcyFcbiAgICB0aGluZy5vbih0eXBlLCBmbik7XG4gICAgcmV0dXJuIHRoaW5nO1xuICB9O1xuICB0aGluZy5vZmYgPSBmdW5jdGlvbiAodHlwZSwgZm4pIHtcbiAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgaWYgKGMgPT09IDEpIHtcbiAgICAgIGRlbGV0ZSBldnRbdHlwZV07XG4gICAgfSBlbHNlIGlmIChjID09PSAwKSB7XG4gICAgICBldnQgPSB7fTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGV0ID0gZXZ0W3R5cGVdO1xuICAgICAgaWYgKCFldCkgeyByZXR1cm4gdGhpbmc7IH1cbiAgICAgIGV0LnNwbGljZShldC5pbmRleE9mKGZuKSwgMSk7XG4gICAgfVxuICAgIHJldHVybiB0aGluZztcbiAgfTtcbiAgdGhpbmcuZW1pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYXJncyA9IGF0b2EoYXJndW1lbnRzKTtcbiAgICByZXR1cm4gdGhpbmcuZW1pdHRlclNuYXBzaG90KGFyZ3Muc2hpZnQoKSkuYXBwbHkodGhpcywgYXJncyk7XG4gIH07XG4gIHRoaW5nLmVtaXR0ZXJTbmFwc2hvdCA9IGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgdmFyIGV0ID0gKGV2dFt0eXBlXSB8fCBbXSkuc2xpY2UoMCk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBhcmdzID0gYXRvYShhcmd1bWVudHMpO1xuICAgICAgdmFyIGN0eCA9IHRoaXMgfHwgdGhpbmc7XG4gICAgICBpZiAodHlwZSA9PT0gJ2Vycm9yJyAmJiBvcHRzLnRocm93cyAhPT0gZmFsc2UgJiYgIWV0Lmxlbmd0aCkgeyB0aHJvdyBhcmdzLmxlbmd0aCA9PT0gMSA/IGFyZ3NbMF0gOiBhcmdzOyB9XG4gICAgICBldC5mb3JFYWNoKGZ1bmN0aW9uIGVtaXR0ZXIgKGxpc3Rlbikge1xuICAgICAgICBpZiAob3B0cy5hc3luYykgeyBkZWJvdW5jZShsaXN0ZW4sIGFyZ3MsIGN0eCk7IH0gZWxzZSB7IGxpc3Rlbi5hcHBseShjdHgsIGFyZ3MpOyB9XG4gICAgICAgIGlmIChsaXN0ZW4uX29uY2UpIHsgdGhpbmcub2ZmKHR5cGUsIGxpc3Rlbik7IH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRoaW5nO1xuICAgIH07XG4gIH07XG4gIHJldHVybiB0aGluZztcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjdXN0b21FdmVudCA9IHJlcXVpcmUoJ2N1c3RvbS1ldmVudCcpO1xudmFyIGV2ZW50bWFwID0gcmVxdWlyZSgnLi9ldmVudG1hcCcpO1xudmFyIGRvYyA9IGdsb2JhbC5kb2N1bWVudDtcbnZhciBhZGRFdmVudCA9IGFkZEV2ZW50RWFzeTtcbnZhciByZW1vdmVFdmVudCA9IHJlbW92ZUV2ZW50RWFzeTtcbnZhciBoYXJkQ2FjaGUgPSBbXTtcblxuaWYgKCFnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcikge1xuICBhZGRFdmVudCA9IGFkZEV2ZW50SGFyZDtcbiAgcmVtb3ZlRXZlbnQgPSByZW1vdmVFdmVudEhhcmQ7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBhZGQ6IGFkZEV2ZW50LFxuICByZW1vdmU6IHJlbW92ZUV2ZW50LFxuICBmYWJyaWNhdGU6IGZhYnJpY2F0ZUV2ZW50XG59O1xuXG5mdW5jdGlvbiBhZGRFdmVudEVhc3kgKGVsLCB0eXBlLCBmbiwgY2FwdHVyaW5nKSB7XG4gIHJldHVybiBlbC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIGZuLCBjYXB0dXJpbmcpO1xufVxuXG5mdW5jdGlvbiBhZGRFdmVudEhhcmQgKGVsLCB0eXBlLCBmbikge1xuICByZXR1cm4gZWwuYXR0YWNoRXZlbnQoJ29uJyArIHR5cGUsIHdyYXAoZWwsIHR5cGUsIGZuKSk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUV2ZW50RWFzeSAoZWwsIHR5cGUsIGZuLCBjYXB0dXJpbmcpIHtcbiAgcmV0dXJuIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZm4sIGNhcHR1cmluZyk7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUV2ZW50SGFyZCAoZWwsIHR5cGUsIGZuKSB7XG4gIHZhciBsaXN0ZW5lciA9IHVud3JhcChlbCwgdHlwZSwgZm4pO1xuICBpZiAobGlzdGVuZXIpIHtcbiAgICByZXR1cm4gZWwuZGV0YWNoRXZlbnQoJ29uJyArIHR5cGUsIGxpc3RlbmVyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmYWJyaWNhdGVFdmVudCAoZWwsIHR5cGUsIG1vZGVsKSB7XG4gIHZhciBlID0gZXZlbnRtYXAuaW5kZXhPZih0eXBlKSA9PT0gLTEgPyBtYWtlQ3VzdG9tRXZlbnQoKSA6IG1ha2VDbGFzc2ljRXZlbnQoKTtcbiAgaWYgKGVsLmRpc3BhdGNoRXZlbnQpIHtcbiAgICBlbC5kaXNwYXRjaEV2ZW50KGUpO1xuICB9IGVsc2Uge1xuICAgIGVsLmZpcmVFdmVudCgnb24nICsgdHlwZSwgZSk7XG4gIH1cbiAgZnVuY3Rpb24gbWFrZUNsYXNzaWNFdmVudCAoKSB7XG4gICAgdmFyIGU7XG4gICAgaWYgKGRvYy5jcmVhdGVFdmVudCkge1xuICAgICAgZSA9IGRvYy5jcmVhdGVFdmVudCgnRXZlbnQnKTtcbiAgICAgIGUuaW5pdEV2ZW50KHR5cGUsIHRydWUsIHRydWUpO1xuICAgIH0gZWxzZSBpZiAoZG9jLmNyZWF0ZUV2ZW50T2JqZWN0KSB7XG4gICAgICBlID0gZG9jLmNyZWF0ZUV2ZW50T2JqZWN0KCk7XG4gICAgfVxuICAgIHJldHVybiBlO1xuICB9XG4gIGZ1bmN0aW9uIG1ha2VDdXN0b21FdmVudCAoKSB7XG4gICAgcmV0dXJuIG5ldyBjdXN0b21FdmVudCh0eXBlLCB7IGRldGFpbDogbW9kZWwgfSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gd3JhcHBlckZhY3RvcnkgKGVsLCB0eXBlLCBmbikge1xuICByZXR1cm4gZnVuY3Rpb24gd3JhcHBlciAob3JpZ2luYWxFdmVudCkge1xuICAgIHZhciBlID0gb3JpZ2luYWxFdmVudCB8fCBnbG9iYWwuZXZlbnQ7XG4gICAgZS50YXJnZXQgPSBlLnRhcmdldCB8fCBlLnNyY0VsZW1lbnQ7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCA9IGUucHJldmVudERlZmF1bHQgfHwgZnVuY3Rpb24gcHJldmVudERlZmF1bHQgKCkgeyBlLnJldHVyblZhbHVlID0gZmFsc2U7IH07XG4gICAgZS5zdG9wUHJvcGFnYXRpb24gPSBlLnN0b3BQcm9wYWdhdGlvbiB8fCBmdW5jdGlvbiBzdG9wUHJvcGFnYXRpb24gKCkgeyBlLmNhbmNlbEJ1YmJsZSA9IHRydWU7IH07XG4gICAgZS53aGljaCA9IGUud2hpY2ggfHwgZS5rZXlDb2RlO1xuICAgIGZuLmNhbGwoZWwsIGUpO1xuICB9O1xufVxuXG5mdW5jdGlvbiB3cmFwIChlbCwgdHlwZSwgZm4pIHtcbiAgdmFyIHdyYXBwZXIgPSB1bndyYXAoZWwsIHR5cGUsIGZuKSB8fCB3cmFwcGVyRmFjdG9yeShlbCwgdHlwZSwgZm4pO1xuICBoYXJkQ2FjaGUucHVzaCh7XG4gICAgd3JhcHBlcjogd3JhcHBlcixcbiAgICBlbGVtZW50OiBlbCxcbiAgICB0eXBlOiB0eXBlLFxuICAgIGZuOiBmblxuICB9KTtcbiAgcmV0dXJuIHdyYXBwZXI7XG59XG5cbmZ1bmN0aW9uIHVud3JhcCAoZWwsIHR5cGUsIGZuKSB7XG4gIHZhciBpID0gZmluZChlbCwgdHlwZSwgZm4pO1xuICBpZiAoaSkge1xuICAgIHZhciB3cmFwcGVyID0gaGFyZENhY2hlW2ldLndyYXBwZXI7XG4gICAgaGFyZENhY2hlLnNwbGljZShpLCAxKTsgLy8gZnJlZSB1cCBhIHRhZCBvZiBtZW1vcnlcbiAgICByZXR1cm4gd3JhcHBlcjtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kIChlbCwgdHlwZSwgZm4pIHtcbiAgdmFyIGksIGl0ZW07XG4gIGZvciAoaSA9IDA7IGkgPCBoYXJkQ2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICBpdGVtID0gaGFyZENhY2hlW2ldO1xuICAgIGlmIChpdGVtLmVsZW1lbnQgPT09IGVsICYmIGl0ZW0udHlwZSA9PT0gdHlwZSAmJiBpdGVtLmZuID09PSBmbikge1xuICAgICAgcmV0dXJuIGk7XG4gICAgfVxuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBldmVudG1hcCA9IFtdO1xudmFyIGV2ZW50bmFtZSA9ICcnO1xudmFyIHJvbiA9IC9eb24vO1xuXG5mb3IgKGV2ZW50bmFtZSBpbiBnbG9iYWwpIHtcbiAgaWYgKHJvbi50ZXN0KGV2ZW50bmFtZSkpIHtcbiAgICBldmVudG1hcC5wdXNoKGV2ZW50bmFtZS5zbGljZSgyKSk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBldmVudG1hcDtcbiIsIlxudmFyIE5hdGl2ZUN1c3RvbUV2ZW50ID0gZ2xvYmFsLkN1c3RvbUV2ZW50O1xuXG5mdW5jdGlvbiB1c2VOYXRpdmUgKCkge1xuICB0cnkge1xuICAgIHZhciBwID0gbmV3IE5hdGl2ZUN1c3RvbUV2ZW50KCdjYXQnLCB7IGRldGFpbDogeyBmb286ICdiYXInIH0gfSk7XG4gICAgcmV0dXJuICAnY2F0JyA9PT0gcC50eXBlICYmICdiYXInID09PSBwLmRldGFpbC5mb287XG4gIH0gY2F0Y2ggKGUpIHtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ3Jvc3MtYnJvd3NlciBgQ3VzdG9tRXZlbnRgIGNvbnN0cnVjdG9yLlxuICpcbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9DdXN0b21FdmVudC5DdXN0b21FdmVudFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuXG5tb2R1bGUuZXhwb3J0cyA9IHVzZU5hdGl2ZSgpID8gTmF0aXZlQ3VzdG9tRXZlbnQgOlxuXG4vLyBJRSA+PSA5XG4nZnVuY3Rpb24nID09PSB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRXZlbnQgPyBmdW5jdGlvbiBDdXN0b21FdmVudCAodHlwZSwgcGFyYW1zKSB7XG4gIHZhciBlID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50Jyk7XG4gIGlmIChwYXJhbXMpIHtcbiAgICBlLmluaXRDdXN0b21FdmVudCh0eXBlLCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUsIHBhcmFtcy5kZXRhaWwpO1xuICB9IGVsc2Uge1xuICAgIGUuaW5pdEN1c3RvbUV2ZW50KHR5cGUsIGZhbHNlLCBmYWxzZSwgdm9pZCAwKTtcbiAgfVxuICByZXR1cm4gZTtcbn0gOlxuXG4vLyBJRSA8PSA4XG5mdW5jdGlvbiBDdXN0b21FdmVudCAodHlwZSwgcGFyYW1zKSB7XG4gIHZhciBlID0gZG9jdW1lbnQuY3JlYXRlRXZlbnRPYmplY3QoKTtcbiAgZS50eXBlID0gdHlwZTtcbiAgaWYgKHBhcmFtcykge1xuICAgIGUuYnViYmxlcyA9IEJvb2xlYW4ocGFyYW1zLmJ1YmJsZXMpO1xuICAgIGUuY2FuY2VsYWJsZSA9IEJvb2xlYW4ocGFyYW1zLmNhbmNlbGFibGUpO1xuICAgIGUuZGV0YWlsID0gcGFyYW1zLmRldGFpbDtcbiAgfSBlbHNlIHtcbiAgICBlLmJ1YmJsZXMgPSBmYWxzZTtcbiAgICBlLmNhbmNlbGFibGUgPSBmYWxzZTtcbiAgICBlLmRldGFpbCA9IHZvaWQgMDtcbiAgfVxuICByZXR1cm4gZTtcbn1cbiIsInZhciBzaSA9IHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09ICdmdW5jdGlvbicsIHRpY2s7XG5pZiAoc2kpIHtcbiAgdGljayA9IGZ1bmN0aW9uIChmbikgeyBzZXRJbW1lZGlhdGUoZm4pOyB9O1xufSBlbHNlIHtcbiAgdGljayA9IGZ1bmN0aW9uIChmbikgeyBzZXRUaW1lb3V0KGZuLCAwKTsgfTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSB0aWNrOyJdfQ== +; +!function(a){a.fn.datepicker.dates["zh-CN"]={days:["星期日","星期一","星期二","星期三","星期四","星期五","星期六"],daysShort:["周日","周一","周二","周三","周四","周五","周六"],daysMin:["日","一","二","三","四","五","六"],months:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"],monthsShort:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],today:"今天",monthsTitle:"选择月份",clear:"清除",format:"yyyy-mm-dd",titleFormat:"yyyy年mm月",weekStart:1}}(jQuery); +/** + * Simplified Chinese translation for bootstrap-datetimepicker + * Yuan Cheung <advanimal@gmail.com> + */ + +;(function($){ + $.fn.datetimepicker.dates['zh-CN'] = { + days: ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"], + daysShort: ["周日", "周一", "周二", "周三", "周四", "周五", "周六", "周日"], + daysMin: ["日", "一", "二", "三", "四", "五", "六", "日"], + months: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], + monthsShort: ["一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"], + today: "今天", + suffix: [], + meridiem: ["上午", "下午"] + }; +}(jQuery)); +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + define( ["jquery", "../jquery.validate"], factory ); + } else { + factory( jQuery ); + } +}(function( $ ) { + + /* + * Translated default messages for the jQuery validation plugin. + * Locale: ZH (Chinese, 中文 (Zhōngwén), 汉语, 漢語) + */ + $.extend($.validator.messages, { + required: "这是必填字段", + remote: "请修正此字段", + email: "请输入有效的电子邮件地址", + url: "请输入有效的网址", + date: "请输入有效的日期", + dateISO: "请输入有效的日期 (YYYY-MM-DD)", + number: "请输入有效的数字", + digits: "只能输入数字", + creditcard: "请输入有效的信用卡号码", + equalTo: "你的输入不相同", + extension: "请输入有效的后缀", + maxlength: $.validator.format("最多可以输入 {0} 个字符"), + minlength: $.validator.format("最少要输入 {0} 个字符"), + rangelength: $.validator.format("请输入长度在 {0} 到 {1} 之间的字符串"), + range: $.validator.format("请输入范围在 {0} 到 {1} 之间的数值"), + max: $.validator.format("请输入不大于 {0} 的数值"), + min: $.validator.format("请输入不小于 {0} 的数值") + }); + +})); +/*! Select2 4.0.8 | https://github.com/select2/select2/blob/master/LICENSE.md */ + + +!function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/zh-CN",[],function(){return{errorLoading:function(){return"无法载入结果。"},inputTooLong:function(n){return"请删除"+(n.input.length-n.maximum)+"个字符"},inputTooShort:function(n){return"请再输入至少"+(n.minimum-n.input.length)+"个字符"},loadingMore:function(){return"载入更多结果…"},maximumSelected:function(n){return"最多只能选择"+n.maximum+"个项目"},noResults:function(){return"未找到结果"},searching:function(){return"搜索中…"},removeAllItems:function(){return"删除所有项目"}}}),n.define,n.require}(); +$(document).on('turbolinks:load', function() { + if ($('body.cooperative-carousels-index-page').length > 0) { + var resetNo = function(){ + $('#carousels-container .custom-carousel-item-no').each(function(index, ele){ + $(ele).html(index + 1); + }) + } + // 删除后 + $(document).on('delete_success', resetNo); + // ------------ 保存链接 ----------- + $('.carousels-card').on('click', '.save-data-btn', function(){ + var $link = $(this); + var id = $link.data('id'); + var link = $('.custom-carousel-item-' + id).find('.link-input').val(); + var name = $('.custom-carousel-item-' + id).find('.name-input').val(); + if(!name || name.length == 0){ + $.notify({ message: '名称不能为空' },{ type: 'danger' }); + return; + } + $link.attr('disabled', true); + + $.ajax({ + url: '/cooperative/carousels/' + id, + method: 'PATCH', + dataType: 'json', + data: { link: link, name: name }, + success: function(data){ + $.notify({ message: '操作成功' }); + }, + error: ajaxErrorNotifyHandler, + complete: function(){ + $link.removeAttr('disabled'); + } + }) + }); + // -------------- 是否在首页展示 -------------- + $('.carousels-card').on('change', '.online-check-box', function(){ + var $checkbox = $(this); + var id = $checkbox.data('id'); + var checked = $checkbox.is(':checked'); + $checkbox.attr('disabled', true); + + $.ajax({ + url: '/cooperative/carousels/' + id, + method: 'PATCH', + dataType: 'json', + data: { status: checked }, + success: function(data){ + $.notify({ message: '保存成功' }); + var box = $('.custom-carousel-item-' + id).find('.drag'); + if(checked){ + box.removeClass('not_active'); + }else{ + box.addClass('not_active'); + } + }, + error: ajaxErrorNotifyHandler, + complete: function(){ + $checkbox.removeAttr('disabled'); + } + }) + }); + + // ------------ 拖拽 ------------- + var onDropFunc = function(el, _target, _source, sibling){ + var moveId = $(el).data('id'); + var insertId = $(sibling).data('id') || ''; + + $.ajax({ + url: '/cooperative/carousels/drag', + method: 'POST', + dataType: 'json', + data: { move_id: moveId, after_id: insertId }, + success: function(data){ + resetNo(); + }, + error: function(res){ + var data = res.responseJSON; + $.notify({message: '移动失败,原因:' + data.message}, {type: 'danger'}); + } + }) + }; + var ele1 = document.getElementById('carousels-container'); + dragula([ele1], { mirrorContainer: ele1 }).on('drop', onDropFunc); + + + // ----------- 新增 -------------- + var $createModal = $('.modal.cooperative-add-carousel-modal'); + var $createForm = $createModal.find('form.cooperative-add-carousel-form'); + + $createForm.validate({ + errorElement: 'span', + errorClass: 'danger text-danger', + rules: { + "portal_image[image]": { + required: true + }, + "portal_image[name]": { + required: true + }, + } + }); + + $createModal.on('show.bs.modal', function(event){ + resetFileInputFunc($createModal.find('.img-file-input')); + $createModal.find('.file-names').html('选择文件'); + }); + + $createModal.on('click', '.submit-btn', function() { + $createForm.find('.error').html(''); + + if ($createForm.valid()) { + $createForm.submit(); + } else { + $createForm.find('.error').html('请选择图片'); + } + }); + $createModal.on('change', '.img-file-input', function(){ + var file = $(this)[0].files[0]; + $createModal.find('.file-names').html(file ? file.name : '请选择文件'); + }) + + // -------------- 重新上传图片 -------------- + //replace_image_url + $('.modal.cooperative-upload-file-modal').on('upload:success', function(e, data){ + var $carouselItem = $('.custom-carousel-item-' + data.source_id); + $carouselItem.find('.custom-carousel-item-img img').attr('src', data.url); + }) + } +}) +; +$(document).on('turbolinks:load', function() { + if ($('body.cooperative-laboratory-settings-edit-page, body.cooperative-laboratory-settings-update-page').length > 0) { + var $container = $('.edit-laboratory-setting-container'); + var $form = $container.find('.edit_laboratory'); + + $('.logo-item-left').on("change", 'input[type="file"]', function () { + var $fileInput = $(this); + var file = this.files[0]; + var imageType = /image.*/; + if (file && file.type.match(imageType)) { + var reader = new FileReader(); + reader.onload = function () { + var $box = $fileInput.parent(); + $box.find('img').attr('src', reader.result).css('display', 'block'); + $box.addClass('has-img'); + }; + reader.readAsDataURL(file); + } else { + } + }); + + createMDEditor('laboratory-footer-editor', { height: 200, placeholder: '请输入备案信息' }); + + $form.validate({ + errorElement: 'span', + errorClass: 'danger text-danger', + errorPlacement:function(error,element){ + if(element.parent().hasClass("input-group")){ + element.parent().after(error); + }else{ + element.after(error) + } + }, + rules: { + identifier: { + required: true, + checkSite: true + }, + name: { + required: true + } + } + }); + $.validator.addMethod("checkSite",function(value,element,params){ + var checkSite = /^(?=^.{3,255}$)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$/; + return this.optional(element)||(checkSite.test(value + '.educoder.com')); + },"域名不合法!"); + + $form.on('click', '.submit-btn', function(){ + $form.find('.submit-btn').attr('disabled', 'disabled'); + $form.find('.error').html(''); + var valid = $form.valid(); + + $('input[name="navbar[][name]"]').each(function(_, e){ + var $ele = $(e); + if($ele.val() === undefined || $ele.val().length === 0){ + $ele.addClass('danger text-danger'); + valid = false; + } else { + $ele.removeClass('danger text-danger'); + } + }); + + if(!valid) return; + $.ajax({ + method: 'PATCH', + dataType: 'json', + url: $form.attr('action'), + data: new FormData($form[0]), + processData: false, + contentType: false, + success: function(data){ + $.notify({ message: '保存成功' }); + window.location.reload(); + }, + error: function(res){ + var data = res.responseJSON; + $form.find('.error').html(data.message); + }, + complete: function(){ + $form.find('.submit-btn').attr('disabled', false); + } + }); + }) + } +}); +$(document).on('turbolinks:load', function() { + if ($('body.cooperative-laboratory-users-index-page').length > 0) { + // ============= 添加管理员 ============== + var $addMemberModal = $('.cooperative-add-laboratory-user-modal'); + var $addMemberForm = $addMemberModal.find('.cooperative-add-laboratory-user-form'); + var $memberSelect = $addMemberModal.find('.laboratory-user-select'); + + $addMemberModal.on('show.bs.modal', function(event){ + $memberSelect.select2('val', ' '); + }); + + $memberSelect.select2({ + theme: 'bootstrap4', + placeholder: '请输入要添加的管理员姓名', + multiple: true, + minimumInputLength: 1, + ajax: { + delay: 500, + url: '/cooperative/users', + dataType: 'json', + data: function(params){ + return { name: params.term }; + }, + processResults: function(data){ + return { results: data.users } + } + }, + templateResult: function (item) { + if(!item.id || item.id === '') return item.text; + return $("<span>" + item.real_name + " <span class='font-12'>" + item.school_name + ' ' + item.hidden_phone + "</span></span>"); + }, + templateSelection: function(item){ + if (item.id) { + } + return item.real_name || item.text; + } + }); + + $addMemberModal.on('click', '.submit-btn', function(){ + $addMemberForm.find('.error').html(''); + + var memberIds = $memberSelect.val(); + if (memberIds && memberIds.length > 0) { + $.ajax({ + method: 'POST', + dataType: 'json', + url: '/cooperative/laboratory_users', + data: { user_ids: memberIds }, + success: function(data){ + if(data && data.status == 0){ + show_success_flash(); + $addMemberModal.modal('hide'); + window.location.reload(); + } + } + }); + } else { + $addMemberModal.modal('hide'); + } + }); + } +}); +$(document).on('turbolinks:load', function() { + var $modal = $('.modal.cooperative-upload-file-modal'); + if ($modal.length > 0) { + var $form = $modal.find('form.cooperative-upload-file-form') + var $sourceIdInput = $modal.find('input[name="source_id"]'); + var $sourceTypeInput = $modal.find('input[name="source_type"]'); + + $modal.on('show.bs.modal', function(event){ + var $link = $(event.relatedTarget); + var sourceId = $link.data('sourceId'); + var sourceType = $link.data('sourceType'); + + $sourceIdInput.val(sourceId); + $sourceTypeInput.val(sourceType); + + $modal.find('.upload-file-input').trigger('click'); + }); + + $modal.find('.upload-file-input').on('change', function(e){ + var file = $(this)[0].files[0]; + + if(file){ + $modal.find('.file-names').html(file.name); + $modal.find('.submit-btn').trigger('click'); + } + }) + + var formValid = function(){ + if($form.find('input[name="file"]').val() == undefined || $form.find('input[name="file"]').val().length == 0){ + $form.find('.error').html('请选择文件'); + return false; + } + + return true; + }; + + $modal.on('click', '.submit-btn', function(){ + $form.find('.error').html(''); + + if (formValid()) { + var formDataString = $form.serialize(); + $.ajax({ + method: 'POST', + dataType: 'json', + url: '/cooperatives/files?' + formDataString, + data: new FormData($form[0]), + processData: false, + contentType: false, + success: function(data){ + $.notify({ message: '上传成功' }); + $modal.trigger('upload:success', data); + $modal.modal('hide'); + }, + error: function(res){ + var data = res.responseJSON; + $form.find('.error').html(data.message); + } + }); + } + }); + } +}); +$(document).on('turbolinks:load', function(){ + $('#sidebarCollapse').on('click', function () { + $(this).toggleClass('active'); + $('#sidebar').toggleClass('active'); + $.cookie('cooperative_sidebar_collapse', $(this).hasClass('active'), {path: '/cooperative'}); + }); + + var sidebarController = $('#sidebar').data('current-controller'); + if (sidebarController.length > 0) { + $('#sidebar a.active').removeClass('active'); + $('#sidebar ul.collapse.show').removeClass('show'); + var activeLi = $('#sidebar a[data-controller="' + sidebarController + '"]'); + activeLi.addClass('active'); + activeLi.parent().parent('ul.collapse').addClass('show'); + } +}); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +$.ajaxSetup({ + beforeSend: function(xhr) { + xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content')); + } +}); + +// ******** select2 global config ******** +$.fn.select2.defaults.set('theme', 'bootstrap4'); +$.fn.select2.defaults.set('language', 'zh-CN'); + +Turbolinks.setProgressBarDelay(200); + +$.notifyDefaults({ + type: 'success', + z_index: 9999, + delay: 2000 +}); + +$(document).on('turbolinks:load', function(){ + $('[data-toggle="tooltip"]').tooltip({ trigger : 'hover' }); + $('[data-toggle="popover"]').popover(); + + // 图片查看大图 + $('img.preview-image').bootstrapViewer(); + + // flash alert提示框自动关闭 + if($('.cooperative-alert-container .alert').length > 0){ + setTimeout(function(){ + $('.cooperative-alert-container .alert:not(.alert-danger)').alert('close'); + }, 2000); + setTimeout(function(){ + $('.cooperative-alert-container .alert.alert-danger').alert('close'); + }, 5000); + } +}); + +$(document).on("turbolinks:before-cache", function () { + $('[data-toggle="tooltip"]').tooltip('hide'); + $('[data-toggle="popover"]').popover('hide'); +}); +// var progressBar = new Turbolinks.ProgressBar(); + +// $(document).on('ajax:send', function(event){ +// console.log('ajax send', event); +// progressBar.setValue(0) +// progressBar.show() +// }); +// +// $(document).on('ajax:complete', function(event){ +// console.log('ajax complete', event); +// progressBar.setValue(1) +// progressBar.hide() // 分页时不触发,奇怪 +// }); +// $(document).on('ajax:success', function(event){ +// console.log('ajax success', event); +// }); +// $(document).on('ajax:error', function(event){ +// console.log('ajax error', event); +// }); + +$(function () { +}); diff --git a/public/assets/cooperative-a309d245cd0b0b9c653db471c53ec090e49ba7ad885879ffa02a11b6efd79d74.js.gz b/public/assets/cooperative-a309d245cd0b0b9c653db471c53ec090e49ba7ad885879ffa02a11b6efd79d74.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..f14d1eb96f265c73d355b4e18387bc7ce8bd5202 GIT binary patch literal 966858 zcmV(pK=8jGiwFQi@3&n71LVE=e%r{gDEzne6c97V0xXaswTm*WpVy3YydB$fl6xiE z1Cfw~F$FLHXju`J_xWDqd$L<qy*C;pWzXd1{>~&8$wn{L)z!6ibz$Sd$}d@dS{2hW z{hD}xiND4lhDAE5RxYY)Qua4C&eQ5*dfFN0mm5W#j!XXcbex}VT*hUU6dUodO7rY% znp|zflgUP0mPu7^{04oM)K|IkJ{c!*nT)(?HcASwx=6g&FF$(YbeLpivf@41SXo)| z&!!pm<Okl(isyZe3vZZbRr0O!B50GAhbvHQS96tkRK4>aL4~%W(1Q`PFHd3EFCPG+ zVU-tsZ!JC^#Z}yfq0Z9cau9mF;4-N$@{#&oB$s)W4EkAK`NyNQj8DhOXb{Nfyr_Kz z7#rB7gSAisaXPK4JhQ-1FnV68fMazX0G#CjD-5nz5L3`=XybZb@@+VtjuPk>AM&<q zvcj#Zn`V<~_4Fdn&Jzt)3@`(lkX5zHaM9u-F)^osg2R89o?fPv);ktjbzTw})`Ai2 zY}D#{l0+qS1f$vy(#!Zf5#=0Fjuz|*LmECtwAQ<4_zdg)iwBMYtVi@qAIF;QGe#@g zR5jch<ke3yB0qEe8>*O#(NL*A()>Xd^)H`Wb9|mHJ4La@=FL&nnKwyQ%Qefn<18FP zRnRAzjuRr?+B~!P5-5gf1S{3JiPj17syan{AG4|V<6tb#o)^^{2=;MH+!;QD&M+R2 zedNHw;fgBYygZ<K$lL{c<_{RVz5|aZ0Z~rg<k>LcgL|?7`lbFlT7jbv)(f!u_)wPM zFQ`4rhtta>t2%$5CdIWtoxg^UX&oczx}9O)gS9|4FOq6nWUQC__vy1kQ_QNvMYw97 zX!30mXQMpyF6C4&0m$d$gkYQ$d6gqsbuQy-c#)LeY}WixOs1hy{*Tv7)hm~(mM>N7 zDmnd<R#sIxRkoC3YT8OBtfNrMOnqt7GtU?09WML4)yT`H<8fd}T(M?sIclADRPV5& ztBuw87#cC$ddav<?lP9%*diBCPyt|I?ep}v@)>NzH491SNrlBuBz;M)ZPG82vl{98 zPzddLvtvH!AP~6oj<DG=^fvJN-q$=GdELVrtPGrTJ~$x&F`g#&s@X$(k!#iJwY;0# zI{M_i?D}j55d)!V0zc`XyQqwJ{<tXOYmJ~w)Na`tyE(~Ycq01?et<Rn6av>P&fdjE ze969k%)ca=oX1a+7yhKNNnT6ild9zRXOzWRyTZ=Dms5IbiU!1@<PU*(f}MXq#0<)( zAKt%s2UL*|d^)J#E(#mkiY=Tds`z@ywedAraG$UW^H>@Tf_w0N0#hxkpOY92Fn{fD zZ3L@LeXfOUoVkpL%>{OSk(3wMmYSCHFh61Rc$X<n_-e|PwdZS37}mgNjYN?X2|xL| z(Lf8_TJzTVc<bI;3s$)URi4Mg3$@Lty4j)ZlAd*lbD(u<P7=3oGdAzAwVzJQD!+XG zmDnZNb_vLTCImxoQY2XZEIEs(<4S1-Qb-y?Q$E+aggRF#Fv6>jRwyeHeE}!S&x|&! zz>3!dxNACg%$^myXV4R_OB0)<*nF*Y#KBK}gAPI8t`h3gU(*KAHzhUdq*+>N70h8f zr_)nVR!jMN7=zk2Mg>+DjbJmUW20XoH*^p+0izA47{5ZQ^*|$YW96WMv!jl^z;lP~ z)H-!;Od<43qeqXIKr6GG8lh^WfgToxMpBHZY{Z(rV;v<Udjq{a{S9~_R!g%4IO8NK zs%z>l^w#Xgz?{t1o(Bp}ziD#DvQ@=2IkX<$8ozIiS>4uG-bR#M{9Cb0a8t^?#(zlQ z^3&f!57|xVq0MA-$mFXgH$3(enrF$CzQ#W5K%XY3<~~hPckrn7s6S)$-6u#^To?do zJ7CpKkYQ+hs4o6isl2w(jVfT3PoTfz8rC>FH&}y?5k#J!bil-h6$VlO{kEUTW*?xF z3DAQEjZO2u@eD^r>Wa@}MkuvuusSa<FOyLUOvYK+p34Yy1*ntEwLwC*lpkSRhTa9J zn&ZT!G4ghucr+q(ze-C`BtSfCt=*{N$^v0Zr(jlss(YvY@aiIkZR)SW|9HJLD=Q=z z;PBia3(z>@62liOp_Ej6v&r$;mkw}J=;Td4N}Bc+agL_Zk%w?}amK?TfXPQ7cFtn3 zrED1HQ9*678wf&&@%Bel@yEkqGT~YlurpKl1KpgY+24MCA4)%k5bH1r#NOKp)+Fhk z50kQdpOh2$y@Y?m9!*xTfv9mT*|!0`;WuA<u-1n^8xJ(k68dbQ5I;61<2cQ<XBXAw zSUkh;+M{puB%VybKB9%#fD-0h!*5#6-^x6*s$vnZtIij+Cage=tg3{b(Mv;lGQ4z_ ze`~8JYYmJc{w@Ayuzt3XHp>TfTw}Pb4wJgt>dVHeDzrnrSkRBC5zd$LXCX>3PC$mR zr!pGYATytv{%AFbT9(-l7Qg=VBOp4Yl5?~&SfMa8o-)&@jl66vsHqUI<LaVwHqOEH zA~U6mt7++Nc)f0yZTL-lvuipj$3Ul?4sixlza_BIs;dQ7eP2v~0nf&kld*V+&cPfW z9Vc8#QRKzaP*LsghpDc)SkMgf%gH!Fxn%$ZOKR7^rLe~jYHl7=b0E`9baa}4A(ebc zvXNn@t=6Bjp#-rzEjMEME|(4t$>=a1U4N)zKDEESe)V%zO}M$+dHe49o9EBw7{&mE zfQvM=c{Z@QNf&H((d)DrLrwh`NZ4`CI7{ckaKDLK+>FqFcB=dr(0_`jF>F!`^JX(N z&;I=U;~L`Jn3{nEy&V7r*3&5Y_V&zQI|7sLq1Ux3RiD5*jBteJv)=vTqAg<gaDQ$O z4J&R)sAIh~vX}-pp<NBVrw`U#L?vp*Gz`>RFrIrI<Tzw1KUi}^!^c2WgdRxNL+|fV zx6|#d&2eDzwhrf*5DX5g1luFelDUG2Nf)#`%>Cn=5~u^VT4s=2s4r_sCWqCe?t5Z5 zT?;Kt*q$wue~rk8jQA|80?YvmsqT>s@e^7~NBipPs*PTuHh`XFLr_{rhu-iaE}*06 zmya*n`)ffH=aI~8Smb5-EWZTxXBmk8*5(DtsQuTpx<IH*l)J|?bvWOY1~?R+);%qf z5llCY=~Qi1!e~9SmNX*{io8A<(s_Tg>tH#a`|RzT=M7FXBt+j9Ww$QZiel1-4nAz? zEIPbOfFk`kJd$Ms5{GGWPI^<Skw$CCO8IleW1Vy;dSYHTf8*p7HP(~Ujk@VnT-THV zO)vY)hqrG!1h1TvE&svThcP^#R0rtZp`_Ho@sIkb{mxLK4HzC=(6J{DM;tTM{57r& zTQIRwr2EGepyzZ7>ckqIkgh3<#}C}Cc%Y9<Vf7Ro7eIR**vKHcpMpU<@>%OZvpqX_ zPW?489v?1+9I!uTXs*o4ujhdaFN}gXuYC6Q^*j1)o19#JQ|F*FjANMe#$jiD19rQO zvITU&24s}*qR1~l5Y^dqeizDUmM%8tZ4>8$*#@@XV~%G-S8wdz((<X|oqD&xj%$uG z5Eeyxo@S4;;RX6vpbq=0DNkC3IfNVQ3!t|V(`(Sp<cQ1mZ7;0sKnw&04qx-C@B6E& zF8OzdIcbfKQsPAYHKt%|BjhD><@m-7WwUi}ZDWJ<F9QM4ih6VmBwJX67)RX}+35~? z^hsf{W5%YN_6H72<jF{t(_!q=M<Tp_qi1sQ32zcKpMMu1bklzbDsegv<IyO^l6Xv~ zUN-sDS(7}wI5dOwa9YQ_Crcp}jyyRI3$e4fn(T$6K~(SX&(f)pFj#Qxfep}72Wg~5 zu|qWUZzHj?Um_ODtwPN6D~jn-KcR?LTnieM5iwmhtT5r~z_TZH(_N|jJUpZhvo;z( zWSUIN3%_2;qf>&urw|f4>d<LppX<cz?6FqsHn`J~hZ2QsXh7ibOESXcI9@B_QJSNQ zN~NdyH~h{*8`lQXWMmDQzJ=VQ-D^PjJQOUNKA*aF>blfHj_stFv(Y>QKD*)^ql`DZ zj3<g_CiUKNcq(S}?mV+s5je~s`Q`n~r}-raWfU)}F;Min*NR&3x49yVs|gm`<@zj| zkl6VxPct7(_C_{Gp`Dyx=qwJ)n}f5&j%Br++{xOkSVb|W&RIIHK>yM>Y6C(QD|AL$ zSqJuwL0bkGOGNYhkUWEG`PF01YY(6sM`?$Rhmdwn`LLk_uHezx%TpFb-Y5-;b8E1% zsW?~79L-PWy4SQW7igJ;oUFV;TMm(V8V|pO-X++C@p+;L`%r<3WJ4FVW|-(P^J^BP zSmlk~#OTymJPwl=*<MTRkezNyK`e(g2dG;EvQOT^7l4@?dyd90FobY9f#?g@FR=Gx zHr`+!!{Z=<$|<`3ffF+>?q4YW5jx6BS@<f=zQ~F!#N23GD=I~q(eliwz+)!0;F?mD zG;Ej#l~Q&kAIPpt>p{Z^4Lj9@SnYMK(7Bm;;P=R-eb%fjR!2KTmyOu%8%Km@gSz%T z`=5c$*6IhrO^m~33adDhXX0MpOBU$K3=~HIzMIX}=u0xKnoOB9oHJ72IFPp*)UQ*_ z15eu$-vwU%%FdFbm9F8M!YkP9|KD2vI%oRVt^ZvB{8v$cgMBYW0(Cqtp$BmPnn?;; z;e6?@Uv{xo0KF5Zw$3@YCQvD4DN{X$a_ltAlH%u&uV0yQi}q9Ue>x^~Yg2hWXlQMS z*W}i0c~TF1a)YgIF`1`0+TDZf?yJN6OYs;Fk!`mdD}_$Z7vj-A@YLI{&bb+2Al41b za?3~~%v%oTa{i-M#2CJ|VP4F!y&P^VU1#8yS2I76?vVOeO9Axny@TCOGJY+#ekk(8 z`~40(zQJ0*3k=Ky;2vKDt~ZT6htvgKqFQJeLca@t`8|o*QjR1o*G5_fntx+%cQ-P= z3vYDNpiM)Kjel<@t5Ke1VgC>#y@R#dU=4o1v*k4<8JMf+y6$!{bCCVzQ4XPZK>>fL zwxTlx`#m%+6W8pxOEEY;bum{~!QmUhVwdjcT0MT;rOpt298T+V&RsO$s@8A;Os_^4 zeVWhcn2*t{&M^qBS`W#?Oz!At?K7W0^FBvw=y2sYTlZRPboLspU8JK?lC60gk6Knl zoPyZ6u%zZ|#K$>~MSVn<wSjej*KLRqLNzJ@sll!WUIhN_O2cq#d^l>`VrKy@XuD=& zv?EDtZIYLj{WKO{KJ$!~p2?VUB1$`qovP@ZOM}m<RaV#Igf29U>1+=J5fTj&Ng=2C z=-LP=AX#JeX5AD#HV}Zf$4J?8+%jnNfqaig__z3*a0N@pl0h-}^F3YDH=J4K8Dyh- zOADmNvrRhPW5=9-gyZXbz1E?}gRNEMwS@)w%)*W1FxGuat1iKDY%U@Fja$V0#A?3o z%JL~V?w9(kvCbYu30}TK*|*jhr9pDV0ksV;(+}9qB=(nGIg!GX?O_VG2))K2vUyIz zRe?T<vpf0IsSC?zjjP>fA;h+7<EmNKuMI7ZEv^UC%~?dO+#agh`cPWL>6{)aijGG| zj|i(;%0IQx9m5v5QRQU3t1Z+-9YK<NFVT`>D21YclMpktRS*h+xkI0^xM8aGX<|>W z(Ga%7F-V}8G1Mwj+E$Pmm>3l;gSSqOIuCxThi};t2r_a4_M8k9yqu1!bP^ZU21T3V zlGlc0;jI)^h9-xOAIpHlVfex}93ivbxIp7|*_k@02&ZAV@QMQm(dLwD8CmDS-7El; z2x~ULQq6P<{DB@gHP!8qB|W!BnyPtzTSsm!Yv;=SH-~G~b#p<va~eSfv&F(yozoc$ zd{_(SpPc{LTr{h}wI4Y6O91ISuLTKVM55rP?F)#JA0vARO`!TD4=otjty;VEBXuVw ztInF`9hkn64?^9Baa=HJmW0?59^UFb41&NBSjq&SOHisV2DNxn2RpcfxNR1>HO8ak zh+ov2bJv?x;^MqCJH!&8iJtc`!tbQxmz{BvomUs$k*7uN$)_P+c<CFVY>UvvfCG%- za3<3;GVbAl{J-ZE2(*P05U~OOo^#M57ZyxInE`#%R-kxey{e`C^*!I#2X(!?{!D7< z&M35HtwOJ+<vmeSW+}ZMTOO{|ltEKV=iU;o7?@3%`fd4L=XrXRZo<OUoTp_x*2^XQ zO|oJkfx7;(;)n>;Rhk9)SDY~5*DQzTDe&n;!J=X0P5$5fvDWFL>6j`7@6D7?x{}*` zC^UBfsr57tAVh00-(Gy3RPkccVy2?>FtQeRbvF8oyp2-w22Hmfx!7;&s4nv_wdo~j znZ*B@T$5qZ8CJy@epn`#tk1GM5#;*K%GLUn$~$D0_@S`CpXzx9L{<tJC1r&}sjw&V zvN(B)=20@@0L4!$l1LQ4R%D=iw8bysi>hUgnispMCD|~uZp`sAX-Uo;qsfQ0CrhVI zumh7E;Yv3875vt!G{t7kiQKYQ#j0$rmGu79T|y13Z$y+iXrs<0oZQ1Cf_g1t6DxW? zFLtf&xBo)-DhbaP=7`4BK%*9JH0_D<ptC}jbHVVT^9PipTHl>|xq#}>eu~|_0|K#P zisdz0an2=kbXW=8mc1G(S;gF2oeeoj?9@7O(U|KAq2Z~hKGV!UkMnqBhw4=qMSew| zhv$@oV2!G_LEgYxmR>xj+n!*tB$>zBuez-%K2$w01^6Fqx%_IaF<Zq?{^CR1IWgWi zQRP*#PyL$hAY=1lzjG`Tmjh9N?TQrpH-uaNE;y>pO*tp(&7o`?5d2`b!e;!AUY#Lx zzX!N;JN^NHYx(Cf3Y$j>Ioba2(<v7ZzfWh9+5c#Frd0fWfMY`Lcbh04b1zLUzx%>2 z)9oFWc7AtvUyWtJTYfzpUQxPvh6O)@#HISZ0~VL+Z~1B0PjS>8yC0bKGTq)`(#v%B zd(F8i<(;yNKc<&SKCOJe(IsU@B1=hW-S`T<-qu~^qZ4-BgL?OU)ZFEdh%oo-Gky=Y zv}DhBB(J$WI<1nx5zA56KA*jP&ErE}k@mXgFc0hA7nj~_1w7swmJDye-)RtW8v~6J z@>{AIGyS?BR~2Z7PoPzrotLJvr|I^-t@$^;UV#^^80kzd^U-w7lYZrtca@APR@_Ox zP4c3WhLTyTn@Lv24Ct7dXm&O+=$bv~#Fx^{U?ogdW)QDfFt5seT!l$+BOr|;J{X7S z{{7k$2J(>!d6f7;UqK}+GeGX&S0Em7*p3G<Zog^VBmUXJ%ZXo;4?vn=(a<PWz3i5y zvQ@0<M)<GgB!e6A-Anu|xJl3a;y4=wA`b_A7jrqJ`~MLZMK@_b3&;J{UdSKzZ*Ff7 zMGOTtBBZ9GZJ37YdlJBpakSc1Ww#W49o@)2lFnrWE6^E61^gXF+OiZOz?pP%{2I(= z4LN+F+6`SQJf9Yngcf1VfbjXRZivZyv)kYn`p+UABMg@6{{5=+`EydfW(!-#qD(t` z+jl(FrZV!2uobre+_1pm^2nqzUXjm4Wpx0f_w7|C=EUg~8ekujsMQKFNo^Tz!a^VG zJ;FdYttsphObi56bST$Y&M%2#-$-N=Y8mHSYwOiIB_clrdPo8}5yQdR;@Rd~!L95+ z)hE<qd5IJe14{h_mbHq+&_M{xSiilT1X`c*o%^(t=_gumQ`Q?>WBV}Z(dPa8EV<xn zq#hn`4vzF6K<i-^sTkl8HigXU9Y=+p(R&I%S+?UakDRH*TlCQi4s*&I&a)kd>1+lx z8slF;67M6L&StPjs^a=a4IcqzS5~&<9A=FEp|MdhyA{dX6h3mK2qUXVTC$7fRd7`G zS<zXMUmmHi@Tf1M@i<imx426)+OaA8J&j`c8%I<4n?(6-xHNs@>HyWP`bJt_pa|t1 z!Xs?vA!<F1vn;RZ_OBOv!*N`e9=eJ=mFTiYozOc_je{#!$H@Q~BJ}Gf4_I}En&Q#s zQPJM)!_uVD=3)A<I84{qgX}nMZw@rVNe7B2CIgIv86#`Tg4<gl3s`033U%Hw1oe+j zGNZ!Z4UmTXeINq(I0(Wr(i+IARcvYs_U>WvFyU|?762TPd=@3g#o#dOC{`HhKY-kN zVb;+ZC-UhQooTgFSRmMLS?8)qEB-79n;3A`!I!GgTrH`SFdi;s3@}<hQEU&{WJYCB zDNJr}{UAJxy5X>4;@Ddn+_204A#Q(6{hp4Z_4PCM9ba!1CG7jO7=uXR+2NTE7^MQj z62Lyb0kHcmwnbYZJKM9x18^KXQHnb;-^;!nNUbML5(TPYpu}1#_{~=rX?fa-Ve-@v zcMqNbAEr<u&ly@HP}+voFB8=K{+f=*Piep><NOrU_WkYW_pLDQpu;wlz$g$n05m8n zPMivG<Qzth7Y&BmMDhZllVfFUtgJQ`kY93ymQBC%(G3pZR5>P(^MRWK70{mnEDtQ` z^86sU;p(iR-Q2&=s17uYIDqclGzjxi0=yO8u(e$6^6dp|+usV1WBa|}kZ(v*bzPeh zMglX9*LtR*$yGU~%9?$cg}pmXdNiB)Biwq;=7fm&2I8MrON-3`LJ3TE7~D*eck8ki zpnCE4{cGfkJmeid&fkDuaR0tpd8+LO5gm{E0_rVFO&A9z`PXx#GlqpEImFEXv;{(w z<!=H`#aI}yoq9{yFGha9aoB1hWeR_HiR;B|7kvYZtb96*VRfY1odx|Il?EMIxtc5| zy^GFi01Mfwzn`(i^(L-mBs3u*g%1-$a>L$-wJT{dJZ?WsbdgQwP7*a-B4MMqu#IsI z08yh~I*3|$<)8(Mf_}Ro(MPR}WQDrURN~xqg`=yUo!QTNw<z~BT2;{A{p}#UfDaH9 z<EX{&N#f>dPigm*ZJt9DwYren|KHRV=85G};~P7SZ*);Q{|}VMd8Cs)y*~1|zP1?S zS$nNyt5JhVYC;@+EkbZJh9EW{h`Im(%IkTTD$PDaz=ZM!(ubE%m6Ye)ex8sIi-^5n zhW4G#_|cbB<l}Kt!1g_4Dh1cVecp2r8eE-IPp7;{&ye$_N2$%9fZU5CALTV;1H3!f zvaKNKLnpUE->-bvQ<ST>p{~9(KwFzIgRF{<mA<M_?l?XSZsal~0assK`Ra;5(>GFN z?m$e370YXup+bP_fPh)dr+GbU_FB(rul00$t%vs7p<!YJ*q}8?3KLq7;7I+}dKKRA zchn@`rM3KvIa982rr!T_&eUin)NKT$Z^2*4ND!8Rwr?cuDh*#467(eqt(}inJd0p& zeLu@tAnrk1W#XP)nQVccL!KKoEf%Jz{RT1wbUz;b77w8(*&)*mPm}XBBL`Ij8>^wE zrv7JSgdO=sQ~G0rqcOtIfTa~IU@`(un4V|J=yN)%^R}>J>_V^#wo`eU?`P=<i0Qll zC1MU<JIr&w0jg?V#p4IPZubyWT5G-&+0l*o%2>d^jz=+e8Yyy1(3q_+0N|;{&RD)t zlb_YunKc($3)h4!+$5~t4GSc%ZiCuuw`Q{#<V%HCf*NF@^}29iMx*UhXw)v)ngbYM zh9VG+Bh^jUxwgD}%#zug^<hC>X6SX8T#ASsT1nDrB3?wBM&iY|MLueWZ&~eX(<AFv z!CL<hNHATu-XjUt$^7(xtPDf4wbMJ#W>)EC{*MpN2kZsb^z1Imw&o=pUQDwuA3%gf zo85!G-p;00{4}3tRYWgL8Ybyj$wgq`|425>_JP*$C1&Z3y1GmxKhb=T8x!0>Z3wfF zIt3%?=^g!b{6�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	{d`0b_12|RJnUhUE<s^ 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≠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%0Dx( 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ⓈvfN6n}#K)40bPVUcP@32KG19aR{UGE% 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±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[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	q*!`TM<|>N^|`@BPJ|UW}15qcwp^MFAdR^60@#{ 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%0An1 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%0DegOB_L<={X(i+mn8#%X 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%0D@)s<f8f)f^`qEAx2H_$as@7>U)SA;5 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 literal 0 HcmV?d00001